diff --git a/Makefile b/Makefile index 74d500c..0cb7861 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ CHECK_TARGETS := assert-fmt vet lint ineffassign misspell MAKE_TARGETS := cmds build install fmt test coverage generate $(CHECK_TARGETS) TARGETS := $(MAKE_TARGETS) -DOCKER_TARGETS := $(pathsubst %, docker-%, $(TARGETS)) +DOCKER_TARGETS := $(patsubst %, docker-%, $(TARGETS)) .PHONY: $(TARGETS) $(DOCKER_TARGETS) ##### Container image variables ##### diff --git a/cmd/k8s-kata-manager/main.go b/cmd/k8s-kata-manager/main.go index e7868f9..1c9cdb8 100644 --- a/cmd/k8s-kata-manager/main.go +++ b/cmd/k8s-kata-manager/main.go @@ -41,11 +41,16 @@ import ( klog "k8s.io/klog/v2" yaml "sigs.k8s.io/yaml" + + "github.com/NVIDIA/k8s-kata-manager/internal/cdi" + cdiapi "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" ) const ( defaultContainerdConfigFilePath = "/etc/containerd/config.toml" defaultContainerdSocketFilePath = "/run/containerd/containerd.sock" + + cdiRoot = "/var/run/cdi" ) var waitingForSignal = make(chan bool, 1) @@ -69,6 +74,7 @@ type worker struct { ContainerdConfig string ContainerdSocket string LoadKernelModules bool + CDIEnabled bool } // newWorker returns a new worker struct @@ -95,7 +101,9 @@ func main() { Name: "log-level", Usage: "Set the logging level", Aliases: []string{"l"}, - Value: 1}), + Value: 1, + }, + ), &cli.StringFlag{ Name: "config-file", Value: "/etc/kubernetes/kata-manager/config.yaml", // Default value @@ -132,6 +140,13 @@ func main() { Destination: &worker.LoadKernelModules, EnvVars: []string{"LOAD_KERNEL_MODULES"}, }, + &cli.BoolFlag{ + Name: "cdi-enabled", + Usage: "Generate a CDI specification for all NVIDIA GPUs configured for passthrough", + Value: false, + Destination: &worker.CDIEnabled, + EnvVars: []string{"CDI_ENABLED"}, + }, } c.Before = func(c *cli.Context) error { @@ -223,6 +238,13 @@ func (w *worker) Run(clictxt *cli.Context) error { } } + if w.CDIEnabled { + err = generateCDISpec() + if err != nil { + return fmt.Errorf("failed to generate CDI spec: %v", err) + } + } + ctrdConfig, err := containerd.New( containerd.WithPath(w.ContainerdConfig), containerd.WithPodAnnotations("io.katacontainers.*"), @@ -457,6 +479,34 @@ func loadKernelModules() error { return nil } +func generateCDISpec() error { + klog.Info("Generating a CDI specification for all NVIDIA GPUs configured for passthrough") + cdilib, err := cdi.New( + cdi.WithVendor("nvidia.com"), + cdi.WithClass("pgpu"), + ) + if err != nil { + return fmt.Errorf("unabled to create cdi lib: %v", err) + } + + spec, err := cdilib.GetSpec() + if err != nil { + return fmt.Errorf("error getting cdi spec: %v", err) + } + + specName, err := cdiapi.GenerateNameForSpec(spec.Raw()) + if err != nil { + return fmt.Errorf("failed to generate cdi spec name: %v", err) + } + + err = spec.Save(filepath.Join(cdiRoot, specName+".yaml")) + if err != nil { + return fmt.Errorf("failed to save cdi spec: %v", err) + } + + return nil +} + func waitForSignal() error { klog.Infof("Waiting for signal") sigs := make(chan os.Signal, 1) diff --git a/go.mod b/go.mod index 7f58746..71fcf89 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,15 @@ module github.com/NVIDIA/k8s-kata-manager go 1.20 require ( + github.com/NVIDIA/nvidia-container-toolkit v1.13.5 + github.com/container-orchestrated-devices/container-device-interface v0.5.4-0.20230111111500-5b3b5d81179a github.com/opencontainers/image-spec v1.1.0-rc2 github.com/pelletier/go-toml v1.9.5 github.com/sirupsen/logrus v1.9.0 github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.1 - golang.org/x/sys v0.6.0 + gitlab.com/nvidia/cloud-native/go-nvlib v0.0.0-20230209143738-95328d8c4438 + golang.org/x/sys v0.7.0 k8s.io/apimachinery v0.27.1 k8s.io/client-go v0.27.1 k8s.io/klog/v2 v2.90.1 @@ -18,9 +21,11 @@ require ( require ( github.com/BurntSushi/toml v1.2.1 // indirect + github.com/NVIDIA/go-nvml v0.12.0-0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.1 // indirect @@ -38,9 +43,14 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/runc v1.1.6 // indirect + github.com/opencontainers/runtime-spec v1.1.0-rc.2 // indirect + github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect golang.org/x/sync v0.1.0 // indirect diff --git a/go.sum b/go.sum index 36cd8b2..bc5fd96 100644 --- a/go.sum +++ b/go.sum @@ -35,12 +35,21 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/NVIDIA/go-nvml v0.11.6-0.0.20220823120812-7e2082095e82/go.mod h1:hy7HYeQy335x6nEss0Ne3PYqleRa6Ct+VKD9RQ4nyFs= +github.com/NVIDIA/go-nvml v0.12.0-0 h1:eHYNHbzAsMgWYshf6dEmTY66/GCXnORJFnzm3TNH4mc= +github.com/NVIDIA/go-nvml v0.12.0-0/go.mod h1:hy7HYeQy335x6nEss0Ne3PYqleRa6Ct+VKD9RQ4nyFs= +github.com/NVIDIA/nvidia-container-toolkit v1.13.5 h1:Rw9dwAjv2plFTUWktz25g2YvHR1QkZ02u8HAaZuv+Zo= +github.com/NVIDIA/nvidia-container-toolkit v1.13.5/go.mod h1:e+OaHS5+q+/RVr9RmriPOrTiogx+d3Vpg1fmVaHFsqE= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/container-orchestrated-devices/container-device-interface v0.5.4-0.20230111111500-5b3b5d81179a h1:sP3PcgyIkRlHqfF3Jfpe/7G8kf/qpzG4C8r94y9hLbE= +github.com/container-orchestrated-devices/container-device-interface v0.5.4-0.20230111111500-5b3b5d81179a/go.mod h1:xMRa4fJgXzSDFUCURSimOUgoSc+odohvO3uXT9xjqH0= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -54,6 +63,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -129,6 +140,10 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -143,18 +158,20 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mndrix/tap-go v0.0.0-20171203230836-629fa407e90b/go.mod h1:pzzDgJWZ34fGzaAZGFW22KVZDfyrYW+QABMrWnJBnSs= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= @@ -163,6 +180,15 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/runc v1.1.6 h1:XbhB8IfG/EsnhNvZtNdLB0GBw92GYEFvKlhaJk9jUgA= +github.com/opencontainers/runc v1.1.6/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= +github.com/opencontainers/runtime-spec v1.0.3-0.20220825212826-86290f6a00fb/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.1.0-rc.2 h1:ucBtEms2tamYYW/SvGpvq9yUN0NEVL6oyLEwDcTSrk8= +github.com/opencontainers/runtime-spec v1.1.0-rc.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 h1:DmNGcqH3WDbV5k8OJ+esPWbqUOX5rMLR2PMvziDMJi0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= +github.com/opencontainers/selinux v1.9.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -172,6 +198,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -179,6 +206,7 @@ github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -187,14 +215,25 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/urfave/cli v1.19.1/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli/v2 v2.25.1 h1:zw8dSP7ghX0Gmm8vugrs6q9Ku0wzweqPyshy+syu9Gw= github.com/urfave/cli/v2 v2.25.1/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +gitlab.com/nvidia/cloud-native/go-nvlib v0.0.0-20230209143738-95328d8c4438 h1:+qRai7XRl8omFQVCeHcaWzL542Yw64vfmuXG+79ZCIc= +gitlab.com/nvidia/cloud-native/go-nvlib v0.0.0-20230209143738-95328d8c4438/go.mod h1:GStidGxhaqJhYFW1YpOnLvYCbL2EsM0od7IW4u7+JgU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -235,6 +274,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -293,6 +334,8 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -311,9 +354,10 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= diff --git a/internal/cdi/lib-vfio.go b/internal/cdi/lib-vfio.go new file mode 100644 index 0000000..11c66d3 --- /dev/null +++ b/internal/cdi/lib-vfio.go @@ -0,0 +1,107 @@ +/** +# 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 cdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi" + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" + "k8s.io/klog/v2" +) + +type vfiolib nvcdilib + +var _ nvcdi.Interface = (*vfiolib)(nil) + +// GetSpec returns the complete CDI spec +func (l *vfiolib) GetSpec() (spec.Interface, error) { + deviceSpecs, err := l.GetAllDeviceSpecs() + if err != nil { + return nil, err + } + + edits, err := l.GetCommonEdits() + if err != nil { + return nil, err + } + + return spec.New( + spec.WithDeviceSpecs(deviceSpecs), + spec.WithEdits(*edits.ContainerEdits), + spec.WithVendor(l.vendor), + spec.WithClass(l.class), + ) +} + +// GetAllDeviceSpecs returns the device specs for all available devices. +func (l *vfiolib) GetAllDeviceSpecs() ([]specs.Device, error) { + var deviceSpecs []specs.Device + + devices, err := l.nvpcilib.GetGPUs() + if err != nil { + return nil, fmt.Errorf("failed getting NVIDIA GPUs: %v", err) + } + + for idx, dev := range devices { + if dev.Driver == "vfio-pci" { + klog.Infof("Found NVIDIA device: address=%s, driver=%s, iommu_group=%d, deviceId=%x", + dev.Address, dev.Driver, dev.IommuGroup, dev.Device) + deviceSpecs = append(deviceSpecs, specs.Device{ + Name: fmt.Sprintf("%d", idx), + ContainerEdits: specs.ContainerEdits{ + DeviceNodes: []*specs.DeviceNode{ + { + Path: fmt.Sprintf("/dev/vfio/%d", dev.IommuGroup), + }, + }, + }, + }) + } + } + + return deviceSpecs, nil +} + +// GetCommonEdits returns common edits for ALL devices. +// Note, currently there are no common edits. +func (l *vfiolib) GetCommonEdits() (*cdi.ContainerEdits, error) { + return &cdi.ContainerEdits{ContainerEdits: &specs.ContainerEdits{}}, nil +} + +// GetGPUDeviceEdits should not be called for vfiolib +func (l *vfiolib) GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("Unexpected call to vfiolib.GetGPUDeviceEdits()") +} + +// GetGPUDeviceSpecs should not be called for vfiolib +func (l *vfiolib) GetGPUDeviceSpecs(int, device.Device) (*specs.Device, error) { + return nil, fmt.Errorf("Unexpected call to vfiolib.GetGPUDeviceSpecs()") +} + +// GetMIGDeviceEdits should not be called for vfiolib +func (l *vfiolib) GetMIGDeviceEdits(device.Device, device.MigDevice) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("Unexpected call to vfiolib.GetMIGDeviceEdits()") +} + +// GetMIGDeviceSpecs should not be called for vfiolib +func (l *vfiolib) GetMIGDeviceSpecs(int, device.Device, int, device.MigDevice) (*specs.Device, error) { + return nil, fmt.Errorf("Unexpected call to vfiolib.GetMIGDeviceSpecs()") +} diff --git a/internal/cdi/lib-vfio_test.go b/internal/cdi/lib-vfio_test.go new file mode 100644 index 0000000..5c862cd --- /dev/null +++ b/internal/cdi/lib-vfio_test.go @@ -0,0 +1,185 @@ +/** +# 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 cdi + +import ( + "testing" + + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "github.com/stretchr/testify/require" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci" +) + +func TestGetAllDeviceSpecs(t *testing.T) { + testCases := []struct { + description string + lib *vfiolib + expectedDeviceSpecs []specs.Device + }{ + { + description: "no NVIDIA devices", + lib: &vfiolib{ + nvpcilib: &nvpciInterfaceMock{ + GetGPUsFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { + devices := []*nvpci.NvidiaPCIDevice{} + return devices, nil + }, + }, + }, + expectedDeviceSpecs: nil, + }, + { + description: "one NVIDIA device, not bound to vfio-pci", + lib: &vfiolib{ + nvpcilib: &nvpciInterfaceMock{ + GetGPUsFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { + devices := []*nvpci.NvidiaPCIDevice{ + { + Address: "000:3B:00.0", + Device: 0x2331, + IommuGroup: -1, + Driver: "nvidia", + }, + } + return devices, nil + }, + }, + }, + expectedDeviceSpecs: nil, + }, + { + description: "one NVIDIA device, bound to vfio-pci", + lib: &vfiolib{ + nvpcilib: &nvpciInterfaceMock{ + GetGPUsFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { + devices := []*nvpci.NvidiaPCIDevice{ + { + Address: "000:3B:00.0", + Device: 0x2331, + IommuGroup: 60, + Driver: "vfio-pci", + }, + } + return devices, nil + }, + }, + }, + expectedDeviceSpecs: []specs.Device{ + { + Name: "0", + ContainerEdits: specs.ContainerEdits{ + DeviceNodes: []*specs.DeviceNode{ + { + Path: "/dev/vfio/60", + }, + }, + }, + }, + }, + }, + { + description: "multiple NVIDIA devices, one bound to vfio-pci", + lib: &vfiolib{ + nvpcilib: &nvpciInterfaceMock{ + GetGPUsFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { + devices := []*nvpci.NvidiaPCIDevice{ + { + Address: "000:3B:00.0", + Device: 0x2331, + IommuGroup: 60, + Driver: "vfio-pci", + }, + { + Address: "000:86:00.0", + Device: 0x2331, + IommuGroup: -1, + Driver: "", + }, + } + return devices, nil + }, + }, + }, + expectedDeviceSpecs: []specs.Device{ + { + Name: "0", + ContainerEdits: specs.ContainerEdits{ + DeviceNodes: []*specs.DeviceNode{ + { + Path: "/dev/vfio/60", + }, + }, + }, + }, + }, + }, + { + description: "multiple NVIDIA devices, all bound to vfio-pci", + lib: &vfiolib{ + nvpcilib: &nvpciInterfaceMock{ + GetGPUsFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { + devices := []*nvpci.NvidiaPCIDevice{ + { + Address: "000:3B:00.0", + Device: 0x2331, + IommuGroup: 60, + Driver: "vfio-pci", + }, + { + Address: "000:86:00.0", + Device: 0x2331, + IommuGroup: 90, + Driver: "vfio-pci", + }, + } + return devices, nil + }, + }, + }, + expectedDeviceSpecs: []specs.Device{ + { + Name: "0", + ContainerEdits: specs.ContainerEdits{ + DeviceNodes: []*specs.DeviceNode{ + { + Path: "/dev/vfio/60", + }, + }, + }, + }, + { + Name: "1", + ContainerEdits: specs.ContainerEdits{ + DeviceNodes: []*specs.DeviceNode{ + { + Path: "/dev/vfio/90", + }, + }, + }, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.description, func(t *testing.T) { + deviceSpecs, err := tc.lib.GetAllDeviceSpecs() + require.NoError(t, err) + require.Equal(t, tc.expectedDeviceSpecs, deviceSpecs) + }) + } +} diff --git a/internal/cdi/lib.go b/internal/cdi/lib.go new file mode 100644 index 0000000..531e2d6 --- /dev/null +++ b/internal/cdi/lib.go @@ -0,0 +1,72 @@ +/** +# 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 cdi + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci" +) + +type nvcdilib struct { + vendor string + class string + + nvpcilib nvpciInterface +} + +// New creates a new instance of this library +func New(opts ...Option) (nvcdi.Interface, error) { + l := &nvcdilib{} + for _, opt := range opts { + opt(l) + } + + if l.vendor == "" { + l.vendor = "nvidia.com" + } + if l.class == "" { + l.class = "pgpu" + } + if l.nvpcilib == nil { + l.nvpcilib = nvpci.New() + } + + return (*vfiolib)(l), nil +} + +type Option func(*nvcdilib) + +// WithNvpciLib sets the nvpci library for the library +func WithNvpciLib(nvpcilib nvpciInterface) Option { + return func(l *nvcdilib) { + l.nvpcilib = nvpcilib + } +} + +// WithVendor sets the vendor for the library +func WithVendor(vendor string) Option { + return func(o *nvcdilib) { + o.vendor = vendor + } +} + +// WithClass sets the class for the library +func WithClass(class string) Option { + return func(o *nvcdilib) { + o.class = class + } +} diff --git a/internal/cdi/nvpci-interface_mock.go b/internal/cdi/nvpci-interface_mock.go new file mode 100644 index 0000000..616edc0 --- /dev/null +++ b/internal/cdi/nvpci-interface_mock.go @@ -0,0 +1,415 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package cdi + +import ( + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci" + "sync" +) + +// Ensure, that nvpciInterfaceMock does implement nvpciInterface. +// If this is not the case, regenerate this file with moq. +var _ nvpciInterface = &nvpciInterfaceMock{} + +// nvpciInterfaceMock is a mock implementation of nvpciInterface. +// +// func TestSomethingThatUsesnvpciInterface(t *testing.T) { +// +// // make and configure a mocked nvpciInterface +// mockednvpciInterface := &nvpciInterfaceMock{ +// Get3DControllersFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the Get3DControllers method") +// }, +// GetAllDevicesFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetAllDevices method") +// }, +// GetDPUsFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetDPUs method") +// }, +// GetGPUByIndexFunc: func(n int) (*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetGPUByIndex method") +// }, +// GetGPUByPciBusIDFunc: func(s string) (*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetGPUByPciBusID method") +// }, +// GetGPUsFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetGPUs method") +// }, +// GetNVSwitchesFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetNVSwitches method") +// }, +// GetNetworkControllersFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetNetworkControllers method") +// }, +// GetPciBridgesFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetPciBridges method") +// }, +// GetVGAControllersFunc: func() ([]*nvpci.NvidiaPCIDevice, error) { +// panic("mock out the GetVGAControllers method") +// }, +// } +// +// // use mockednvpciInterface in code that requires nvpciInterface +// // and then make assertions. +// +// } +type nvpciInterfaceMock struct { + // Get3DControllersFunc mocks the Get3DControllers method. + Get3DControllersFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // GetAllDevicesFunc mocks the GetAllDevices method. + GetAllDevicesFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // GetDPUsFunc mocks the GetDPUs method. + GetDPUsFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // GetGPUByIndexFunc mocks the GetGPUByIndex method. + GetGPUByIndexFunc func(n int) (*nvpci.NvidiaPCIDevice, error) + + // GetGPUByPciBusIDFunc mocks the GetGPUByPciBusID method. + GetGPUByPciBusIDFunc func(s string) (*nvpci.NvidiaPCIDevice, error) + + // GetGPUsFunc mocks the GetGPUs method. + GetGPUsFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // GetNVSwitchesFunc mocks the GetNVSwitches method. + GetNVSwitchesFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // GetNetworkControllersFunc mocks the GetNetworkControllers method. + GetNetworkControllersFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // GetPciBridgesFunc mocks the GetPciBridges method. + GetPciBridgesFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // GetVGAControllersFunc mocks the GetVGAControllers method. + GetVGAControllersFunc func() ([]*nvpci.NvidiaPCIDevice, error) + + // calls tracks calls to the methods. + calls struct { + // Get3DControllers holds details about calls to the Get3DControllers method. + Get3DControllers []struct { + } + // GetAllDevices holds details about calls to the GetAllDevices method. + GetAllDevices []struct { + } + // GetDPUs holds details about calls to the GetDPUs method. + GetDPUs []struct { + } + // GetGPUByIndex holds details about calls to the GetGPUByIndex method. + GetGPUByIndex []struct { + // N is the n argument value. + N int + } + // GetGPUByPciBusID holds details about calls to the GetGPUByPciBusID method. + GetGPUByPciBusID []struct { + // S is the s argument value. + S string + } + // GetGPUs holds details about calls to the GetGPUs method. + GetGPUs []struct { + } + // GetNVSwitches holds details about calls to the GetNVSwitches method. + GetNVSwitches []struct { + } + // GetNetworkControllers holds details about calls to the GetNetworkControllers method. + GetNetworkControllers []struct { + } + // GetPciBridges holds details about calls to the GetPciBridges method. + GetPciBridges []struct { + } + // GetVGAControllers holds details about calls to the GetVGAControllers method. + GetVGAControllers []struct { + } + } + lockGet3DControllers sync.RWMutex + lockGetAllDevices sync.RWMutex + lockGetDPUs sync.RWMutex + lockGetGPUByIndex sync.RWMutex + lockGetGPUByPciBusID sync.RWMutex + lockGetGPUs sync.RWMutex + lockGetNVSwitches sync.RWMutex + lockGetNetworkControllers sync.RWMutex + lockGetPciBridges sync.RWMutex + lockGetVGAControllers sync.RWMutex +} + +// Get3DControllers calls Get3DControllersFunc. +func (mock *nvpciInterfaceMock) Get3DControllers() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.Get3DControllersFunc == nil { + panic("nvpciInterfaceMock.Get3DControllersFunc: method is nil but nvpciInterface.Get3DControllers was just called") + } + callInfo := struct { + }{} + mock.lockGet3DControllers.Lock() + mock.calls.Get3DControllers = append(mock.calls.Get3DControllers, callInfo) + mock.lockGet3DControllers.Unlock() + return mock.Get3DControllersFunc() +} + +// Get3DControllersCalls gets all the calls that were made to Get3DControllers. +// Check the length with: +// +// len(mockednvpciInterface.Get3DControllersCalls()) +func (mock *nvpciInterfaceMock) Get3DControllersCalls() []struct { +} { + var calls []struct { + } + mock.lockGet3DControllers.RLock() + calls = mock.calls.Get3DControllers + mock.lockGet3DControllers.RUnlock() + return calls +} + +// GetAllDevices calls GetAllDevicesFunc. +func (mock *nvpciInterfaceMock) GetAllDevices() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.GetAllDevicesFunc == nil { + panic("nvpciInterfaceMock.GetAllDevicesFunc: method is nil but nvpciInterface.GetAllDevices was just called") + } + callInfo := struct { + }{} + mock.lockGetAllDevices.Lock() + mock.calls.GetAllDevices = append(mock.calls.GetAllDevices, callInfo) + mock.lockGetAllDevices.Unlock() + return mock.GetAllDevicesFunc() +} + +// GetAllDevicesCalls gets all the calls that were made to GetAllDevices. +// Check the length with: +// +// len(mockednvpciInterface.GetAllDevicesCalls()) +func (mock *nvpciInterfaceMock) GetAllDevicesCalls() []struct { +} { + var calls []struct { + } + mock.lockGetAllDevices.RLock() + calls = mock.calls.GetAllDevices + mock.lockGetAllDevices.RUnlock() + return calls +} + +// GetDPUs calls GetDPUsFunc. +func (mock *nvpciInterfaceMock) GetDPUs() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.GetDPUsFunc == nil { + panic("nvpciInterfaceMock.GetDPUsFunc: method is nil but nvpciInterface.GetDPUs was just called") + } + callInfo := struct { + }{} + mock.lockGetDPUs.Lock() + mock.calls.GetDPUs = append(mock.calls.GetDPUs, callInfo) + mock.lockGetDPUs.Unlock() + return mock.GetDPUsFunc() +} + +// GetDPUsCalls gets all the calls that were made to GetDPUs. +// Check the length with: +// +// len(mockednvpciInterface.GetDPUsCalls()) +func (mock *nvpciInterfaceMock) GetDPUsCalls() []struct { +} { + var calls []struct { + } + mock.lockGetDPUs.RLock() + calls = mock.calls.GetDPUs + mock.lockGetDPUs.RUnlock() + return calls +} + +// GetGPUByIndex calls GetGPUByIndexFunc. +func (mock *nvpciInterfaceMock) GetGPUByIndex(n int) (*nvpci.NvidiaPCIDevice, error) { + if mock.GetGPUByIndexFunc == nil { + panic("nvpciInterfaceMock.GetGPUByIndexFunc: method is nil but nvpciInterface.GetGPUByIndex was just called") + } + callInfo := struct { + N int + }{ + N: n, + } + mock.lockGetGPUByIndex.Lock() + mock.calls.GetGPUByIndex = append(mock.calls.GetGPUByIndex, callInfo) + mock.lockGetGPUByIndex.Unlock() + return mock.GetGPUByIndexFunc(n) +} + +// GetGPUByIndexCalls gets all the calls that were made to GetGPUByIndex. +// Check the length with: +// +// len(mockednvpciInterface.GetGPUByIndexCalls()) +func (mock *nvpciInterfaceMock) GetGPUByIndexCalls() []struct { + N int +} { + var calls []struct { + N int + } + mock.lockGetGPUByIndex.RLock() + calls = mock.calls.GetGPUByIndex + mock.lockGetGPUByIndex.RUnlock() + return calls +} + +// GetGPUByPciBusID calls GetGPUByPciBusIDFunc. +func (mock *nvpciInterfaceMock) GetGPUByPciBusID(s string) (*nvpci.NvidiaPCIDevice, error) { + if mock.GetGPUByPciBusIDFunc == nil { + panic("nvpciInterfaceMock.GetGPUByPciBusIDFunc: method is nil but nvpciInterface.GetGPUByPciBusID was just called") + } + callInfo := struct { + S string + }{ + S: s, + } + mock.lockGetGPUByPciBusID.Lock() + mock.calls.GetGPUByPciBusID = append(mock.calls.GetGPUByPciBusID, callInfo) + mock.lockGetGPUByPciBusID.Unlock() + return mock.GetGPUByPciBusIDFunc(s) +} + +// GetGPUByPciBusIDCalls gets all the calls that were made to GetGPUByPciBusID. +// Check the length with: +// +// len(mockednvpciInterface.GetGPUByPciBusIDCalls()) +func (mock *nvpciInterfaceMock) GetGPUByPciBusIDCalls() []struct { + S string +} { + var calls []struct { + S string + } + mock.lockGetGPUByPciBusID.RLock() + calls = mock.calls.GetGPUByPciBusID + mock.lockGetGPUByPciBusID.RUnlock() + return calls +} + +// GetGPUs calls GetGPUsFunc. +func (mock *nvpciInterfaceMock) GetGPUs() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.GetGPUsFunc == nil { + panic("nvpciInterfaceMock.GetGPUsFunc: method is nil but nvpciInterface.GetGPUs was just called") + } + callInfo := struct { + }{} + mock.lockGetGPUs.Lock() + mock.calls.GetGPUs = append(mock.calls.GetGPUs, callInfo) + mock.lockGetGPUs.Unlock() + return mock.GetGPUsFunc() +} + +// GetGPUsCalls gets all the calls that were made to GetGPUs. +// Check the length with: +// +// len(mockednvpciInterface.GetGPUsCalls()) +func (mock *nvpciInterfaceMock) GetGPUsCalls() []struct { +} { + var calls []struct { + } + mock.lockGetGPUs.RLock() + calls = mock.calls.GetGPUs + mock.lockGetGPUs.RUnlock() + return calls +} + +// GetNVSwitches calls GetNVSwitchesFunc. +func (mock *nvpciInterfaceMock) GetNVSwitches() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.GetNVSwitchesFunc == nil { + panic("nvpciInterfaceMock.GetNVSwitchesFunc: method is nil but nvpciInterface.GetNVSwitches was just called") + } + callInfo := struct { + }{} + mock.lockGetNVSwitches.Lock() + mock.calls.GetNVSwitches = append(mock.calls.GetNVSwitches, callInfo) + mock.lockGetNVSwitches.Unlock() + return mock.GetNVSwitchesFunc() +} + +// GetNVSwitchesCalls gets all the calls that were made to GetNVSwitches. +// Check the length with: +// +// len(mockednvpciInterface.GetNVSwitchesCalls()) +func (mock *nvpciInterfaceMock) GetNVSwitchesCalls() []struct { +} { + var calls []struct { + } + mock.lockGetNVSwitches.RLock() + calls = mock.calls.GetNVSwitches + mock.lockGetNVSwitches.RUnlock() + return calls +} + +// GetNetworkControllers calls GetNetworkControllersFunc. +func (mock *nvpciInterfaceMock) GetNetworkControllers() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.GetNetworkControllersFunc == nil { + panic("nvpciInterfaceMock.GetNetworkControllersFunc: method is nil but nvpciInterface.GetNetworkControllers was just called") + } + callInfo := struct { + }{} + mock.lockGetNetworkControllers.Lock() + mock.calls.GetNetworkControllers = append(mock.calls.GetNetworkControllers, callInfo) + mock.lockGetNetworkControllers.Unlock() + return mock.GetNetworkControllersFunc() +} + +// GetNetworkControllersCalls gets all the calls that were made to GetNetworkControllers. +// Check the length with: +// +// len(mockednvpciInterface.GetNetworkControllersCalls()) +func (mock *nvpciInterfaceMock) GetNetworkControllersCalls() []struct { +} { + var calls []struct { + } + mock.lockGetNetworkControllers.RLock() + calls = mock.calls.GetNetworkControllers + mock.lockGetNetworkControllers.RUnlock() + return calls +} + +// GetPciBridges calls GetPciBridgesFunc. +func (mock *nvpciInterfaceMock) GetPciBridges() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.GetPciBridgesFunc == nil { + panic("nvpciInterfaceMock.GetPciBridgesFunc: method is nil but nvpciInterface.GetPciBridges was just called") + } + callInfo := struct { + }{} + mock.lockGetPciBridges.Lock() + mock.calls.GetPciBridges = append(mock.calls.GetPciBridges, callInfo) + mock.lockGetPciBridges.Unlock() + return mock.GetPciBridgesFunc() +} + +// GetPciBridgesCalls gets all the calls that were made to GetPciBridges. +// Check the length with: +// +// len(mockednvpciInterface.GetPciBridgesCalls()) +func (mock *nvpciInterfaceMock) GetPciBridgesCalls() []struct { +} { + var calls []struct { + } + mock.lockGetPciBridges.RLock() + calls = mock.calls.GetPciBridges + mock.lockGetPciBridges.RUnlock() + return calls +} + +// GetVGAControllers calls GetVGAControllersFunc. +func (mock *nvpciInterfaceMock) GetVGAControllers() ([]*nvpci.NvidiaPCIDevice, error) { + if mock.GetVGAControllersFunc == nil { + panic("nvpciInterfaceMock.GetVGAControllersFunc: method is nil but nvpciInterface.GetVGAControllers was just called") + } + callInfo := struct { + }{} + mock.lockGetVGAControllers.Lock() + mock.calls.GetVGAControllers = append(mock.calls.GetVGAControllers, callInfo) + mock.lockGetVGAControllers.Unlock() + return mock.GetVGAControllersFunc() +} + +// GetVGAControllersCalls gets all the calls that were made to GetVGAControllers. +// Check the length with: +// +// len(mockednvpciInterface.GetVGAControllersCalls()) +func (mock *nvpciInterfaceMock) GetVGAControllersCalls() []struct { +} { + var calls []struct { + } + mock.lockGetVGAControllers.RLock() + calls = mock.calls.GetVGAControllers + mock.lockGetVGAControllers.RUnlock() + return calls +} diff --git a/internal/cdi/types.go b/internal/cdi/types.go new file mode 100644 index 0000000..e057708 --- /dev/null +++ b/internal/cdi/types.go @@ -0,0 +1,23 @@ +/** +# 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 cdi + +import ( + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci" +) + +type nvpciInterface nvpci.Interface diff --git a/vendor/github.com/NVIDIA/go-nvml/LICENSE b/vendor/github.com/NVIDIA/go-nvml/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/dl/dl.go b/vendor/github.com/NVIDIA/go-nvml/pkg/dl/dl.go new file mode 100644 index 0000000..21a0209 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/dl/dl.go @@ -0,0 +1,82 @@ +// Copyright (c) 2020, 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 dl + +import ( + "fmt" + "unsafe" +) + +// #cgo LDFLAGS: -ldl +// #include +// #include +import "C" + +const ( + RTLD_LAZY = C.RTLD_LAZY + RTLD_NOW = C.RTLD_NOW + RTLD_GLOBAL = C.RTLD_GLOBAL + RTLD_LOCAL = C.RTLD_LOCAL + RTLD_NODELETE = C.RTLD_NODELETE + RTLD_NOLOAD = C.RTLD_NOLOAD + RTLD_DEEPBIND = C.RTLD_DEEPBIND +) + +type DynamicLibrary struct{ + Name string + Flags int + handle unsafe.Pointer +} + +func New(name string, flags int) *DynamicLibrary { + return &DynamicLibrary{ + Name: name, + Flags: flags, + handle: nil, + } +} + +func (dl *DynamicLibrary) Open() error { + name := C.CString(dl.Name) + defer C.free(unsafe.Pointer(name)) + + handle := C.dlopen(name, C.int(dl.Flags)) + if handle == C.NULL { + return fmt.Errorf("%s", C.GoString(C.dlerror())) + } + dl.handle = handle + return nil +} + +func (dl *DynamicLibrary) Close() error { + err := C.dlclose(dl.handle) + if err != 0 { + return fmt.Errorf("%s", C.GoString(C.dlerror())) + } + return nil +} + +func (dl *DynamicLibrary) Lookup(symbol string) error { + sym := C.CString(symbol) + defer C.free(unsafe.Pointer(sym)) + + C.dlerror() // Clear out any previous errors + C.dlsym(dl.handle, sym) + err := C.dlerror() + if unsafe.Pointer(err) == C.NULL { + return nil + } + return fmt.Errorf("%s", C.GoString(err)) +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/cgo_helpers.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/cgo_helpers.go new file mode 100644 index 0000000..b04f366 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/cgo_helpers.go @@ -0,0 +1,64 @@ +// Copyright (c) 2020, 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 nvml + +import ( + "unsafe" +) + +import "C" + +var cgoAllocsUnknown = new(struct{}) + +type stringHeader struct { + Data unsafe.Pointer + Len int +} + +func clen(n []byte) int { + for i := 0; i < len(n); i++ { + if n[i] == 0 { + return i + } + } + return len(n) +} + +func uint32SliceToIntSlice(s []uint32) []int { + ret := make([]int, len(s)) + for i := range s { + ret[i] = int(s[i]) + } + return ret +} + +// packPCharString creates a Go string backed by *C.char and avoids copying. +func packPCharString(p *C.char) (raw string) { + if p != nil && *p != 0 { + h := (*stringHeader)(unsafe.Pointer(&raw)) + h.Data = unsafe.Pointer(p) + for *p != 0 { + p = (*C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + 1)) // p++ + } + h.Len = int(uintptr(unsafe.Pointer(p)) - uintptr(h.Data)) + } + return +} + +// unpackPCharString represents the data from Go string as *C.char and avoids copying. +func unpackPCharString(str string) (*C.char, *struct{}) { + h := (*stringHeader)(unsafe.Pointer(&str)) + return (*C.char)(h.Data), cgoAllocsUnknown +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/cgo_helpers.h b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/cgo_helpers.h new file mode 100644 index 0000000..b25c5e5 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/cgo_helpers.h @@ -0,0 +1,23 @@ +// Copyright (c) 2020, 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. + +// WARNING: THIS FILE WAS AUTOMATICALLY GENERATED. +// Code generated by https://git.io/c-for-go. DO NOT EDIT. + +#include "nvml.h" +#include +#pragma once + +#define __CGOGEN 1 + diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/const.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/const.go new file mode 100644 index 0000000..1a0efaf --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/const.go @@ -0,0 +1,1375 @@ +// Copyright (c) 2020, 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. + +// WARNING: THIS FILE WAS AUTOMATICALLY GENERATED. +// Code generated by https://git.io/c-for-go. DO NOT EDIT. + +package nvml + +/* +#cgo LDFLAGS: -Wl,--unresolved-symbols=ignore-in-object-files +#cgo CFLAGS: -DNVML_NO_UNVERSIONED_FUNC_DEFS=1 +#include "nvml.h" +#include +#include "cgo_helpers.h" +*/ +import "C" + +const ( + // NO_UNVERSIONED_FUNC_DEFS as defined in go-nvml/:24 + NO_UNVERSIONED_FUNC_DEFS = 1 + // API_VERSION as defined in nvml/nvml.h + API_VERSION = 11 + // API_VERSION_STR as defined in nvml/nvml.h + API_VERSION_STR = "11" + // VALUE_NOT_AVAILABLE as defined in nvml/nvml.h + VALUE_NOT_AVAILABLE = -1 + // DEVICE_PCI_BUS_ID_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_PCI_BUS_ID_BUFFER_SIZE = 32 + // DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE as defined in nvml/nvml.h + DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE = 16 + // DEVICE_PCI_BUS_ID_LEGACY_FMT as defined in nvml/nvml.h + DEVICE_PCI_BUS_ID_LEGACY_FMT = "%04X:%02X:%02X.0" + // DEVICE_PCI_BUS_ID_FMT as defined in nvml/nvml.h + DEVICE_PCI_BUS_ID_FMT = "%08X:%02X:%02X.0" + // NVLINK_MAX_LINKS as defined in nvml/nvml.h + NVLINK_MAX_LINKS = 18 + // TOPOLOGY_CPU as defined in nvml/nvml.h + TOPOLOGY_CPU = 0 + // MAX_PHYSICAL_BRIDGE as defined in nvml/nvml.h + MAX_PHYSICAL_BRIDGE = 128 + // MAX_THERMAL_SENSORS_PER_GPU as defined in nvml/nvml.h + MAX_THERMAL_SENSORS_PER_GPU = 3 + // FlagDefault as defined in nvml/nvml.h + FlagDefault = 0 + // FlagForce as defined in nvml/nvml.h + FlagForce = 1 + // SINGLE_BIT_ECC as defined in nvml/nvml.h + SINGLE_BIT_ECC = 0 + // DOUBLE_BIT_ECC as defined in nvml/nvml.h + DOUBLE_BIT_ECC = 0 + // MAX_GPU_PERF_PSTATES as defined in nvml/nvml.h + MAX_GPU_PERF_PSTATES = 16 + // GRID_LICENSE_EXPIRY_NOT_AVAILABLE as defined in nvml/nvml.h + GRID_LICENSE_EXPIRY_NOT_AVAILABLE = 0 + // GRID_LICENSE_EXPIRY_INVALID as defined in nvml/nvml.h + GRID_LICENSE_EXPIRY_INVALID = 1 + // GRID_LICENSE_EXPIRY_VALID as defined in nvml/nvml.h + GRID_LICENSE_EXPIRY_VALID = 2 + // GRID_LICENSE_EXPIRY_NOT_APPLICABLE as defined in nvml/nvml.h + GRID_LICENSE_EXPIRY_NOT_APPLICABLE = 3 + // GRID_LICENSE_EXPIRY_PERMANENT as defined in nvml/nvml.h + GRID_LICENSE_EXPIRY_PERMANENT = 4 + // GRID_LICENSE_BUFFER_SIZE as defined in nvml/nvml.h + GRID_LICENSE_BUFFER_SIZE = 128 + // VGPU_NAME_BUFFER_SIZE as defined in nvml/nvml.h + VGPU_NAME_BUFFER_SIZE = 64 + // GRID_LICENSE_FEATURE_MAX_COUNT as defined in nvml/nvml.h + GRID_LICENSE_FEATURE_MAX_COUNT = 3 + // VGPU_SCHEDULER_POLICY_UNKNOWN as defined in nvml/nvml.h + VGPU_SCHEDULER_POLICY_UNKNOWN = 0 + // VGPU_SCHEDULER_POLICY_BEST_EFFORT as defined in nvml/nvml.h + VGPU_SCHEDULER_POLICY_BEST_EFFORT = 1 + // VGPU_SCHEDULER_POLICY_EQUAL_SHARE as defined in nvml/nvml.h + VGPU_SCHEDULER_POLICY_EQUAL_SHARE = 2 + // VGPU_SCHEDULER_POLICY_FIXED_SHARE as defined in nvml/nvml.h + VGPU_SCHEDULER_POLICY_FIXED_SHARE = 3 + // SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT as defined in nvml/nvml.h + SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT = 3 + // SCHEDULER_SW_MAX_LOG_ENTRIES as defined in nvml/nvml.h + SCHEDULER_SW_MAX_LOG_ENTRIES = 200 + // GRID_LICENSE_STATE_UNKNOWN as defined in nvml/nvml.h + GRID_LICENSE_STATE_UNKNOWN = 0 + // GRID_LICENSE_STATE_UNINITIALIZED as defined in nvml/nvml.h + GRID_LICENSE_STATE_UNINITIALIZED = 1 + // GRID_LICENSE_STATE_UNLICENSED_UNRESTRICTED as defined in nvml/nvml.h + GRID_LICENSE_STATE_UNLICENSED_UNRESTRICTED = 2 + // GRID_LICENSE_STATE_UNLICENSED_RESTRICTED as defined in nvml/nvml.h + GRID_LICENSE_STATE_UNLICENSED_RESTRICTED = 3 + // GRID_LICENSE_STATE_UNLICENSED as defined in nvml/nvml.h + GRID_LICENSE_STATE_UNLICENSED = 4 + // GRID_LICENSE_STATE_LICENSED as defined in nvml/nvml.h + GRID_LICENSE_STATE_LICENSED = 5 + // GSP_FIRMWARE_VERSION_BUF_SIZE as defined in nvml/nvml.h + GSP_FIRMWARE_VERSION_BUF_SIZE = 64 + // DEVICE_ARCH_KEPLER as defined in nvml/nvml.h + DEVICE_ARCH_KEPLER = 2 + // DEVICE_ARCH_MAXWELL as defined in nvml/nvml.h + DEVICE_ARCH_MAXWELL = 3 + // DEVICE_ARCH_PASCAL as defined in nvml/nvml.h + DEVICE_ARCH_PASCAL = 4 + // DEVICE_ARCH_VOLTA as defined in nvml/nvml.h + DEVICE_ARCH_VOLTA = 5 + // DEVICE_ARCH_TURING as defined in nvml/nvml.h + DEVICE_ARCH_TURING = 6 + // DEVICE_ARCH_AMPERE as defined in nvml/nvml.h + DEVICE_ARCH_AMPERE = 7 + // DEVICE_ARCH_ADA as defined in nvml/nvml.h + DEVICE_ARCH_ADA = 8 + // DEVICE_ARCH_HOPPER as defined in nvml/nvml.h + DEVICE_ARCH_HOPPER = 9 + // DEVICE_ARCH_UNKNOWN as defined in nvml/nvml.h + DEVICE_ARCH_UNKNOWN = 4294967295 + // BUS_TYPE_UNKNOWN as defined in nvml/nvml.h + BUS_TYPE_UNKNOWN = 0 + // BUS_TYPE_PCI as defined in nvml/nvml.h + BUS_TYPE_PCI = 1 + // BUS_TYPE_PCIE as defined in nvml/nvml.h + BUS_TYPE_PCIE = 2 + // BUS_TYPE_FPCI as defined in nvml/nvml.h + BUS_TYPE_FPCI = 3 + // BUS_TYPE_AGP as defined in nvml/nvml.h + BUS_TYPE_AGP = 4 + // FAN_POLICY_TEMPERATURE_CONTINOUS_SW as defined in nvml/nvml.h + FAN_POLICY_TEMPERATURE_CONTINOUS_SW = 0 + // FAN_POLICY_MANUAL as defined in nvml/nvml.h + FAN_POLICY_MANUAL = 1 + // POWER_SOURCE_AC as defined in nvml/nvml.h + POWER_SOURCE_AC = 0 + // POWER_SOURCE_BATTERY as defined in nvml/nvml.h + POWER_SOURCE_BATTERY = 1 + // PCIE_LINK_MAX_SPEED_INVALID as defined in nvml/nvml.h + PCIE_LINK_MAX_SPEED_INVALID = 0 + // PCIE_LINK_MAX_SPEED_2500MBPS as defined in nvml/nvml.h + PCIE_LINK_MAX_SPEED_2500MBPS = 1 + // PCIE_LINK_MAX_SPEED_5000MBPS as defined in nvml/nvml.h + PCIE_LINK_MAX_SPEED_5000MBPS = 2 + // PCIE_LINK_MAX_SPEED_8000MBPS as defined in nvml/nvml.h + PCIE_LINK_MAX_SPEED_8000MBPS = 3 + // PCIE_LINK_MAX_SPEED_16000MBPS as defined in nvml/nvml.h + PCIE_LINK_MAX_SPEED_16000MBPS = 4 + // PCIE_LINK_MAX_SPEED_32000MBPS as defined in nvml/nvml.h + PCIE_LINK_MAX_SPEED_32000MBPS = 5 + // PCIE_LINK_MAX_SPEED_64000MBPS as defined in nvml/nvml.h + PCIE_LINK_MAX_SPEED_64000MBPS = 6 + // ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED as defined in nvml/nvml.h + ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED = 0 + // ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED as defined in nvml/nvml.h + ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED = 1 + // MAX_GPU_UTILIZATIONS as defined in nvml/nvml.h + MAX_GPU_UTILIZATIONS = 8 + // FI_DEV_ECC_CURRENT as defined in nvml/nvml.h + FI_DEV_ECC_CURRENT = 1 + // FI_DEV_ECC_PENDING as defined in nvml/nvml.h + FI_DEV_ECC_PENDING = 2 + // FI_DEV_ECC_SBE_VOL_TOTAL as defined in nvml/nvml.h + FI_DEV_ECC_SBE_VOL_TOTAL = 3 + // FI_DEV_ECC_DBE_VOL_TOTAL as defined in nvml/nvml.h + FI_DEV_ECC_DBE_VOL_TOTAL = 4 + // FI_DEV_ECC_SBE_AGG_TOTAL as defined in nvml/nvml.h + FI_DEV_ECC_SBE_AGG_TOTAL = 5 + // FI_DEV_ECC_DBE_AGG_TOTAL as defined in nvml/nvml.h + FI_DEV_ECC_DBE_AGG_TOTAL = 6 + // FI_DEV_ECC_SBE_VOL_L1 as defined in nvml/nvml.h + FI_DEV_ECC_SBE_VOL_L1 = 7 + // FI_DEV_ECC_DBE_VOL_L1 as defined in nvml/nvml.h + FI_DEV_ECC_DBE_VOL_L1 = 8 + // FI_DEV_ECC_SBE_VOL_L2 as defined in nvml/nvml.h + FI_DEV_ECC_SBE_VOL_L2 = 9 + // FI_DEV_ECC_DBE_VOL_L2 as defined in nvml/nvml.h + FI_DEV_ECC_DBE_VOL_L2 = 10 + // FI_DEV_ECC_SBE_VOL_DEV as defined in nvml/nvml.h + FI_DEV_ECC_SBE_VOL_DEV = 11 + // FI_DEV_ECC_DBE_VOL_DEV as defined in nvml/nvml.h + FI_DEV_ECC_DBE_VOL_DEV = 12 + // FI_DEV_ECC_SBE_VOL_REG as defined in nvml/nvml.h + FI_DEV_ECC_SBE_VOL_REG = 13 + // FI_DEV_ECC_DBE_VOL_REG as defined in nvml/nvml.h + FI_DEV_ECC_DBE_VOL_REG = 14 + // FI_DEV_ECC_SBE_VOL_TEX as defined in nvml/nvml.h + FI_DEV_ECC_SBE_VOL_TEX = 15 + // FI_DEV_ECC_DBE_VOL_TEX as defined in nvml/nvml.h + FI_DEV_ECC_DBE_VOL_TEX = 16 + // FI_DEV_ECC_DBE_VOL_CBU as defined in nvml/nvml.h + FI_DEV_ECC_DBE_VOL_CBU = 17 + // FI_DEV_ECC_SBE_AGG_L1 as defined in nvml/nvml.h + FI_DEV_ECC_SBE_AGG_L1 = 18 + // FI_DEV_ECC_DBE_AGG_L1 as defined in nvml/nvml.h + FI_DEV_ECC_DBE_AGG_L1 = 19 + // FI_DEV_ECC_SBE_AGG_L2 as defined in nvml/nvml.h + FI_DEV_ECC_SBE_AGG_L2 = 20 + // FI_DEV_ECC_DBE_AGG_L2 as defined in nvml/nvml.h + FI_DEV_ECC_DBE_AGG_L2 = 21 + // FI_DEV_ECC_SBE_AGG_DEV as defined in nvml/nvml.h + FI_DEV_ECC_SBE_AGG_DEV = 22 + // FI_DEV_ECC_DBE_AGG_DEV as defined in nvml/nvml.h + FI_DEV_ECC_DBE_AGG_DEV = 23 + // FI_DEV_ECC_SBE_AGG_REG as defined in nvml/nvml.h + FI_DEV_ECC_SBE_AGG_REG = 24 + // FI_DEV_ECC_DBE_AGG_REG as defined in nvml/nvml.h + FI_DEV_ECC_DBE_AGG_REG = 25 + // FI_DEV_ECC_SBE_AGG_TEX as defined in nvml/nvml.h + FI_DEV_ECC_SBE_AGG_TEX = 26 + // FI_DEV_ECC_DBE_AGG_TEX as defined in nvml/nvml.h + FI_DEV_ECC_DBE_AGG_TEX = 27 + // FI_DEV_ECC_DBE_AGG_CBU as defined in nvml/nvml.h + FI_DEV_ECC_DBE_AGG_CBU = 28 + // FI_DEV_RETIRED_SBE as defined in nvml/nvml.h + FI_DEV_RETIRED_SBE = 29 + // FI_DEV_RETIRED_DBE as defined in nvml/nvml.h + FI_DEV_RETIRED_DBE = 30 + // FI_DEV_RETIRED_PENDING as defined in nvml/nvml.h + FI_DEV_RETIRED_PENDING = 31 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L0 = 32 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L1 = 33 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L2 = 34 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L3 = 35 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L4 = 36 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L5 = 37 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_TOTAL as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_TOTAL = 38 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L0 = 39 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L1 = 40 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L2 = 41 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L3 = 42 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L4 = 43 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L5 = 44 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_TOTAL as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_TOTAL = 45 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L0 = 46 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L1 = 47 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L2 = 48 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L3 = 49 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L4 = 50 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L5 = 51 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_TOTAL as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_TOTAL = 52 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L0 = 53 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L1 = 54 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L2 = 55 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L3 = 56 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L4 = 57 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L5 = 58 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_TOTAL as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_TOTAL = 59 + // FI_DEV_NVLINK_BANDWIDTH_C0_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L0 = 60 + // FI_DEV_NVLINK_BANDWIDTH_C0_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L1 = 61 + // FI_DEV_NVLINK_BANDWIDTH_C0_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L2 = 62 + // FI_DEV_NVLINK_BANDWIDTH_C0_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L3 = 63 + // FI_DEV_NVLINK_BANDWIDTH_C0_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L4 = 64 + // FI_DEV_NVLINK_BANDWIDTH_C0_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L5 = 65 + // FI_DEV_NVLINK_BANDWIDTH_C0_TOTAL as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_TOTAL = 66 + // FI_DEV_NVLINK_BANDWIDTH_C1_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L0 = 67 + // FI_DEV_NVLINK_BANDWIDTH_C1_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L1 = 68 + // FI_DEV_NVLINK_BANDWIDTH_C1_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L2 = 69 + // FI_DEV_NVLINK_BANDWIDTH_C1_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L3 = 70 + // FI_DEV_NVLINK_BANDWIDTH_C1_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L4 = 71 + // FI_DEV_NVLINK_BANDWIDTH_C1_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L5 = 72 + // FI_DEV_NVLINK_BANDWIDTH_C1_TOTAL as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_TOTAL = 73 + // FI_DEV_PERF_POLICY_POWER as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_POWER = 74 + // FI_DEV_PERF_POLICY_THERMAL as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_THERMAL = 75 + // FI_DEV_PERF_POLICY_SYNC_BOOST as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_SYNC_BOOST = 76 + // FI_DEV_PERF_POLICY_BOARD_LIMIT as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_BOARD_LIMIT = 77 + // FI_DEV_PERF_POLICY_LOW_UTILIZATION as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_LOW_UTILIZATION = 78 + // FI_DEV_PERF_POLICY_RELIABILITY as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_RELIABILITY = 79 + // FI_DEV_PERF_POLICY_TOTAL_APP_CLOCKS as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_TOTAL_APP_CLOCKS = 80 + // FI_DEV_PERF_POLICY_TOTAL_BASE_CLOCKS as defined in nvml/nvml.h + FI_DEV_PERF_POLICY_TOTAL_BASE_CLOCKS = 81 + // FI_DEV_MEMORY_TEMP as defined in nvml/nvml.h + FI_DEV_MEMORY_TEMP = 82 + // FI_DEV_TOTAL_ENERGY_CONSUMPTION as defined in nvml/nvml.h + FI_DEV_TOTAL_ENERGY_CONSUMPTION = 83 + // FI_DEV_NVLINK_SPEED_MBPS_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L0 = 84 + // FI_DEV_NVLINK_SPEED_MBPS_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L1 = 85 + // FI_DEV_NVLINK_SPEED_MBPS_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L2 = 86 + // FI_DEV_NVLINK_SPEED_MBPS_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L3 = 87 + // FI_DEV_NVLINK_SPEED_MBPS_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L4 = 88 + // FI_DEV_NVLINK_SPEED_MBPS_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L5 = 89 + // FI_DEV_NVLINK_SPEED_MBPS_COMMON as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_COMMON = 90 + // FI_DEV_NVLINK_LINK_COUNT as defined in nvml/nvml.h + FI_DEV_NVLINK_LINK_COUNT = 91 + // FI_DEV_RETIRED_PENDING_SBE as defined in nvml/nvml.h + FI_DEV_RETIRED_PENDING_SBE = 92 + // FI_DEV_RETIRED_PENDING_DBE as defined in nvml/nvml.h + FI_DEV_RETIRED_PENDING_DBE = 93 + // FI_DEV_PCIE_REPLAY_COUNTER as defined in nvml/nvml.h + FI_DEV_PCIE_REPLAY_COUNTER = 94 + // FI_DEV_PCIE_REPLAY_ROLLOVER_COUNTER as defined in nvml/nvml.h + FI_DEV_PCIE_REPLAY_ROLLOVER_COUNTER = 95 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L6 = 96 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L7 = 97 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L8 = 98 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L9 = 99 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L10 = 100 + // FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L11 = 101 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L6 = 102 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L7 = 103 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L8 = 104 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L9 = 105 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L10 = 106 + // FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L11 = 107 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L6 = 108 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L7 = 109 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L8 = 110 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L9 = 111 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L10 = 112 + // FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L11 = 113 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L6 = 114 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L7 = 115 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L8 = 116 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L9 = 117 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L10 = 118 + // FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L11 = 119 + // FI_DEV_NVLINK_BANDWIDTH_C0_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L6 = 120 + // FI_DEV_NVLINK_BANDWIDTH_C0_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L7 = 121 + // FI_DEV_NVLINK_BANDWIDTH_C0_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L8 = 122 + // FI_DEV_NVLINK_BANDWIDTH_C0_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L9 = 123 + // FI_DEV_NVLINK_BANDWIDTH_C0_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L10 = 124 + // FI_DEV_NVLINK_BANDWIDTH_C0_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C0_L11 = 125 + // FI_DEV_NVLINK_BANDWIDTH_C1_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L6 = 126 + // FI_DEV_NVLINK_BANDWIDTH_C1_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L7 = 127 + // FI_DEV_NVLINK_BANDWIDTH_C1_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L8 = 128 + // FI_DEV_NVLINK_BANDWIDTH_C1_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L9 = 129 + // FI_DEV_NVLINK_BANDWIDTH_C1_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L10 = 130 + // FI_DEV_NVLINK_BANDWIDTH_C1_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_BANDWIDTH_C1_L11 = 131 + // FI_DEV_NVLINK_SPEED_MBPS_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L6 = 132 + // FI_DEV_NVLINK_SPEED_MBPS_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L7 = 133 + // FI_DEV_NVLINK_SPEED_MBPS_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L8 = 134 + // FI_DEV_NVLINK_SPEED_MBPS_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L9 = 135 + // FI_DEV_NVLINK_SPEED_MBPS_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L10 = 136 + // FI_DEV_NVLINK_SPEED_MBPS_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_SPEED_MBPS_L11 = 137 + // FI_DEV_NVLINK_THROUGHPUT_DATA_TX as defined in nvml/nvml.h + FI_DEV_NVLINK_THROUGHPUT_DATA_TX = 138 + // FI_DEV_NVLINK_THROUGHPUT_DATA_RX as defined in nvml/nvml.h + FI_DEV_NVLINK_THROUGHPUT_DATA_RX = 139 + // FI_DEV_NVLINK_THROUGHPUT_RAW_TX as defined in nvml/nvml.h + FI_DEV_NVLINK_THROUGHPUT_RAW_TX = 140 + // FI_DEV_NVLINK_THROUGHPUT_RAW_RX as defined in nvml/nvml.h + FI_DEV_NVLINK_THROUGHPUT_RAW_RX = 141 + // FI_DEV_REMAPPED_COR as defined in nvml/nvml.h + FI_DEV_REMAPPED_COR = 142 + // FI_DEV_REMAPPED_UNC as defined in nvml/nvml.h + FI_DEV_REMAPPED_UNC = 143 + // FI_DEV_REMAPPED_PENDING as defined in nvml/nvml.h + FI_DEV_REMAPPED_PENDING = 144 + // FI_DEV_REMAPPED_FAILURE as defined in nvml/nvml.h + FI_DEV_REMAPPED_FAILURE = 145 + // FI_DEV_NVLINK_REMOTE_NVLINK_ID as defined in nvml/nvml.h + FI_DEV_NVLINK_REMOTE_NVLINK_ID = 146 + // FI_DEV_NVSWITCH_CONNECTED_LINK_COUNT as defined in nvml/nvml.h + FI_DEV_NVSWITCH_CONNECTED_LINK_COUNT = 147 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L0 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L0 = 148 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L1 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L1 = 149 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L2 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L2 = 150 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L3 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L3 = 151 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L4 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L4 = 152 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L5 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L5 = 153 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L6 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L6 = 154 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L7 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L7 = 155 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L8 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L8 = 156 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L9 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L9 = 157 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L10 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L10 = 158 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L11 as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L11 = 159 + // FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_TOTAL as defined in nvml/nvml.h + FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_TOTAL = 160 + // FI_DEV_NVLINK_ERROR_DL_REPLAY as defined in nvml/nvml.h + FI_DEV_NVLINK_ERROR_DL_REPLAY = 161 + // FI_DEV_NVLINK_ERROR_DL_RECOVERY as defined in nvml/nvml.h + FI_DEV_NVLINK_ERROR_DL_RECOVERY = 162 + // FI_DEV_NVLINK_ERROR_DL_CRC as defined in nvml/nvml.h + FI_DEV_NVLINK_ERROR_DL_CRC = 163 + // FI_DEV_NVLINK_GET_SPEED as defined in nvml/nvml.h + FI_DEV_NVLINK_GET_SPEED = 164 + // FI_DEV_NVLINK_GET_STATE as defined in nvml/nvml.h + FI_DEV_NVLINK_GET_STATE = 165 + // FI_DEV_NVLINK_GET_VERSION as defined in nvml/nvml.h + FI_DEV_NVLINK_GET_VERSION = 166 + // FI_DEV_NVLINK_GET_POWER_STATE as defined in nvml/nvml.h + FI_DEV_NVLINK_GET_POWER_STATE = 167 + // FI_DEV_NVLINK_GET_POWER_THRESHOLD as defined in nvml/nvml.h + FI_DEV_NVLINK_GET_POWER_THRESHOLD = 168 + // FI_DEV_PCIE_L0_TO_RECOVERY_COUNTER as defined in nvml/nvml.h + FI_DEV_PCIE_L0_TO_RECOVERY_COUNTER = 169 + // FI_MAX as defined in nvml/nvml.h + FI_MAX = 170 + // EventTypeSingleBitEccError as defined in nvml/nvml.h + EventTypeSingleBitEccError = 1 + // EventTypeDoubleBitEccError as defined in nvml/nvml.h + EventTypeDoubleBitEccError = 2 + // EventTypePState as defined in nvml/nvml.h + EventTypePState = 4 + // EventTypeXidCriticalError as defined in nvml/nvml.h + EventTypeXidCriticalError = 8 + // EventTypeClock as defined in nvml/nvml.h + EventTypeClock = 16 + // EventTypePowerSourceChange as defined in nvml/nvml.h + EventTypePowerSourceChange = 128 + // EventMigConfigChange as defined in nvml/nvml.h + EventMigConfigChange = 256 + // EventTypeNone as defined in nvml/nvml.h + EventTypeNone = 0 + // EventTypeAll as defined in nvml/nvml.h + EventTypeAll = 415 + // ClocksThrottleReasonGpuIdle as defined in nvml/nvml.h + ClocksThrottleReasonGpuIdle = 1 + // ClocksThrottleReasonApplicationsClocksSetting as defined in nvml/nvml.h + ClocksThrottleReasonApplicationsClocksSetting = 2 + // ClocksThrottleReasonUserDefinedClocks as defined in nvml/nvml.h + ClocksThrottleReasonUserDefinedClocks = 2 + // ClocksThrottleReasonSwPowerCap as defined in nvml/nvml.h + ClocksThrottleReasonSwPowerCap = 4 + // ClocksThrottleReasonHwSlowdown as defined in nvml/nvml.h + ClocksThrottleReasonHwSlowdown = 8 + // ClocksThrottleReasonSyncBoost as defined in nvml/nvml.h + ClocksThrottleReasonSyncBoost = 16 + // ClocksThrottleReasonSwThermalSlowdown as defined in nvml/nvml.h + ClocksThrottleReasonSwThermalSlowdown = 32 + // ClocksThrottleReasonHwThermalSlowdown as defined in nvml/nvml.h + ClocksThrottleReasonHwThermalSlowdown = 64 + // ClocksThrottleReasonHwPowerBrakeSlowdown as defined in nvml/nvml.h + ClocksThrottleReasonHwPowerBrakeSlowdown = 128 + // ClocksThrottleReasonDisplayClockSetting as defined in nvml/nvml.h + ClocksThrottleReasonDisplayClockSetting = 256 + // ClocksThrottleReasonNone as defined in nvml/nvml.h + ClocksThrottleReasonNone = 0 + // ClocksThrottleReasonAll as defined in nvml/nvml.h + ClocksThrottleReasonAll = 511 + // NVFBC_SESSION_FLAG_DIFFMAP_ENABLED as defined in nvml/nvml.h + NVFBC_SESSION_FLAG_DIFFMAP_ENABLED = 1 + // NVFBC_SESSION_FLAG_CLASSIFICATIONMAP_ENABLED as defined in nvml/nvml.h + NVFBC_SESSION_FLAG_CLASSIFICATIONMAP_ENABLED = 2 + // NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_NO_WAIT as defined in nvml/nvml.h + NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_NO_WAIT = 4 + // NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_INFINITE as defined in nvml/nvml.h + NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_INFINITE = 8 + // NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_TIMEOUT as defined in nvml/nvml.h + NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_TIMEOUT = 16 + // GPU_FABRIC_UUID_LEN as defined in nvml/nvml.h + GPU_FABRIC_UUID_LEN = 16 + // GPU_FABRIC_STATE_NOT_SUPPORTED as defined in nvml/nvml.h + GPU_FABRIC_STATE_NOT_SUPPORTED = 0 + // GPU_FABRIC_STATE_NOT_STARTED as defined in nvml/nvml.h + GPU_FABRIC_STATE_NOT_STARTED = 1 + // GPU_FABRIC_STATE_IN_PROGRESS as defined in nvml/nvml.h + GPU_FABRIC_STATE_IN_PROGRESS = 2 + // GPU_FABRIC_STATE_COMPLETED as defined in nvml/nvml.h + GPU_FABRIC_STATE_COMPLETED = 3 + // INIT_FLAG_NO_GPUS as defined in nvml/nvml.h + INIT_FLAG_NO_GPUS = 1 + // INIT_FLAG_NO_ATTACH as defined in nvml/nvml.h + INIT_FLAG_NO_ATTACH = 2 + // DEVICE_INFOROM_VERSION_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_INFOROM_VERSION_BUFFER_SIZE = 16 + // DEVICE_UUID_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_UUID_BUFFER_SIZE = 80 + // DEVICE_UUID_V2_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_UUID_V2_BUFFER_SIZE = 96 + // DEVICE_PART_NUMBER_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_PART_NUMBER_BUFFER_SIZE = 80 + // SYSTEM_DRIVER_VERSION_BUFFER_SIZE as defined in nvml/nvml.h + SYSTEM_DRIVER_VERSION_BUFFER_SIZE = 80 + // SYSTEM_NVML_VERSION_BUFFER_SIZE as defined in nvml/nvml.h + SYSTEM_NVML_VERSION_BUFFER_SIZE = 80 + // DEVICE_NAME_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_NAME_BUFFER_SIZE = 64 + // DEVICE_NAME_V2_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_NAME_V2_BUFFER_SIZE = 96 + // DEVICE_SERIAL_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_SERIAL_BUFFER_SIZE = 30 + // DEVICE_VBIOS_VERSION_BUFFER_SIZE as defined in nvml/nvml.h + DEVICE_VBIOS_VERSION_BUFFER_SIZE = 32 + // AFFINITY_SCOPE_NODE as defined in nvml/nvml.h + AFFINITY_SCOPE_NODE = 0 + // AFFINITY_SCOPE_SOCKET as defined in nvml/nvml.h + AFFINITY_SCOPE_SOCKET = 1 + // DEVICE_MIG_DISABLE as defined in nvml/nvml.h + DEVICE_MIG_DISABLE = 0 + // DEVICE_MIG_ENABLE as defined in nvml/nvml.h + DEVICE_MIG_ENABLE = 1 + // GPU_INSTANCE_PROFILE_1_SLICE as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_1_SLICE = 0 + // GPU_INSTANCE_PROFILE_2_SLICE as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_2_SLICE = 1 + // GPU_INSTANCE_PROFILE_3_SLICE as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_3_SLICE = 2 + // GPU_INSTANCE_PROFILE_4_SLICE as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_4_SLICE = 3 + // GPU_INSTANCE_PROFILE_7_SLICE as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_7_SLICE = 4 + // GPU_INSTANCE_PROFILE_8_SLICE as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_8_SLICE = 5 + // GPU_INSTANCE_PROFILE_6_SLICE as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_6_SLICE = 6 + // GPU_INSTANCE_PROFILE_1_SLICE_REV1 as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_1_SLICE_REV1 = 7 + // GPU_INSTANCE_PROFILE_2_SLICE_REV1 as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_2_SLICE_REV1 = 8 + // GPU_INSTANCE_PROFILE_1_SLICE_REV2 as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_1_SLICE_REV2 = 9 + // GPU_INSTANCE_PROFILE_COUNT as defined in nvml/nvml.h + GPU_INSTANCE_PROFILE_COUNT = 10 + // COMPUTE_INSTANCE_PROFILE_1_SLICE as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_1_SLICE = 0 + // COMPUTE_INSTANCE_PROFILE_2_SLICE as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_2_SLICE = 1 + // COMPUTE_INSTANCE_PROFILE_3_SLICE as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_3_SLICE = 2 + // COMPUTE_INSTANCE_PROFILE_4_SLICE as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_4_SLICE = 3 + // COMPUTE_INSTANCE_PROFILE_7_SLICE as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_7_SLICE = 4 + // COMPUTE_INSTANCE_PROFILE_8_SLICE as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_8_SLICE = 5 + // COMPUTE_INSTANCE_PROFILE_6_SLICE as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_6_SLICE = 6 + // COMPUTE_INSTANCE_PROFILE_1_SLICE_REV1 as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_1_SLICE_REV1 = 7 + // COMPUTE_INSTANCE_PROFILE_COUNT as defined in nvml/nvml.h + COMPUTE_INSTANCE_PROFILE_COUNT = 8 + // COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED as defined in nvml/nvml.h + COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED = 0 + // COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT as defined in nvml/nvml.h + COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT = 1 + // GPM_METRICS_GET_VERSION as defined in nvml/nvml.h + GPM_METRICS_GET_VERSION = 1 + // GPM_SUPPORT_VERSION as defined in nvml/nvml.h + GPM_SUPPORT_VERSION = 1 + // COUNTER_COLLECTION_UNIT_STREAM_STATE_DISABLE as defined in nvml/nvml.h + COUNTER_COLLECTION_UNIT_STREAM_STATE_DISABLE = 0 + // COUNTER_COLLECTION_UNIT_STREAM_STATE_ENABLE as defined in nvml/nvml.h + COUNTER_COLLECTION_UNIT_STREAM_STATE_ENABLE = 1 + // NVLINK_POWER_STATE_HIGH_SPEED as defined in nvml/nvml.h + NVLINK_POWER_STATE_HIGH_SPEED = 0 + // NVLINK_POWER_STATE_LOW as defined in nvml/nvml.h + NVLINK_POWER_STATE_LOW = 1 + // NVLINK_LOW_POWER_THRESHOLD_MIN as defined in nvml/nvml.h + NVLINK_LOW_POWER_THRESHOLD_MIN = 1 + // NVLINK_LOW_POWER_THRESHOLD_MAX as defined in nvml/nvml.h + NVLINK_LOW_POWER_THRESHOLD_MAX = 8191 + // NVLINK_LOW_POWER_THRESHOLD_RESET as defined in nvml/nvml.h + NVLINK_LOW_POWER_THRESHOLD_RESET = 4294967295 +) + +// BridgeChipType as declared in nvml/nvml.h +type BridgeChipType int32 + +// BridgeChipType enumeration from nvml/nvml.h +const ( + BRIDGE_CHIP_PLX BridgeChipType = iota + BRIDGE_CHIP_BRO4 BridgeChipType = 1 +) + +// NvLinkUtilizationCountUnits as declared in nvml/nvml.h +type NvLinkUtilizationCountUnits int32 + +// NvLinkUtilizationCountUnits enumeration from nvml/nvml.h +const ( + NVLINK_COUNTER_UNIT_CYCLES NvLinkUtilizationCountUnits = iota + NVLINK_COUNTER_UNIT_PACKETS NvLinkUtilizationCountUnits = 1 + NVLINK_COUNTER_UNIT_BYTES NvLinkUtilizationCountUnits = 2 + NVLINK_COUNTER_UNIT_RESERVED NvLinkUtilizationCountUnits = 3 + NVLINK_COUNTER_UNIT_COUNT NvLinkUtilizationCountUnits = 4 +) + +// NvLinkUtilizationCountPktTypes as declared in nvml/nvml.h +type NvLinkUtilizationCountPktTypes int32 + +// NvLinkUtilizationCountPktTypes enumeration from nvml/nvml.h +const ( + NVLINK_COUNTER_PKTFILTER_NOP NvLinkUtilizationCountPktTypes = 1 + NVLINK_COUNTER_PKTFILTER_READ NvLinkUtilizationCountPktTypes = 2 + NVLINK_COUNTER_PKTFILTER_WRITE NvLinkUtilizationCountPktTypes = 4 + NVLINK_COUNTER_PKTFILTER_RATOM NvLinkUtilizationCountPktTypes = 8 + NVLINK_COUNTER_PKTFILTER_NRATOM NvLinkUtilizationCountPktTypes = 16 + NVLINK_COUNTER_PKTFILTER_FLUSH NvLinkUtilizationCountPktTypes = 32 + NVLINK_COUNTER_PKTFILTER_RESPDATA NvLinkUtilizationCountPktTypes = 64 + NVLINK_COUNTER_PKTFILTER_RESPNODATA NvLinkUtilizationCountPktTypes = 128 + NVLINK_COUNTER_PKTFILTER_ALL NvLinkUtilizationCountPktTypes = 255 +) + +// NvLinkCapability as declared in nvml/nvml.h +type NvLinkCapability int32 + +// NvLinkCapability enumeration from nvml/nvml.h +const ( + NVLINK_CAP_P2P_SUPPORTED NvLinkCapability = iota + NVLINK_CAP_SYSMEM_ACCESS NvLinkCapability = 1 + NVLINK_CAP_P2P_ATOMICS NvLinkCapability = 2 + NVLINK_CAP_SYSMEM_ATOMICS NvLinkCapability = 3 + NVLINK_CAP_SLI_BRIDGE NvLinkCapability = 4 + NVLINK_CAP_VALID NvLinkCapability = 5 + NVLINK_CAP_COUNT NvLinkCapability = 6 +) + +// NvLinkErrorCounter as declared in nvml/nvml.h +type NvLinkErrorCounter int32 + +// NvLinkErrorCounter enumeration from nvml/nvml.h +const ( + NVLINK_ERROR_DL_REPLAY NvLinkErrorCounter = iota + NVLINK_ERROR_DL_RECOVERY NvLinkErrorCounter = 1 + NVLINK_ERROR_DL_CRC_FLIT NvLinkErrorCounter = 2 + NVLINK_ERROR_DL_CRC_DATA NvLinkErrorCounter = 3 + NVLINK_ERROR_DL_ECC_DATA NvLinkErrorCounter = 4 + NVLINK_ERROR_COUNT NvLinkErrorCounter = 5 +) + +// IntNvLinkDeviceType as declared in nvml/nvml.h +type IntNvLinkDeviceType int32 + +// IntNvLinkDeviceType enumeration from nvml/nvml.h +const ( + NVLINK_DEVICE_TYPE_GPU IntNvLinkDeviceType = iota + NVLINK_DEVICE_TYPE_IBMNPU IntNvLinkDeviceType = 1 + NVLINK_DEVICE_TYPE_SWITCH IntNvLinkDeviceType = 2 + NVLINK_DEVICE_TYPE_UNKNOWN IntNvLinkDeviceType = 255 +) + +// GpuTopologyLevel as declared in nvml/nvml.h +type GpuTopologyLevel int32 + +// GpuTopologyLevel enumeration from nvml/nvml.h +const ( + TOPOLOGY_INTERNAL GpuTopologyLevel = iota + TOPOLOGY_SINGLE GpuTopologyLevel = 10 + TOPOLOGY_MULTIPLE GpuTopologyLevel = 20 + TOPOLOGY_HOSTBRIDGE GpuTopologyLevel = 30 + TOPOLOGY_NODE GpuTopologyLevel = 40 + TOPOLOGY_SYSTEM GpuTopologyLevel = 50 +) + +// GpuP2PStatus as declared in nvml/nvml.h +type GpuP2PStatus int32 + +// GpuP2PStatus enumeration from nvml/nvml.h +const ( + P2P_STATUS_OK GpuP2PStatus = iota + P2P_STATUS_CHIPSET_NOT_SUPPORED GpuP2PStatus = 1 + P2P_STATUS_GPU_NOT_SUPPORTED GpuP2PStatus = 2 + P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED GpuP2PStatus = 3 + P2P_STATUS_DISABLED_BY_REGKEY GpuP2PStatus = 4 + P2P_STATUS_NOT_SUPPORTED GpuP2PStatus = 5 + P2P_STATUS_UNKNOWN GpuP2PStatus = 6 +) + +// GpuP2PCapsIndex as declared in nvml/nvml.h +type GpuP2PCapsIndex int32 + +// GpuP2PCapsIndex enumeration from nvml/nvml.h +const ( + P2P_CAPS_INDEX_READ GpuP2PCapsIndex = iota + P2P_CAPS_INDEX_WRITE GpuP2PCapsIndex = 1 + P2P_CAPS_INDEX_NVLINK GpuP2PCapsIndex = 2 + P2P_CAPS_INDEX_ATOMICS GpuP2PCapsIndex = 3 + P2P_CAPS_INDEX_PROP GpuP2PCapsIndex = 4 + P2P_CAPS_INDEX_UNKNOWN GpuP2PCapsIndex = 5 +) + +// SamplingType as declared in nvml/nvml.h +type SamplingType int32 + +// SamplingType enumeration from nvml/nvml.h +const ( + TOTAL_POWER_SAMPLES SamplingType = iota + GPU_UTILIZATION_SAMPLES SamplingType = 1 + MEMORY_UTILIZATION_SAMPLES SamplingType = 2 + ENC_UTILIZATION_SAMPLES SamplingType = 3 + DEC_UTILIZATION_SAMPLES SamplingType = 4 + PROCESSOR_CLK_SAMPLES SamplingType = 5 + MEMORY_CLK_SAMPLES SamplingType = 6 + SAMPLINGTYPE_COUNT SamplingType = 7 +) + +// PcieUtilCounter as declared in nvml/nvml.h +type PcieUtilCounter int32 + +// PcieUtilCounter enumeration from nvml/nvml.h +const ( + PCIE_UTIL_TX_BYTES PcieUtilCounter = iota + PCIE_UTIL_RX_BYTES PcieUtilCounter = 1 + PCIE_UTIL_COUNT PcieUtilCounter = 2 +) + +// ValueType as declared in nvml/nvml.h +type ValueType int32 + +// ValueType enumeration from nvml/nvml.h +const ( + VALUE_TYPE_DOUBLE ValueType = iota + VALUE_TYPE_UNSIGNED_INT ValueType = 1 + VALUE_TYPE_UNSIGNED_LONG ValueType = 2 + VALUE_TYPE_UNSIGNED_LONG_LONG ValueType = 3 + VALUE_TYPE_SIGNED_LONG_LONG ValueType = 4 + VALUE_TYPE_COUNT ValueType = 5 +) + +// PerfPolicyType as declared in nvml/nvml.h +type PerfPolicyType int32 + +// PerfPolicyType enumeration from nvml/nvml.h +const ( + PERF_POLICY_POWER PerfPolicyType = iota + PERF_POLICY_THERMAL PerfPolicyType = 1 + PERF_POLICY_SYNC_BOOST PerfPolicyType = 2 + PERF_POLICY_BOARD_LIMIT PerfPolicyType = 3 + PERF_POLICY_LOW_UTILIZATION PerfPolicyType = 4 + PERF_POLICY_RELIABILITY PerfPolicyType = 5 + PERF_POLICY_TOTAL_APP_CLOCKS PerfPolicyType = 10 + PERF_POLICY_TOTAL_BASE_CLOCKS PerfPolicyType = 11 + PERF_POLICY_COUNT PerfPolicyType = 12 +) + +// EnableState as declared in nvml/nvml.h +type EnableState int32 + +// EnableState enumeration from nvml/nvml.h +const ( + FEATURE_DISABLED EnableState = iota + FEATURE_ENABLED EnableState = 1 +) + +// BrandType as declared in nvml/nvml.h +type BrandType int32 + +// BrandType enumeration from nvml/nvml.h +const ( + BRAND_UNKNOWN BrandType = iota + BRAND_QUADRO BrandType = 1 + BRAND_TESLA BrandType = 2 + BRAND_NVS BrandType = 3 + BRAND_GRID BrandType = 4 + BRAND_GEFORCE BrandType = 5 + BRAND_TITAN BrandType = 6 + BRAND_NVIDIA_VAPPS BrandType = 7 + BRAND_NVIDIA_VPC BrandType = 8 + BRAND_NVIDIA_VCS BrandType = 9 + BRAND_NVIDIA_VWS BrandType = 10 + BRAND_NVIDIA_CLOUD_GAMING BrandType = 11 + BRAND_NVIDIA_VGAMING BrandType = 11 + BRAND_QUADRO_RTX BrandType = 12 + BRAND_NVIDIA_RTX BrandType = 13 + BRAND_NVIDIA BrandType = 14 + BRAND_GEFORCE_RTX BrandType = 15 + BRAND_TITAN_RTX BrandType = 16 + BRAND_COUNT BrandType = 17 +) + +// TemperatureThresholds as declared in nvml/nvml.h +type TemperatureThresholds int32 + +// TemperatureThresholds enumeration from nvml/nvml.h +const ( + TEMPERATURE_THRESHOLD_SHUTDOWN TemperatureThresholds = iota + TEMPERATURE_THRESHOLD_SLOWDOWN TemperatureThresholds = 1 + TEMPERATURE_THRESHOLD_MEM_MAX TemperatureThresholds = 2 + TEMPERATURE_THRESHOLD_GPU_MAX TemperatureThresholds = 3 + TEMPERATURE_THRESHOLD_ACOUSTIC_MIN TemperatureThresholds = 4 + TEMPERATURE_THRESHOLD_ACOUSTIC_CURR TemperatureThresholds = 5 + TEMPERATURE_THRESHOLD_ACOUSTIC_MAX TemperatureThresholds = 6 + TEMPERATURE_THRESHOLD_COUNT TemperatureThresholds = 7 +) + +// TemperatureSensors as declared in nvml/nvml.h +type TemperatureSensors int32 + +// TemperatureSensors enumeration from nvml/nvml.h +const ( + TEMPERATURE_GPU TemperatureSensors = iota + TEMPERATURE_COUNT TemperatureSensors = 1 +) + +// ComputeMode as declared in nvml/nvml.h +type ComputeMode int32 + +// ComputeMode enumeration from nvml/nvml.h +const ( + COMPUTEMODE_DEFAULT ComputeMode = iota + COMPUTEMODE_EXCLUSIVE_THREAD ComputeMode = 1 + COMPUTEMODE_PROHIBITED ComputeMode = 2 + COMPUTEMODE_EXCLUSIVE_PROCESS ComputeMode = 3 + COMPUTEMODE_COUNT ComputeMode = 4 +) + +// MemoryErrorType as declared in nvml/nvml.h +type MemoryErrorType int32 + +// MemoryErrorType enumeration from nvml/nvml.h +const ( + MEMORY_ERROR_TYPE_CORRECTED MemoryErrorType = iota + MEMORY_ERROR_TYPE_UNCORRECTED MemoryErrorType = 1 + MEMORY_ERROR_TYPE_COUNT MemoryErrorType = 2 +) + +// EccCounterType as declared in nvml/nvml.h +type EccCounterType int32 + +// EccCounterType enumeration from nvml/nvml.h +const ( + VOLATILE_ECC EccCounterType = iota + AGGREGATE_ECC EccCounterType = 1 + ECC_COUNTER_TYPE_COUNT EccCounterType = 2 +) + +// ClockType as declared in nvml/nvml.h +type ClockType int32 + +// ClockType enumeration from nvml/nvml.h +const ( + CLOCK_GRAPHICS ClockType = iota + CLOCK_SM ClockType = 1 + CLOCK_MEM ClockType = 2 + CLOCK_VIDEO ClockType = 3 + CLOCK_COUNT ClockType = 4 +) + +// ClockId as declared in nvml/nvml.h +type ClockId int32 + +// ClockId enumeration from nvml/nvml.h +const ( + CLOCK_ID_CURRENT ClockId = iota + CLOCK_ID_APP_CLOCK_TARGET ClockId = 1 + CLOCK_ID_APP_CLOCK_DEFAULT ClockId = 2 + CLOCK_ID_CUSTOMER_BOOST_MAX ClockId = 3 + CLOCK_ID_COUNT ClockId = 4 +) + +// DriverModel as declared in nvml/nvml.h +type DriverModel int32 + +// DriverModel enumeration from nvml/nvml.h +const ( + DRIVER_WDDM DriverModel = iota + DRIVER_WDM DriverModel = 1 +) + +// Pstates as declared in nvml/nvml.h +type Pstates int32 + +// Pstates enumeration from nvml/nvml.h +const ( + PSTATE_0 Pstates = iota + PSTATE_1 Pstates = 1 + PSTATE_2 Pstates = 2 + PSTATE_3 Pstates = 3 + PSTATE_4 Pstates = 4 + PSTATE_5 Pstates = 5 + PSTATE_6 Pstates = 6 + PSTATE_7 Pstates = 7 + PSTATE_8 Pstates = 8 + PSTATE_9 Pstates = 9 + PSTATE_10 Pstates = 10 + PSTATE_11 Pstates = 11 + PSTATE_12 Pstates = 12 + PSTATE_13 Pstates = 13 + PSTATE_14 Pstates = 14 + PSTATE_15 Pstates = 15 + PSTATE_UNKNOWN Pstates = 32 +) + +// GpuOperationMode as declared in nvml/nvml.h +type GpuOperationMode int32 + +// GpuOperationMode enumeration from nvml/nvml.h +const ( + GOM_ALL_ON GpuOperationMode = iota + GOM_COMPUTE GpuOperationMode = 1 + GOM_LOW_DP GpuOperationMode = 2 +) + +// InforomObject as declared in nvml/nvml.h +type InforomObject int32 + +// InforomObject enumeration from nvml/nvml.h +const ( + INFOROM_OEM InforomObject = iota + INFOROM_ECC InforomObject = 1 + INFOROM_POWER InforomObject = 2 + INFOROM_COUNT InforomObject = 3 +) + +// Return as declared in nvml/nvml.h +type Return int32 + +// Return enumeration from nvml/nvml.h +const ( + SUCCESS Return = iota + ERROR_UNINITIALIZED Return = 1 + ERROR_INVALID_ARGUMENT Return = 2 + ERROR_NOT_SUPPORTED Return = 3 + ERROR_NO_PERMISSION Return = 4 + ERROR_ALREADY_INITIALIZED Return = 5 + ERROR_NOT_FOUND Return = 6 + ERROR_INSUFFICIENT_SIZE Return = 7 + ERROR_INSUFFICIENT_POWER Return = 8 + ERROR_DRIVER_NOT_LOADED Return = 9 + ERROR_TIMEOUT Return = 10 + ERROR_IRQ_ISSUE Return = 11 + ERROR_LIBRARY_NOT_FOUND Return = 12 + ERROR_FUNCTION_NOT_FOUND Return = 13 + ERROR_CORRUPTED_INFOROM Return = 14 + ERROR_GPU_IS_LOST Return = 15 + ERROR_RESET_REQUIRED Return = 16 + ERROR_OPERATING_SYSTEM Return = 17 + ERROR_LIB_RM_VERSION_MISMATCH Return = 18 + ERROR_IN_USE Return = 19 + ERROR_MEMORY Return = 20 + ERROR_NO_DATA Return = 21 + ERROR_VGPU_ECC_NOT_SUPPORTED Return = 22 + ERROR_INSUFFICIENT_RESOURCES Return = 23 + ERROR_FREQ_NOT_SUPPORTED Return = 24 + ERROR_ARGUMENT_VERSION_MISMATCH Return = 25 + ERROR_DEPRECATED Return = 26 + ERROR_UNKNOWN Return = 999 +) + +// MemoryLocation as declared in nvml/nvml.h +type MemoryLocation int32 + +// MemoryLocation enumeration from nvml/nvml.h +const ( + MEMORY_LOCATION_L1_CACHE MemoryLocation = iota + MEMORY_LOCATION_L2_CACHE MemoryLocation = 1 + MEMORY_LOCATION_DRAM MemoryLocation = 2 + MEMORY_LOCATION_DEVICE_MEMORY MemoryLocation = 2 + MEMORY_LOCATION_REGISTER_FILE MemoryLocation = 3 + MEMORY_LOCATION_TEXTURE_MEMORY MemoryLocation = 4 + MEMORY_LOCATION_TEXTURE_SHM MemoryLocation = 5 + MEMORY_LOCATION_CBU MemoryLocation = 6 + MEMORY_LOCATION_SRAM MemoryLocation = 7 + MEMORY_LOCATION_COUNT MemoryLocation = 8 +) + +// PageRetirementCause as declared in nvml/nvml.h +type PageRetirementCause int32 + +// PageRetirementCause enumeration from nvml/nvml.h +const ( + PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS PageRetirementCause = iota + PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR PageRetirementCause = 1 + PAGE_RETIREMENT_CAUSE_COUNT PageRetirementCause = 2 +) + +// RestrictedAPI as declared in nvml/nvml.h +type RestrictedAPI int32 + +// RestrictedAPI enumeration from nvml/nvml.h +const ( + RESTRICTED_API_SET_APPLICATION_CLOCKS RestrictedAPI = iota + RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS RestrictedAPI = 1 + RESTRICTED_API_COUNT RestrictedAPI = 2 +) + +// GpuVirtualizationMode as declared in nvml/nvml.h +type GpuVirtualizationMode int32 + +// GpuVirtualizationMode enumeration from nvml/nvml.h +const ( + GPU_VIRTUALIZATION_MODE_NONE GpuVirtualizationMode = iota + GPU_VIRTUALIZATION_MODE_PASSTHROUGH GpuVirtualizationMode = 1 + GPU_VIRTUALIZATION_MODE_VGPU GpuVirtualizationMode = 2 + GPU_VIRTUALIZATION_MODE_HOST_VGPU GpuVirtualizationMode = 3 + GPU_VIRTUALIZATION_MODE_HOST_VSGA GpuVirtualizationMode = 4 +) + +// HostVgpuMode as declared in nvml/nvml.h +type HostVgpuMode int32 + +// HostVgpuMode enumeration from nvml/nvml.h +const ( + HOST_VGPU_MODE_NON_SRIOV HostVgpuMode = iota + HOST_VGPU_MODE_SRIOV HostVgpuMode = 1 +) + +// VgpuVmIdType as declared in nvml/nvml.h +type VgpuVmIdType int32 + +// VgpuVmIdType enumeration from nvml/nvml.h +const ( + VGPU_VM_ID_DOMAIN_ID VgpuVmIdType = iota + VGPU_VM_ID_UUID VgpuVmIdType = 1 +) + +// VgpuGuestInfoState as declared in nvml/nvml.h +type VgpuGuestInfoState int32 + +// VgpuGuestInfoState enumeration from nvml/nvml.h +const ( + VGPU_INSTANCE_GUEST_INFO_STATE_UNINITIALIZED VgpuGuestInfoState = iota + VGPU_INSTANCE_GUEST_INFO_STATE_INITIALIZED VgpuGuestInfoState = 1 +) + +// VgpuCapability as declared in nvml/nvml.h +type VgpuCapability int32 + +// VgpuCapability enumeration from nvml/nvml.h +const ( + VGPU_CAP_NVLINK_P2P VgpuCapability = iota + VGPU_CAP_GPUDIRECT VgpuCapability = 1 + VGPU_CAP_MULTI_VGPU_EXCLUSIVE VgpuCapability = 2 + VGPU_CAP_EXCLUSIVE_TYPE VgpuCapability = 3 + VGPU_CAP_EXCLUSIVE_SIZE VgpuCapability = 4 + VGPU_CAP_COUNT VgpuCapability = 5 +) + +// VgpuDriverCapability as declared in nvml/nvml.h +type VgpuDriverCapability int32 + +// VgpuDriverCapability enumeration from nvml/nvml.h +const ( + VGPU_DRIVER_CAP_HETEROGENEOUS_MULTI_VGPU VgpuDriverCapability = iota + VGPU_DRIVER_CAP_COUNT VgpuDriverCapability = 1 +) + +// DeviceVgpuCapability as declared in nvml/nvml.h +type DeviceVgpuCapability int32 + +// DeviceVgpuCapability enumeration from nvml/nvml.h +const ( + DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU DeviceVgpuCapability = iota + DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES DeviceVgpuCapability = 1 + DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES DeviceVgpuCapability = 2 + DEVICE_VGPU_CAP_COUNT DeviceVgpuCapability = 3 +) + +// GpuUtilizationDomainId as declared in nvml/nvml.h +type GpuUtilizationDomainId int32 + +// GpuUtilizationDomainId enumeration from nvml/nvml.h +const ( + GPU_UTILIZATION_DOMAIN_GPU GpuUtilizationDomainId = iota + GPU_UTILIZATION_DOMAIN_FB GpuUtilizationDomainId = 1 + GPU_UTILIZATION_DOMAIN_VID GpuUtilizationDomainId = 2 + GPU_UTILIZATION_DOMAIN_BUS GpuUtilizationDomainId = 3 +) + +// FanState as declared in nvml/nvml.h +type FanState int32 + +// FanState enumeration from nvml/nvml.h +const ( + FAN_NORMAL FanState = iota + FAN_FAILED FanState = 1 +) + +// LedColor as declared in nvml/nvml.h +type LedColor int32 + +// LedColor enumeration from nvml/nvml.h +const ( + LED_COLOR_GREEN LedColor = iota + LED_COLOR_AMBER LedColor = 1 +) + +// EncoderType as declared in nvml/nvml.h +type EncoderType int32 + +// EncoderType enumeration from nvml/nvml.h +const ( + ENCODER_QUERY_H264 EncoderType = iota + ENCODER_QUERY_HEVC EncoderType = 1 +) + +// FBCSessionType as declared in nvml/nvml.h +type FBCSessionType int32 + +// FBCSessionType enumeration from nvml/nvml.h +const ( + FBC_SESSION_TYPE_UNKNOWN FBCSessionType = iota + FBC_SESSION_TYPE_TOSYS FBCSessionType = 1 + FBC_SESSION_TYPE_CUDA FBCSessionType = 2 + FBC_SESSION_TYPE_VID FBCSessionType = 3 + FBC_SESSION_TYPE_HWENC FBCSessionType = 4 +) + +// DetachGpuState as declared in nvml/nvml.h +type DetachGpuState int32 + +// DetachGpuState enumeration from nvml/nvml.h +const ( + DETACH_GPU_KEEP DetachGpuState = iota + DETACH_GPU_REMOVE DetachGpuState = 1 +) + +// PcieLinkState as declared in nvml/nvml.h +type PcieLinkState int32 + +// PcieLinkState enumeration from nvml/nvml.h +const ( + PCIE_LINK_KEEP PcieLinkState = iota + PCIE_LINK_SHUT_DOWN PcieLinkState = 1 +) + +// ClockLimitId as declared in nvml/nvml.h +type ClockLimitId int32 + +// ClockLimitId enumeration from nvml/nvml.h +const ( + CLOCK_LIMIT_ID_RANGE_START ClockLimitId = -256 + CLOCK_LIMIT_ID_TDP ClockLimitId = -255 + CLOCK_LIMIT_ID_UNLIMITED ClockLimitId = -254 +) + +// VgpuVmCompatibility as declared in nvml/nvml.h +type VgpuVmCompatibility int32 + +// VgpuVmCompatibility enumeration from nvml/nvml.h +const ( + VGPU_VM_COMPATIBILITY_NONE VgpuVmCompatibility = iota + VGPU_VM_COMPATIBILITY_COLD VgpuVmCompatibility = 1 + VGPU_VM_COMPATIBILITY_HIBERNATE VgpuVmCompatibility = 2 + VGPU_VM_COMPATIBILITY_SLEEP VgpuVmCompatibility = 4 + VGPU_VM_COMPATIBILITY_LIVE VgpuVmCompatibility = 8 +) + +// VgpuPgpuCompatibilityLimitCode as declared in nvml/nvml.h +type VgpuPgpuCompatibilityLimitCode int32 + +// VgpuPgpuCompatibilityLimitCode enumeration from nvml/nvml.h +const ( + VGPU_COMPATIBILITY_LIMIT_NONE VgpuPgpuCompatibilityLimitCode = iota + VGPU_COMPATIBILITY_LIMIT_HOST_DRIVER VgpuPgpuCompatibilityLimitCode = 1 + VGPU_COMPATIBILITY_LIMIT_GUEST_DRIVER VgpuPgpuCompatibilityLimitCode = 2 + VGPU_COMPATIBILITY_LIMIT_GPU VgpuPgpuCompatibilityLimitCode = 4 + VGPU_COMPATIBILITY_LIMIT_OTHER VgpuPgpuCompatibilityLimitCode = -2147483648 +) + +// ThermalTarget as declared in nvml/nvml.h +type ThermalTarget int32 + +// ThermalTarget enumeration from nvml/nvml.h +const ( + THERMAL_TARGET_NONE ThermalTarget = iota + THERMAL_TARGET_GPU ThermalTarget = 1 + THERMAL_TARGET_MEMORY ThermalTarget = 2 + THERMAL_TARGET_POWER_SUPPLY ThermalTarget = 4 + THERMAL_TARGET_BOARD ThermalTarget = 8 + THERMAL_TARGET_VCD_BOARD ThermalTarget = 9 + THERMAL_TARGET_VCD_INLET ThermalTarget = 10 + THERMAL_TARGET_VCD_OUTLET ThermalTarget = 11 + THERMAL_TARGET_ALL ThermalTarget = 15 + THERMAL_TARGET_UNKNOWN ThermalTarget = -1 +) + +// ThermalController as declared in nvml/nvml.h +type ThermalController int32 + +// ThermalController enumeration from nvml/nvml.h +const ( + THERMAL_CONTROLLER_NONE ThermalController = iota + THERMAL_CONTROLLER_GPU_INTERNAL ThermalController = 1 + THERMAL_CONTROLLER_ADM1032 ThermalController = 2 + THERMAL_CONTROLLER_ADT7461 ThermalController = 3 + THERMAL_CONTROLLER_MAX6649 ThermalController = 4 + THERMAL_CONTROLLER_MAX1617 ThermalController = 5 + THERMAL_CONTROLLER_LM99 ThermalController = 6 + THERMAL_CONTROLLER_LM89 ThermalController = 7 + THERMAL_CONTROLLER_LM64 ThermalController = 8 + THERMAL_CONTROLLER_G781 ThermalController = 9 + THERMAL_CONTROLLER_ADT7473 ThermalController = 10 + THERMAL_CONTROLLER_SBMAX6649 ThermalController = 11 + THERMAL_CONTROLLER_VBIOSEVT ThermalController = 12 + THERMAL_CONTROLLER_OS ThermalController = 13 + THERMAL_CONTROLLER_NVSYSCON_CANOAS ThermalController = 14 + THERMAL_CONTROLLER_NVSYSCON_E551 ThermalController = 15 + THERMAL_CONTROLLER_MAX6649R ThermalController = 16 + THERMAL_CONTROLLER_ADT7473S ThermalController = 17 + THERMAL_CONTROLLER_UNKNOWN ThermalController = -1 +) + +// GridLicenseFeatureCode as declared in nvml/nvml.h +type GridLicenseFeatureCode int32 + +// GridLicenseFeatureCode enumeration from nvml/nvml.h +const ( + GRID_LICENSE_FEATURE_CODE_UNKNOWN GridLicenseFeatureCode = iota + GRID_LICENSE_FEATURE_CODE_VGPU GridLicenseFeatureCode = 1 + GRID_LICENSE_FEATURE_CODE_NVIDIA_RTX GridLicenseFeatureCode = 2 + GRID_LICENSE_FEATURE_CODE_VWORKSTATION GridLicenseFeatureCode = 2 + GRID_LICENSE_FEATURE_CODE_GAMING GridLicenseFeatureCode = 3 + GRID_LICENSE_FEATURE_CODE_COMPUTE GridLicenseFeatureCode = 4 +) + +// GpmMetricId as declared in nvml/nvml.h +type GpmMetricId int32 + +// GpmMetricId enumeration from nvml/nvml.h +const ( + GPM_METRIC_GRAPHICS_UTIL GpmMetricId = 1 + GPM_METRIC_SM_UTIL GpmMetricId = 2 + GPM_METRIC_SM_OCCUPANCY GpmMetricId = 3 + GPM_METRIC_INTEGER_UTIL GpmMetricId = 4 + GPM_METRIC_ANY_TENSOR_UTIL GpmMetricId = 5 + GPM_METRIC_DFMA_TENSOR_UTIL GpmMetricId = 6 + GPM_METRIC_HMMA_TENSOR_UTIL GpmMetricId = 7 + GPM_METRIC_IMMA_TENSOR_UTIL GpmMetricId = 9 + GPM_METRIC_DRAM_BW_UTIL GpmMetricId = 10 + GPM_METRIC_FP64_UTIL GpmMetricId = 11 + GPM_METRIC_FP32_UTIL GpmMetricId = 12 + GPM_METRIC_FP16_UTIL GpmMetricId = 13 + GPM_METRIC_PCIE_TX_PER_SEC GpmMetricId = 20 + GPM_METRIC_PCIE_RX_PER_SEC GpmMetricId = 21 + GPM_METRIC_NVDEC_0_UTIL GpmMetricId = 30 + GPM_METRIC_NVDEC_1_UTIL GpmMetricId = 31 + GPM_METRIC_NVDEC_2_UTIL GpmMetricId = 32 + GPM_METRIC_NVDEC_3_UTIL GpmMetricId = 33 + GPM_METRIC_NVDEC_4_UTIL GpmMetricId = 34 + GPM_METRIC_NVDEC_5_UTIL GpmMetricId = 35 + GPM_METRIC_NVDEC_6_UTIL GpmMetricId = 36 + GPM_METRIC_NVDEC_7_UTIL GpmMetricId = 37 + GPM_METRIC_NVJPG_0_UTIL GpmMetricId = 40 + GPM_METRIC_NVJPG_1_UTIL GpmMetricId = 41 + GPM_METRIC_NVJPG_2_UTIL GpmMetricId = 42 + GPM_METRIC_NVJPG_3_UTIL GpmMetricId = 43 + GPM_METRIC_NVJPG_4_UTIL GpmMetricId = 44 + GPM_METRIC_NVJPG_5_UTIL GpmMetricId = 45 + GPM_METRIC_NVJPG_6_UTIL GpmMetricId = 46 + GPM_METRIC_NVJPG_7_UTIL GpmMetricId = 47 + GPM_METRIC_NVOFA_0_UTIL GpmMetricId = 50 + GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC GpmMetricId = 60 + GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC GpmMetricId = 61 + GPM_METRIC_NVLINK_L0_RX_PER_SEC GpmMetricId = 62 + GPM_METRIC_NVLINK_L0_TX_PER_SEC GpmMetricId = 63 + GPM_METRIC_NVLINK_L1_RX_PER_SEC GpmMetricId = 64 + GPM_METRIC_NVLINK_L1_TX_PER_SEC GpmMetricId = 65 + GPM_METRIC_NVLINK_L2_RX_PER_SEC GpmMetricId = 66 + GPM_METRIC_NVLINK_L2_TX_PER_SEC GpmMetricId = 67 + GPM_METRIC_NVLINK_L3_RX_PER_SEC GpmMetricId = 68 + GPM_METRIC_NVLINK_L3_TX_PER_SEC GpmMetricId = 69 + GPM_METRIC_NVLINK_L4_RX_PER_SEC GpmMetricId = 70 + GPM_METRIC_NVLINK_L4_TX_PER_SEC GpmMetricId = 71 + GPM_METRIC_NVLINK_L5_RX_PER_SEC GpmMetricId = 72 + GPM_METRIC_NVLINK_L5_TX_PER_SEC GpmMetricId = 73 + GPM_METRIC_NVLINK_L6_RX_PER_SEC GpmMetricId = 74 + GPM_METRIC_NVLINK_L6_TX_PER_SEC GpmMetricId = 75 + GPM_METRIC_NVLINK_L7_RX_PER_SEC GpmMetricId = 76 + GPM_METRIC_NVLINK_L7_TX_PER_SEC GpmMetricId = 77 + GPM_METRIC_NVLINK_L8_RX_PER_SEC GpmMetricId = 78 + GPM_METRIC_NVLINK_L8_TX_PER_SEC GpmMetricId = 79 + GPM_METRIC_NVLINK_L9_RX_PER_SEC GpmMetricId = 80 + GPM_METRIC_NVLINK_L9_TX_PER_SEC GpmMetricId = 81 + GPM_METRIC_NVLINK_L10_RX_PER_SEC GpmMetricId = 82 + GPM_METRIC_NVLINK_L10_TX_PER_SEC GpmMetricId = 83 + GPM_METRIC_NVLINK_L11_RX_PER_SEC GpmMetricId = 84 + GPM_METRIC_NVLINK_L11_TX_PER_SEC GpmMetricId = 85 + GPM_METRIC_NVLINK_L12_RX_PER_SEC GpmMetricId = 86 + GPM_METRIC_NVLINK_L12_TX_PER_SEC GpmMetricId = 87 + GPM_METRIC_NVLINK_L13_RX_PER_SEC GpmMetricId = 88 + GPM_METRIC_NVLINK_L13_TX_PER_SEC GpmMetricId = 89 + GPM_METRIC_NVLINK_L14_RX_PER_SEC GpmMetricId = 90 + GPM_METRIC_NVLINK_L14_TX_PER_SEC GpmMetricId = 91 + GPM_METRIC_NVLINK_L15_RX_PER_SEC GpmMetricId = 92 + GPM_METRIC_NVLINK_L15_TX_PER_SEC GpmMetricId = 93 + GPM_METRIC_NVLINK_L16_RX_PER_SEC GpmMetricId = 94 + GPM_METRIC_NVLINK_L16_TX_PER_SEC GpmMetricId = 95 + GPM_METRIC_NVLINK_L17_RX_PER_SEC GpmMetricId = 96 + GPM_METRIC_NVLINK_L17_TX_PER_SEC GpmMetricId = 97 + GPM_METRIC_MAX GpmMetricId = 98 +) diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/const_gen.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/const_gen.go new file mode 100644 index 0000000..9038b31 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/const_gen.go @@ -0,0 +1,27 @@ +// Copyright (c) 2021, 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 nvml + +import ( + "reflect" +) + +const ( + SYSTEM_PROCESS_NAME_BUFFER_SIZE = 256 +) + +func STRUCT_VERSION(data interface{}, version uint32) uint32 { + return uint32(uint32(reflect.Indirect(reflect.ValueOf(data)).Type().Size()) | (version << uint32(24))) +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/device.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/device.go new file mode 100644 index 0000000..f19da39 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/device.go @@ -0,0 +1,2645 @@ +// Copyright (c) 2020, 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 nvml + +import ( + "unsafe" +) + +// EccBitType +type EccBitType = MemoryErrorType + +// nvml.DeviceGetCount() +func DeviceGetCount() (int, Return) { + var DeviceCount uint32 + ret := nvmlDeviceGetCount(&DeviceCount) + return int(DeviceCount), ret +} + +// nvml.DeviceGetHandleByIndex() +func DeviceGetHandleByIndex(Index int) (Device, Return) { + var Device Device + ret := nvmlDeviceGetHandleByIndex(uint32(Index), &Device) + return Device, ret +} + +// nvml.DeviceGetHandleBySerial() +func DeviceGetHandleBySerial(Serial string) (Device, Return) { + var Device Device + ret := nvmlDeviceGetHandleBySerial(Serial+string(rune(0)), &Device) + return Device, ret +} + +// nvml.DeviceGetHandleByUUID() +func DeviceGetHandleByUUID(Uuid string) (Device, Return) { + var Device Device + ret := nvmlDeviceGetHandleByUUID(Uuid+string(rune(0)), &Device) + return Device, ret +} + +// nvml.DeviceGetHandleByPciBusId() +func DeviceGetHandleByPciBusId(PciBusId string) (Device, Return) { + var Device Device + ret := nvmlDeviceGetHandleByPciBusId(PciBusId+string(rune(0)), &Device) + return Device, ret +} + +// nvml.DeviceGetName() +func DeviceGetName(Device Device) (string, Return) { + Name := make([]byte, DEVICE_NAME_V2_BUFFER_SIZE) + ret := nvmlDeviceGetName(Device, &Name[0], DEVICE_NAME_V2_BUFFER_SIZE) + return string(Name[:clen(Name)]), ret +} + +func (Device Device) GetName() (string, Return) { + return DeviceGetName(Device) +} + +// nvml.DeviceGetBrand() +func DeviceGetBrand(Device Device) (BrandType, Return) { + var _type BrandType + ret := nvmlDeviceGetBrand(Device, &_type) + return _type, ret +} + +func (Device Device) GetBrand() (BrandType, Return) { + return DeviceGetBrand(Device) +} + +// nvml.DeviceGetIndex() +func DeviceGetIndex(Device Device) (int, Return) { + var Index uint32 + ret := nvmlDeviceGetIndex(Device, &Index) + return int(Index), ret +} + +func (Device Device) GetIndex() (int, Return) { + return DeviceGetIndex(Device) +} + +// nvml.DeviceGetSerial() +func DeviceGetSerial(Device Device) (string, Return) { + Serial := make([]byte, DEVICE_SERIAL_BUFFER_SIZE) + ret := nvmlDeviceGetSerial(Device, &Serial[0], DEVICE_SERIAL_BUFFER_SIZE) + return string(Serial[:clen(Serial)]), ret +} + +func (Device Device) GetSerial() (string, Return) { + return DeviceGetSerial(Device) +} + +// nvml.DeviceGetCpuAffinity() +func DeviceGetCpuAffinity(Device Device, NumCPUs int) ([]uint, Return) { + CpuSetSize := uint32((NumCPUs-1)/int(unsafe.Sizeof(uint(0))) + 1) + CpuSet := make([]uint, CpuSetSize) + ret := nvmlDeviceGetCpuAffinity(Device, CpuSetSize, &CpuSet[0]) + return CpuSet, ret +} + +func (Device Device) GetCpuAffinity(NumCPUs int) ([]uint, Return) { + return DeviceGetCpuAffinity(Device, NumCPUs) +} + +// nvml.DeviceSetCpuAffinity() +func DeviceSetCpuAffinity(Device Device) Return { + return nvmlDeviceSetCpuAffinity(Device) +} + +func (Device Device) SetCpuAffinity() Return { + return DeviceSetCpuAffinity(Device) +} + +// nvml.DeviceClearCpuAffinity() +func DeviceClearCpuAffinity(Device Device) Return { + return nvmlDeviceClearCpuAffinity(Device) +} + +func (Device Device) ClearCpuAffinity() Return { + return DeviceClearCpuAffinity(Device) +} + +// nvml.DeviceGetMemoryAffinity() +func DeviceGetMemoryAffinity(Device Device, NumNodes int, Scope AffinityScope) ([]uint, Return) { + NodeSetSize := uint32((NumNodes-1)/int(unsafe.Sizeof(uint(0))) + 1) + NodeSet := make([]uint, NodeSetSize) + ret := nvmlDeviceGetMemoryAffinity(Device, NodeSetSize, &NodeSet[0], Scope) + return NodeSet, ret +} + +func (Device Device) GetMemoryAffinity(NumNodes int, Scope AffinityScope) ([]uint, Return) { + return DeviceGetMemoryAffinity(Device, NumNodes, Scope) +} + +// nvml.DeviceGetCpuAffinityWithinScope() +func DeviceGetCpuAffinityWithinScope(Device Device, NumCPUs int, Scope AffinityScope) ([]uint, Return) { + CpuSetSize := uint32((NumCPUs-1)/int(unsafe.Sizeof(uint(0))) + 1) + CpuSet := make([]uint, CpuSetSize) + ret := nvmlDeviceGetCpuAffinityWithinScope(Device, CpuSetSize, &CpuSet[0], Scope) + return CpuSet, ret +} + +func (Device Device) GetCpuAffinityWithinScope(NumCPUs int, Scope AffinityScope) ([]uint, Return) { + return DeviceGetCpuAffinityWithinScope(Device, NumCPUs, Scope) +} + +// nvml.DeviceGetTopologyCommonAncestor() +func DeviceGetTopologyCommonAncestor(Device1 Device, Device2 Device) (GpuTopologyLevel, Return) { + var PathInfo GpuTopologyLevel + ret := nvmlDeviceGetTopologyCommonAncestor(Device1, Device2, &PathInfo) + return PathInfo, ret +} + +func (Device1 Device) GetTopologyCommonAncestor(Device2 Device) (GpuTopologyLevel, Return) { + return DeviceGetTopologyCommonAncestor(Device1, Device2) +} + +// nvml.DeviceGetTopologyNearestGpus() +func DeviceGetTopologyNearestGpus(device Device, Level GpuTopologyLevel) ([]Device, Return) { + var Count uint32 + ret := nvmlDeviceGetTopologyNearestGpus(device, Level, &Count, nil) + if ret != SUCCESS { + return nil, ret + } + if Count == 0 { + return []Device{}, ret + } + DeviceArray := make([]Device, Count) + ret = nvmlDeviceGetTopologyNearestGpus(device, Level, &Count, &DeviceArray[0]) + return DeviceArray, ret +} + +func (Device Device) GetTopologyNearestGpus(Level GpuTopologyLevel) ([]Device, Return) { + return DeviceGetTopologyNearestGpus(Device, Level) +} + +// nvml.DeviceGetP2PStatus() +func DeviceGetP2PStatus(Device1 Device, Device2 Device, P2pIndex GpuP2PCapsIndex) (GpuP2PStatus, Return) { + var P2pStatus GpuP2PStatus + ret := nvmlDeviceGetP2PStatus(Device1, Device2, P2pIndex, &P2pStatus) + return P2pStatus, ret +} + +func (Device1 Device) GetP2PStatus(Device2 Device, P2pIndex GpuP2PCapsIndex) (GpuP2PStatus, Return) { + return DeviceGetP2PStatus(Device1, Device2, P2pIndex) +} + +// nvml.DeviceGetUUID() +func DeviceGetUUID(Device Device) (string, Return) { + Uuid := make([]byte, DEVICE_UUID_V2_BUFFER_SIZE) + ret := nvmlDeviceGetUUID(Device, &Uuid[0], DEVICE_UUID_V2_BUFFER_SIZE) + return string(Uuid[:clen(Uuid)]), ret +} + +func (Device Device) GetUUID() (string, Return) { + return DeviceGetUUID(Device) +} + +// nvml.DeviceGetMinorNumber() +func DeviceGetMinorNumber(Device Device) (int, Return) { + var MinorNumber uint32 + ret := nvmlDeviceGetMinorNumber(Device, &MinorNumber) + return int(MinorNumber), ret +} + +func (Device Device) GetMinorNumber() (int, Return) { + return DeviceGetMinorNumber(Device) +} + +// nvml.DeviceGetBoardPartNumber() +func DeviceGetBoardPartNumber(Device Device) (string, Return) { + PartNumber := make([]byte, DEVICE_PART_NUMBER_BUFFER_SIZE) + ret := nvmlDeviceGetBoardPartNumber(Device, &PartNumber[0], DEVICE_PART_NUMBER_BUFFER_SIZE) + return string(PartNumber[:clen(PartNumber)]), ret +} + +func (Device Device) GetBoardPartNumber() (string, Return) { + return DeviceGetBoardPartNumber(Device) +} + +// nvml.DeviceGetInforomVersion() +func DeviceGetInforomVersion(Device Device, Object InforomObject) (string, Return) { + Version := make([]byte, DEVICE_INFOROM_VERSION_BUFFER_SIZE) + ret := nvmlDeviceGetInforomVersion(Device, Object, &Version[0], DEVICE_INFOROM_VERSION_BUFFER_SIZE) + return string(Version[:clen(Version)]), ret +} + +func (Device Device) GetInforomVersion(Object InforomObject) (string, Return) { + return DeviceGetInforomVersion(Device, Object) +} + +// nvml.DeviceGetInforomImageVersion() +func DeviceGetInforomImageVersion(Device Device) (string, Return) { + Version := make([]byte, DEVICE_INFOROM_VERSION_BUFFER_SIZE) + ret := nvmlDeviceGetInforomImageVersion(Device, &Version[0], DEVICE_INFOROM_VERSION_BUFFER_SIZE) + return string(Version[:clen(Version)]), ret +} + +func (Device Device) GetInforomImageVersion() (string, Return) { + return DeviceGetInforomImageVersion(Device) +} + +// nvml.DeviceGetInforomConfigurationChecksum() +func DeviceGetInforomConfigurationChecksum(Device Device) (uint32, Return) { + var Checksum uint32 + ret := nvmlDeviceGetInforomConfigurationChecksum(Device, &Checksum) + return Checksum, ret +} + +func (Device Device) GetInforomConfigurationChecksum() (uint32, Return) { + return DeviceGetInforomConfigurationChecksum(Device) +} + +// nvml.DeviceValidateInforom() +func DeviceValidateInforom(Device Device) Return { + return nvmlDeviceValidateInforom(Device) +} + +func (Device Device) ValidateInforom() Return { + return DeviceValidateInforom(Device) +} + +// nvml.DeviceGetDisplayMode() +func DeviceGetDisplayMode(Device Device) (EnableState, Return) { + var Display EnableState + ret := nvmlDeviceGetDisplayMode(Device, &Display) + return Display, ret +} + +func (Device Device) GetDisplayMode() (EnableState, Return) { + return DeviceGetDisplayMode(Device) +} + +// nvml.DeviceGetDisplayActive() +func DeviceGetDisplayActive(Device Device) (EnableState, Return) { + var IsActive EnableState + ret := nvmlDeviceGetDisplayActive(Device, &IsActive) + return IsActive, ret +} + +func (Device Device) GetDisplayActive() (EnableState, Return) { + return DeviceGetDisplayActive(Device) +} + +// nvml.DeviceGetPersistenceMode() +func DeviceGetPersistenceMode(Device Device) (EnableState, Return) { + var Mode EnableState + ret := nvmlDeviceGetPersistenceMode(Device, &Mode) + return Mode, ret +} + +func (Device Device) GetPersistenceMode() (EnableState, Return) { + return DeviceGetPersistenceMode(Device) +} + +// nvml.DeviceGetPciInfo() +func DeviceGetPciInfo(Device Device) (PciInfo, Return) { + var Pci PciInfo + ret := nvmlDeviceGetPciInfo(Device, &Pci) + return Pci, ret +} + +func (Device Device) GetPciInfo() (PciInfo, Return) { + return DeviceGetPciInfo(Device) +} + +// nvml.DeviceGetMaxPcieLinkGeneration() +func DeviceGetMaxPcieLinkGeneration(Device Device) (int, Return) { + var MaxLinkGen uint32 + ret := nvmlDeviceGetMaxPcieLinkGeneration(Device, &MaxLinkGen) + return int(MaxLinkGen), ret +} + +func (Device Device) GetMaxPcieLinkGeneration() (int, Return) { + return DeviceGetMaxPcieLinkGeneration(Device) +} + +// nvml.DeviceGetMaxPcieLinkWidth() +func DeviceGetMaxPcieLinkWidth(Device Device) (int, Return) { + var MaxLinkWidth uint32 + ret := nvmlDeviceGetMaxPcieLinkWidth(Device, &MaxLinkWidth) + return int(MaxLinkWidth), ret +} + +func (Device Device) GetMaxPcieLinkWidth() (int, Return) { + return DeviceGetMaxPcieLinkWidth(Device) +} + +// nvml.DeviceGetCurrPcieLinkGeneration() +func DeviceGetCurrPcieLinkGeneration(Device Device) (int, Return) { + var CurrLinkGen uint32 + ret := nvmlDeviceGetCurrPcieLinkGeneration(Device, &CurrLinkGen) + return int(CurrLinkGen), ret +} + +func (Device Device) GetCurrPcieLinkGeneration() (int, Return) { + return DeviceGetCurrPcieLinkGeneration(Device) +} + +// nvml.DeviceGetCurrPcieLinkWidth() +func DeviceGetCurrPcieLinkWidth(Device Device) (int, Return) { + var CurrLinkWidth uint32 + ret := nvmlDeviceGetCurrPcieLinkWidth(Device, &CurrLinkWidth) + return int(CurrLinkWidth), ret +} + +func (Device Device) GetCurrPcieLinkWidth() (int, Return) { + return DeviceGetCurrPcieLinkWidth(Device) +} + +// nvml.DeviceGetPcieThroughput() +func DeviceGetPcieThroughput(Device Device, Counter PcieUtilCounter) (uint32, Return) { + var Value uint32 + ret := nvmlDeviceGetPcieThroughput(Device, Counter, &Value) + return Value, ret +} + +func (Device Device) GetPcieThroughput(Counter PcieUtilCounter) (uint32, Return) { + return DeviceGetPcieThroughput(Device, Counter) +} + +// nvml.DeviceGetPcieReplayCounter() +func DeviceGetPcieReplayCounter(Device Device) (int, Return) { + var Value uint32 + ret := nvmlDeviceGetPcieReplayCounter(Device, &Value) + return int(Value), ret +} + +func (Device Device) GetPcieReplayCounter() (int, Return) { + return DeviceGetPcieReplayCounter(Device) +} + +// nvml.nvmlDeviceGetClockInfo() +func DeviceGetClockInfo(Device Device, _type ClockType) (uint32, Return) { + var Clock uint32 + ret := nvmlDeviceGetClockInfo(Device, _type, &Clock) + return Clock, ret +} + +func (Device Device) GetClockInfo(_type ClockType) (uint32, Return) { + return DeviceGetClockInfo(Device, _type) +} + +// nvml.DeviceGetMaxClockInfo() +func DeviceGetMaxClockInfo(Device Device, _type ClockType) (uint32, Return) { + var Clock uint32 + ret := nvmlDeviceGetMaxClockInfo(Device, _type, &Clock) + return Clock, ret +} + +func (Device Device) GetMaxClockInfo(_type ClockType) (uint32, Return) { + return DeviceGetMaxClockInfo(Device, _type) +} + +// nvml.DeviceGetApplicationsClock() +func DeviceGetApplicationsClock(Device Device, ClockType ClockType) (uint32, Return) { + var ClockMHz uint32 + ret := nvmlDeviceGetApplicationsClock(Device, ClockType, &ClockMHz) + return ClockMHz, ret +} + +func (Device Device) GetApplicationsClock(ClockType ClockType) (uint32, Return) { + return DeviceGetApplicationsClock(Device, ClockType) +} + +// nvml.DeviceGetDefaultApplicationsClock() +func DeviceGetDefaultApplicationsClock(Device Device, ClockType ClockType) (uint32, Return) { + var ClockMHz uint32 + ret := nvmlDeviceGetDefaultApplicationsClock(Device, ClockType, &ClockMHz) + return ClockMHz, ret +} + +func (Device Device) GetDefaultApplicationsClock(ClockType ClockType) (uint32, Return) { + return DeviceGetDefaultApplicationsClock(Device, ClockType) +} + +// nvml.DeviceResetApplicationsClocks() +func DeviceResetApplicationsClocks(Device Device) Return { + return nvmlDeviceResetApplicationsClocks(Device) +} + +func (Device Device) ResetApplicationsClocks() Return { + return DeviceResetApplicationsClocks(Device) +} + +// nvml.DeviceGetClock() +func DeviceGetClock(Device Device, ClockType ClockType, ClockId ClockId) (uint32, Return) { + var ClockMHz uint32 + ret := nvmlDeviceGetClock(Device, ClockType, ClockId, &ClockMHz) + return ClockMHz, ret +} + +func (Device Device) GetClock(ClockType ClockType, ClockId ClockId) (uint32, Return) { + return DeviceGetClock(Device, ClockType, ClockId) +} + +// nvml.DeviceGetMaxCustomerBoostClock() +func DeviceGetMaxCustomerBoostClock(Device Device, ClockType ClockType) (uint32, Return) { + var ClockMHz uint32 + ret := nvmlDeviceGetMaxCustomerBoostClock(Device, ClockType, &ClockMHz) + return ClockMHz, ret +} + +func (Device Device) GetMaxCustomerBoostClock(ClockType ClockType) (uint32, Return) { + return DeviceGetMaxCustomerBoostClock(Device, ClockType) +} + +// nvml.DeviceGetSupportedMemoryClocks() +func DeviceGetSupportedMemoryClocks(Device Device) (int, uint32, Return) { + var Count, ClocksMHz uint32 + ret := nvmlDeviceGetSupportedMemoryClocks(Device, &Count, &ClocksMHz) + return int(Count), ClocksMHz, ret +} + +func (Device Device) GetSupportedMemoryClocks() (int, uint32, Return) { + return DeviceGetSupportedMemoryClocks(Device) +} + +// nvml.DeviceGetSupportedGraphicsClocks() +func DeviceGetSupportedGraphicsClocks(Device Device, MemoryClockMHz int) (int, uint32, Return) { + var Count, ClocksMHz uint32 + ret := nvmlDeviceGetSupportedGraphicsClocks(Device, uint32(MemoryClockMHz), &Count, &ClocksMHz) + return int(Count), ClocksMHz, ret +} + +func (Device Device) GetSupportedGraphicsClocks(MemoryClockMHz int) (int, uint32, Return) { + return DeviceGetSupportedGraphicsClocks(Device, MemoryClockMHz) +} + +// nvml.DeviceGetAutoBoostedClocksEnabled() +func DeviceGetAutoBoostedClocksEnabled(Device Device) (EnableState, EnableState, Return) { + var IsEnabled, DefaultIsEnabled EnableState + ret := nvmlDeviceGetAutoBoostedClocksEnabled(Device, &IsEnabled, &DefaultIsEnabled) + return IsEnabled, DefaultIsEnabled, ret +} + +func (Device Device) GetAutoBoostedClocksEnabled() (EnableState, EnableState, Return) { + return DeviceGetAutoBoostedClocksEnabled(Device) +} + +// nvml.DeviceSetAutoBoostedClocksEnabled() +func DeviceSetAutoBoostedClocksEnabled(Device Device, Enabled EnableState) Return { + return nvmlDeviceSetAutoBoostedClocksEnabled(Device, Enabled) +} + +func (Device Device) SetAutoBoostedClocksEnabled(Enabled EnableState) Return { + return DeviceSetAutoBoostedClocksEnabled(Device, Enabled) +} + +// nvml.DeviceSetDefaultAutoBoostedClocksEnabled() +func DeviceSetDefaultAutoBoostedClocksEnabled(Device Device, Enabled EnableState, Flags uint32) Return { + return nvmlDeviceSetDefaultAutoBoostedClocksEnabled(Device, Enabled, Flags) +} + +func (Device Device) SetDefaultAutoBoostedClocksEnabled(Enabled EnableState, Flags uint32) Return { + return DeviceSetDefaultAutoBoostedClocksEnabled(Device, Enabled, Flags) +} + +// nvml.DeviceGetFanSpeed() +func DeviceGetFanSpeed(Device Device) (uint32, Return) { + var Speed uint32 + ret := nvmlDeviceGetFanSpeed(Device, &Speed) + return Speed, ret +} + +func (Device Device) GetFanSpeed() (uint32, Return) { + return DeviceGetFanSpeed(Device) +} + +// nvml.DeviceGetFanSpeed_v2() +func DeviceGetFanSpeed_v2(Device Device, Fan int) (uint32, Return) { + var Speed uint32 + ret := nvmlDeviceGetFanSpeed_v2(Device, uint32(Fan), &Speed) + return Speed, ret +} + +func (Device Device) GetFanSpeed_v2(Fan int) (uint32, Return) { + return DeviceGetFanSpeed_v2(Device, Fan) +} + +// nvml.DeviceGetNumFans() +func DeviceGetNumFans(Device Device) (int, Return) { + var NumFans uint32 + ret := nvmlDeviceGetNumFans(Device, &NumFans) + return int(NumFans), ret +} + +func (Device Device) GetNumFans() (int, Return) { + return DeviceGetNumFans(Device) +} + +// nvml.DeviceGetTemperature() +func DeviceGetTemperature(Device Device, SensorType TemperatureSensors) (uint32, Return) { + var Temp uint32 + ret := nvmlDeviceGetTemperature(Device, SensorType, &Temp) + return Temp, ret +} + +func (Device Device) GetTemperature(SensorType TemperatureSensors) (uint32, Return) { + return DeviceGetTemperature(Device, SensorType) +} + +// nvml.DeviceGetTemperatureThreshold() +func DeviceGetTemperatureThreshold(Device Device, ThresholdType TemperatureThresholds) (uint32, Return) { + var Temp uint32 + ret := nvmlDeviceGetTemperatureThreshold(Device, ThresholdType, &Temp) + return Temp, ret +} + +func (Device Device) GetTemperatureThreshold(ThresholdType TemperatureThresholds) (uint32, Return) { + return DeviceGetTemperatureThreshold(Device, ThresholdType) +} + +// nvml.DeviceSetTemperatureThreshold() +func DeviceSetTemperatureThreshold(Device Device, ThresholdType TemperatureThresholds, Temp int) Return { + t := int32(Temp) + ret := nvmlDeviceSetTemperatureThreshold(Device, ThresholdType, &t) + return ret +} + +func (Device Device) SetTemperatureThreshold(ThresholdType TemperatureThresholds, Temp int) Return { + return DeviceSetTemperatureThreshold(Device, ThresholdType, Temp) +} + +// nvml.DeviceGetPerformanceState() +func DeviceGetPerformanceState(Device Device) (Pstates, Return) { + var PState Pstates + ret := nvmlDeviceGetPerformanceState(Device, &PState) + return PState, ret +} + +func (Device Device) GetPerformanceState() (Pstates, Return) { + return DeviceGetPerformanceState(Device) +} + +// nvml.DeviceGetCurrentClocksThrottleReasons() +func DeviceGetCurrentClocksThrottleReasons(Device Device) (uint64, Return) { + var ClocksThrottleReasons uint64 + ret := nvmlDeviceGetCurrentClocksThrottleReasons(Device, &ClocksThrottleReasons) + return ClocksThrottleReasons, ret +} + +func (Device Device) GetCurrentClocksThrottleReasons() (uint64, Return) { + return DeviceGetCurrentClocksThrottleReasons(Device) +} + +// nvml.DeviceGetSupportedClocksThrottleReasons() +func DeviceGetSupportedClocksThrottleReasons(Device Device) (uint64, Return) { + var SupportedClocksThrottleReasons uint64 + ret := nvmlDeviceGetSupportedClocksThrottleReasons(Device, &SupportedClocksThrottleReasons) + return SupportedClocksThrottleReasons, ret +} + +func (Device Device) GetSupportedClocksThrottleReasons() (uint64, Return) { + return DeviceGetSupportedClocksThrottleReasons(Device) +} + +// nvml.DeviceGetPowerState() +func DeviceGetPowerState(Device Device) (Pstates, Return) { + var PState Pstates + ret := nvmlDeviceGetPowerState(Device, &PState) + return PState, ret +} + +func (Device Device) GetPowerState() (Pstates, Return) { + return DeviceGetPowerState(Device) +} + +// nvml.DeviceGetPowerManagementMode() +func DeviceGetPowerManagementMode(Device Device) (EnableState, Return) { + var Mode EnableState + ret := nvmlDeviceGetPowerManagementMode(Device, &Mode) + return Mode, ret +} + +func (Device Device) GetPowerManagementMode() (EnableState, Return) { + return DeviceGetPowerManagementMode(Device) +} + +// nvml.DeviceGetPowerManagementLimit() +func DeviceGetPowerManagementLimit(Device Device) (uint32, Return) { + var Limit uint32 + ret := nvmlDeviceGetPowerManagementLimit(Device, &Limit) + return Limit, ret +} + +func (Device Device) GetPowerManagementLimit() (uint32, Return) { + return DeviceGetPowerManagementLimit(Device) +} + +// nvml.DeviceGetPowerManagementLimitConstraints() +func DeviceGetPowerManagementLimitConstraints(Device Device) (uint32, uint32, Return) { + var MinLimit, MaxLimit uint32 + ret := nvmlDeviceGetPowerManagementLimitConstraints(Device, &MinLimit, &MaxLimit) + return MinLimit, MaxLimit, ret +} + +func (Device Device) GetPowerManagementLimitConstraints() (uint32, uint32, Return) { + return DeviceGetPowerManagementLimitConstraints(Device) +} + +// nvml.DeviceGetPowerManagementDefaultLimit() +func DeviceGetPowerManagementDefaultLimit(Device Device) (uint32, Return) { + var DefaultLimit uint32 + ret := nvmlDeviceGetPowerManagementDefaultLimit(Device, &DefaultLimit) + return DefaultLimit, ret +} + +func (Device Device) GetPowerManagementDefaultLimit() (uint32, Return) { + return DeviceGetPowerManagementDefaultLimit(Device) +} + +// nvml.DeviceGetPowerUsage() +func DeviceGetPowerUsage(Device Device) (uint32, Return) { + var Power uint32 + ret := nvmlDeviceGetPowerUsage(Device, &Power) + return Power, ret +} + +func (Device Device) GetPowerUsage() (uint32, Return) { + return DeviceGetPowerUsage(Device) +} + +// nvml.DeviceGetTotalEnergyConsumption() +func DeviceGetTotalEnergyConsumption(Device Device) (uint64, Return) { + var Energy uint64 + ret := nvmlDeviceGetTotalEnergyConsumption(Device, &Energy) + return Energy, ret +} + +func (Device Device) GetTotalEnergyConsumption() (uint64, Return) { + return DeviceGetTotalEnergyConsumption(Device) +} + +// nvml.DeviceGetEnforcedPowerLimit() +func DeviceGetEnforcedPowerLimit(Device Device) (uint32, Return) { + var Limit uint32 + ret := nvmlDeviceGetEnforcedPowerLimit(Device, &Limit) + return Limit, ret +} + +func (Device Device) GetEnforcedPowerLimit() (uint32, Return) { + return DeviceGetEnforcedPowerLimit(Device) +} + +// nvml.DeviceGetGpuOperationMode() +func DeviceGetGpuOperationMode(Device Device) (GpuOperationMode, GpuOperationMode, Return) { + var Current, Pending GpuOperationMode + ret := nvmlDeviceGetGpuOperationMode(Device, &Current, &Pending) + return Current, Pending, ret +} + +func (Device Device) GetGpuOperationMode() (GpuOperationMode, GpuOperationMode, Return) { + return DeviceGetGpuOperationMode(Device) +} + +// nvml.DeviceGetMemoryInfo() +func DeviceGetMemoryInfo(Device Device) (Memory, Return) { + var Memory Memory + ret := nvmlDeviceGetMemoryInfo(Device, &Memory) + return Memory, ret +} + +func (Device Device) GetMemoryInfo() (Memory, Return) { + return DeviceGetMemoryInfo(Device) +} + +// nvml.DeviceGetMemoryInfo_v2() +func DeviceGetMemoryInfo_v2(Device Device) (Memory_v2, Return) { + var Memory Memory_v2 + Memory.Version = STRUCT_VERSION(Memory, 2) + ret := nvmlDeviceGetMemoryInfo_v2(Device, &Memory) + return Memory, ret +} + +func (Device Device) GetMemoryInfo_v2() (Memory_v2, Return) { + return DeviceGetMemoryInfo_v2(Device) +} + +// nvml.DeviceGetComputeMode() +func DeviceGetComputeMode(Device Device) (ComputeMode, Return) { + var Mode ComputeMode + ret := nvmlDeviceGetComputeMode(Device, &Mode) + return Mode, ret +} + +func (Device Device) GetComputeMode() (ComputeMode, Return) { + return DeviceGetComputeMode(Device) +} + +// nvml.DeviceGetCudaComputeCapability() +func DeviceGetCudaComputeCapability(Device Device) (int, int, Return) { + var Major, Minor int32 + ret := nvmlDeviceGetCudaComputeCapability(Device, &Major, &Minor) + return int(Major), int(Minor), ret +} + +func (Device Device) GetCudaComputeCapability() (int, int, Return) { + return DeviceGetCudaComputeCapability(Device) +} + +// nvml.DeviceGetEccMode() +func DeviceGetEccMode(Device Device) (EnableState, EnableState, Return) { + var Current, Pending EnableState + ret := nvmlDeviceGetEccMode(Device, &Current, &Pending) + return Current, Pending, ret +} + +func (Device Device) GetEccMode() (EnableState, EnableState, Return) { + return DeviceGetEccMode(Device) +} + +// nvml.DeviceGetBoardId() +func DeviceGetBoardId(Device Device) (uint32, Return) { + var BoardId uint32 + ret := nvmlDeviceGetBoardId(Device, &BoardId) + return BoardId, ret +} + +func (Device Device) GetBoardId() (uint32, Return) { + return DeviceGetBoardId(Device) +} + +// nvml.DeviceGetMultiGpuBoard() +func DeviceGetMultiGpuBoard(Device Device) (int, Return) { + var MultiGpuBool uint32 + ret := nvmlDeviceGetMultiGpuBoard(Device, &MultiGpuBool) + return int(MultiGpuBool), ret +} + +func (Device Device) GetMultiGpuBoard() (int, Return) { + return DeviceGetMultiGpuBoard(Device) +} + +// nvml.DeviceGetTotalEccErrors() +func DeviceGetTotalEccErrors(Device Device, ErrorType MemoryErrorType, CounterType EccCounterType) (uint64, Return) { + var EccCounts uint64 + ret := nvmlDeviceGetTotalEccErrors(Device, ErrorType, CounterType, &EccCounts) + return EccCounts, ret +} + +func (Device Device) GetTotalEccErrors(ErrorType MemoryErrorType, CounterType EccCounterType) (uint64, Return) { + return DeviceGetTotalEccErrors(Device, ErrorType, CounterType) +} + +// nvml.DeviceGetDetailedEccErrors() +func DeviceGetDetailedEccErrors(Device Device, ErrorType MemoryErrorType, CounterType EccCounterType) (EccErrorCounts, Return) { + var EccCounts EccErrorCounts + ret := nvmlDeviceGetDetailedEccErrors(Device, ErrorType, CounterType, &EccCounts) + return EccCounts, ret +} + +func (Device Device) GetDetailedEccErrors(ErrorType MemoryErrorType, CounterType EccCounterType) (EccErrorCounts, Return) { + return DeviceGetDetailedEccErrors(Device, ErrorType, CounterType) +} + +// nvml.DeviceGetMemoryErrorCounter() +func DeviceGetMemoryErrorCounter(Device Device, ErrorType MemoryErrorType, CounterType EccCounterType, LocationType MemoryLocation) (uint64, Return) { + var Count uint64 + ret := nvmlDeviceGetMemoryErrorCounter(Device, ErrorType, CounterType, LocationType, &Count) + return Count, ret +} + +func (Device Device) GetMemoryErrorCounter(ErrorType MemoryErrorType, CounterType EccCounterType, LocationType MemoryLocation) (uint64, Return) { + return DeviceGetMemoryErrorCounter(Device, ErrorType, CounterType, LocationType) +} + +// nvml.DeviceGetUtilizationRates() +func DeviceGetUtilizationRates(Device Device) (Utilization, Return) { + var Utilization Utilization + ret := nvmlDeviceGetUtilizationRates(Device, &Utilization) + return Utilization, ret +} + +func (Device Device) GetUtilizationRates() (Utilization, Return) { + return DeviceGetUtilizationRates(Device) +} + +// nvml.DeviceGetEncoderUtilization() +func DeviceGetEncoderUtilization(Device Device) (uint32, uint32, Return) { + var Utilization, SamplingPeriodUs uint32 + ret := nvmlDeviceGetEncoderUtilization(Device, &Utilization, &SamplingPeriodUs) + return Utilization, SamplingPeriodUs, ret +} + +func (Device Device) GetEncoderUtilization() (uint32, uint32, Return) { + return DeviceGetEncoderUtilization(Device) +} + +// nvml.DeviceGetEncoderCapacity() +func DeviceGetEncoderCapacity(Device Device, EncoderQueryType EncoderType) (int, Return) { + var EncoderCapacity uint32 + ret := nvmlDeviceGetEncoderCapacity(Device, EncoderQueryType, &EncoderCapacity) + return int(EncoderCapacity), ret +} + +func (Device Device) GetEncoderCapacity(EncoderQueryType EncoderType) (int, Return) { + return DeviceGetEncoderCapacity(Device, EncoderQueryType) +} + +// nvml.DeviceGetEncoderStats() +func DeviceGetEncoderStats(Device Device) (int, uint32, uint32, Return) { + var SessionCount, AverageFps, AverageLatency uint32 + ret := nvmlDeviceGetEncoderStats(Device, &SessionCount, &AverageFps, &AverageLatency) + return int(SessionCount), AverageFps, AverageLatency, ret +} + +func (Device Device) GetEncoderStats() (int, uint32, uint32, Return) { + return DeviceGetEncoderStats(Device) +} + +// nvml.DeviceGetEncoderSessions() +func DeviceGetEncoderSessions(Device Device) ([]EncoderSessionInfo, Return) { + var SessionCount uint32 = 1 // Will be reduced upon returning + for { + SessionInfos := make([]EncoderSessionInfo, SessionCount) + ret := nvmlDeviceGetEncoderSessions(Device, &SessionCount, &SessionInfos[0]) + if ret == SUCCESS { + return SessionInfos[:SessionCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + SessionCount *= 2 + } +} + +func (Device Device) GetEncoderSessions() ([]EncoderSessionInfo, Return) { + return DeviceGetEncoderSessions(Device) +} + +// nvml.DeviceGetDecoderUtilization() +func DeviceGetDecoderUtilization(Device Device) (uint32, uint32, Return) { + var Utilization, SamplingPeriodUs uint32 + ret := nvmlDeviceGetDecoderUtilization(Device, &Utilization, &SamplingPeriodUs) + return Utilization, SamplingPeriodUs, ret +} + +func (Device Device) GetDecoderUtilization() (uint32, uint32, Return) { + return DeviceGetDecoderUtilization(Device) +} + +// nvml.DeviceGetFBCStats() +func DeviceGetFBCStats(Device Device) (FBCStats, Return) { + var FbcStats FBCStats + ret := nvmlDeviceGetFBCStats(Device, &FbcStats) + return FbcStats, ret +} + +func (Device Device) GetFBCStats() (FBCStats, Return) { + return DeviceGetFBCStats(Device) +} + +// nvml.DeviceGetFBCSessions() +func DeviceGetFBCSessions(Device Device) ([]FBCSessionInfo, Return) { + var SessionCount uint32 = 1 // Will be reduced upon returning + for { + SessionInfo := make([]FBCSessionInfo, SessionCount) + ret := nvmlDeviceGetFBCSessions(Device, &SessionCount, &SessionInfo[0]) + if ret == SUCCESS { + return SessionInfo[:SessionCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + SessionCount *= 2 + } +} + +func (Device Device) GetFBCSessions() ([]FBCSessionInfo, Return) { + return DeviceGetFBCSessions(Device) +} + +// nvml.DeviceGetDriverModel() +func DeviceGetDriverModel(Device Device) (DriverModel, DriverModel, Return) { + var Current, Pending DriverModel + ret := nvmlDeviceGetDriverModel(Device, &Current, &Pending) + return Current, Pending, ret +} + +func (Device Device) GetDriverModel() (DriverModel, DriverModel, Return) { + return DeviceGetDriverModel(Device) +} + +// nvml.DeviceGetVbiosVersion() +func DeviceGetVbiosVersion(Device Device) (string, Return) { + Version := make([]byte, DEVICE_VBIOS_VERSION_BUFFER_SIZE) + ret := nvmlDeviceGetVbiosVersion(Device, &Version[0], DEVICE_VBIOS_VERSION_BUFFER_SIZE) + return string(Version[:clen(Version)]), ret +} + +func (Device Device) GetVbiosVersion() (string, Return) { + return DeviceGetVbiosVersion(Device) +} + +// nvml.DeviceGetBridgeChipInfo() +func DeviceGetBridgeChipInfo(Device Device) (BridgeChipHierarchy, Return) { + var BridgeHierarchy BridgeChipHierarchy + ret := nvmlDeviceGetBridgeChipInfo(Device, &BridgeHierarchy) + return BridgeHierarchy, ret +} + +func (Device Device) GetBridgeChipInfo() (BridgeChipHierarchy, Return) { + return DeviceGetBridgeChipInfo(Device) +} + +// nvml.DeviceGetComputeRunningProcesses() +func deviceGetComputeRunningProcesses_v1(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo_v1, InfoCount) + ret := nvmlDeviceGetComputeRunningProcesses_v1(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return ProcessInfo_v1Slice(Infos[:InfoCount]).ToProcessInfoSlice(), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func deviceGetComputeRunningProcesses_v2(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo_v2, InfoCount) + ret := nvmlDeviceGetComputeRunningProcesses_v2(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return ProcessInfo_v2Slice(Infos[:InfoCount]).ToProcessInfoSlice(), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func deviceGetComputeRunningProcesses_v3(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo, InfoCount) + ret := nvmlDeviceGetComputeRunningProcesses_v3(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return Infos[:InfoCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func (Device Device) GetComputeRunningProcesses() ([]ProcessInfo, Return) { + return DeviceGetComputeRunningProcesses(Device) +} + +// nvml.DeviceGetGraphicsRunningProcesses() +func deviceGetGraphicsRunningProcesses_v1(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo_v1, InfoCount) + ret := nvmlDeviceGetGraphicsRunningProcesses_v1(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return ProcessInfo_v1Slice(Infos[:InfoCount]).ToProcessInfoSlice(), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func deviceGetGraphicsRunningProcesses_v2(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo_v2, InfoCount) + ret := nvmlDeviceGetGraphicsRunningProcesses_v2(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return ProcessInfo_v2Slice(Infos[:InfoCount]).ToProcessInfoSlice(), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func deviceGetGraphicsRunningProcesses_v3(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo, InfoCount) + ret := nvmlDeviceGetGraphicsRunningProcesses_v3(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return Infos[:InfoCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func (Device Device) GetGraphicsRunningProcesses() ([]ProcessInfo, Return) { + return DeviceGetGraphicsRunningProcesses(Device) +} + +// nvml.DeviceGetMPSComputeRunningProcesses() +func deviceGetMPSComputeRunningProcesses_v1(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo_v1, InfoCount) + ret := nvmlDeviceGetMPSComputeRunningProcesses_v1(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return ProcessInfo_v1Slice(Infos[:InfoCount]).ToProcessInfoSlice(), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func deviceGetMPSComputeRunningProcesses_v2(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo_v2, InfoCount) + ret := nvmlDeviceGetMPSComputeRunningProcesses_v2(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return ProcessInfo_v2Slice(Infos[:InfoCount]).ToProcessInfoSlice(), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func deviceGetMPSComputeRunningProcesses_v3(Device Device) ([]ProcessInfo, Return) { + var InfoCount uint32 = 1 // Will be reduced upon returning + for { + Infos := make([]ProcessInfo, InfoCount) + ret := nvmlDeviceGetMPSComputeRunningProcesses_v3(Device, &InfoCount, &Infos[0]) + if ret == SUCCESS { + return Infos[:InfoCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + InfoCount *= 2 + } +} + +func (Device Device) GetMPSComputeRunningProcesses() ([]ProcessInfo, Return) { + return DeviceGetMPSComputeRunningProcesses(Device) +} + +// nvml.DeviceOnSameBoard() +func DeviceOnSameBoard(Device1 Device, Device2 Device) (int, Return) { + var OnSameBoard int32 + ret := nvmlDeviceOnSameBoard(Device1, Device2, &OnSameBoard) + return int(OnSameBoard), ret +} + +func (Device1 Device) OnSameBoard(Device2 Device) (int, Return) { + return DeviceOnSameBoard(Device1, Device2) +} + +// nvml.DeviceGetAPIRestriction() +func DeviceGetAPIRestriction(Device Device, ApiType RestrictedAPI) (EnableState, Return) { + var IsRestricted EnableState + ret := nvmlDeviceGetAPIRestriction(Device, ApiType, &IsRestricted) + return IsRestricted, ret +} + +func (Device Device) GetAPIRestriction(ApiType RestrictedAPI) (EnableState, Return) { + return DeviceGetAPIRestriction(Device, ApiType) +} + +// nvml.DeviceGetSamples() +func DeviceGetSamples(Device Device, _type SamplingType, LastSeenTimeStamp uint64) (ValueType, []Sample, Return) { + var SampleValType ValueType + var SampleCount uint32 + ret := nvmlDeviceGetSamples(Device, _type, LastSeenTimeStamp, &SampleValType, &SampleCount, nil) + if ret != SUCCESS { + return SampleValType, nil, ret + } + if SampleCount == 0 { + return SampleValType, []Sample{}, ret + } + Samples := make([]Sample, SampleCount) + ret = nvmlDeviceGetSamples(Device, _type, LastSeenTimeStamp, &SampleValType, &SampleCount, &Samples[0]) + return SampleValType, Samples, ret +} + +func (Device Device) GetSamples(_type SamplingType, LastSeenTimeStamp uint64) (ValueType, []Sample, Return) { + return DeviceGetSamples(Device, _type, LastSeenTimeStamp) +} + +// nvml.DeviceGetBAR1MemoryInfo() +func DeviceGetBAR1MemoryInfo(Device Device) (BAR1Memory, Return) { + var Bar1Memory BAR1Memory + ret := nvmlDeviceGetBAR1MemoryInfo(Device, &Bar1Memory) + return Bar1Memory, ret +} + +func (Device Device) GetBAR1MemoryInfo() (BAR1Memory, Return) { + return DeviceGetBAR1MemoryInfo(Device) +} + +// nvml.DeviceGetViolationStatus() +func DeviceGetViolationStatus(Device Device, PerfPolicyType PerfPolicyType) (ViolationTime, Return) { + var ViolTime ViolationTime + ret := nvmlDeviceGetViolationStatus(Device, PerfPolicyType, &ViolTime) + return ViolTime, ret +} + +func (Device Device) GetViolationStatus(PerfPolicyType PerfPolicyType) (ViolationTime, Return) { + return DeviceGetViolationStatus(Device, PerfPolicyType) +} + +// nvml.DeviceGetIrqNum() +func DeviceGetIrqNum(Device Device) (int, Return) { + var IrqNum uint32 + ret := nvmlDeviceGetIrqNum(Device, &IrqNum) + return int(IrqNum), ret +} + +func (Device Device) GetIrqNum() (int, Return) { + return DeviceGetIrqNum(Device) +} + +// nvml.DeviceGetNumGpuCores() +func DeviceGetNumGpuCores(Device Device) (int, Return) { + var NumCores uint32 + ret := nvmlDeviceGetNumGpuCores(Device, &NumCores) + return int(NumCores), ret +} + +func (Device Device) GetNumGpuCores() (int, Return) { + return DeviceGetNumGpuCores(Device) +} + +// nvml.DeviceGetPowerSource() +func DeviceGetPowerSource(Device Device) (PowerSource, Return) { + var PowerSource PowerSource + ret := nvmlDeviceGetPowerSource(Device, &PowerSource) + return PowerSource, ret +} + +func (Device Device) GetPowerSource() (PowerSource, Return) { + return DeviceGetPowerSource(Device) +} + +// nvml.DeviceGetMemoryBusWidth() +func DeviceGetMemoryBusWidth(Device Device) (uint32, Return) { + var BusWidth uint32 + ret := nvmlDeviceGetMemoryBusWidth(Device, &BusWidth) + return BusWidth, ret +} + +func (Device Device) GetMemoryBusWidth() (uint32, Return) { + return DeviceGetMemoryBusWidth(Device) +} + +// nvml.DeviceGetPcieLinkMaxSpeed() +func DeviceGetPcieLinkMaxSpeed(Device Device) (uint32, Return) { + var MaxSpeed uint32 + ret := nvmlDeviceGetPcieLinkMaxSpeed(Device, &MaxSpeed) + return MaxSpeed, ret +} + +func (Device Device) GetPcieLinkMaxSpeed() (uint32, Return) { + return DeviceGetPcieLinkMaxSpeed(Device) +} + +// nvml.DeviceGetAdaptiveClockInfoStatus() +func DeviceGetAdaptiveClockInfoStatus(Device Device) (uint32, Return) { + var AdaptiveClockStatus uint32 + ret := nvmlDeviceGetAdaptiveClockInfoStatus(Device, &AdaptiveClockStatus) + return AdaptiveClockStatus, ret +} + +func (Device Device) GetAdaptiveClockInfoStatus() (uint32, Return) { + return DeviceGetAdaptiveClockInfoStatus(Device) +} + +// nvml.DeviceGetAccountingMode() +func DeviceGetAccountingMode(Device Device) (EnableState, Return) { + var Mode EnableState + ret := nvmlDeviceGetAccountingMode(Device, &Mode) + return Mode, ret +} + +func (Device Device) GetAccountingMode() (EnableState, Return) { + return DeviceGetAccountingMode(Device) +} + +// nvml.DeviceGetAccountingStats() +func DeviceGetAccountingStats(Device Device, Pid uint32) (AccountingStats, Return) { + var Stats AccountingStats + ret := nvmlDeviceGetAccountingStats(Device, Pid, &Stats) + return Stats, ret +} + +func (Device Device) GetAccountingStats(Pid uint32) (AccountingStats, Return) { + return DeviceGetAccountingStats(Device, Pid) +} + +// nvml.DeviceGetAccountingPids() +func DeviceGetAccountingPids(Device Device) ([]int, Return) { + var Count uint32 = 1 // Will be reduced upon returning + for { + Pids := make([]uint32, Count) + ret := nvmlDeviceGetAccountingPids(Device, &Count, &Pids[0]) + if ret == SUCCESS { + return uint32SliceToIntSlice(Pids[:Count]), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + Count *= 2 + } +} + +func (Device Device) GetAccountingPids() ([]int, Return) { + return DeviceGetAccountingPids(Device) +} + +// nvml.DeviceGetAccountingBufferSize() +func DeviceGetAccountingBufferSize(Device Device) (int, Return) { + var BufferSize uint32 + ret := nvmlDeviceGetAccountingBufferSize(Device, &BufferSize) + return int(BufferSize), ret +} + +func (Device Device) GetAccountingBufferSize() (int, Return) { + return DeviceGetAccountingBufferSize(Device) +} + +// nvml.DeviceGetRetiredPages() +func DeviceGetRetiredPages(Device Device, Cause PageRetirementCause) ([]uint64, Return) { + var PageCount uint32 = 1 // Will be reduced upon returning + for { + Addresses := make([]uint64, PageCount) + ret := nvmlDeviceGetRetiredPages(Device, Cause, &PageCount, &Addresses[0]) + if ret == SUCCESS { + return Addresses[:PageCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + PageCount *= 2 + } +} + +func (Device Device) GetRetiredPages(Cause PageRetirementCause) ([]uint64, Return) { + return DeviceGetRetiredPages(Device, Cause) +} + +// nvml.DeviceGetRetiredPages_v2() +func DeviceGetRetiredPages_v2(Device Device, Cause PageRetirementCause) ([]uint64, []uint64, Return) { + var PageCount uint32 = 1 // Will be reduced upon returning + for { + Addresses := make([]uint64, PageCount) + Timestamps := make([]uint64, PageCount) + ret := nvmlDeviceGetRetiredPages_v2(Device, Cause, &PageCount, &Addresses[0], &Timestamps[0]) + if ret == SUCCESS { + return Addresses[:PageCount], Timestamps[:PageCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, nil, ret + } + PageCount *= 2 + } +} + +func (Device Device) GetRetiredPages_v2(Cause PageRetirementCause) ([]uint64, []uint64, Return) { + return DeviceGetRetiredPages_v2(Device, Cause) +} + +// nvml.DeviceGetRetiredPagesPendingStatus() +func DeviceGetRetiredPagesPendingStatus(Device Device) (EnableState, Return) { + var IsPending EnableState + ret := nvmlDeviceGetRetiredPagesPendingStatus(Device, &IsPending) + return IsPending, ret +} + +func (Device Device) GetRetiredPagesPendingStatus() (EnableState, Return) { + return DeviceGetRetiredPagesPendingStatus(Device) +} + +// nvml.DeviceSetPersistenceMode() +func DeviceSetPersistenceMode(Device Device, Mode EnableState) Return { + return nvmlDeviceSetPersistenceMode(Device, Mode) +} + +func (Device Device) SetPersistenceMode(Mode EnableState) Return { + return DeviceSetPersistenceMode(Device, Mode) +} + +// nvml.DeviceSetComputeMode() +func DeviceSetComputeMode(Device Device, Mode ComputeMode) Return { + return nvmlDeviceSetComputeMode(Device, Mode) +} + +func (Device Device) SetComputeMode(Mode ComputeMode) Return { + return DeviceSetComputeMode(Device, Mode) +} + +// nvml.DeviceSetEccMode() +func DeviceSetEccMode(Device Device, Ecc EnableState) Return { + return nvmlDeviceSetEccMode(Device, Ecc) +} + +func (Device Device) SetEccMode(Ecc EnableState) Return { + return DeviceSetEccMode(Device, Ecc) +} + +// nvml.DeviceClearEccErrorCounts() +func DeviceClearEccErrorCounts(Device Device, CounterType EccCounterType) Return { + return nvmlDeviceClearEccErrorCounts(Device, CounterType) +} + +func (Device Device) ClearEccErrorCounts(CounterType EccCounterType) Return { + return DeviceClearEccErrorCounts(Device, CounterType) +} + +// nvml.DeviceSetDriverModel() +func DeviceSetDriverModel(Device Device, DriverModel DriverModel, Flags uint32) Return { + return nvmlDeviceSetDriverModel(Device, DriverModel, Flags) +} + +func (Device Device) SetDriverModel(DriverModel DriverModel, Flags uint32) Return { + return DeviceSetDriverModel(Device, DriverModel, Flags) +} + +// nvml.DeviceSetGpuLockedClocks() +func DeviceSetGpuLockedClocks(Device Device, MinGpuClockMHz uint32, MaxGpuClockMHz uint32) Return { + return nvmlDeviceSetGpuLockedClocks(Device, MinGpuClockMHz, MaxGpuClockMHz) +} + +func (Device Device) SetGpuLockedClocks(MinGpuClockMHz uint32, MaxGpuClockMHz uint32) Return { + return DeviceSetGpuLockedClocks(Device, MinGpuClockMHz, MaxGpuClockMHz) +} + +// nvml.DeviceResetGpuLockedClocks() +func DeviceResetGpuLockedClocks(Device Device) Return { + return nvmlDeviceResetGpuLockedClocks(Device) +} + +func (Device Device) ResetGpuLockedClocks() Return { + return DeviceResetGpuLockedClocks(Device) +} + +// nvmlDeviceSetMemoryLockedClocks() +func DeviceSetMemoryLockedClocks(Device Device, MinMemClockMHz uint32, MaxMemClockMHz uint32) Return { + return nvmlDeviceSetMemoryLockedClocks(Device, MinMemClockMHz, MaxMemClockMHz) +} + +func (Device Device) SetMemoryLockedClocks(NinMemClockMHz uint32, MaxMemClockMHz uint32) Return { + return DeviceSetMemoryLockedClocks(Device, NinMemClockMHz, MaxMemClockMHz) +} + +// nvmlDeviceResetMemoryLockedClocks() +func DeviceResetMemoryLockedClocks(Device Device) Return { + return nvmlDeviceResetMemoryLockedClocks(Device) +} + +func (Device Device) ResetMemoryLockedClocks() Return { + return DeviceResetMemoryLockedClocks(Device) +} + +// nvml.DeviceGetClkMonStatus() +func DeviceGetClkMonStatus(Device Device) (ClkMonStatus, Return) { + var Status ClkMonStatus + ret := nvmlDeviceGetClkMonStatus(Device, &Status) + return Status, ret +} + +func (Device Device) GetClkMonStatus() (ClkMonStatus, Return) { + return DeviceGetClkMonStatus(Device) +} + +// nvml.DeviceSetApplicationsClocks() +func DeviceSetApplicationsClocks(Device Device, MemClockMHz uint32, GraphicsClockMHz uint32) Return { + return nvmlDeviceSetApplicationsClocks(Device, MemClockMHz, GraphicsClockMHz) +} + +func (Device Device) SetApplicationsClocks(MemClockMHz uint32, GraphicsClockMHz uint32) Return { + return DeviceSetApplicationsClocks(Device, MemClockMHz, GraphicsClockMHz) +} + +// nvml.DeviceSetPowerManagementLimit() +func DeviceSetPowerManagementLimit(Device Device, Limit uint32) Return { + return nvmlDeviceSetPowerManagementLimit(Device, Limit) +} + +func (Device Device) SetPowerManagementLimit(Limit uint32) Return { + return DeviceSetPowerManagementLimit(Device, Limit) +} + +// nvml.DeviceSetGpuOperationMode() +func DeviceSetGpuOperationMode(Device Device, Mode GpuOperationMode) Return { + return nvmlDeviceSetGpuOperationMode(Device, Mode) +} + +func (Device Device) SetGpuOperationMode(Mode GpuOperationMode) Return { + return DeviceSetGpuOperationMode(Device, Mode) +} + +// nvml.DeviceSetAPIRestriction() +func DeviceSetAPIRestriction(Device Device, ApiType RestrictedAPI, IsRestricted EnableState) Return { + return nvmlDeviceSetAPIRestriction(Device, ApiType, IsRestricted) +} + +func (Device Device) SetAPIRestriction(ApiType RestrictedAPI, IsRestricted EnableState) Return { + return DeviceSetAPIRestriction(Device, ApiType, IsRestricted) +} + +// nvml.DeviceSetAccountingMode() +func DeviceSetAccountingMode(Device Device, Mode EnableState) Return { + return nvmlDeviceSetAccountingMode(Device, Mode) +} + +func (Device Device) SetAccountingMode(Mode EnableState) Return { + return DeviceSetAccountingMode(Device, Mode) +} + +// nvml.DeviceClearAccountingPids() +func DeviceClearAccountingPids(Device Device) Return { + return nvmlDeviceClearAccountingPids(Device) +} + +func (Device Device) ClearAccountingPids() Return { + return DeviceClearAccountingPids(Device) +} + +// nvml.DeviceGetNvLinkState() +func DeviceGetNvLinkState(Device Device, Link int) (EnableState, Return) { + var IsActive EnableState + ret := nvmlDeviceGetNvLinkState(Device, uint32(Link), &IsActive) + return IsActive, ret +} + +func (Device Device) GetNvLinkState(Link int) (EnableState, Return) { + return DeviceGetNvLinkState(Device, Link) +} + +// nvml.DeviceGetNvLinkVersion() +func DeviceGetNvLinkVersion(Device Device, Link int) (uint32, Return) { + var Version uint32 + ret := nvmlDeviceGetNvLinkVersion(Device, uint32(Link), &Version) + return Version, ret +} + +func (Device Device) GetNvLinkVersion(Link int) (uint32, Return) { + return DeviceGetNvLinkVersion(Device, Link) +} + +// nvml.DeviceGetNvLinkCapability() +func DeviceGetNvLinkCapability(Device Device, Link int, Capability NvLinkCapability) (uint32, Return) { + var CapResult uint32 + ret := nvmlDeviceGetNvLinkCapability(Device, uint32(Link), Capability, &CapResult) + return CapResult, ret +} + +func (Device Device) GetNvLinkCapability(Link int, Capability NvLinkCapability) (uint32, Return) { + return DeviceGetNvLinkCapability(Device, Link, Capability) +} + +// nvml.DeviceGetNvLinkRemotePciInfo() +func DeviceGetNvLinkRemotePciInfo(Device Device, Link int) (PciInfo, Return) { + var Pci PciInfo + ret := nvmlDeviceGetNvLinkRemotePciInfo(Device, uint32(Link), &Pci) + return Pci, ret +} + +func (Device Device) GetNvLinkRemotePciInfo(Link int) (PciInfo, Return) { + return DeviceGetNvLinkRemotePciInfo(Device, Link) +} + +// nvml.DeviceGetNvLinkErrorCounter() +func DeviceGetNvLinkErrorCounter(Device Device, Link int, Counter NvLinkErrorCounter) (uint64, Return) { + var CounterValue uint64 + ret := nvmlDeviceGetNvLinkErrorCounter(Device, uint32(Link), Counter, &CounterValue) + return CounterValue, ret +} + +func (Device Device) GetNvLinkErrorCounter(Link int, Counter NvLinkErrorCounter) (uint64, Return) { + return DeviceGetNvLinkErrorCounter(Device, Link, Counter) +} + +// nvml.DeviceResetNvLinkErrorCounters() +func DeviceResetNvLinkErrorCounters(Device Device, Link int) Return { + return nvmlDeviceResetNvLinkErrorCounters(Device, uint32(Link)) +} + +func (Device Device) ResetNvLinkErrorCounters(Link int) Return { + return DeviceResetNvLinkErrorCounters(Device, Link) +} + +// nvml.DeviceSetNvLinkUtilizationControl() +func DeviceSetNvLinkUtilizationControl(Device Device, Link int, Counter int, Control *NvLinkUtilizationControl, Reset bool) Return { + reset := uint32(0) + if Reset { + reset = 1 + } + return nvmlDeviceSetNvLinkUtilizationControl(Device, uint32(Link), uint32(Counter), Control, reset) +} + +func (Device Device) SetNvLinkUtilizationControl(Link int, Counter int, Control *NvLinkUtilizationControl, Reset bool) Return { + return DeviceSetNvLinkUtilizationControl(Device, Link, Counter, Control, Reset) +} + +// nvml.DeviceGetNvLinkUtilizationControl() +func DeviceGetNvLinkUtilizationControl(Device Device, Link int, Counter int) (NvLinkUtilizationControl, Return) { + var Control NvLinkUtilizationControl + ret := nvmlDeviceGetNvLinkUtilizationControl(Device, uint32(Link), uint32(Counter), &Control) + return Control, ret +} + +func (Device Device) GetNvLinkUtilizationControl(Link int, Counter int) (NvLinkUtilizationControl, Return) { + return DeviceGetNvLinkUtilizationControl(Device, Link, Counter) +} + +// nvml.DeviceGetNvLinkUtilizationCounter() +func DeviceGetNvLinkUtilizationCounter(Device Device, Link int, Counter int) (uint64, uint64, Return) { + var Rxcounter, Txcounter uint64 + ret := nvmlDeviceGetNvLinkUtilizationCounter(Device, uint32(Link), uint32(Counter), &Rxcounter, &Txcounter) + return Rxcounter, Txcounter, ret +} + +func (Device Device) GetNvLinkUtilizationCounter(Link int, Counter int) (uint64, uint64, Return) { + return DeviceGetNvLinkUtilizationCounter(Device, Link, Counter) +} + +// nvml.DeviceFreezeNvLinkUtilizationCounter() +func DeviceFreezeNvLinkUtilizationCounter(Device Device, Link int, Counter int, Freeze EnableState) Return { + return nvmlDeviceFreezeNvLinkUtilizationCounter(Device, uint32(Link), uint32(Counter), Freeze) +} + +func (Device Device) FreezeNvLinkUtilizationCounter(Link int, Counter int, Freeze EnableState) Return { + return DeviceFreezeNvLinkUtilizationCounter(Device, Link, Counter, Freeze) +} + +// nvml.DeviceResetNvLinkUtilizationCounter() +func DeviceResetNvLinkUtilizationCounter(Device Device, Link int, Counter int) Return { + return nvmlDeviceResetNvLinkUtilizationCounter(Device, uint32(Link), uint32(Counter)) +} + +func (Device Device) ResetNvLinkUtilizationCounter(Link int, Counter int) Return { + return DeviceResetNvLinkUtilizationCounter(Device, Link, Counter) +} + +// nvml.DeviceGetNvLinkRemoteDeviceType() +func DeviceGetNvLinkRemoteDeviceType(Device Device, Link int) (IntNvLinkDeviceType, Return) { + var NvLinkDeviceType IntNvLinkDeviceType + ret := nvmlDeviceGetNvLinkRemoteDeviceType(Device, uint32(Link), &NvLinkDeviceType) + return NvLinkDeviceType, ret +} + +func (Device Device) GetNvLinkRemoteDeviceType(Link int) (IntNvLinkDeviceType, Return) { + return DeviceGetNvLinkRemoteDeviceType(Device, Link) +} + +// nvml.DeviceRegisterEvents() +func DeviceRegisterEvents(Device Device, EventTypes uint64, Set EventSet) Return { + return nvmlDeviceRegisterEvents(Device, EventTypes, Set) +} + +func (Device Device) RegisterEvents(EventTypes uint64, Set EventSet) Return { + return DeviceRegisterEvents(Device, EventTypes, Set) +} + +// nvmlDeviceGetSupportedEventTypes() +func DeviceGetSupportedEventTypes(Device Device) (uint64, Return) { + var EventTypes uint64 + ret := nvmlDeviceGetSupportedEventTypes(Device, &EventTypes) + return EventTypes, ret +} + +func (Device Device) GetSupportedEventTypes() (uint64, Return) { + return DeviceGetSupportedEventTypes(Device) +} + +// nvml.DeviceModifyDrainState() +func DeviceModifyDrainState(PciInfo *PciInfo, NewState EnableState) Return { + return nvmlDeviceModifyDrainState(PciInfo, NewState) +} + +// nvml.DeviceQueryDrainState() +func DeviceQueryDrainState(PciInfo *PciInfo) (EnableState, Return) { + var CurrentState EnableState + ret := nvmlDeviceQueryDrainState(PciInfo, &CurrentState) + return CurrentState, ret +} + +// nvml.DeviceRemoveGpu() +func DeviceRemoveGpu(PciInfo *PciInfo) Return { + return nvmlDeviceRemoveGpu(PciInfo) +} + +// nvml.DeviceRemoveGpu_v2() +func DeviceRemoveGpu_v2(PciInfo *PciInfo, GpuState DetachGpuState, LinkState PcieLinkState) Return { + return nvmlDeviceRemoveGpu_v2(PciInfo, GpuState, LinkState) +} + +// nvml.DeviceDiscoverGpus() +func DeviceDiscoverGpus() (PciInfo, Return) { + var PciInfo PciInfo + ret := nvmlDeviceDiscoverGpus(&PciInfo) + return PciInfo, ret +} + +// nvml.DeviceGetFieldValues() +func DeviceGetFieldValues(Device Device, Values []FieldValue) Return { + ValuesCount := len(Values) + return nvmlDeviceGetFieldValues(Device, int32(ValuesCount), &Values[0]) +} + +func (Device Device) GetFieldValues(Values []FieldValue) Return { + return DeviceGetFieldValues(Device, Values) +} + +// nvml.DeviceGetVirtualizationMode() +func DeviceGetVirtualizationMode(Device Device) (GpuVirtualizationMode, Return) { + var PVirtualMode GpuVirtualizationMode + ret := nvmlDeviceGetVirtualizationMode(Device, &PVirtualMode) + return PVirtualMode, ret +} + +func (Device Device) GetVirtualizationMode() (GpuVirtualizationMode, Return) { + return DeviceGetVirtualizationMode(Device) +} + +// nvml.DeviceGetHostVgpuMode() +func DeviceGetHostVgpuMode(Device Device) (HostVgpuMode, Return) { + var PHostVgpuMode HostVgpuMode + ret := nvmlDeviceGetHostVgpuMode(Device, &PHostVgpuMode) + return PHostVgpuMode, ret +} + +func (Device Device) GetHostVgpuMode() (HostVgpuMode, Return) { + return DeviceGetHostVgpuMode(Device) +} + +// nvml.DeviceSetVirtualizationMode() +func DeviceSetVirtualizationMode(Device Device, VirtualMode GpuVirtualizationMode) Return { + return nvmlDeviceSetVirtualizationMode(Device, VirtualMode) +} + +func (Device Device) SetVirtualizationMode(VirtualMode GpuVirtualizationMode) Return { + return DeviceSetVirtualizationMode(Device, VirtualMode) +} + +// nvml.DeviceGetGridLicensableFeatures() +func DeviceGetGridLicensableFeatures(Device Device) (GridLicensableFeatures, Return) { + var PGridLicensableFeatures GridLicensableFeatures + ret := nvmlDeviceGetGridLicensableFeatures(Device, &PGridLicensableFeatures) + return PGridLicensableFeatures, ret +} + +func (Device Device) GetGridLicensableFeatures() (GridLicensableFeatures, Return) { + return DeviceGetGridLicensableFeatures(Device) +} + +// nvml.DeviceGetProcessUtilization() +func DeviceGetProcessUtilization(Device Device, LastSeenTimeStamp uint64) ([]ProcessUtilizationSample, Return) { + var ProcessSamplesCount uint32 + ret := nvmlDeviceGetProcessUtilization(Device, nil, &ProcessSamplesCount, LastSeenTimeStamp) + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + if ProcessSamplesCount == 0 { + return []ProcessUtilizationSample{}, ret + } + Utilization := make([]ProcessUtilizationSample, ProcessSamplesCount) + ret = nvmlDeviceGetProcessUtilization(Device, &Utilization[0], &ProcessSamplesCount, LastSeenTimeStamp) + return Utilization[:ProcessSamplesCount], ret +} + +func (Device Device) GetProcessUtilization(LastSeenTimeStamp uint64) ([]ProcessUtilizationSample, Return) { + return DeviceGetProcessUtilization(Device, LastSeenTimeStamp) +} + +// nvml.DeviceGetSupportedVgpus() +func DeviceGetSupportedVgpus(Device Device) ([]VgpuTypeId, Return) { + var VgpuCount uint32 = 1 // Will be reduced upon returning + for { + VgpuTypeIds := make([]VgpuTypeId, VgpuCount) + ret := nvmlDeviceGetSupportedVgpus(Device, &VgpuCount, &VgpuTypeIds[0]) + if ret == SUCCESS { + return VgpuTypeIds[:VgpuCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + VgpuCount *= 2 + } +} + +func (Device Device) GetSupportedVgpus() ([]VgpuTypeId, Return) { + return DeviceGetSupportedVgpus(Device) +} + +// nvml.DeviceGetCreatableVgpus() +func DeviceGetCreatableVgpus(Device Device) ([]VgpuTypeId, Return) { + var VgpuCount uint32 = 1 // Will be reduced upon returning + for { + VgpuTypeIds := make([]VgpuTypeId, VgpuCount) + ret := nvmlDeviceGetCreatableVgpus(Device, &VgpuCount, &VgpuTypeIds[0]) + if ret == SUCCESS { + return VgpuTypeIds[:VgpuCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + VgpuCount *= 2 + } +} + +func (Device Device) GetCreatableVgpus() ([]VgpuTypeId, Return) { + return DeviceGetCreatableVgpus(Device) +} + +// nvml.DeviceGetActiveVgpus() +func DeviceGetActiveVgpus(Device Device) ([]VgpuInstance, Return) { + var VgpuCount uint32 = 1 // Will be reduced upon returning + for { + VgpuInstances := make([]VgpuInstance, VgpuCount) + ret := nvmlDeviceGetActiveVgpus(Device, &VgpuCount, &VgpuInstances[0]) + if ret == SUCCESS { + return VgpuInstances[:VgpuCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + VgpuCount *= 2 + } +} + +func (Device Device) GetActiveVgpus() ([]VgpuInstance, Return) { + return DeviceGetActiveVgpus(Device) +} + +// nvml.DeviceGetVgpuMetadata() +func DeviceGetVgpuMetadata(Device Device) (VgpuPgpuMetadata, Return) { + var VgpuPgpuMetadata VgpuPgpuMetadata + OpaqueDataSize := unsafe.Sizeof(VgpuPgpuMetadata.nvmlVgpuPgpuMetadata.OpaqueData) + VgpuPgpuMetadataSize := unsafe.Sizeof(VgpuPgpuMetadata.nvmlVgpuPgpuMetadata) - OpaqueDataSize + for { + BufferSize := uint32(VgpuPgpuMetadataSize + OpaqueDataSize) + Buffer := make([]byte, BufferSize) + nvmlVgpuPgpuMetadataPtr := (*nvmlVgpuPgpuMetadata)(unsafe.Pointer(&Buffer[0])) + ret := nvmlDeviceGetVgpuMetadata(Device, nvmlVgpuPgpuMetadataPtr, &BufferSize) + if ret == SUCCESS { + VgpuPgpuMetadata.nvmlVgpuPgpuMetadata = *nvmlVgpuPgpuMetadataPtr + VgpuPgpuMetadata.OpaqueData = Buffer[VgpuPgpuMetadataSize:BufferSize] + return VgpuPgpuMetadata, ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return VgpuPgpuMetadata, ret + } + OpaqueDataSize = 2 * OpaqueDataSize + } +} + +func (Device Device) GetVgpuMetadata() (VgpuPgpuMetadata, Return) { + return DeviceGetVgpuMetadata(Device) +} + +// nvml.DeviceGetPgpuMetadataString() +func DeviceGetPgpuMetadataString(Device Device) (string, Return) { + var BufferSize uint32 = 1 // Will be reduced upon returning + for { + PgpuMetadata := make([]byte, BufferSize) + ret := nvmlDeviceGetPgpuMetadataString(Device, &PgpuMetadata[0], &BufferSize) + if ret == SUCCESS { + return string(PgpuMetadata[:clen(PgpuMetadata)]), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return "", ret + } + BufferSize *= 2 + } +} + +func (Device Device) GetPgpuMetadataString() (string, Return) { + return DeviceGetPgpuMetadataString(Device) +} + +// nvml.DeviceGetVgpuUtilization() +func DeviceGetVgpuUtilization(Device Device, LastSeenTimeStamp uint64) (ValueType, []VgpuInstanceUtilizationSample, Return) { + var SampleValType ValueType + var VgpuInstanceSamplesCount uint32 = 1 // Will be reduced upon returning + for { + UtilizationSamples := make([]VgpuInstanceUtilizationSample, VgpuInstanceSamplesCount) + ret := nvmlDeviceGetVgpuUtilization(Device, LastSeenTimeStamp, &SampleValType, &VgpuInstanceSamplesCount, &UtilizationSamples[0]) + if ret == SUCCESS { + return SampleValType, UtilizationSamples[:VgpuInstanceSamplesCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return SampleValType, nil, ret + } + VgpuInstanceSamplesCount *= 2 + } +} + +func (Device Device) GetVgpuUtilization(LastSeenTimeStamp uint64) (ValueType, []VgpuInstanceUtilizationSample, Return) { + return DeviceGetVgpuUtilization(Device, LastSeenTimeStamp) +} + +// nvml.DeviceGetAttributes() +func DeviceGetAttributes(Device Device) (DeviceAttributes, Return) { + var Attributes DeviceAttributes + ret := nvmlDeviceGetAttributes(Device, &Attributes) + return Attributes, ret +} + +func (Device Device) GetAttributes() (DeviceAttributes, Return) { + return DeviceGetAttributes(Device) +} + +// nvml.DeviceGetRemappedRows() +func DeviceGetRemappedRows(Device Device) (int, int, bool, bool, Return) { + var CorrRows, UncRows, IsPending, FailureOccured uint32 + ret := nvmlDeviceGetRemappedRows(Device, &CorrRows, &UncRows, &IsPending, &FailureOccured) + return int(CorrRows), int(UncRows), (IsPending != 0), (FailureOccured != 0), ret +} + +func (Device Device) GetRemappedRows() (int, int, bool, bool, Return) { + return DeviceGetRemappedRows(Device) +} + +// nvml.DeviceGetRowRemapperHistogram() +func DeviceGetRowRemapperHistogram(Device Device) (RowRemapperHistogramValues, Return) { + var Values RowRemapperHistogramValues + ret := nvmlDeviceGetRowRemapperHistogram(Device, &Values) + return Values, ret +} + +func (Device Device) GetRowRemapperHistogram() (RowRemapperHistogramValues, Return) { + return DeviceGetRowRemapperHistogram(Device) +} + +// nvml.DeviceGetArchitecture() +func DeviceGetArchitecture(Device Device) (DeviceArchitecture, Return) { + var Arch DeviceArchitecture + ret := nvmlDeviceGetArchitecture(Device, &Arch) + return Arch, ret +} + +func (Device Device) GetArchitecture() (DeviceArchitecture, Return) { + return DeviceGetArchitecture(Device) +} + +// nvml.DeviceGetVgpuProcessUtilization() +func DeviceGetVgpuProcessUtilization(Device Device, LastSeenTimeStamp uint64) ([]VgpuProcessUtilizationSample, Return) { + var VgpuProcessSamplesCount uint32 = 1 // Will be reduced upon returning + for { + UtilizationSamples := make([]VgpuProcessUtilizationSample, VgpuProcessSamplesCount) + ret := nvmlDeviceGetVgpuProcessUtilization(Device, LastSeenTimeStamp, &VgpuProcessSamplesCount, &UtilizationSamples[0]) + if ret == SUCCESS { + return UtilizationSamples[:VgpuProcessSamplesCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + VgpuProcessSamplesCount *= 2 + } +} + +func (Device Device) GetVgpuProcessUtilization(LastSeenTimeStamp uint64) ([]VgpuProcessUtilizationSample, Return) { + return DeviceGetVgpuProcessUtilization(Device, LastSeenTimeStamp) +} + +// nvml.GetExcludedDeviceCount() +func GetExcludedDeviceCount() (int, Return) { + var DeviceCount uint32 + ret := nvmlGetExcludedDeviceCount(&DeviceCount) + return int(DeviceCount), ret +} + +// nvml.GetExcludedDeviceInfoByIndex() +func GetExcludedDeviceInfoByIndex(Index int) (ExcludedDeviceInfo, Return) { + var Info ExcludedDeviceInfo + ret := nvmlGetExcludedDeviceInfoByIndex(uint32(Index), &Info) + return Info, ret +} + +// nvml.DeviceSetMigMode() +func DeviceSetMigMode(Device Device, Mode int) (Return, Return) { + var ActivationStatus Return + ret := nvmlDeviceSetMigMode(Device, uint32(Mode), &ActivationStatus) + return ActivationStatus, ret +} + +func (Device Device) SetMigMode(Mode int) (Return, Return) { + return DeviceSetMigMode(Device, Mode) +} + +// nvml.DeviceGetMigMode() +func DeviceGetMigMode(Device Device) (int, int, Return) { + var CurrentMode, PendingMode uint32 + ret := nvmlDeviceGetMigMode(Device, &CurrentMode, &PendingMode) + return int(CurrentMode), int(PendingMode), ret +} + +func (Device Device) GetMigMode() (int, int, Return) { + return DeviceGetMigMode(Device) +} + +// nvml.DeviceGetGpuInstanceProfileInfo() +func DeviceGetGpuInstanceProfileInfo(Device Device, Profile int) (GpuInstanceProfileInfo, Return) { + var Info GpuInstanceProfileInfo + ret := nvmlDeviceGetGpuInstanceProfileInfo(Device, uint32(Profile), &Info) + return Info, ret +} + +func (Device Device) GetGpuInstanceProfileInfo(Profile int) (GpuInstanceProfileInfo, Return) { + return DeviceGetGpuInstanceProfileInfo(Device, Profile) +} + +// nvml.DeviceGetGpuInstanceProfileInfoV() +type GpuInstanceProfileInfoV struct { + device Device + profile int +} + +func (InfoV GpuInstanceProfileInfoV) V1() (GpuInstanceProfileInfo, Return) { + return DeviceGetGpuInstanceProfileInfo(InfoV.device, InfoV.profile) +} + +func (InfoV GpuInstanceProfileInfoV) V2() (GpuInstanceProfileInfo_v2, Return) { + var Info GpuInstanceProfileInfo_v2 + Info.Version = STRUCT_VERSION(Info, 2) + ret := nvmlDeviceGetGpuInstanceProfileInfoV(InfoV.device, uint32(InfoV.profile), &Info) + return Info, ret +} + +func DeviceGetGpuInstanceProfileInfoV(Device Device, Profile int) GpuInstanceProfileInfoV { + return GpuInstanceProfileInfoV{Device, Profile} +} + +func (Device Device) GetGpuInstanceProfileInfoV(Profile int) GpuInstanceProfileInfoV { + return DeviceGetGpuInstanceProfileInfoV(Device, Profile) +} + +// nvml.DeviceGetGpuInstancePossiblePlacements() +func DeviceGetGpuInstancePossiblePlacements(Device Device, Info *GpuInstanceProfileInfo) ([]GpuInstancePlacement, Return) { + if Info == nil { + return nil, ERROR_INVALID_ARGUMENT + } + var Count uint32 = Info.InstanceCount + Placements := make([]GpuInstancePlacement, Count) + ret := nvmlDeviceGetGpuInstancePossiblePlacements(Device, Info.Id, &Placements[0], &Count) + return Placements[:Count], ret +} + +func (Device Device) GetGpuInstancePossiblePlacements(Info *GpuInstanceProfileInfo) ([]GpuInstancePlacement, Return) { + return DeviceGetGpuInstancePossiblePlacements(Device, Info) +} + +// nvml.DeviceGetGpuInstanceRemainingCapacity() +func DeviceGetGpuInstanceRemainingCapacity(Device Device, Info *GpuInstanceProfileInfo) (int, Return) { + if Info == nil { + return 0, ERROR_INVALID_ARGUMENT + } + var Count uint32 + ret := nvmlDeviceGetGpuInstanceRemainingCapacity(Device, Info.Id, &Count) + return int(Count), ret +} + +func (Device Device) GetGpuInstanceRemainingCapacity(Info *GpuInstanceProfileInfo) (int, Return) { + return DeviceGetGpuInstanceRemainingCapacity(Device, Info) +} + +// nvml.DeviceCreateGpuInstance() +func DeviceCreateGpuInstance(Device Device, Info *GpuInstanceProfileInfo) (GpuInstance, Return) { + if Info == nil { + return GpuInstance{}, ERROR_INVALID_ARGUMENT + } + var GpuInstance GpuInstance + ret := nvmlDeviceCreateGpuInstance(Device, Info.Id, &GpuInstance) + return GpuInstance, ret +} + +func (Device Device) CreateGpuInstance(Info *GpuInstanceProfileInfo) (GpuInstance, Return) { + return DeviceCreateGpuInstance(Device, Info) +} + +// nvml.DeviceCreateGpuInstanceWithPlacement() +func DeviceCreateGpuInstanceWithPlacement(Device Device, Info *GpuInstanceProfileInfo, Placement *GpuInstancePlacement) (GpuInstance, Return) { + if Info == nil { + return GpuInstance{}, ERROR_INVALID_ARGUMENT + } + var GpuInstance GpuInstance + ret := nvmlDeviceCreateGpuInstanceWithPlacement(Device, Info.Id, Placement, &GpuInstance) + return GpuInstance, ret +} + +func (Device Device) CreateGpuInstanceWithPlacement(Info *GpuInstanceProfileInfo, Placement *GpuInstancePlacement) (GpuInstance, Return) { + return DeviceCreateGpuInstanceWithPlacement(Device, Info, Placement) +} + +// nvml.GpuInstanceDestroy() +func GpuInstanceDestroy(GpuInstance GpuInstance) Return { + return nvmlGpuInstanceDestroy(GpuInstance) +} + +func (GpuInstance GpuInstance) Destroy() Return { + return GpuInstanceDestroy(GpuInstance) +} + +// nvml.DeviceGetGpuInstances() +func DeviceGetGpuInstances(Device Device, Info *GpuInstanceProfileInfo) ([]GpuInstance, Return) { + if Info == nil { + return nil, ERROR_INVALID_ARGUMENT + } + var Count uint32 = Info.InstanceCount + GpuInstances := make([]GpuInstance, Count) + ret := nvmlDeviceGetGpuInstances(Device, Info.Id, &GpuInstances[0], &Count) + return GpuInstances[:Count], ret +} + +func (Device Device) GetGpuInstances(Info *GpuInstanceProfileInfo) ([]GpuInstance, Return) { + return DeviceGetGpuInstances(Device, Info) +} + +// nvml.DeviceGetGpuInstanceById() +func DeviceGetGpuInstanceById(Device Device, Id int) (GpuInstance, Return) { + var GpuInstance GpuInstance + ret := nvmlDeviceGetGpuInstanceById(Device, uint32(Id), &GpuInstance) + return GpuInstance, ret +} + +func (Device Device) GetGpuInstanceById(Id int) (GpuInstance, Return) { + return DeviceGetGpuInstanceById(Device, Id) +} + +// nvml.GpuInstanceGetInfo() +func GpuInstanceGetInfo(GpuInstance GpuInstance) (GpuInstanceInfo, Return) { + var Info GpuInstanceInfo + ret := nvmlGpuInstanceGetInfo(GpuInstance, &Info) + return Info, ret +} + +func (GpuInstance GpuInstance) GetInfo() (GpuInstanceInfo, Return) { + return GpuInstanceGetInfo(GpuInstance) +} + +// nvml.GpuInstanceGetComputeInstanceProfileInfo() +func GpuInstanceGetComputeInstanceProfileInfo(GpuInstance GpuInstance, Profile int, EngProfile int) (ComputeInstanceProfileInfo, Return) { + var Info ComputeInstanceProfileInfo + ret := nvmlGpuInstanceGetComputeInstanceProfileInfo(GpuInstance, uint32(Profile), uint32(EngProfile), &Info) + return Info, ret +} + +func (GpuInstance GpuInstance) GetComputeInstanceProfileInfo(Profile int, EngProfile int) (ComputeInstanceProfileInfo, Return) { + return GpuInstanceGetComputeInstanceProfileInfo(GpuInstance, Profile, EngProfile) +} + +// nvml.GpuInstanceGetComputeInstanceProfileInfoV() +type ComputeInstanceProfileInfoV struct { + gpuInstance GpuInstance + profile int + engProfile int +} + +func (InfoV ComputeInstanceProfileInfoV) V1() (ComputeInstanceProfileInfo, Return) { + return GpuInstanceGetComputeInstanceProfileInfo(InfoV.gpuInstance, InfoV.profile, InfoV.engProfile) +} + +func (InfoV ComputeInstanceProfileInfoV) V2() (ComputeInstanceProfileInfo_v2, Return) { + var Info ComputeInstanceProfileInfo_v2 + Info.Version = STRUCT_VERSION(Info, 2) + ret := nvmlGpuInstanceGetComputeInstanceProfileInfoV(InfoV.gpuInstance, uint32(InfoV.profile), uint32(InfoV.engProfile), &Info) + return Info, ret +} + +func GpuInstanceGetComputeInstanceProfileInfoV(GpuInstance GpuInstance, Profile int, EngProfile int) ComputeInstanceProfileInfoV { + return ComputeInstanceProfileInfoV{GpuInstance, Profile, EngProfile} +} + +func (GpuInstance GpuInstance) GetComputeInstanceProfileInfoV(Profile int, EngProfile int) ComputeInstanceProfileInfoV { + return GpuInstanceGetComputeInstanceProfileInfoV(GpuInstance, Profile, EngProfile) +} + +// nvml.GpuInstanceGetComputeInstanceRemainingCapacity() +func GpuInstanceGetComputeInstanceRemainingCapacity(GpuInstance GpuInstance, Info *ComputeInstanceProfileInfo) (int, Return) { + if Info == nil { + return 0, ERROR_INVALID_ARGUMENT + } + var Count uint32 + ret := nvmlGpuInstanceGetComputeInstanceRemainingCapacity(GpuInstance, Info.Id, &Count) + return int(Count), ret +} + +func (GpuInstance GpuInstance) GetComputeInstanceRemainingCapacity(Info *ComputeInstanceProfileInfo) (int, Return) { + return GpuInstanceGetComputeInstanceRemainingCapacity(GpuInstance, Info) +} + +// nvml.GpuInstanceCreateComputeInstance() +func GpuInstanceCreateComputeInstance(GpuInstance GpuInstance, Info *ComputeInstanceProfileInfo) (ComputeInstance, Return) { + if Info == nil { + return ComputeInstance{}, ERROR_INVALID_ARGUMENT + } + var ComputeInstance ComputeInstance + ret := nvmlGpuInstanceCreateComputeInstance(GpuInstance, Info.Id, &ComputeInstance) + return ComputeInstance, ret +} + +func (GpuInstance GpuInstance) CreateComputeInstance(Info *ComputeInstanceProfileInfo) (ComputeInstance, Return) { + return GpuInstanceCreateComputeInstance(GpuInstance, Info) +} + +// nvml.ComputeInstanceDestroy() +func ComputeInstanceDestroy(ComputeInstance ComputeInstance) Return { + return nvmlComputeInstanceDestroy(ComputeInstance) +} + +func (ComputeInstance ComputeInstance) Destroy() Return { + return ComputeInstanceDestroy(ComputeInstance) +} + +// nvml.GpuInstanceGetComputeInstances() +func GpuInstanceGetComputeInstances(GpuInstance GpuInstance, Info *ComputeInstanceProfileInfo) ([]ComputeInstance, Return) { + if Info == nil { + return nil, ERROR_INVALID_ARGUMENT + } + var Count uint32 = Info.InstanceCount + ComputeInstances := make([]ComputeInstance, Count) + ret := nvmlGpuInstanceGetComputeInstances(GpuInstance, Info.Id, &ComputeInstances[0], &Count) + return ComputeInstances[:Count], ret +} + +func (GpuInstance GpuInstance) GetComputeInstances(Info *ComputeInstanceProfileInfo) ([]ComputeInstance, Return) { + return GpuInstanceGetComputeInstances(GpuInstance, Info) +} + +// nvml.GpuInstanceGetComputeInstanceById() +func GpuInstanceGetComputeInstanceById(GpuInstance GpuInstance, Id int) (ComputeInstance, Return) { + var ComputeInstance ComputeInstance + ret := nvmlGpuInstanceGetComputeInstanceById(GpuInstance, uint32(Id), &ComputeInstance) + return ComputeInstance, ret +} + +func (GpuInstance GpuInstance) GetComputeInstanceById(Id int) (ComputeInstance, Return) { + return GpuInstanceGetComputeInstanceById(GpuInstance, Id) +} + +// nvml.ComputeInstanceGetInfo() +func ComputeInstanceGetInfo(ComputeInstance ComputeInstance) (ComputeInstanceInfo, Return) { + var Info ComputeInstanceInfo + ret := nvmlComputeInstanceGetInfo(ComputeInstance, &Info) + return Info, ret +} + +func (ComputeInstance ComputeInstance) GetInfo() (ComputeInstanceInfo, Return) { + return ComputeInstanceGetInfo(ComputeInstance) +} + +// nvml.DeviceIsMigDeviceHandle() +func DeviceIsMigDeviceHandle(Device Device) (bool, Return) { + var IsMigDevice uint32 + ret := nvmlDeviceIsMigDeviceHandle(Device, &IsMigDevice) + return (IsMigDevice != 0), ret +} + +func (Device Device) IsMigDeviceHandle() (bool, Return) { + return DeviceIsMigDeviceHandle(Device) +} + +// nvml DeviceGetGpuInstanceId() +func DeviceGetGpuInstanceId(Device Device) (int, Return) { + var Id uint32 + ret := nvmlDeviceGetGpuInstanceId(Device, &Id) + return int(Id), ret +} + +func (Device Device) GetGpuInstanceId() (int, Return) { + return DeviceGetGpuInstanceId(Device) +} + +// nvml.DeviceGetComputeInstanceId() +func DeviceGetComputeInstanceId(Device Device) (int, Return) { + var Id uint32 + ret := nvmlDeviceGetComputeInstanceId(Device, &Id) + return int(Id), ret +} + +func (Device Device) GetComputeInstanceId() (int, Return) { + return DeviceGetComputeInstanceId(Device) +} + +// nvml.DeviceGetMaxMigDeviceCount() +func DeviceGetMaxMigDeviceCount(Device Device) (int, Return) { + var Count uint32 + ret := nvmlDeviceGetMaxMigDeviceCount(Device, &Count) + return int(Count), ret +} + +func (Device Device) GetMaxMigDeviceCount() (int, Return) { + return DeviceGetMaxMigDeviceCount(Device) +} + +// nvml.DeviceGetMigDeviceHandleByIndex() +func DeviceGetMigDeviceHandleByIndex(device Device, Index int) (Device, Return) { + var MigDevice Device + ret := nvmlDeviceGetMigDeviceHandleByIndex(device, uint32(Index), &MigDevice) + return MigDevice, ret +} + +func (Device Device) GetMigDeviceHandleByIndex(Index int) (Device, Return) { + return DeviceGetMigDeviceHandleByIndex(Device, Index) +} + +// nvml.DeviceGetDeviceHandleFromMigDeviceHandle() +func DeviceGetDeviceHandleFromMigDeviceHandle(MigDevice Device) (Device, Return) { + var Device Device + ret := nvmlDeviceGetDeviceHandleFromMigDeviceHandle(MigDevice, &Device) + return Device, ret +} + +func (MigDevice Device) GetDeviceHandleFromMigDeviceHandle() (Device, Return) { + return DeviceGetDeviceHandleFromMigDeviceHandle(MigDevice) +} + +// nvml.DeviceGetBusType() +func DeviceGetBusType(Device Device) (BusType, Return) { + var Type BusType + ret := nvmlDeviceGetBusType(Device, &Type) + return Type, ret +} + +func (Device Device) GetBusType() (BusType, Return) { + return DeviceGetBusType(Device) +} + +// nvml.DeviceSetDefaultFanSpeed_v2() +func DeviceSetDefaultFanSpeed_v2(Device Device, Fan int) Return { + return nvmlDeviceSetDefaultFanSpeed_v2(Device, uint32(Fan)) +} + +func (Device Device) SetDefaultFanSpeed_v2(Fan int) Return { + return DeviceSetDefaultFanSpeed_v2(Device, Fan) +} + +// nvml.DeviceGetMinMaxFanSpeed() +func DeviceGetMinMaxFanSpeed(Device Device) (int, int, Return) { + var MinSpeed, MaxSpeed uint32 + ret := nvmlDeviceGetMinMaxFanSpeed(Device, &MinSpeed, &MaxSpeed) + return int(MinSpeed), int(MaxSpeed), ret +} + +func (Device Device) GetMinMaxFanSpeed() (int, int, Return) { + return DeviceGetMinMaxFanSpeed(Device) +} + +// nvml.DeviceGetThermalSettings() +func DeviceGetThermalSettings(Device Device, SensorIndex uint32) (GpuThermalSettings, Return) { + var PThermalSettings GpuThermalSettings + ret := nvmlDeviceGetThermalSettings(Device, SensorIndex, &PThermalSettings) + return PThermalSettings, ret +} + +func (Device Device) GetThermalSettings(SensorIndex uint32) (GpuThermalSettings, Return) { + return DeviceGetThermalSettings(Device, SensorIndex) +} + +// nvml.DeviceGetDefaultEccMode() +func DeviceGetDefaultEccMode(Device Device) (EnableState, Return) { + var DefaultMode EnableState + ret := nvmlDeviceGetDefaultEccMode(Device, &DefaultMode) + return DefaultMode, ret +} + +func (Device Device) GetDefaultEccMode() (EnableState, Return) { + return DeviceGetDefaultEccMode(Device) +} + +// nvml.DeviceGetPcieSpeed() +func DeviceGetPcieSpeed(Device Device) (int, Return) { + var PcieSpeed uint32 + ret := nvmlDeviceGetPcieSpeed(Device, &PcieSpeed) + return int(PcieSpeed), ret +} + +func (Device Device) GetPcieSpeed() (int, Return) { + return DeviceGetPcieSpeed(Device) +} + +// nvml.DeviceGetGspFirmwareVersion() +func DeviceGetGspFirmwareVersion(Device Device) (string, Return) { + Version := make([]byte, GSP_FIRMWARE_VERSION_BUF_SIZE) + ret := nvmlDeviceGetGspFirmwareVersion(Device, &Version[0]) + return string(Version[:clen(Version)]), ret +} + +func (Device Device) GetGspFirmwareVersion() (string, Return) { + return DeviceGetGspFirmwareVersion(Device) +} + +// nvml.DeviceGetGspFirmwareMode() +func DeviceGetGspFirmwareMode(Device Device) (bool, bool, Return) { + var IsEnabled, DefaultMode uint32 + ret := nvmlDeviceGetGspFirmwareMode(Device, &IsEnabled, &DefaultMode) + return (IsEnabled != 0), (DefaultMode != 0), ret +} + +func (Device Device) GetGspFirmwareMode() (bool, bool, Return) { + return DeviceGetGspFirmwareMode(Device) +} + +// nvml.DeviceGetDynamicPstatesInfo() +func DeviceGetDynamicPstatesInfo(Device Device) (GpuDynamicPstatesInfo, Return) { + var PDynamicPstatesInfo GpuDynamicPstatesInfo + ret := nvmlDeviceGetDynamicPstatesInfo(Device, &PDynamicPstatesInfo) + return PDynamicPstatesInfo, ret +} + +func (Device Device) GetDynamicPstatesInfo() (GpuDynamicPstatesInfo, Return) { + return DeviceGetDynamicPstatesInfo(Device) +} + +// nvml.DeviceSetFanSpeed_v2() +func DeviceSetFanSpeed_v2(Device Device, Fan int, Speed int) Return { + return nvmlDeviceSetFanSpeed_v2(Device, uint32(Fan), uint32(Speed)) +} + +func (Device Device) SetFanSpeed_v2(Fan int, Speed int) Return { + return DeviceSetFanSpeed_v2(Device, Fan, Speed) +} + +// nvml.DeviceGetGpcClkVfOffset() +func DeviceGetGpcClkVfOffset(Device Device) (int, Return) { + var Offset int32 + ret := nvmlDeviceGetGpcClkVfOffset(Device, &Offset) + return int(Offset), ret +} + +func (Device Device) GetGpcClkVfOffset() (int, Return) { + return DeviceGetGpcClkVfOffset(Device) +} + +// nvml.DeviceSetGpcClkVfOffset() +func DeviceSetGpcClkVfOffset(Device Device, Offset int) Return { + return nvmlDeviceSetGpcClkVfOffset(Device, int32(Offset)) +} + +func (Device Device) SetGpcClkVfOffset(Offset int) Return { + return DeviceSetGpcClkVfOffset(Device, Offset) +} + +// nvml.DeviceGetMinMaxClockOfPState() +func DeviceGetMinMaxClockOfPState(Device Device, _type ClockType, Pstate Pstates) (uint32, uint32, Return) { + var MinClockMHz, MaxClockMHz uint32 + ret := nvmlDeviceGetMinMaxClockOfPState(Device, _type, Pstate, &MinClockMHz, &MaxClockMHz) + return MinClockMHz, MaxClockMHz, ret +} + +func (Device Device) GetMinMaxClockOfPState(_type ClockType, Pstate Pstates) (uint32, uint32, Return) { + return DeviceGetMinMaxClockOfPState(Device, _type, Pstate) +} + +// nvml.DeviceGetSupportedPerformanceStates() +func DeviceGetSupportedPerformanceStates(Device Device) ([]Pstates, Return) { + Pstates := make([]Pstates, MAX_GPU_PERF_PSTATES) + ret := nvmlDeviceGetSupportedPerformanceStates(Device, &Pstates[0], MAX_GPU_PERF_PSTATES) + for i := 0; i < MAX_GPU_PERF_PSTATES; i++ { + if Pstates[i] == PSTATE_UNKNOWN { + return Pstates[0:i], ret + } + } + return Pstates, ret +} + +func (Device Device) GetSupportedPerformanceStates() ([]Pstates, Return) { + return DeviceGetSupportedPerformanceStates(Device) +} + +// nvml.DeviceGetTargetFanSpeed() +func DeviceGetTargetFanSpeed(Device Device, Fan int) (int, Return) { + var TargetSpeed uint32 + ret := nvmlDeviceGetTargetFanSpeed(Device, uint32(Fan), &TargetSpeed) + return int(TargetSpeed), ret +} + +func (Device Device) GetTargetFanSpeed(Fan int) (int, Return) { + return DeviceGetTargetFanSpeed(Device, Fan) +} + +// nvml.DeviceGetMemClkVfOffset() +func DeviceGetMemClkVfOffset(Device Device) (int, Return) { + var Offset int32 + ret := nvmlDeviceGetMemClkVfOffset(Device, &Offset) + return int(Offset), ret +} + +func (Device Device) GetMemClkVfOffset() (int, Return) { + return DeviceGetMemClkVfOffset(Device) +} + +// nvml.DeviceSetMemClkVfOffset() +func DeviceSetMemClkVfOffset(Device Device, Offset int) Return { + return nvmlDeviceSetMemClkVfOffset(Device, int32(Offset)) +} + +func (Device Device) SetMemClkVfOffset(Offset int) Return { + return DeviceSetMemClkVfOffset(Device, Offset) +} + +// nvml.DeviceGetGpcClkMinMaxVfOffset() +func DeviceGetGpcClkMinMaxVfOffset(Device Device) (int, int, Return) { + var MinOffset, MaxOffset int32 + ret := nvmlDeviceGetGpcClkMinMaxVfOffset(Device, &MinOffset, &MaxOffset) + return int(MinOffset), int(MaxOffset), ret +} + +func (Device Device) GetGpcClkMinMaxVfOffset() (int, int, Return) { + return DeviceGetGpcClkMinMaxVfOffset(Device) +} + +// nvml.DeviceGetMemClkMinMaxVfOffset() +func DeviceGetMemClkMinMaxVfOffset(Device Device) (int, int, Return) { + var MinOffset, MaxOffset int32 + ret := nvmlDeviceGetMemClkMinMaxVfOffset(Device, &MinOffset, &MaxOffset) + return int(MinOffset), int(MaxOffset), ret +} + +func (Device Device) GetMemClkMinMaxVfOffset() (int, int, Return) { + return DeviceGetMemClkMinMaxVfOffset(Device) +} + +// nvml.DeviceGetGpuMaxPcieLinkGeneration() +func DeviceGetGpuMaxPcieLinkGeneration(Device Device) (int, Return) { + var MaxLinkGenDevice uint32 + ret := nvmlDeviceGetGpuMaxPcieLinkGeneration(Device, &MaxLinkGenDevice) + return int(MaxLinkGenDevice), ret +} + +func (Device Device) GetGpuMaxPcieLinkGeneration() (int, Return) { + return DeviceGetGpuMaxPcieLinkGeneration(Device) +} + +// nvml.DeviceGetFanControlPolicy_v2() +func DeviceGetFanControlPolicy_v2(Device Device, Fan int) (FanControlPolicy, Return) { + var Policy FanControlPolicy + ret := nvmlDeviceGetFanControlPolicy_v2(Device, uint32(Fan), &Policy) + return Policy, ret +} + +func (Device Device) GetFanControlPolicy_v2(Fan int) (FanControlPolicy, Return) { + return DeviceGetFanControlPolicy_v2(Device, Fan) +} + +// nvml.DeviceSetFanControlPolicy() +func DeviceSetFanControlPolicy(Device Device, Fan int, Policy FanControlPolicy) Return { + return nvmlDeviceSetFanControlPolicy(Device, uint32(Fan), Policy) +} + +func (Device Device) SetFanControlPolicy(Fan int, Policy FanControlPolicy) Return { + return DeviceSetFanControlPolicy(Device, Fan, Policy) +} + +// nvml.DeviceClearFieldValues() +func DeviceClearFieldValues(Device Device, Values []FieldValue) Return { + ValuesCount := len(Values) + return nvmlDeviceClearFieldValues(Device, int32(ValuesCount), &Values[0]) +} + +func (Device Device) ClearFieldValues(Values []FieldValue) Return { + return DeviceClearFieldValues(Device, Values) +} + +// nvml.DeviceGetVgpuCapabilities() +func DeviceGetVgpuCapabilities(Device Device, Capability DeviceVgpuCapability) (bool, Return) { + var CapResult uint32 + ret := nvmlDeviceGetVgpuCapabilities(Device, Capability, &CapResult) + return (CapResult != 0), ret +} + +func (Device Device) GetVgpuCapabilities(Capability DeviceVgpuCapability) (bool, Return) { + return DeviceGetVgpuCapabilities(Device, Capability) +} + +// nvml.DeviceGetVgpuSchedulerLog() +func DeviceGetVgpuSchedulerLog(Device Device) (VgpuSchedulerLog, Return) { + var PSchedulerLog VgpuSchedulerLog + ret := nvmlDeviceGetVgpuSchedulerLog(Device, &PSchedulerLog) + return PSchedulerLog, ret +} + +func (Device Device) GetVgpuSchedulerLog() (VgpuSchedulerLog, Return) { + return DeviceGetVgpuSchedulerLog(Device) +} + +// nvml.DeviceGetVgpuSchedulerState() +func DeviceGetVgpuSchedulerState(Device Device) (VgpuSchedulerGetState, Return) { + var PSchedulerState VgpuSchedulerGetState + ret := nvmlDeviceGetVgpuSchedulerState(Device, &PSchedulerState) + return PSchedulerState, ret +} + +func (Device Device) GetVgpuSchedulerState() (VgpuSchedulerGetState, Return) { + return DeviceGetVgpuSchedulerState(Device) +} + +// nvml.DeviceSetVgpuSchedulerState() +func DeviceSetVgpuSchedulerState(Device Device, PSchedulerState *VgpuSchedulerSetState) Return { + return nvmlDeviceSetVgpuSchedulerState(Device, PSchedulerState) +} + +func (Device Device) SetVgpuSchedulerState(PSchedulerState *VgpuSchedulerSetState) Return { + return DeviceSetVgpuSchedulerState(Device, PSchedulerState) +} + +// nvml.DeviceGetVgpuSchedulerCapabilities() +func DeviceGetVgpuSchedulerCapabilities(Device Device) (VgpuSchedulerCapabilities, Return) { + var PCapabilities VgpuSchedulerCapabilities + ret := nvmlDeviceGetVgpuSchedulerCapabilities(Device, &PCapabilities) + return PCapabilities, ret +} + +func (Device Device) GetVgpuSchedulerCapabilities() (VgpuSchedulerCapabilities, Return) { + return DeviceGetVgpuSchedulerCapabilities(Device) +} + +// nvml.GpuInstanceGetComputeInstancePossiblePlacements() +func GpuInstanceGetComputeInstancePossiblePlacements(GpuInstance GpuInstance, ProfileId int) ([]ComputeInstancePlacement, Return) { + var Count uint32 + ret := nvmlGpuInstanceGetComputeInstancePossiblePlacements(GpuInstance, uint32(ProfileId), nil, &Count) + if ret != SUCCESS { + return nil, ret + } + if Count == 0 { + return []ComputeInstancePlacement{}, ret + } + PlacementArray := make([]ComputeInstancePlacement, Count) + ret = nvmlGpuInstanceGetComputeInstancePossiblePlacements(GpuInstance, uint32(ProfileId), &PlacementArray[0], &Count) + return PlacementArray, ret +} + +func (GpuInstance GpuInstance) GetComputeInstancePossiblePlacements(ProfileId int) ([]ComputeInstancePlacement, Return) { + return GpuInstanceGetComputeInstancePossiblePlacements(GpuInstance, ProfileId) +} + +// nvml.GpuInstanceCreateComputeInstanceWithPlacement() +func GpuInstanceCreateComputeInstanceWithPlacement(GpuInstance GpuInstance, ProfileId int, Placement *ComputeInstancePlacement, ComputeInstance *ComputeInstance) Return { + return nvmlGpuInstanceCreateComputeInstanceWithPlacement(GpuInstance, uint32(ProfileId), Placement, ComputeInstance) +} + +func (GpuInstance GpuInstance) CreateComputeInstanceWithPlacement(ProfileId int, Placement *ComputeInstancePlacement, ComputeInstance *ComputeInstance) Return { + return GpuInstanceCreateComputeInstanceWithPlacement(GpuInstance, ProfileId, Placement, ComputeInstance) +} + +// nvml.DeviceGetGpuFabricInfo() +func DeviceGetGpuFabricInfo(Device Device) (GpuFabricInfo, Return) { + var GpuFabricInfo GpuFabricInfo + ret := nvmlDeviceGetGpuFabricInfo(Device, &GpuFabricInfo) + return GpuFabricInfo, ret +} + +func (Device Device) GetGpuFabricInfo() (GpuFabricInfo, Return) { + return DeviceGetGpuFabricInfo(Device) +} + +// nvml.DeviceCcuGetStreamState() +func DeviceCcuGetStreamState(Device Device) (int, Return) { + var State uint32 + ret := nvmlDeviceCcuGetStreamState(Device, &State) + return int(State), ret +} + +func (Device Device) CcuGetStreamState() (int, Return) { + return DeviceCcuGetStreamState(Device) +} + +// nvml.DeviceCcuSetStreamState() +func DeviceCcuSetStreamState(Device Device, State int) Return { + return nvmlDeviceCcuSetStreamState(Device, uint32(State)) +} + +func (Device Device) CcuSetStreamState(State int) Return { + return DeviceCcuSetStreamState(Device, State) +} + +// nvml.DeviceSetNvLinkDeviceLowPowerThreshold() +func DeviceSetNvLinkDeviceLowPowerThreshold(Device Device, Info *NvLinkPowerThres) Return { + return nvmlDeviceSetNvLinkDeviceLowPowerThreshold(Device, Info) +} + +func (Device Device) SetNvLinkDeviceLowPowerThreshold(Info *NvLinkPowerThres) Return { + return DeviceSetNvLinkDeviceLowPowerThreshold(Device, Info) +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/doc.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/doc.go new file mode 100644 index 0000000..c2ce2e3 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/doc.go @@ -0,0 +1,21 @@ +// Copyright (c) 2020, 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. + +// WARNING: THIS FILE WAS AUTOMATICALLY GENERATED. +// Code generated by https://git.io/c-for-go. DO NOT EDIT. + +/* +Package NVML bindings +*/ +package nvml diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/event_set.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/event_set.go new file mode 100644 index 0000000..c6315f5 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/event_set.go @@ -0,0 +1,42 @@ +// Copyright (c) 2020, 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 nvml + +// nvml.EventSetCreate() +func EventSetCreate() (EventSet, Return) { + var Set EventSet + ret := nvmlEventSetCreate(&Set) + return Set, ret +} + +// nvml.EventSetWait() +func EventSetWait(Set EventSet, Timeoutms uint32) (EventData, Return) { + var Data EventData + ret := nvmlEventSetWait(Set, &Data, Timeoutms) + return Data, ret +} + +func (Set EventSet) Wait(Timeoutms uint32) (EventData, Return) { + return EventSetWait(Set, Timeoutms) +} + +// nvml.EventSetFree() +func EventSetFree(Set EventSet) Return { + return nvmlEventSetFree(Set) +} + +func (Set EventSet) Free() Return { + return EventSetFree(Set) +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/init.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/init.go new file mode 100644 index 0000000..1572f81 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/init.go @@ -0,0 +1,218 @@ +// Copyright (c) 2020, 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 nvml + +import ( + "fmt" + + "github.com/NVIDIA/go-nvml/pkg/dl" +) + +import "C" + +const ( + nvmlLibraryName = "libnvidia-ml.so.1" + nvmlLibraryLoadFlags = dl.RTLD_LAZY | dl.RTLD_GLOBAL +) + +var nvml *dl.DynamicLibrary + +// nvml.Init() +func Init() Return { + lib := dl.New(nvmlLibraryName, nvmlLibraryLoadFlags) + err := lib.Open() + if err != nil { + return ERROR_LIBRARY_NOT_FOUND + } + + nvml = lib + updateVersionedSymbols() + + return nvmlInit() +} + +// nvml.InitWithFlags() +func InitWithFlags(Flags uint32) Return { + lib := dl.New(nvmlLibraryName, nvmlLibraryLoadFlags) + err := lib.Open() + if err != nil { + return ERROR_LIBRARY_NOT_FOUND + } + + nvml = lib + + return nvmlInitWithFlags(Flags) +} + +// nvml.Shutdown() +func Shutdown() Return { + ret := nvmlShutdown() + if ret != SUCCESS { + return ret + } + + err := nvml.Close() + if err != nil { + panic(fmt.Sprintf("error closing %s: %v", nvmlLibraryName, err)) + } + + return ret +} + +// Default all versioned APIs to v1 (to infer the types) +var nvmlInit = nvmlInit_v1 +var nvmlDeviceGetPciInfo = nvmlDeviceGetPciInfo_v1 +var nvmlDeviceGetCount = nvmlDeviceGetCount_v1 +var nvmlDeviceGetHandleByIndex = nvmlDeviceGetHandleByIndex_v1 +var nvmlDeviceGetHandleByPciBusId = nvmlDeviceGetHandleByPciBusId_v1 +var nvmlDeviceGetNvLinkRemotePciInfo = nvmlDeviceGetNvLinkRemotePciInfo_v1 +var nvmlDeviceRemoveGpu = nvmlDeviceRemoveGpu_v1 +var nvmlDeviceGetGridLicensableFeatures = nvmlDeviceGetGridLicensableFeatures_v1 +var nvmlEventSetWait = nvmlEventSetWait_v1 +var nvmlDeviceGetAttributes = nvmlDeviceGetAttributes_v1 +var nvmlComputeInstanceGetInfo = nvmlComputeInstanceGetInfo_v1 +var DeviceGetComputeRunningProcesses = deviceGetComputeRunningProcesses_v1 +var DeviceGetGraphicsRunningProcesses = deviceGetGraphicsRunningProcesses_v1 +var DeviceGetMPSComputeRunningProcesses = deviceGetMPSComputeRunningProcesses_v1 +var GetBlacklistDeviceCount = GetExcludedDeviceCount +var GetBlacklistDeviceInfoByIndex = GetExcludedDeviceInfoByIndex +var nvmlDeviceGetGpuInstancePossiblePlacements = nvmlDeviceGetGpuInstancePossiblePlacements_v1 +var nvmlVgpuInstanceGetLicenseInfo = nvmlVgpuInstanceGetLicenseInfo_v1 + +type BlacklistDeviceInfo = ExcludedDeviceInfo +type ProcessInfo_v1Slice []ProcessInfo_v1 +type ProcessInfo_v2Slice []ProcessInfo_v2 + +func (pis ProcessInfo_v1Slice) ToProcessInfoSlice() []ProcessInfo { + var newInfos []ProcessInfo + for _, pi := range pis { + info := ProcessInfo{ + Pid: pi.Pid, + UsedGpuMemory: pi.UsedGpuMemory, + GpuInstanceId: 0xFFFFFFFF, // GPU instance ID is invalid in v1 + ComputeInstanceId: 0xFFFFFFFF, // Compute instance ID is invalid in v1 + } + newInfos = append(newInfos, info) + } + return newInfos +} + +func (pis ProcessInfo_v2Slice) ToProcessInfoSlice() []ProcessInfo { + var newInfos []ProcessInfo + for _, pi := range pis { + info := ProcessInfo{ + Pid: pi.Pid, + UsedGpuMemory: pi.UsedGpuMemory, + GpuInstanceId: pi.GpuInstanceId, + ComputeInstanceId: pi.ComputeInstanceId, + } + newInfos = append(newInfos, info) + } + return newInfos +} + +// updateVersionedSymbols() +func updateVersionedSymbols() { + err := nvml.Lookup("nvmlInit_v2") + if err == nil { + nvmlInit = nvmlInit_v2 + } + err = nvml.Lookup("nvmlDeviceGetPciInfo_v2") + if err == nil { + nvmlDeviceGetPciInfo = nvmlDeviceGetPciInfo_v2 + } + err = nvml.Lookup("nvmlDeviceGetPciInfo_v3") + if err == nil { + nvmlDeviceGetPciInfo = nvmlDeviceGetPciInfo_v3 + } + err = nvml.Lookup("nvmlDeviceGetCount_v2") + if err == nil { + nvmlDeviceGetCount = nvmlDeviceGetCount_v2 + } + err = nvml.Lookup("nvmlDeviceGetHandleByIndex_v2") + if err == nil { + nvmlDeviceGetHandleByIndex = nvmlDeviceGetHandleByIndex_v2 + } + err = nvml.Lookup("nvmlDeviceGetHandleByPciBusId_v2") + if err == nil { + nvmlDeviceGetHandleByPciBusId = nvmlDeviceGetHandleByPciBusId_v2 + } + err = nvml.Lookup("nvmlDeviceGetNvLinkRemotePciInfo_v2") + if err == nil { + nvmlDeviceGetNvLinkRemotePciInfo = nvmlDeviceGetNvLinkRemotePciInfo_v2 + } + // Unable to overwrite nvmlDeviceRemoveGpu() because the v2 function takes + // a different set of parameters than the v1 function. + //err = nvml.Lookup("nvmlDeviceRemoveGpu_v2") + //if err == nil { + // nvmlDeviceRemoveGpu = nvmlDeviceRemoveGpu_v2 + //} + err = nvml.Lookup("nvmlDeviceGetGridLicensableFeatures_v2") + if err == nil { + nvmlDeviceGetGridLicensableFeatures = nvmlDeviceGetGridLicensableFeatures_v2 + } + err = nvml.Lookup("nvmlDeviceGetGridLicensableFeatures_v3") + if err == nil { + nvmlDeviceGetGridLicensableFeatures = nvmlDeviceGetGridLicensableFeatures_v3 + } + err = nvml.Lookup("nvmlDeviceGetGridLicensableFeatures_v4") + if err == nil { + nvmlDeviceGetGridLicensableFeatures = nvmlDeviceGetGridLicensableFeatures_v4 + } + err = nvml.Lookup("nvmlEventSetWait_v2") + if err == nil { + nvmlEventSetWait = nvmlEventSetWait_v2 + } + err = nvml.Lookup("nvmlDeviceGetAttributes_v2") + if err == nil { + nvmlDeviceGetAttributes = nvmlDeviceGetAttributes_v2 + } + err = nvml.Lookup("nvmlComputeInstanceGetInfo_v2") + if err == nil { + nvmlComputeInstanceGetInfo = nvmlComputeInstanceGetInfo_v2 + } + err = nvml.Lookup("nvmlDeviceGetComputeRunningProcesses_v2") + if err == nil { + DeviceGetComputeRunningProcesses = deviceGetComputeRunningProcesses_v2 + } + err = nvml.Lookup("nvmlDeviceGetComputeRunningProcesses_v3") + if err == nil { + DeviceGetComputeRunningProcesses = deviceGetComputeRunningProcesses_v3 + } + err = nvml.Lookup("nvmlDeviceGetGraphicsRunningProcesses_v2") + if err == nil { + DeviceGetGraphicsRunningProcesses = deviceGetGraphicsRunningProcesses_v2 + } + err = nvml.Lookup("nvmlDeviceGetGraphicsRunningProcesses_v3") + if err == nil { + DeviceGetGraphicsRunningProcesses = deviceGetGraphicsRunningProcesses_v3 + } + err = nvml.Lookup("nvmlDeviceGetMPSComputeRunningProcesses_v2") + if err == nil { + DeviceGetMPSComputeRunningProcesses = deviceGetMPSComputeRunningProcesses_v2 + } + err = nvml.Lookup("nvmlDeviceGetMPSComputeRunningProcesses_v3") + if err == nil { + DeviceGetMPSComputeRunningProcesses = deviceGetMPSComputeRunningProcesses_v3 + } + err = nvml.Lookup("nvmlDeviceGetGpuInstancePossiblePlacements_v2") + if err == nil { + nvmlDeviceGetGpuInstancePossiblePlacements = nvmlDeviceGetGpuInstancePossiblePlacements_v2 + } + err = nvml.Lookup("nvmlVgpuInstanceGetLicenseInfo_v2") + if err == nil { + nvmlVgpuInstanceGetLicenseInfo = nvmlVgpuInstanceGetLicenseInfo_v2 + } +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/nvml.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/nvml.go new file mode 100644 index 0000000..f63dfe8 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/nvml.go @@ -0,0 +1,2970 @@ +// Copyright (c) 2020, 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. + +// WARNING: THIS FILE WAS AUTOMATICALLY GENERATED. +// Code generated by https://git.io/c-for-go. DO NOT EDIT. + +package nvml + +/* +#cgo LDFLAGS: -Wl,--unresolved-symbols=ignore-in-object-files +#cgo CFLAGS: -DNVML_NO_UNVERSIONED_FUNC_DEFS=1 +#include "nvml.h" +#include +#include "cgo_helpers.h" +*/ +import "C" +import "unsafe" + +// nvmlInit_v2 function as declared in nvml/nvml.h +func nvmlInit_v2() Return { + __ret := C.nvmlInit_v2() + __v := (Return)(__ret) + return __v +} + +// nvmlInitWithFlags function as declared in nvml/nvml.h +func nvmlInitWithFlags(Flags uint32) Return { + cFlags, _ := (C.uint)(Flags), cgoAllocsUnknown + __ret := C.nvmlInitWithFlags(cFlags) + __v := (Return)(__ret) + return __v +} + +// nvmlShutdown function as declared in nvml/nvml.h +func nvmlShutdown() Return { + __ret := C.nvmlShutdown() + __v := (Return)(__ret) + return __v +} + +// nvmlErrorString function as declared in nvml/nvml.h +func nvmlErrorString(Result Return) string { + cResult, _ := (C.nvmlReturn_t)(Result), cgoAllocsUnknown + __ret := C.nvmlErrorString(cResult) + __v := packPCharString(__ret) + return __v +} + +// nvmlSystemGetDriverVersion function as declared in nvml/nvml.h +func nvmlSystemGetDriverVersion(Version *byte, Length uint32) Return { + cVersion, _ := (*C.char)(unsafe.Pointer(Version)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlSystemGetDriverVersion(cVersion, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlSystemGetNVMLVersion function as declared in nvml/nvml.h +func nvmlSystemGetNVMLVersion(Version *byte, Length uint32) Return { + cVersion, _ := (*C.char)(unsafe.Pointer(Version)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlSystemGetNVMLVersion(cVersion, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlSystemGetCudaDriverVersion function as declared in nvml/nvml.h +func nvmlSystemGetCudaDriverVersion(CudaDriverVersion *int32) Return { + cCudaDriverVersion, _ := (*C.int)(unsafe.Pointer(CudaDriverVersion)), cgoAllocsUnknown + __ret := C.nvmlSystemGetCudaDriverVersion(cCudaDriverVersion) + __v := (Return)(__ret) + return __v +} + +// nvmlSystemGetCudaDriverVersion_v2 function as declared in nvml/nvml.h +func nvmlSystemGetCudaDriverVersion_v2(CudaDriverVersion *int32) Return { + cCudaDriverVersion, _ := (*C.int)(unsafe.Pointer(CudaDriverVersion)), cgoAllocsUnknown + __ret := C.nvmlSystemGetCudaDriverVersion_v2(cCudaDriverVersion) + __v := (Return)(__ret) + return __v +} + +// nvmlSystemGetProcessName function as declared in nvml/nvml.h +func nvmlSystemGetProcessName(Pid uint32, Name *byte, Length uint32) Return { + cPid, _ := (C.uint)(Pid), cgoAllocsUnknown + cName, _ := (*C.char)(unsafe.Pointer(Name)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlSystemGetProcessName(cPid, cName, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetCount function as declared in nvml/nvml.h +func nvmlUnitGetCount(UnitCount *uint32) Return { + cUnitCount, _ := (*C.uint)(unsafe.Pointer(UnitCount)), cgoAllocsUnknown + __ret := C.nvmlUnitGetCount(cUnitCount) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetHandleByIndex function as declared in nvml/nvml.h +func nvmlUnitGetHandleByIndex(Index uint32, Unit *Unit) Return { + cIndex, _ := (C.uint)(Index), cgoAllocsUnknown + cUnit, _ := (*C.nvmlUnit_t)(unsafe.Pointer(Unit)), cgoAllocsUnknown + __ret := C.nvmlUnitGetHandleByIndex(cIndex, cUnit) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetUnitInfo function as declared in nvml/nvml.h +func nvmlUnitGetUnitInfo(Unit Unit, Info *UnitInfo) Return { + cUnit, _ := *(*C.nvmlUnit_t)(unsafe.Pointer(&Unit)), cgoAllocsUnknown + cInfo, _ := (*C.nvmlUnitInfo_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlUnitGetUnitInfo(cUnit, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetLedState function as declared in nvml/nvml.h +func nvmlUnitGetLedState(Unit Unit, State *LedState) Return { + cUnit, _ := *(*C.nvmlUnit_t)(unsafe.Pointer(&Unit)), cgoAllocsUnknown + cState, _ := (*C.nvmlLedState_t)(unsafe.Pointer(State)), cgoAllocsUnknown + __ret := C.nvmlUnitGetLedState(cUnit, cState) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetPsuInfo function as declared in nvml/nvml.h +func nvmlUnitGetPsuInfo(Unit Unit, Psu *PSUInfo) Return { + cUnit, _ := *(*C.nvmlUnit_t)(unsafe.Pointer(&Unit)), cgoAllocsUnknown + cPsu, _ := (*C.nvmlPSUInfo_t)(unsafe.Pointer(Psu)), cgoAllocsUnknown + __ret := C.nvmlUnitGetPsuInfo(cUnit, cPsu) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetTemperature function as declared in nvml/nvml.h +func nvmlUnitGetTemperature(Unit Unit, _type uint32, Temp *uint32) Return { + cUnit, _ := *(*C.nvmlUnit_t)(unsafe.Pointer(&Unit)), cgoAllocsUnknown + c_type, _ := (C.uint)(_type), cgoAllocsUnknown + cTemp, _ := (*C.uint)(unsafe.Pointer(Temp)), cgoAllocsUnknown + __ret := C.nvmlUnitGetTemperature(cUnit, c_type, cTemp) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetFanSpeedInfo function as declared in nvml/nvml.h +func nvmlUnitGetFanSpeedInfo(Unit Unit, FanSpeeds *UnitFanSpeeds) Return { + cUnit, _ := *(*C.nvmlUnit_t)(unsafe.Pointer(&Unit)), cgoAllocsUnknown + cFanSpeeds, _ := (*C.nvmlUnitFanSpeeds_t)(unsafe.Pointer(FanSpeeds)), cgoAllocsUnknown + __ret := C.nvmlUnitGetFanSpeedInfo(cUnit, cFanSpeeds) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitGetDevices function as declared in nvml/nvml.h +func nvmlUnitGetDevices(Unit Unit, DeviceCount *uint32, Devices *Device) Return { + cUnit, _ := *(*C.nvmlUnit_t)(unsafe.Pointer(&Unit)), cgoAllocsUnknown + cDeviceCount, _ := (*C.uint)(unsafe.Pointer(DeviceCount)), cgoAllocsUnknown + cDevices, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Devices)), cgoAllocsUnknown + __ret := C.nvmlUnitGetDevices(cUnit, cDeviceCount, cDevices) + __v := (Return)(__ret) + return __v +} + +// nvmlSystemGetHicVersion function as declared in nvml/nvml.h +func nvmlSystemGetHicVersion(HwbcCount *uint32, HwbcEntries *HwbcEntry) Return { + cHwbcCount, _ := (*C.uint)(unsafe.Pointer(HwbcCount)), cgoAllocsUnknown + cHwbcEntries, _ := (*C.nvmlHwbcEntry_t)(unsafe.Pointer(HwbcEntries)), cgoAllocsUnknown + __ret := C.nvmlSystemGetHicVersion(cHwbcCount, cHwbcEntries) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCount_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetCount_v2(DeviceCount *uint32) Return { + cDeviceCount, _ := (*C.uint)(unsafe.Pointer(DeviceCount)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCount_v2(cDeviceCount) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAttributes_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetAttributes_v2(Device Device, Attributes *DeviceAttributes) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cAttributes, _ := (*C.nvmlDeviceAttributes_t)(unsafe.Pointer(Attributes)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAttributes_v2(cDevice, cAttributes) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetHandleByIndex_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetHandleByIndex_v2(Index uint32, Device *Device) Return { + cIndex, _ := (C.uint)(Index), cgoAllocsUnknown + cDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetHandleByIndex_v2(cIndex, cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetHandleBySerial function as declared in nvml/nvml.h +func nvmlDeviceGetHandleBySerial(Serial string, Device *Device) Return { + cSerial, _ := unpackPCharString(Serial) + cDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetHandleBySerial(cSerial, cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetHandleByUUID function as declared in nvml/nvml.h +func nvmlDeviceGetHandleByUUID(Uuid string, Device *Device) Return { + cUuid, _ := unpackPCharString(Uuid) + cDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetHandleByUUID(cUuid, cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetHandleByPciBusId_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetHandleByPciBusId_v2(PciBusId string, Device *Device) Return { + cPciBusId, _ := unpackPCharString(PciBusId) + cDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetHandleByPciBusId_v2(cPciBusId, cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetName function as declared in nvml/nvml.h +func nvmlDeviceGetName(Device Device, Name *byte, Length uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cName, _ := (*C.char)(unsafe.Pointer(Name)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlDeviceGetName(cDevice, cName, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetBrand function as declared in nvml/nvml.h +func nvmlDeviceGetBrand(Device Device, _type *BrandType) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + c_type, _ := (*C.nvmlBrandType_t)(unsafe.Pointer(_type)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetBrand(cDevice, c_type) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetIndex function as declared in nvml/nvml.h +func nvmlDeviceGetIndex(Device Device, Index *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIndex, _ := (*C.uint)(unsafe.Pointer(Index)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetIndex(cDevice, cIndex) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSerial function as declared in nvml/nvml.h +func nvmlDeviceGetSerial(Device Device, Serial *byte, Length uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSerial, _ := (*C.char)(unsafe.Pointer(Serial)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSerial(cDevice, cSerial, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMemoryAffinity function as declared in nvml/nvml.h +func nvmlDeviceGetMemoryAffinity(Device Device, NodeSetSize uint32, NodeSet *uint, Scope AffinityScope) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cNodeSetSize, _ := (C.uint)(NodeSetSize), cgoAllocsUnknown + cNodeSet, _ := (*C.ulong)(unsafe.Pointer(NodeSet)), cgoAllocsUnknown + cScope, _ := (C.nvmlAffinityScope_t)(Scope), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMemoryAffinity(cDevice, cNodeSetSize, cNodeSet, cScope) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCpuAffinityWithinScope function as declared in nvml/nvml.h +func nvmlDeviceGetCpuAffinityWithinScope(Device Device, CpuSetSize uint32, CpuSet *uint, Scope AffinityScope) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCpuSetSize, _ := (C.uint)(CpuSetSize), cgoAllocsUnknown + cCpuSet, _ := (*C.ulong)(unsafe.Pointer(CpuSet)), cgoAllocsUnknown + cScope, _ := (C.nvmlAffinityScope_t)(Scope), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCpuAffinityWithinScope(cDevice, cCpuSetSize, cCpuSet, cScope) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCpuAffinity function as declared in nvml/nvml.h +func nvmlDeviceGetCpuAffinity(Device Device, CpuSetSize uint32, CpuSet *uint) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCpuSetSize, _ := (C.uint)(CpuSetSize), cgoAllocsUnknown + cCpuSet, _ := (*C.ulong)(unsafe.Pointer(CpuSet)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCpuAffinity(cDevice, cCpuSetSize, cCpuSet) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetCpuAffinity function as declared in nvml/nvml.h +func nvmlDeviceSetCpuAffinity(Device Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceSetCpuAffinity(cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceClearCpuAffinity function as declared in nvml/nvml.h +func nvmlDeviceClearCpuAffinity(Device Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceClearCpuAffinity(cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetTopologyCommonAncestor function as declared in nvml/nvml.h +func nvmlDeviceGetTopologyCommonAncestor(Device1 Device, Device2 Device, PathInfo *GpuTopologyLevel) Return { + cDevice1, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device1)), cgoAllocsUnknown + cDevice2, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device2)), cgoAllocsUnknown + cPathInfo, _ := (*C.nvmlGpuTopologyLevel_t)(unsafe.Pointer(PathInfo)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetTopologyCommonAncestor(cDevice1, cDevice2, cPathInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetTopologyNearestGpus function as declared in nvml/nvml.h +func nvmlDeviceGetTopologyNearestGpus(Device Device, Level GpuTopologyLevel, Count *uint32, DeviceArray *Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLevel, _ := (C.nvmlGpuTopologyLevel_t)(Level), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + cDeviceArray, _ := (*C.nvmlDevice_t)(unsafe.Pointer(DeviceArray)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetTopologyNearestGpus(cDevice, cLevel, cCount, cDeviceArray) + __v := (Return)(__ret) + return __v +} + +// nvmlSystemGetTopologyGpuSet function as declared in nvml/nvml.h +func nvmlSystemGetTopologyGpuSet(CpuNumber uint32, Count *uint32, DeviceArray *Device) Return { + cCpuNumber, _ := (C.uint)(CpuNumber), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + cDeviceArray, _ := (*C.nvmlDevice_t)(unsafe.Pointer(DeviceArray)), cgoAllocsUnknown + __ret := C.nvmlSystemGetTopologyGpuSet(cCpuNumber, cCount, cDeviceArray) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetP2PStatus function as declared in nvml/nvml.h +func nvmlDeviceGetP2PStatus(Device1 Device, Device2 Device, P2pIndex GpuP2PCapsIndex, P2pStatus *GpuP2PStatus) Return { + cDevice1, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device1)), cgoAllocsUnknown + cDevice2, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device2)), cgoAllocsUnknown + cP2pIndex, _ := (C.nvmlGpuP2PCapsIndex_t)(P2pIndex), cgoAllocsUnknown + cP2pStatus, _ := (*C.nvmlGpuP2PStatus_t)(unsafe.Pointer(P2pStatus)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetP2PStatus(cDevice1, cDevice2, cP2pIndex, cP2pStatus) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetUUID function as declared in nvml/nvml.h +func nvmlDeviceGetUUID(Device Device, Uuid *byte, Length uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cUuid, _ := (*C.char)(unsafe.Pointer(Uuid)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlDeviceGetUUID(cDevice, cUuid, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetMdevUUID function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetMdevUUID(VgpuInstance VgpuInstance, MdevUuid *byte, Size uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cMdevUuid, _ := (*C.char)(unsafe.Pointer(MdevUuid)), cgoAllocsUnknown + cSize, _ := (C.uint)(Size), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetMdevUUID(cVgpuInstance, cMdevUuid, cSize) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMinorNumber function as declared in nvml/nvml.h +func nvmlDeviceGetMinorNumber(Device Device, MinorNumber *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMinorNumber, _ := (*C.uint)(unsafe.Pointer(MinorNumber)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMinorNumber(cDevice, cMinorNumber) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetBoardPartNumber function as declared in nvml/nvml.h +func nvmlDeviceGetBoardPartNumber(Device Device, PartNumber *byte, Length uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPartNumber, _ := (*C.char)(unsafe.Pointer(PartNumber)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlDeviceGetBoardPartNumber(cDevice, cPartNumber, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetInforomVersion function as declared in nvml/nvml.h +func nvmlDeviceGetInforomVersion(Device Device, Object InforomObject, Version *byte, Length uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cObject, _ := (C.nvmlInforomObject_t)(Object), cgoAllocsUnknown + cVersion, _ := (*C.char)(unsafe.Pointer(Version)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlDeviceGetInforomVersion(cDevice, cObject, cVersion, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetInforomImageVersion function as declared in nvml/nvml.h +func nvmlDeviceGetInforomImageVersion(Device Device, Version *byte, Length uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVersion, _ := (*C.char)(unsafe.Pointer(Version)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlDeviceGetInforomImageVersion(cDevice, cVersion, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetInforomConfigurationChecksum function as declared in nvml/nvml.h +func nvmlDeviceGetInforomConfigurationChecksum(Device Device, Checksum *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cChecksum, _ := (*C.uint)(unsafe.Pointer(Checksum)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetInforomConfigurationChecksum(cDevice, cChecksum) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceValidateInforom function as declared in nvml/nvml.h +func nvmlDeviceValidateInforom(Device Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceValidateInforom(cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDisplayMode function as declared in nvml/nvml.h +func nvmlDeviceGetDisplayMode(Device Device, Display *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cDisplay, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(Display)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDisplayMode(cDevice, cDisplay) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDisplayActive function as declared in nvml/nvml.h +func nvmlDeviceGetDisplayActive(Device Device, IsActive *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIsActive, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(IsActive)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDisplayActive(cDevice, cIsActive) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPersistenceMode function as declared in nvml/nvml.h +func nvmlDeviceGetPersistenceMode(Device Device, Mode *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(Mode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPersistenceMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPciInfo_v3 function as declared in nvml/nvml.h +func nvmlDeviceGetPciInfo_v3(Device Device, Pci *PciInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPci, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(Pci)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPciInfo_v3(cDevice, cPci) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMaxPcieLinkGeneration function as declared in nvml/nvml.h +func nvmlDeviceGetMaxPcieLinkGeneration(Device Device, MaxLinkGen *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMaxLinkGen, _ := (*C.uint)(unsafe.Pointer(MaxLinkGen)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMaxPcieLinkGeneration(cDevice, cMaxLinkGen) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuMaxPcieLinkGeneration function as declared in nvml/nvml.h +func nvmlDeviceGetGpuMaxPcieLinkGeneration(Device Device, MaxLinkGenDevice *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMaxLinkGenDevice, _ := (*C.uint)(unsafe.Pointer(MaxLinkGenDevice)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuMaxPcieLinkGeneration(cDevice, cMaxLinkGenDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMaxPcieLinkWidth function as declared in nvml/nvml.h +func nvmlDeviceGetMaxPcieLinkWidth(Device Device, MaxLinkWidth *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMaxLinkWidth, _ := (*C.uint)(unsafe.Pointer(MaxLinkWidth)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMaxPcieLinkWidth(cDevice, cMaxLinkWidth) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCurrPcieLinkGeneration function as declared in nvml/nvml.h +func nvmlDeviceGetCurrPcieLinkGeneration(Device Device, CurrLinkGen *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCurrLinkGen, _ := (*C.uint)(unsafe.Pointer(CurrLinkGen)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCurrPcieLinkGeneration(cDevice, cCurrLinkGen) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCurrPcieLinkWidth function as declared in nvml/nvml.h +func nvmlDeviceGetCurrPcieLinkWidth(Device Device, CurrLinkWidth *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCurrLinkWidth, _ := (*C.uint)(unsafe.Pointer(CurrLinkWidth)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCurrPcieLinkWidth(cDevice, cCurrLinkWidth) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPcieThroughput function as declared in nvml/nvml.h +func nvmlDeviceGetPcieThroughput(Device Device, Counter PcieUtilCounter, Value *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCounter, _ := (C.nvmlPcieUtilCounter_t)(Counter), cgoAllocsUnknown + cValue, _ := (*C.uint)(unsafe.Pointer(Value)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPcieThroughput(cDevice, cCounter, cValue) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPcieReplayCounter function as declared in nvml/nvml.h +func nvmlDeviceGetPcieReplayCounter(Device Device, Value *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cValue, _ := (*C.uint)(unsafe.Pointer(Value)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPcieReplayCounter(cDevice, cValue) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetClockInfo function as declared in nvml/nvml.h +func nvmlDeviceGetClockInfo(Device Device, _type ClockType, Clock *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + c_type, _ := (C.nvmlClockType_t)(_type), cgoAllocsUnknown + cClock, _ := (*C.uint)(unsafe.Pointer(Clock)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetClockInfo(cDevice, c_type, cClock) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMaxClockInfo function as declared in nvml/nvml.h +func nvmlDeviceGetMaxClockInfo(Device Device, _type ClockType, Clock *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + c_type, _ := (C.nvmlClockType_t)(_type), cgoAllocsUnknown + cClock, _ := (*C.uint)(unsafe.Pointer(Clock)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMaxClockInfo(cDevice, c_type, cClock) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetApplicationsClock function as declared in nvml/nvml.h +func nvmlDeviceGetApplicationsClock(Device Device, ClockType ClockType, ClockMHz *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cClockType, _ := (C.nvmlClockType_t)(ClockType), cgoAllocsUnknown + cClockMHz, _ := (*C.uint)(unsafe.Pointer(ClockMHz)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetApplicationsClock(cDevice, cClockType, cClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDefaultApplicationsClock function as declared in nvml/nvml.h +func nvmlDeviceGetDefaultApplicationsClock(Device Device, ClockType ClockType, ClockMHz *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cClockType, _ := (C.nvmlClockType_t)(ClockType), cgoAllocsUnknown + cClockMHz, _ := (*C.uint)(unsafe.Pointer(ClockMHz)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDefaultApplicationsClock(cDevice, cClockType, cClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceResetApplicationsClocks function as declared in nvml/nvml.h +func nvmlDeviceResetApplicationsClocks(Device Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceResetApplicationsClocks(cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetClock function as declared in nvml/nvml.h +func nvmlDeviceGetClock(Device Device, ClockType ClockType, ClockId ClockId, ClockMHz *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cClockType, _ := (C.nvmlClockType_t)(ClockType), cgoAllocsUnknown + cClockId, _ := (C.nvmlClockId_t)(ClockId), cgoAllocsUnknown + cClockMHz, _ := (*C.uint)(unsafe.Pointer(ClockMHz)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetClock(cDevice, cClockType, cClockId, cClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMaxCustomerBoostClock function as declared in nvml/nvml.h +func nvmlDeviceGetMaxCustomerBoostClock(Device Device, ClockType ClockType, ClockMHz *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cClockType, _ := (C.nvmlClockType_t)(ClockType), cgoAllocsUnknown + cClockMHz, _ := (*C.uint)(unsafe.Pointer(ClockMHz)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMaxCustomerBoostClock(cDevice, cClockType, cClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSupportedMemoryClocks function as declared in nvml/nvml.h +func nvmlDeviceGetSupportedMemoryClocks(Device Device, Count *uint32, ClocksMHz *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + cClocksMHz, _ := (*C.uint)(unsafe.Pointer(ClocksMHz)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSupportedMemoryClocks(cDevice, cCount, cClocksMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSupportedGraphicsClocks function as declared in nvml/nvml.h +func nvmlDeviceGetSupportedGraphicsClocks(Device Device, MemoryClockMHz uint32, Count *uint32, ClocksMHz *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMemoryClockMHz, _ := (C.uint)(MemoryClockMHz), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + cClocksMHz, _ := (*C.uint)(unsafe.Pointer(ClocksMHz)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSupportedGraphicsClocks(cDevice, cMemoryClockMHz, cCount, cClocksMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAutoBoostedClocksEnabled function as declared in nvml/nvml.h +func nvmlDeviceGetAutoBoostedClocksEnabled(Device Device, IsEnabled *EnableState, DefaultIsEnabled *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIsEnabled, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(IsEnabled)), cgoAllocsUnknown + cDefaultIsEnabled, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(DefaultIsEnabled)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAutoBoostedClocksEnabled(cDevice, cIsEnabled, cDefaultIsEnabled) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetAutoBoostedClocksEnabled function as declared in nvml/nvml.h +func nvmlDeviceSetAutoBoostedClocksEnabled(Device Device, Enabled EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cEnabled, _ := (C.nvmlEnableState_t)(Enabled), cgoAllocsUnknown + __ret := C.nvmlDeviceSetAutoBoostedClocksEnabled(cDevice, cEnabled) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetDefaultAutoBoostedClocksEnabled function as declared in nvml/nvml.h +func nvmlDeviceSetDefaultAutoBoostedClocksEnabled(Device Device, Enabled EnableState, Flags uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cEnabled, _ := (C.nvmlEnableState_t)(Enabled), cgoAllocsUnknown + cFlags, _ := (C.uint)(Flags), cgoAllocsUnknown + __ret := C.nvmlDeviceSetDefaultAutoBoostedClocksEnabled(cDevice, cEnabled, cFlags) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetFanSpeed function as declared in nvml/nvml.h +func nvmlDeviceGetFanSpeed(Device Device, Speed *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSpeed, _ := (*C.uint)(unsafe.Pointer(Speed)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetFanSpeed(cDevice, cSpeed) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetFanSpeed_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetFanSpeed_v2(Device Device, Fan uint32, Speed *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cFan, _ := (C.uint)(Fan), cgoAllocsUnknown + cSpeed, _ := (*C.uint)(unsafe.Pointer(Speed)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetFanSpeed_v2(cDevice, cFan, cSpeed) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetTargetFanSpeed function as declared in nvml/nvml.h +func nvmlDeviceGetTargetFanSpeed(Device Device, Fan uint32, TargetSpeed *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cFan, _ := (C.uint)(Fan), cgoAllocsUnknown + cTargetSpeed, _ := (*C.uint)(unsafe.Pointer(TargetSpeed)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetTargetFanSpeed(cDevice, cFan, cTargetSpeed) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetDefaultFanSpeed_v2 function as declared in nvml/nvml.h +func nvmlDeviceSetDefaultFanSpeed_v2(Device Device, Fan uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cFan, _ := (C.uint)(Fan), cgoAllocsUnknown + __ret := C.nvmlDeviceSetDefaultFanSpeed_v2(cDevice, cFan) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMinMaxFanSpeed function as declared in nvml/nvml.h +func nvmlDeviceGetMinMaxFanSpeed(Device Device, MinSpeed *uint32, MaxSpeed *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMinSpeed, _ := (*C.uint)(unsafe.Pointer(MinSpeed)), cgoAllocsUnknown + cMaxSpeed, _ := (*C.uint)(unsafe.Pointer(MaxSpeed)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMinMaxFanSpeed(cDevice, cMinSpeed, cMaxSpeed) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetFanControlPolicy_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetFanControlPolicy_v2(Device Device, Fan uint32, Policy *FanControlPolicy) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cFan, _ := (C.uint)(Fan), cgoAllocsUnknown + cPolicy, _ := (*C.nvmlFanControlPolicy_t)(unsafe.Pointer(Policy)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetFanControlPolicy_v2(cDevice, cFan, cPolicy) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetFanControlPolicy function as declared in nvml/nvml.h +func nvmlDeviceSetFanControlPolicy(Device Device, Fan uint32, Policy FanControlPolicy) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cFan, _ := (C.uint)(Fan), cgoAllocsUnknown + cPolicy, _ := (C.nvmlFanControlPolicy_t)(Policy), cgoAllocsUnknown + __ret := C.nvmlDeviceSetFanControlPolicy(cDevice, cFan, cPolicy) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNumFans function as declared in nvml/nvml.h +func nvmlDeviceGetNumFans(Device Device, NumFans *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cNumFans, _ := (*C.uint)(unsafe.Pointer(NumFans)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNumFans(cDevice, cNumFans) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetTemperature function as declared in nvml/nvml.h +func nvmlDeviceGetTemperature(Device Device, SensorType TemperatureSensors, Temp *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSensorType, _ := (C.nvmlTemperatureSensors_t)(SensorType), cgoAllocsUnknown + cTemp, _ := (*C.uint)(unsafe.Pointer(Temp)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetTemperature(cDevice, cSensorType, cTemp) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetTemperatureThreshold function as declared in nvml/nvml.h +func nvmlDeviceGetTemperatureThreshold(Device Device, ThresholdType TemperatureThresholds, Temp *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cThresholdType, _ := (C.nvmlTemperatureThresholds_t)(ThresholdType), cgoAllocsUnknown + cTemp, _ := (*C.uint)(unsafe.Pointer(Temp)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetTemperatureThreshold(cDevice, cThresholdType, cTemp) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetTemperatureThreshold function as declared in nvml/nvml.h +func nvmlDeviceSetTemperatureThreshold(Device Device, ThresholdType TemperatureThresholds, Temp *int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cThresholdType, _ := (C.nvmlTemperatureThresholds_t)(ThresholdType), cgoAllocsUnknown + cTemp, _ := (*C.int)(unsafe.Pointer(Temp)), cgoAllocsUnknown + __ret := C.nvmlDeviceSetTemperatureThreshold(cDevice, cThresholdType, cTemp) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetThermalSettings function as declared in nvml/nvml.h +func nvmlDeviceGetThermalSettings(Device Device, SensorIndex uint32, PThermalSettings *GpuThermalSettings) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSensorIndex, _ := (C.uint)(SensorIndex), cgoAllocsUnknown + cPThermalSettings, _ := (*C.nvmlGpuThermalSettings_t)(unsafe.Pointer(PThermalSettings)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetThermalSettings(cDevice, cSensorIndex, cPThermalSettings) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPerformanceState function as declared in nvml/nvml.h +func nvmlDeviceGetPerformanceState(Device Device, PState *Pstates) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPState, _ := (*C.nvmlPstates_t)(unsafe.Pointer(PState)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPerformanceState(cDevice, cPState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCurrentClocksThrottleReasons function as declared in nvml/nvml.h +func nvmlDeviceGetCurrentClocksThrottleReasons(Device Device, ClocksThrottleReasons *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cClocksThrottleReasons, _ := (*C.ulonglong)(unsafe.Pointer(ClocksThrottleReasons)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCurrentClocksThrottleReasons(cDevice, cClocksThrottleReasons) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSupportedClocksThrottleReasons function as declared in nvml/nvml.h +func nvmlDeviceGetSupportedClocksThrottleReasons(Device Device, SupportedClocksThrottleReasons *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSupportedClocksThrottleReasons, _ := (*C.ulonglong)(unsafe.Pointer(SupportedClocksThrottleReasons)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSupportedClocksThrottleReasons(cDevice, cSupportedClocksThrottleReasons) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPowerState function as declared in nvml/nvml.h +func nvmlDeviceGetPowerState(Device Device, PState *Pstates) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPState, _ := (*C.nvmlPstates_t)(unsafe.Pointer(PState)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPowerState(cDevice, cPState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPowerManagementMode function as declared in nvml/nvml.h +func nvmlDeviceGetPowerManagementMode(Device Device, Mode *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(Mode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPowerManagementMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPowerManagementLimit function as declared in nvml/nvml.h +func nvmlDeviceGetPowerManagementLimit(Device Device, Limit *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLimit, _ := (*C.uint)(unsafe.Pointer(Limit)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPowerManagementLimit(cDevice, cLimit) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPowerManagementLimitConstraints function as declared in nvml/nvml.h +func nvmlDeviceGetPowerManagementLimitConstraints(Device Device, MinLimit *uint32, MaxLimit *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMinLimit, _ := (*C.uint)(unsafe.Pointer(MinLimit)), cgoAllocsUnknown + cMaxLimit, _ := (*C.uint)(unsafe.Pointer(MaxLimit)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPowerManagementLimitConstraints(cDevice, cMinLimit, cMaxLimit) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPowerManagementDefaultLimit function as declared in nvml/nvml.h +func nvmlDeviceGetPowerManagementDefaultLimit(Device Device, DefaultLimit *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cDefaultLimit, _ := (*C.uint)(unsafe.Pointer(DefaultLimit)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPowerManagementDefaultLimit(cDevice, cDefaultLimit) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPowerUsage function as declared in nvml/nvml.h +func nvmlDeviceGetPowerUsage(Device Device, Power *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPower, _ := (*C.uint)(unsafe.Pointer(Power)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPowerUsage(cDevice, cPower) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetTotalEnergyConsumption function as declared in nvml/nvml.h +func nvmlDeviceGetTotalEnergyConsumption(Device Device, Energy *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cEnergy, _ := (*C.ulonglong)(unsafe.Pointer(Energy)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetTotalEnergyConsumption(cDevice, cEnergy) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetEnforcedPowerLimit function as declared in nvml/nvml.h +func nvmlDeviceGetEnforcedPowerLimit(Device Device, Limit *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLimit, _ := (*C.uint)(unsafe.Pointer(Limit)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetEnforcedPowerLimit(cDevice, cLimit) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuOperationMode function as declared in nvml/nvml.h +func nvmlDeviceGetGpuOperationMode(Device Device, Current *GpuOperationMode, Pending *GpuOperationMode) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCurrent, _ := (*C.nvmlGpuOperationMode_t)(unsafe.Pointer(Current)), cgoAllocsUnknown + cPending, _ := (*C.nvmlGpuOperationMode_t)(unsafe.Pointer(Pending)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuOperationMode(cDevice, cCurrent, cPending) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMemoryInfo function as declared in nvml/nvml.h +func nvmlDeviceGetMemoryInfo(Device Device, Memory *Memory) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMemory, _ := (*C.nvmlMemory_t)(unsafe.Pointer(Memory)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMemoryInfo(cDevice, cMemory) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMemoryInfo_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetMemoryInfo_v2(Device Device, Memory *Memory_v2) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMemory, _ := (*C.nvmlMemory_v2_t)(unsafe.Pointer(Memory)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMemoryInfo_v2(cDevice, cMemory) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetComputeMode function as declared in nvml/nvml.h +func nvmlDeviceGetComputeMode(Device Device, Mode *ComputeMode) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (*C.nvmlComputeMode_t)(unsafe.Pointer(Mode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetComputeMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCudaComputeCapability function as declared in nvml/nvml.h +func nvmlDeviceGetCudaComputeCapability(Device Device, Major *int32, Minor *int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMajor, _ := (*C.int)(unsafe.Pointer(Major)), cgoAllocsUnknown + cMinor, _ := (*C.int)(unsafe.Pointer(Minor)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCudaComputeCapability(cDevice, cMajor, cMinor) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetEccMode function as declared in nvml/nvml.h +func nvmlDeviceGetEccMode(Device Device, Current *EnableState, Pending *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCurrent, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(Current)), cgoAllocsUnknown + cPending, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(Pending)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetEccMode(cDevice, cCurrent, cPending) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDefaultEccMode function as declared in nvml/nvml.h +func nvmlDeviceGetDefaultEccMode(Device Device, DefaultMode *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cDefaultMode, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(DefaultMode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDefaultEccMode(cDevice, cDefaultMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetBoardId function as declared in nvml/nvml.h +func nvmlDeviceGetBoardId(Device Device, BoardId *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cBoardId, _ := (*C.uint)(unsafe.Pointer(BoardId)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetBoardId(cDevice, cBoardId) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMultiGpuBoard function as declared in nvml/nvml.h +func nvmlDeviceGetMultiGpuBoard(Device Device, MultiGpuBool *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMultiGpuBool, _ := (*C.uint)(unsafe.Pointer(MultiGpuBool)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMultiGpuBoard(cDevice, cMultiGpuBool) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetTotalEccErrors function as declared in nvml/nvml.h +func nvmlDeviceGetTotalEccErrors(Device Device, ErrorType MemoryErrorType, CounterType EccCounterType, EccCounts *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cErrorType, _ := (C.nvmlMemoryErrorType_t)(ErrorType), cgoAllocsUnknown + cCounterType, _ := (C.nvmlEccCounterType_t)(CounterType), cgoAllocsUnknown + cEccCounts, _ := (*C.ulonglong)(unsafe.Pointer(EccCounts)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetTotalEccErrors(cDevice, cErrorType, cCounterType, cEccCounts) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDetailedEccErrors function as declared in nvml/nvml.h +func nvmlDeviceGetDetailedEccErrors(Device Device, ErrorType MemoryErrorType, CounterType EccCounterType, EccCounts *EccErrorCounts) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cErrorType, _ := (C.nvmlMemoryErrorType_t)(ErrorType), cgoAllocsUnknown + cCounterType, _ := (C.nvmlEccCounterType_t)(CounterType), cgoAllocsUnknown + cEccCounts, _ := (*C.nvmlEccErrorCounts_t)(unsafe.Pointer(EccCounts)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDetailedEccErrors(cDevice, cErrorType, cCounterType, cEccCounts) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMemoryErrorCounter function as declared in nvml/nvml.h +func nvmlDeviceGetMemoryErrorCounter(Device Device, ErrorType MemoryErrorType, CounterType EccCounterType, LocationType MemoryLocation, Count *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cErrorType, _ := (C.nvmlMemoryErrorType_t)(ErrorType), cgoAllocsUnknown + cCounterType, _ := (C.nvmlEccCounterType_t)(CounterType), cgoAllocsUnknown + cLocationType, _ := (C.nvmlMemoryLocation_t)(LocationType), cgoAllocsUnknown + cCount, _ := (*C.ulonglong)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMemoryErrorCounter(cDevice, cErrorType, cCounterType, cLocationType, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetUtilizationRates function as declared in nvml/nvml.h +func nvmlDeviceGetUtilizationRates(Device Device, Utilization *Utilization) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cUtilization, _ := (*C.nvmlUtilization_t)(unsafe.Pointer(Utilization)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetUtilizationRates(cDevice, cUtilization) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetEncoderUtilization function as declared in nvml/nvml.h +func nvmlDeviceGetEncoderUtilization(Device Device, Utilization *uint32, SamplingPeriodUs *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cUtilization, _ := (*C.uint)(unsafe.Pointer(Utilization)), cgoAllocsUnknown + cSamplingPeriodUs, _ := (*C.uint)(unsafe.Pointer(SamplingPeriodUs)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetEncoderUtilization(cDevice, cUtilization, cSamplingPeriodUs) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetEncoderCapacity function as declared in nvml/nvml.h +func nvmlDeviceGetEncoderCapacity(Device Device, EncoderQueryType EncoderType, EncoderCapacity *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cEncoderQueryType, _ := (C.nvmlEncoderType_t)(EncoderQueryType), cgoAllocsUnknown + cEncoderCapacity, _ := (*C.uint)(unsafe.Pointer(EncoderCapacity)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetEncoderCapacity(cDevice, cEncoderQueryType, cEncoderCapacity) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetEncoderStats function as declared in nvml/nvml.h +func nvmlDeviceGetEncoderStats(Device Device, SessionCount *uint32, AverageFps *uint32, AverageLatency *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSessionCount, _ := (*C.uint)(unsafe.Pointer(SessionCount)), cgoAllocsUnknown + cAverageFps, _ := (*C.uint)(unsafe.Pointer(AverageFps)), cgoAllocsUnknown + cAverageLatency, _ := (*C.uint)(unsafe.Pointer(AverageLatency)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetEncoderStats(cDevice, cSessionCount, cAverageFps, cAverageLatency) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetEncoderSessions function as declared in nvml/nvml.h +func nvmlDeviceGetEncoderSessions(Device Device, SessionCount *uint32, SessionInfos *EncoderSessionInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSessionCount, _ := (*C.uint)(unsafe.Pointer(SessionCount)), cgoAllocsUnknown + cSessionInfos, _ := (*C.nvmlEncoderSessionInfo_t)(unsafe.Pointer(SessionInfos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetEncoderSessions(cDevice, cSessionCount, cSessionInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDecoderUtilization function as declared in nvml/nvml.h +func nvmlDeviceGetDecoderUtilization(Device Device, Utilization *uint32, SamplingPeriodUs *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cUtilization, _ := (*C.uint)(unsafe.Pointer(Utilization)), cgoAllocsUnknown + cSamplingPeriodUs, _ := (*C.uint)(unsafe.Pointer(SamplingPeriodUs)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDecoderUtilization(cDevice, cUtilization, cSamplingPeriodUs) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetFBCStats function as declared in nvml/nvml.h +func nvmlDeviceGetFBCStats(Device Device, FbcStats *FBCStats) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cFbcStats, _ := (*C.nvmlFBCStats_t)(unsafe.Pointer(FbcStats)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetFBCStats(cDevice, cFbcStats) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetFBCSessions function as declared in nvml/nvml.h +func nvmlDeviceGetFBCSessions(Device Device, SessionCount *uint32, SessionInfo *FBCSessionInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cSessionCount, _ := (*C.uint)(unsafe.Pointer(SessionCount)), cgoAllocsUnknown + cSessionInfo, _ := (*C.nvmlFBCSessionInfo_t)(unsafe.Pointer(SessionInfo)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetFBCSessions(cDevice, cSessionCount, cSessionInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDriverModel function as declared in nvml/nvml.h +func nvmlDeviceGetDriverModel(Device Device, Current *DriverModel, Pending *DriverModel) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCurrent, _ := (*C.nvmlDriverModel_t)(unsafe.Pointer(Current)), cgoAllocsUnknown + cPending, _ := (*C.nvmlDriverModel_t)(unsafe.Pointer(Pending)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDriverModel(cDevice, cCurrent, cPending) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVbiosVersion function as declared in nvml/nvml.h +func nvmlDeviceGetVbiosVersion(Device Device, Version *byte, Length uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVersion, _ := (*C.char)(unsafe.Pointer(Version)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVbiosVersion(cDevice, cVersion, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetBridgeChipInfo function as declared in nvml/nvml.h +func nvmlDeviceGetBridgeChipInfo(Device Device, BridgeHierarchy *BridgeChipHierarchy) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cBridgeHierarchy, _ := (*C.nvmlBridgeChipHierarchy_t)(unsafe.Pointer(BridgeHierarchy)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetBridgeChipInfo(cDevice, cBridgeHierarchy) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetComputeRunningProcesses_v3 function as declared in nvml/nvml.h +func nvmlDeviceGetComputeRunningProcesses_v3(Device Device, InfoCount *uint32, Infos *ProcessInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetComputeRunningProcesses_v3(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGraphicsRunningProcesses_v3 function as declared in nvml/nvml.h +func nvmlDeviceGetGraphicsRunningProcesses_v3(Device Device, InfoCount *uint32, Infos *ProcessInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGraphicsRunningProcesses_v3(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMPSComputeRunningProcesses_v3 function as declared in nvml/nvml.h +func nvmlDeviceGetMPSComputeRunningProcesses_v3(Device Device, InfoCount *uint32, Infos *ProcessInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMPSComputeRunningProcesses_v3(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceOnSameBoard function as declared in nvml/nvml.h +func nvmlDeviceOnSameBoard(Device1 Device, Device2 Device, OnSameBoard *int32) Return { + cDevice1, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device1)), cgoAllocsUnknown + cDevice2, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device2)), cgoAllocsUnknown + cOnSameBoard, _ := (*C.int)(unsafe.Pointer(OnSameBoard)), cgoAllocsUnknown + __ret := C.nvmlDeviceOnSameBoard(cDevice1, cDevice2, cOnSameBoard) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAPIRestriction function as declared in nvml/nvml.h +func nvmlDeviceGetAPIRestriction(Device Device, ApiType RestrictedAPI, IsRestricted *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cApiType, _ := (C.nvmlRestrictedAPI_t)(ApiType), cgoAllocsUnknown + cIsRestricted, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(IsRestricted)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAPIRestriction(cDevice, cApiType, cIsRestricted) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSamples function as declared in nvml/nvml.h +func nvmlDeviceGetSamples(Device Device, _type SamplingType, LastSeenTimeStamp uint64, SampleValType *ValueType, SampleCount *uint32, Samples *Sample) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + c_type, _ := (C.nvmlSamplingType_t)(_type), cgoAllocsUnknown + cLastSeenTimeStamp, _ := (C.ulonglong)(LastSeenTimeStamp), cgoAllocsUnknown + cSampleValType, _ := (*C.nvmlValueType_t)(unsafe.Pointer(SampleValType)), cgoAllocsUnknown + cSampleCount, _ := (*C.uint)(unsafe.Pointer(SampleCount)), cgoAllocsUnknown + cSamples, _ := (*C.nvmlSample_t)(unsafe.Pointer(Samples)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSamples(cDevice, c_type, cLastSeenTimeStamp, cSampleValType, cSampleCount, cSamples) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetBAR1MemoryInfo function as declared in nvml/nvml.h +func nvmlDeviceGetBAR1MemoryInfo(Device Device, Bar1Memory *BAR1Memory) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cBar1Memory, _ := (*C.nvmlBAR1Memory_t)(unsafe.Pointer(Bar1Memory)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetBAR1MemoryInfo(cDevice, cBar1Memory) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetViolationStatus function as declared in nvml/nvml.h +func nvmlDeviceGetViolationStatus(Device Device, PerfPolicyType PerfPolicyType, ViolTime *ViolationTime) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPerfPolicyType, _ := (C.nvmlPerfPolicyType_t)(PerfPolicyType), cgoAllocsUnknown + cViolTime, _ := (*C.nvmlViolationTime_t)(unsafe.Pointer(ViolTime)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetViolationStatus(cDevice, cPerfPolicyType, cViolTime) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetIrqNum function as declared in nvml/nvml.h +func nvmlDeviceGetIrqNum(Device Device, IrqNum *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIrqNum, _ := (*C.uint)(unsafe.Pointer(IrqNum)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetIrqNum(cDevice, cIrqNum) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNumGpuCores function as declared in nvml/nvml.h +func nvmlDeviceGetNumGpuCores(Device Device, NumCores *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cNumCores, _ := (*C.uint)(unsafe.Pointer(NumCores)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNumGpuCores(cDevice, cNumCores) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPowerSource function as declared in nvml/nvml.h +func nvmlDeviceGetPowerSource(Device Device, PowerSource *PowerSource) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPowerSource, _ := (*C.nvmlPowerSource_t)(unsafe.Pointer(PowerSource)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPowerSource(cDevice, cPowerSource) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMemoryBusWidth function as declared in nvml/nvml.h +func nvmlDeviceGetMemoryBusWidth(Device Device, BusWidth *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cBusWidth, _ := (*C.uint)(unsafe.Pointer(BusWidth)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMemoryBusWidth(cDevice, cBusWidth) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPcieLinkMaxSpeed function as declared in nvml/nvml.h +func nvmlDeviceGetPcieLinkMaxSpeed(Device Device, MaxSpeed *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMaxSpeed, _ := (*C.uint)(unsafe.Pointer(MaxSpeed)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPcieLinkMaxSpeed(cDevice, cMaxSpeed) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPcieSpeed function as declared in nvml/nvml.h +func nvmlDeviceGetPcieSpeed(Device Device, PcieSpeed *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPcieSpeed, _ := (*C.uint)(unsafe.Pointer(PcieSpeed)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPcieSpeed(cDevice, cPcieSpeed) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAdaptiveClockInfoStatus function as declared in nvml/nvml.h +func nvmlDeviceGetAdaptiveClockInfoStatus(Device Device, AdaptiveClockStatus *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cAdaptiveClockStatus, _ := (*C.uint)(unsafe.Pointer(AdaptiveClockStatus)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAdaptiveClockInfoStatus(cDevice, cAdaptiveClockStatus) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAccountingMode function as declared in nvml/nvml.h +func nvmlDeviceGetAccountingMode(Device Device, Mode *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(Mode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAccountingMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAccountingStats function as declared in nvml/nvml.h +func nvmlDeviceGetAccountingStats(Device Device, Pid uint32, Stats *AccountingStats) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPid, _ := (C.uint)(Pid), cgoAllocsUnknown + cStats, _ := (*C.nvmlAccountingStats_t)(unsafe.Pointer(Stats)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAccountingStats(cDevice, cPid, cStats) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAccountingPids function as declared in nvml/nvml.h +func nvmlDeviceGetAccountingPids(Device Device, Count *uint32, Pids *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + cPids, _ := (*C.uint)(unsafe.Pointer(Pids)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAccountingPids(cDevice, cCount, cPids) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAccountingBufferSize function as declared in nvml/nvml.h +func nvmlDeviceGetAccountingBufferSize(Device Device, BufferSize *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cBufferSize, _ := (*C.uint)(unsafe.Pointer(BufferSize)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAccountingBufferSize(cDevice, cBufferSize) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetRetiredPages function as declared in nvml/nvml.h +func nvmlDeviceGetRetiredPages(Device Device, Cause PageRetirementCause, PageCount *uint32, Addresses *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCause, _ := (C.nvmlPageRetirementCause_t)(Cause), cgoAllocsUnknown + cPageCount, _ := (*C.uint)(unsafe.Pointer(PageCount)), cgoAllocsUnknown + cAddresses, _ := (*C.ulonglong)(unsafe.Pointer(Addresses)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetRetiredPages(cDevice, cCause, cPageCount, cAddresses) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetRetiredPages_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetRetiredPages_v2(Device Device, Cause PageRetirementCause, PageCount *uint32, Addresses *uint64, Timestamps *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCause, _ := (C.nvmlPageRetirementCause_t)(Cause), cgoAllocsUnknown + cPageCount, _ := (*C.uint)(unsafe.Pointer(PageCount)), cgoAllocsUnknown + cAddresses, _ := (*C.ulonglong)(unsafe.Pointer(Addresses)), cgoAllocsUnknown + cTimestamps, _ := (*C.ulonglong)(unsafe.Pointer(Timestamps)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetRetiredPages_v2(cDevice, cCause, cPageCount, cAddresses, cTimestamps) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetRetiredPagesPendingStatus function as declared in nvml/nvml.h +func nvmlDeviceGetRetiredPagesPendingStatus(Device Device, IsPending *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIsPending, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(IsPending)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetRetiredPagesPendingStatus(cDevice, cIsPending) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetRemappedRows function as declared in nvml/nvml.h +func nvmlDeviceGetRemappedRows(Device Device, CorrRows *uint32, UncRows *uint32, IsPending *uint32, FailureOccurred *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCorrRows, _ := (*C.uint)(unsafe.Pointer(CorrRows)), cgoAllocsUnknown + cUncRows, _ := (*C.uint)(unsafe.Pointer(UncRows)), cgoAllocsUnknown + cIsPending, _ := (*C.uint)(unsafe.Pointer(IsPending)), cgoAllocsUnknown + cFailureOccurred, _ := (*C.uint)(unsafe.Pointer(FailureOccurred)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetRemappedRows(cDevice, cCorrRows, cUncRows, cIsPending, cFailureOccurred) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetRowRemapperHistogram function as declared in nvml/nvml.h +func nvmlDeviceGetRowRemapperHistogram(Device Device, Values *RowRemapperHistogramValues) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cValues, _ := (*C.nvmlRowRemapperHistogramValues_t)(unsafe.Pointer(Values)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetRowRemapperHistogram(cDevice, cValues) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetArchitecture function as declared in nvml/nvml.h +func nvmlDeviceGetArchitecture(Device Device, Arch *DeviceArchitecture) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cArch, _ := (*C.nvmlDeviceArchitecture_t)(unsafe.Pointer(Arch)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetArchitecture(cDevice, cArch) + __v := (Return)(__ret) + return __v +} + +// nvmlUnitSetLedState function as declared in nvml/nvml.h +func nvmlUnitSetLedState(Unit Unit, Color LedColor) Return { + cUnit, _ := *(*C.nvmlUnit_t)(unsafe.Pointer(&Unit)), cgoAllocsUnknown + cColor, _ := (C.nvmlLedColor_t)(Color), cgoAllocsUnknown + __ret := C.nvmlUnitSetLedState(cUnit, cColor) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetPersistenceMode function as declared in nvml/nvml.h +func nvmlDeviceSetPersistenceMode(Device Device, Mode EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (C.nvmlEnableState_t)(Mode), cgoAllocsUnknown + __ret := C.nvmlDeviceSetPersistenceMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetComputeMode function as declared in nvml/nvml.h +func nvmlDeviceSetComputeMode(Device Device, Mode ComputeMode) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (C.nvmlComputeMode_t)(Mode), cgoAllocsUnknown + __ret := C.nvmlDeviceSetComputeMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetEccMode function as declared in nvml/nvml.h +func nvmlDeviceSetEccMode(Device Device, Ecc EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cEcc, _ := (C.nvmlEnableState_t)(Ecc), cgoAllocsUnknown + __ret := C.nvmlDeviceSetEccMode(cDevice, cEcc) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceClearEccErrorCounts function as declared in nvml/nvml.h +func nvmlDeviceClearEccErrorCounts(Device Device, CounterType EccCounterType) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCounterType, _ := (C.nvmlEccCounterType_t)(CounterType), cgoAllocsUnknown + __ret := C.nvmlDeviceClearEccErrorCounts(cDevice, cCounterType) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetDriverModel function as declared in nvml/nvml.h +func nvmlDeviceSetDriverModel(Device Device, DriverModel DriverModel, Flags uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cDriverModel, _ := (C.nvmlDriverModel_t)(DriverModel), cgoAllocsUnknown + cFlags, _ := (C.uint)(Flags), cgoAllocsUnknown + __ret := C.nvmlDeviceSetDriverModel(cDevice, cDriverModel, cFlags) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetGpuLockedClocks function as declared in nvml/nvml.h +func nvmlDeviceSetGpuLockedClocks(Device Device, MinGpuClockMHz uint32, MaxGpuClockMHz uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMinGpuClockMHz, _ := (C.uint)(MinGpuClockMHz), cgoAllocsUnknown + cMaxGpuClockMHz, _ := (C.uint)(MaxGpuClockMHz), cgoAllocsUnknown + __ret := C.nvmlDeviceSetGpuLockedClocks(cDevice, cMinGpuClockMHz, cMaxGpuClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceResetGpuLockedClocks function as declared in nvml/nvml.h +func nvmlDeviceResetGpuLockedClocks(Device Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceResetGpuLockedClocks(cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetMemoryLockedClocks function as declared in nvml/nvml.h +func nvmlDeviceSetMemoryLockedClocks(Device Device, MinMemClockMHz uint32, MaxMemClockMHz uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMinMemClockMHz, _ := (C.uint)(MinMemClockMHz), cgoAllocsUnknown + cMaxMemClockMHz, _ := (C.uint)(MaxMemClockMHz), cgoAllocsUnknown + __ret := C.nvmlDeviceSetMemoryLockedClocks(cDevice, cMinMemClockMHz, cMaxMemClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceResetMemoryLockedClocks function as declared in nvml/nvml.h +func nvmlDeviceResetMemoryLockedClocks(Device Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceResetMemoryLockedClocks(cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetApplicationsClocks function as declared in nvml/nvml.h +func nvmlDeviceSetApplicationsClocks(Device Device, MemClockMHz uint32, GraphicsClockMHz uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMemClockMHz, _ := (C.uint)(MemClockMHz), cgoAllocsUnknown + cGraphicsClockMHz, _ := (C.uint)(GraphicsClockMHz), cgoAllocsUnknown + __ret := C.nvmlDeviceSetApplicationsClocks(cDevice, cMemClockMHz, cGraphicsClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetClkMonStatus function as declared in nvml/nvml.h +func nvmlDeviceGetClkMonStatus(Device Device, Status *ClkMonStatus) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cStatus, _ := (*C.nvmlClkMonStatus_t)(unsafe.Pointer(Status)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetClkMonStatus(cDevice, cStatus) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetPowerManagementLimit function as declared in nvml/nvml.h +func nvmlDeviceSetPowerManagementLimit(Device Device, Limit uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLimit, _ := (C.uint)(Limit), cgoAllocsUnknown + __ret := C.nvmlDeviceSetPowerManagementLimit(cDevice, cLimit) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetGpuOperationMode function as declared in nvml/nvml.h +func nvmlDeviceSetGpuOperationMode(Device Device, Mode GpuOperationMode) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (C.nvmlGpuOperationMode_t)(Mode), cgoAllocsUnknown + __ret := C.nvmlDeviceSetGpuOperationMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetAPIRestriction function as declared in nvml/nvml.h +func nvmlDeviceSetAPIRestriction(Device Device, ApiType RestrictedAPI, IsRestricted EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cApiType, _ := (C.nvmlRestrictedAPI_t)(ApiType), cgoAllocsUnknown + cIsRestricted, _ := (C.nvmlEnableState_t)(IsRestricted), cgoAllocsUnknown + __ret := C.nvmlDeviceSetAPIRestriction(cDevice, cApiType, cIsRestricted) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetAccountingMode function as declared in nvml/nvml.h +func nvmlDeviceSetAccountingMode(Device Device, Mode EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (C.nvmlEnableState_t)(Mode), cgoAllocsUnknown + __ret := C.nvmlDeviceSetAccountingMode(cDevice, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceClearAccountingPids function as declared in nvml/nvml.h +func nvmlDeviceClearAccountingPids(Device Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceClearAccountingPids(cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkState function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkState(Device Device, Link uint32, IsActive *EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cIsActive, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(IsActive)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkState(cDevice, cLink, cIsActive) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkVersion function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkVersion(Device Device, Link uint32, Version *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cVersion, _ := (*C.uint)(unsafe.Pointer(Version)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkVersion(cDevice, cLink, cVersion) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkCapability function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkCapability(Device Device, Link uint32, Capability NvLinkCapability, CapResult *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cCapability, _ := (C.nvmlNvLinkCapability_t)(Capability), cgoAllocsUnknown + cCapResult, _ := (*C.uint)(unsafe.Pointer(CapResult)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkCapability(cDevice, cLink, cCapability, cCapResult) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkRemotePciInfo_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkRemotePciInfo_v2(Device Device, Link uint32, Pci *PciInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cPci, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(Pci)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkRemotePciInfo_v2(cDevice, cLink, cPci) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkErrorCounter function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkErrorCounter(Device Device, Link uint32, Counter NvLinkErrorCounter, CounterValue *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cCounter, _ := (C.nvmlNvLinkErrorCounter_t)(Counter), cgoAllocsUnknown + cCounterValue, _ := (*C.ulonglong)(unsafe.Pointer(CounterValue)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkErrorCounter(cDevice, cLink, cCounter, cCounterValue) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceResetNvLinkErrorCounters function as declared in nvml/nvml.h +func nvmlDeviceResetNvLinkErrorCounters(Device Device, Link uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + __ret := C.nvmlDeviceResetNvLinkErrorCounters(cDevice, cLink) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetNvLinkUtilizationControl function as declared in nvml/nvml.h +func nvmlDeviceSetNvLinkUtilizationControl(Device Device, Link uint32, Counter uint32, Control *NvLinkUtilizationControl, Reset uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cCounter, _ := (C.uint)(Counter), cgoAllocsUnknown + cControl, _ := (*C.nvmlNvLinkUtilizationControl_t)(unsafe.Pointer(Control)), cgoAllocsUnknown + cReset, _ := (C.uint)(Reset), cgoAllocsUnknown + __ret := C.nvmlDeviceSetNvLinkUtilizationControl(cDevice, cLink, cCounter, cControl, cReset) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkUtilizationControl function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkUtilizationControl(Device Device, Link uint32, Counter uint32, Control *NvLinkUtilizationControl) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cCounter, _ := (C.uint)(Counter), cgoAllocsUnknown + cControl, _ := (*C.nvmlNvLinkUtilizationControl_t)(unsafe.Pointer(Control)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkUtilizationControl(cDevice, cLink, cCounter, cControl) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkUtilizationCounter function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkUtilizationCounter(Device Device, Link uint32, Counter uint32, Rxcounter *uint64, Txcounter *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cCounter, _ := (C.uint)(Counter), cgoAllocsUnknown + cRxcounter, _ := (*C.ulonglong)(unsafe.Pointer(Rxcounter)), cgoAllocsUnknown + cTxcounter, _ := (*C.ulonglong)(unsafe.Pointer(Txcounter)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkUtilizationCounter(cDevice, cLink, cCounter, cRxcounter, cTxcounter) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceFreezeNvLinkUtilizationCounter function as declared in nvml/nvml.h +func nvmlDeviceFreezeNvLinkUtilizationCounter(Device Device, Link uint32, Counter uint32, Freeze EnableState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cCounter, _ := (C.uint)(Counter), cgoAllocsUnknown + cFreeze, _ := (C.nvmlEnableState_t)(Freeze), cgoAllocsUnknown + __ret := C.nvmlDeviceFreezeNvLinkUtilizationCounter(cDevice, cLink, cCounter, cFreeze) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceResetNvLinkUtilizationCounter function as declared in nvml/nvml.h +func nvmlDeviceResetNvLinkUtilizationCounter(Device Device, Link uint32, Counter uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cCounter, _ := (C.uint)(Counter), cgoAllocsUnknown + __ret := C.nvmlDeviceResetNvLinkUtilizationCounter(cDevice, cLink, cCounter) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkRemoteDeviceType function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkRemoteDeviceType(Device Device, Link uint32, PNvLinkDeviceType *IntNvLinkDeviceType) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cPNvLinkDeviceType, _ := (*C.nvmlIntNvLinkDeviceType_t)(unsafe.Pointer(PNvLinkDeviceType)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkRemoteDeviceType(cDevice, cLink, cPNvLinkDeviceType) + __v := (Return)(__ret) + return __v +} + +// nvmlEventSetCreate function as declared in nvml/nvml.h +func nvmlEventSetCreate(Set *EventSet) Return { + cSet, _ := (*C.nvmlEventSet_t)(unsafe.Pointer(Set)), cgoAllocsUnknown + __ret := C.nvmlEventSetCreate(cSet) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceRegisterEvents function as declared in nvml/nvml.h +func nvmlDeviceRegisterEvents(Device Device, EventTypes uint64, Set EventSet) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cEventTypes, _ := (C.ulonglong)(EventTypes), cgoAllocsUnknown + cSet, _ := *(*C.nvmlEventSet_t)(unsafe.Pointer(&Set)), cgoAllocsUnknown + __ret := C.nvmlDeviceRegisterEvents(cDevice, cEventTypes, cSet) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSupportedEventTypes function as declared in nvml/nvml.h +func nvmlDeviceGetSupportedEventTypes(Device Device, EventTypes *uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cEventTypes, _ := (*C.ulonglong)(unsafe.Pointer(EventTypes)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSupportedEventTypes(cDevice, cEventTypes) + __v := (Return)(__ret) + return __v +} + +// nvmlEventSetWait_v2 function as declared in nvml/nvml.h +func nvmlEventSetWait_v2(Set EventSet, Data *EventData, Timeoutms uint32) Return { + cSet, _ := *(*C.nvmlEventSet_t)(unsafe.Pointer(&Set)), cgoAllocsUnknown + cData, _ := (*C.nvmlEventData_t)(unsafe.Pointer(Data)), cgoAllocsUnknown + cTimeoutms, _ := (C.uint)(Timeoutms), cgoAllocsUnknown + __ret := C.nvmlEventSetWait_v2(cSet, cData, cTimeoutms) + __v := (Return)(__ret) + return __v +} + +// nvmlEventSetFree function as declared in nvml/nvml.h +func nvmlEventSetFree(Set EventSet) Return { + cSet, _ := *(*C.nvmlEventSet_t)(unsafe.Pointer(&Set)), cgoAllocsUnknown + __ret := C.nvmlEventSetFree(cSet) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceModifyDrainState function as declared in nvml/nvml.h +func nvmlDeviceModifyDrainState(PciInfo *PciInfo, NewState EnableState) Return { + cPciInfo, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(PciInfo)), cgoAllocsUnknown + cNewState, _ := (C.nvmlEnableState_t)(NewState), cgoAllocsUnknown + __ret := C.nvmlDeviceModifyDrainState(cPciInfo, cNewState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceQueryDrainState function as declared in nvml/nvml.h +func nvmlDeviceQueryDrainState(PciInfo *PciInfo, CurrentState *EnableState) Return { + cPciInfo, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(PciInfo)), cgoAllocsUnknown + cCurrentState, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(CurrentState)), cgoAllocsUnknown + __ret := C.nvmlDeviceQueryDrainState(cPciInfo, cCurrentState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceRemoveGpu_v2 function as declared in nvml/nvml.h +func nvmlDeviceRemoveGpu_v2(PciInfo *PciInfo, GpuState DetachGpuState, LinkState PcieLinkState) Return { + cPciInfo, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(PciInfo)), cgoAllocsUnknown + cGpuState, _ := (C.nvmlDetachGpuState_t)(GpuState), cgoAllocsUnknown + cLinkState, _ := (C.nvmlPcieLinkState_t)(LinkState), cgoAllocsUnknown + __ret := C.nvmlDeviceRemoveGpu_v2(cPciInfo, cGpuState, cLinkState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceDiscoverGpus function as declared in nvml/nvml.h +func nvmlDeviceDiscoverGpus(PciInfo *PciInfo) Return { + cPciInfo, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(PciInfo)), cgoAllocsUnknown + __ret := C.nvmlDeviceDiscoverGpus(cPciInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetFieldValues function as declared in nvml/nvml.h +func nvmlDeviceGetFieldValues(Device Device, ValuesCount int32, Values *FieldValue) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cValuesCount, _ := (C.int)(ValuesCount), cgoAllocsUnknown + cValues, _ := (*C.nvmlFieldValue_t)(unsafe.Pointer(Values)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetFieldValues(cDevice, cValuesCount, cValues) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceClearFieldValues function as declared in nvml/nvml.h +func nvmlDeviceClearFieldValues(Device Device, ValuesCount int32, Values *FieldValue) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cValuesCount, _ := (C.int)(ValuesCount), cgoAllocsUnknown + cValues, _ := (*C.nvmlFieldValue_t)(unsafe.Pointer(Values)), cgoAllocsUnknown + __ret := C.nvmlDeviceClearFieldValues(cDevice, cValuesCount, cValues) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVirtualizationMode function as declared in nvml/nvml.h +func nvmlDeviceGetVirtualizationMode(Device Device, PVirtualMode *GpuVirtualizationMode) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPVirtualMode, _ := (*C.nvmlGpuVirtualizationMode_t)(unsafe.Pointer(PVirtualMode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVirtualizationMode(cDevice, cPVirtualMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetHostVgpuMode function as declared in nvml/nvml.h +func nvmlDeviceGetHostVgpuMode(Device Device, PHostVgpuMode *HostVgpuMode) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPHostVgpuMode, _ := (*C.nvmlHostVgpuMode_t)(unsafe.Pointer(PHostVgpuMode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetHostVgpuMode(cDevice, cPHostVgpuMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetVirtualizationMode function as declared in nvml/nvml.h +func nvmlDeviceSetVirtualizationMode(Device Device, VirtualMode GpuVirtualizationMode) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVirtualMode, _ := (C.nvmlGpuVirtualizationMode_t)(VirtualMode), cgoAllocsUnknown + __ret := C.nvmlDeviceSetVirtualizationMode(cDevice, cVirtualMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGridLicensableFeatures_v4 function as declared in nvml/nvml.h +func nvmlDeviceGetGridLicensableFeatures_v4(Device Device, PGridLicensableFeatures *GridLicensableFeatures) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPGridLicensableFeatures, _ := (*C.nvmlGridLicensableFeatures_t)(unsafe.Pointer(PGridLicensableFeatures)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGridLicensableFeatures_v4(cDevice, cPGridLicensableFeatures) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetProcessUtilization function as declared in nvml/nvml.h +func nvmlDeviceGetProcessUtilization(Device Device, Utilization *ProcessUtilizationSample, ProcessSamplesCount *uint32, LastSeenTimeStamp uint64) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cUtilization, _ := (*C.nvmlProcessUtilizationSample_t)(unsafe.Pointer(Utilization)), cgoAllocsUnknown + cProcessSamplesCount, _ := (*C.uint)(unsafe.Pointer(ProcessSamplesCount)), cgoAllocsUnknown + cLastSeenTimeStamp, _ := (C.ulonglong)(LastSeenTimeStamp), cgoAllocsUnknown + __ret := C.nvmlDeviceGetProcessUtilization(cDevice, cUtilization, cProcessSamplesCount, cLastSeenTimeStamp) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGspFirmwareVersion function as declared in nvml/nvml.h +func nvmlDeviceGetGspFirmwareVersion(Device Device, Version *byte) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVersion, _ := (*C.char)(unsafe.Pointer(Version)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGspFirmwareVersion(cDevice, cVersion) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGspFirmwareMode function as declared in nvml/nvml.h +func nvmlDeviceGetGspFirmwareMode(Device Device, IsEnabled *uint32, DefaultMode *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIsEnabled, _ := (*C.uint)(unsafe.Pointer(IsEnabled)), cgoAllocsUnknown + cDefaultMode, _ := (*C.uint)(unsafe.Pointer(DefaultMode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGspFirmwareMode(cDevice, cIsEnabled, cDefaultMode) + __v := (Return)(__ret) + return __v +} + +// nvmlGetVgpuDriverCapabilities function as declared in nvml/nvml.h +func nvmlGetVgpuDriverCapabilities(Capability VgpuDriverCapability, CapResult *uint32) Return { + cCapability, _ := (C.nvmlVgpuDriverCapability_t)(Capability), cgoAllocsUnknown + cCapResult, _ := (*C.uint)(unsafe.Pointer(CapResult)), cgoAllocsUnknown + __ret := C.nvmlGetVgpuDriverCapabilities(cCapability, cCapResult) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVgpuCapabilities function as declared in nvml/nvml.h +func nvmlDeviceGetVgpuCapabilities(Device Device, Capability DeviceVgpuCapability, CapResult *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCapability, _ := (C.nvmlDeviceVgpuCapability_t)(Capability), cgoAllocsUnknown + cCapResult, _ := (*C.uint)(unsafe.Pointer(CapResult)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVgpuCapabilities(cDevice, cCapability, cCapResult) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSupportedVgpus function as declared in nvml/nvml.h +func nvmlDeviceGetSupportedVgpus(Device Device, VgpuCount *uint32, VgpuTypeIds *VgpuTypeId) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVgpuCount, _ := (*C.uint)(unsafe.Pointer(VgpuCount)), cgoAllocsUnknown + cVgpuTypeIds, _ := (*C.nvmlVgpuTypeId_t)(unsafe.Pointer(VgpuTypeIds)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSupportedVgpus(cDevice, cVgpuCount, cVgpuTypeIds) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCreatableVgpus function as declared in nvml/nvml.h +func nvmlDeviceGetCreatableVgpus(Device Device, VgpuCount *uint32, VgpuTypeIds *VgpuTypeId) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVgpuCount, _ := (*C.uint)(unsafe.Pointer(VgpuCount)), cgoAllocsUnknown + cVgpuTypeIds, _ := (*C.nvmlVgpuTypeId_t)(unsafe.Pointer(VgpuTypeIds)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCreatableVgpus(cDevice, cVgpuCount, cVgpuTypeIds) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetClass function as declared in nvml/nvml.h +func nvmlVgpuTypeGetClass(VgpuTypeId VgpuTypeId, VgpuTypeClass *byte, Size *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cVgpuTypeClass, _ := (*C.char)(unsafe.Pointer(VgpuTypeClass)), cgoAllocsUnknown + cSize, _ := (*C.uint)(unsafe.Pointer(Size)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetClass(cVgpuTypeId, cVgpuTypeClass, cSize) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetName function as declared in nvml/nvml.h +func nvmlVgpuTypeGetName(VgpuTypeId VgpuTypeId, VgpuTypeName *byte, Size *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cVgpuTypeName, _ := (*C.char)(unsafe.Pointer(VgpuTypeName)), cgoAllocsUnknown + cSize, _ := (*C.uint)(unsafe.Pointer(Size)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetName(cVgpuTypeId, cVgpuTypeName, cSize) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetGpuInstanceProfileId function as declared in nvml/nvml.h +func nvmlVgpuTypeGetGpuInstanceProfileId(VgpuTypeId VgpuTypeId, GpuInstanceProfileId *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cGpuInstanceProfileId, _ := (*C.uint)(unsafe.Pointer(GpuInstanceProfileId)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetGpuInstanceProfileId(cVgpuTypeId, cGpuInstanceProfileId) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetDeviceID function as declared in nvml/nvml.h +func nvmlVgpuTypeGetDeviceID(VgpuTypeId VgpuTypeId, DeviceID *uint64, SubsystemID *uint64) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cDeviceID, _ := (*C.ulonglong)(unsafe.Pointer(DeviceID)), cgoAllocsUnknown + cSubsystemID, _ := (*C.ulonglong)(unsafe.Pointer(SubsystemID)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetDeviceID(cVgpuTypeId, cDeviceID, cSubsystemID) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetFramebufferSize function as declared in nvml/nvml.h +func nvmlVgpuTypeGetFramebufferSize(VgpuTypeId VgpuTypeId, FbSize *uint64) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cFbSize, _ := (*C.ulonglong)(unsafe.Pointer(FbSize)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetFramebufferSize(cVgpuTypeId, cFbSize) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetNumDisplayHeads function as declared in nvml/nvml.h +func nvmlVgpuTypeGetNumDisplayHeads(VgpuTypeId VgpuTypeId, NumDisplayHeads *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cNumDisplayHeads, _ := (*C.uint)(unsafe.Pointer(NumDisplayHeads)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetNumDisplayHeads(cVgpuTypeId, cNumDisplayHeads) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetResolution function as declared in nvml/nvml.h +func nvmlVgpuTypeGetResolution(VgpuTypeId VgpuTypeId, DisplayIndex uint32, Xdim *uint32, Ydim *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cDisplayIndex, _ := (C.uint)(DisplayIndex), cgoAllocsUnknown + cXdim, _ := (*C.uint)(unsafe.Pointer(Xdim)), cgoAllocsUnknown + cYdim, _ := (*C.uint)(unsafe.Pointer(Ydim)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetResolution(cVgpuTypeId, cDisplayIndex, cXdim, cYdim) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetLicense function as declared in nvml/nvml.h +func nvmlVgpuTypeGetLicense(VgpuTypeId VgpuTypeId, VgpuTypeLicenseString *byte, Size uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cVgpuTypeLicenseString, _ := (*C.char)(unsafe.Pointer(VgpuTypeLicenseString)), cgoAllocsUnknown + cSize, _ := (C.uint)(Size), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetLicense(cVgpuTypeId, cVgpuTypeLicenseString, cSize) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetFrameRateLimit function as declared in nvml/nvml.h +func nvmlVgpuTypeGetFrameRateLimit(VgpuTypeId VgpuTypeId, FrameRateLimit *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cFrameRateLimit, _ := (*C.uint)(unsafe.Pointer(FrameRateLimit)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetFrameRateLimit(cVgpuTypeId, cFrameRateLimit) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetMaxInstances function as declared in nvml/nvml.h +func nvmlVgpuTypeGetMaxInstances(Device Device, VgpuTypeId VgpuTypeId, VgpuInstanceCount *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cVgpuInstanceCount, _ := (*C.uint)(unsafe.Pointer(VgpuInstanceCount)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetMaxInstances(cDevice, cVgpuTypeId, cVgpuInstanceCount) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetMaxInstancesPerVm function as declared in nvml/nvml.h +func nvmlVgpuTypeGetMaxInstancesPerVm(VgpuTypeId VgpuTypeId, VgpuInstanceCountPerVm *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cVgpuInstanceCountPerVm, _ := (*C.uint)(unsafe.Pointer(VgpuInstanceCountPerVm)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetMaxInstancesPerVm(cVgpuTypeId, cVgpuInstanceCountPerVm) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetActiveVgpus function as declared in nvml/nvml.h +func nvmlDeviceGetActiveVgpus(Device Device, VgpuCount *uint32, VgpuInstances *VgpuInstance) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cVgpuCount, _ := (*C.uint)(unsafe.Pointer(VgpuCount)), cgoAllocsUnknown + cVgpuInstances, _ := (*C.nvmlVgpuInstance_t)(unsafe.Pointer(VgpuInstances)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetActiveVgpus(cDevice, cVgpuCount, cVgpuInstances) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetVmID function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetVmID(VgpuInstance VgpuInstance, VmId *byte, Size uint32, VmIdType *VgpuVmIdType) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cVmId, _ := (*C.char)(unsafe.Pointer(VmId)), cgoAllocsUnknown + cSize, _ := (C.uint)(Size), cgoAllocsUnknown + cVmIdType, _ := (*C.nvmlVgpuVmIdType_t)(unsafe.Pointer(VmIdType)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetVmID(cVgpuInstance, cVmId, cSize, cVmIdType) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetUUID function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetUUID(VgpuInstance VgpuInstance, Uuid *byte, Size uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cUuid, _ := (*C.char)(unsafe.Pointer(Uuid)), cgoAllocsUnknown + cSize, _ := (C.uint)(Size), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetUUID(cVgpuInstance, cUuid, cSize) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetVmDriverVersion function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetVmDriverVersion(VgpuInstance VgpuInstance, Version *byte, Length uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cVersion, _ := (*C.char)(unsafe.Pointer(Version)), cgoAllocsUnknown + cLength, _ := (C.uint)(Length), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetVmDriverVersion(cVgpuInstance, cVersion, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetFbUsage function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetFbUsage(VgpuInstance VgpuInstance, FbUsage *uint64) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cFbUsage, _ := (*C.ulonglong)(unsafe.Pointer(FbUsage)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetFbUsage(cVgpuInstance, cFbUsage) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetLicenseStatus function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetLicenseStatus(VgpuInstance VgpuInstance, Licensed *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cLicensed, _ := (*C.uint)(unsafe.Pointer(Licensed)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetLicenseStatus(cVgpuInstance, cLicensed) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetType function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetType(VgpuInstance VgpuInstance, VgpuTypeId *VgpuTypeId) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cVgpuTypeId, _ := (*C.nvmlVgpuTypeId_t)(unsafe.Pointer(VgpuTypeId)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetType(cVgpuInstance, cVgpuTypeId) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetFrameRateLimit function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetFrameRateLimit(VgpuInstance VgpuInstance, FrameRateLimit *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cFrameRateLimit, _ := (*C.uint)(unsafe.Pointer(FrameRateLimit)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetFrameRateLimit(cVgpuInstance, cFrameRateLimit) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetEccMode function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetEccMode(VgpuInstance VgpuInstance, EccMode *EnableState) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cEccMode, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(EccMode)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetEccMode(cVgpuInstance, cEccMode) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetEncoderCapacity function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetEncoderCapacity(VgpuInstance VgpuInstance, EncoderCapacity *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cEncoderCapacity, _ := (*C.uint)(unsafe.Pointer(EncoderCapacity)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetEncoderCapacity(cVgpuInstance, cEncoderCapacity) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceSetEncoderCapacity function as declared in nvml/nvml.h +func nvmlVgpuInstanceSetEncoderCapacity(VgpuInstance VgpuInstance, EncoderCapacity uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cEncoderCapacity, _ := (C.uint)(EncoderCapacity), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceSetEncoderCapacity(cVgpuInstance, cEncoderCapacity) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetEncoderStats function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetEncoderStats(VgpuInstance VgpuInstance, SessionCount *uint32, AverageFps *uint32, AverageLatency *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cSessionCount, _ := (*C.uint)(unsafe.Pointer(SessionCount)), cgoAllocsUnknown + cAverageFps, _ := (*C.uint)(unsafe.Pointer(AverageFps)), cgoAllocsUnknown + cAverageLatency, _ := (*C.uint)(unsafe.Pointer(AverageLatency)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetEncoderStats(cVgpuInstance, cSessionCount, cAverageFps, cAverageLatency) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetEncoderSessions function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetEncoderSessions(VgpuInstance VgpuInstance, SessionCount *uint32, SessionInfo *EncoderSessionInfo) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cSessionCount, _ := (*C.uint)(unsafe.Pointer(SessionCount)), cgoAllocsUnknown + cSessionInfo, _ := (*C.nvmlEncoderSessionInfo_t)(unsafe.Pointer(SessionInfo)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetEncoderSessions(cVgpuInstance, cSessionCount, cSessionInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetFBCStats function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetFBCStats(VgpuInstance VgpuInstance, FbcStats *FBCStats) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cFbcStats, _ := (*C.nvmlFBCStats_t)(unsafe.Pointer(FbcStats)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetFBCStats(cVgpuInstance, cFbcStats) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetFBCSessions function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetFBCSessions(VgpuInstance VgpuInstance, SessionCount *uint32, SessionInfo *FBCSessionInfo) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cSessionCount, _ := (*C.uint)(unsafe.Pointer(SessionCount)), cgoAllocsUnknown + cSessionInfo, _ := (*C.nvmlFBCSessionInfo_t)(unsafe.Pointer(SessionInfo)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetFBCSessions(cVgpuInstance, cSessionCount, cSessionInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetGpuInstanceId function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetGpuInstanceId(VgpuInstance VgpuInstance, GpuInstanceId *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cGpuInstanceId, _ := (*C.uint)(unsafe.Pointer(GpuInstanceId)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetGpuInstanceId(cVgpuInstance, cGpuInstanceId) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetGpuPciId function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetGpuPciId(VgpuInstance VgpuInstance, VgpuPciId *byte, Length *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cVgpuPciId, _ := (*C.char)(unsafe.Pointer(VgpuPciId)), cgoAllocsUnknown + cLength, _ := (*C.uint)(unsafe.Pointer(Length)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetGpuPciId(cVgpuInstance, cVgpuPciId, cLength) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuTypeGetCapabilities function as declared in nvml/nvml.h +func nvmlVgpuTypeGetCapabilities(VgpuTypeId VgpuTypeId, Capability VgpuCapability, CapResult *uint32) Return { + cVgpuTypeId, _ := (C.nvmlVgpuTypeId_t)(VgpuTypeId), cgoAllocsUnknown + cCapability, _ := (C.nvmlVgpuCapability_t)(Capability), cgoAllocsUnknown + cCapResult, _ := (*C.uint)(unsafe.Pointer(CapResult)), cgoAllocsUnknown + __ret := C.nvmlVgpuTypeGetCapabilities(cVgpuTypeId, cCapability, cCapResult) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetMetadata function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetMetadata(VgpuInstance VgpuInstance, nvmlVgpuMetadata *nvmlVgpuMetadata, BufferSize *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cnvmlVgpuMetadata, _ := (*C.nvmlVgpuMetadata_t)(unsafe.Pointer(nvmlVgpuMetadata)), cgoAllocsUnknown + cBufferSize, _ := (*C.uint)(unsafe.Pointer(BufferSize)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetMetadata(cVgpuInstance, cnvmlVgpuMetadata, cBufferSize) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVgpuMetadata function as declared in nvml/nvml.h +func nvmlDeviceGetVgpuMetadata(Device Device, PgpuMetadata *nvmlVgpuPgpuMetadata, BufferSize *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPgpuMetadata, _ := (*C.nvmlVgpuPgpuMetadata_t)(unsafe.Pointer(PgpuMetadata)), cgoAllocsUnknown + cBufferSize, _ := (*C.uint)(unsafe.Pointer(BufferSize)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVgpuMetadata(cDevice, cPgpuMetadata, cBufferSize) + __v := (Return)(__ret) + return __v +} + +// nvmlGetVgpuCompatibility function as declared in nvml/nvml.h +func nvmlGetVgpuCompatibility(nvmlVgpuMetadata *nvmlVgpuMetadata, PgpuMetadata *nvmlVgpuPgpuMetadata, CompatibilityInfo *VgpuPgpuCompatibility) Return { + cnvmlVgpuMetadata, _ := (*C.nvmlVgpuMetadata_t)(unsafe.Pointer(nvmlVgpuMetadata)), cgoAllocsUnknown + cPgpuMetadata, _ := (*C.nvmlVgpuPgpuMetadata_t)(unsafe.Pointer(PgpuMetadata)), cgoAllocsUnknown + cCompatibilityInfo, _ := (*C.nvmlVgpuPgpuCompatibility_t)(unsafe.Pointer(CompatibilityInfo)), cgoAllocsUnknown + __ret := C.nvmlGetVgpuCompatibility(cnvmlVgpuMetadata, cPgpuMetadata, cCompatibilityInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPgpuMetadataString function as declared in nvml/nvml.h +func nvmlDeviceGetPgpuMetadataString(Device Device, PgpuMetadata *byte, BufferSize *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPgpuMetadata, _ := (*C.char)(unsafe.Pointer(PgpuMetadata)), cgoAllocsUnknown + cBufferSize, _ := (*C.uint)(unsafe.Pointer(BufferSize)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPgpuMetadataString(cDevice, cPgpuMetadata, cBufferSize) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVgpuSchedulerLog function as declared in nvml/nvml.h +func nvmlDeviceGetVgpuSchedulerLog(Device Device, PSchedulerLog *VgpuSchedulerLog) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPSchedulerLog, _ := (*C.nvmlVgpuSchedulerLog_t)(unsafe.Pointer(PSchedulerLog)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVgpuSchedulerLog(cDevice, cPSchedulerLog) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVgpuSchedulerState function as declared in nvml/nvml.h +func nvmlDeviceGetVgpuSchedulerState(Device Device, PSchedulerState *VgpuSchedulerGetState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPSchedulerState, _ := (*C.nvmlVgpuSchedulerGetState_t)(unsafe.Pointer(PSchedulerState)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVgpuSchedulerState(cDevice, cPSchedulerState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetVgpuSchedulerState function as declared in nvml/nvml.h +func nvmlDeviceSetVgpuSchedulerState(Device Device, PSchedulerState *VgpuSchedulerSetState) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPSchedulerState, _ := (*C.nvmlVgpuSchedulerSetState_t)(unsafe.Pointer(PSchedulerState)), cgoAllocsUnknown + __ret := C.nvmlDeviceSetVgpuSchedulerState(cDevice, cPSchedulerState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVgpuSchedulerCapabilities function as declared in nvml/nvml.h +func nvmlDeviceGetVgpuSchedulerCapabilities(Device Device, PCapabilities *VgpuSchedulerCapabilities) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPCapabilities, _ := (*C.nvmlVgpuSchedulerCapabilities_t)(unsafe.Pointer(PCapabilities)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVgpuSchedulerCapabilities(cDevice, cPCapabilities) + __v := (Return)(__ret) + return __v +} + +// nvmlGetVgpuVersion function as declared in nvml/nvml.h +func nvmlGetVgpuVersion(Supported *VgpuVersion, Current *VgpuVersion) Return { + cSupported, _ := (*C.nvmlVgpuVersion_t)(unsafe.Pointer(Supported)), cgoAllocsUnknown + cCurrent, _ := (*C.nvmlVgpuVersion_t)(unsafe.Pointer(Current)), cgoAllocsUnknown + __ret := C.nvmlGetVgpuVersion(cSupported, cCurrent) + __v := (Return)(__ret) + return __v +} + +// nvmlSetVgpuVersion function as declared in nvml/nvml.h +func nvmlSetVgpuVersion(VgpuVersion *VgpuVersion) Return { + cVgpuVersion, _ := (*C.nvmlVgpuVersion_t)(unsafe.Pointer(VgpuVersion)), cgoAllocsUnknown + __ret := C.nvmlSetVgpuVersion(cVgpuVersion) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVgpuUtilization function as declared in nvml/nvml.h +func nvmlDeviceGetVgpuUtilization(Device Device, LastSeenTimeStamp uint64, SampleValType *ValueType, VgpuInstanceSamplesCount *uint32, UtilizationSamples *VgpuInstanceUtilizationSample) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLastSeenTimeStamp, _ := (C.ulonglong)(LastSeenTimeStamp), cgoAllocsUnknown + cSampleValType, _ := (*C.nvmlValueType_t)(unsafe.Pointer(SampleValType)), cgoAllocsUnknown + cVgpuInstanceSamplesCount, _ := (*C.uint)(unsafe.Pointer(VgpuInstanceSamplesCount)), cgoAllocsUnknown + cUtilizationSamples, _ := (*C.nvmlVgpuInstanceUtilizationSample_t)(unsafe.Pointer(UtilizationSamples)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVgpuUtilization(cDevice, cLastSeenTimeStamp, cSampleValType, cVgpuInstanceSamplesCount, cUtilizationSamples) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetVgpuProcessUtilization function as declared in nvml/nvml.h +func nvmlDeviceGetVgpuProcessUtilization(Device Device, LastSeenTimeStamp uint64, VgpuProcessSamplesCount *uint32, UtilizationSamples *VgpuProcessUtilizationSample) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLastSeenTimeStamp, _ := (C.ulonglong)(LastSeenTimeStamp), cgoAllocsUnknown + cVgpuProcessSamplesCount, _ := (*C.uint)(unsafe.Pointer(VgpuProcessSamplesCount)), cgoAllocsUnknown + cUtilizationSamples, _ := (*C.nvmlVgpuProcessUtilizationSample_t)(unsafe.Pointer(UtilizationSamples)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetVgpuProcessUtilization(cDevice, cLastSeenTimeStamp, cVgpuProcessSamplesCount, cUtilizationSamples) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetAccountingMode function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetAccountingMode(VgpuInstance VgpuInstance, Mode *EnableState) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cMode, _ := (*C.nvmlEnableState_t)(unsafe.Pointer(Mode)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetAccountingMode(cVgpuInstance, cMode) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetAccountingPids function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetAccountingPids(VgpuInstance VgpuInstance, Count *uint32, Pids *uint32) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + cPids, _ := (*C.uint)(unsafe.Pointer(Pids)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetAccountingPids(cVgpuInstance, cCount, cPids) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetAccountingStats function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetAccountingStats(VgpuInstance VgpuInstance, Pid uint32, Stats *AccountingStats) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cPid, _ := (C.uint)(Pid), cgoAllocsUnknown + cStats, _ := (*C.nvmlAccountingStats_t)(unsafe.Pointer(Stats)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetAccountingStats(cVgpuInstance, cPid, cStats) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceClearAccountingPids function as declared in nvml/nvml.h +func nvmlVgpuInstanceClearAccountingPids(VgpuInstance VgpuInstance) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceClearAccountingPids(cVgpuInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetLicenseInfo_v2 function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetLicenseInfo_v2(VgpuInstance VgpuInstance, LicenseInfo *VgpuLicenseInfo) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cLicenseInfo, _ := (*C.nvmlVgpuLicenseInfo_t)(unsafe.Pointer(LicenseInfo)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetLicenseInfo_v2(cVgpuInstance, cLicenseInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlGetExcludedDeviceCount function as declared in nvml/nvml.h +func nvmlGetExcludedDeviceCount(DeviceCount *uint32) Return { + cDeviceCount, _ := (*C.uint)(unsafe.Pointer(DeviceCount)), cgoAllocsUnknown + __ret := C.nvmlGetExcludedDeviceCount(cDeviceCount) + __v := (Return)(__ret) + return __v +} + +// nvmlGetExcludedDeviceInfoByIndex function as declared in nvml/nvml.h +func nvmlGetExcludedDeviceInfoByIndex(Index uint32, Info *ExcludedDeviceInfo) Return { + cIndex, _ := (C.uint)(Index), cgoAllocsUnknown + cInfo, _ := (*C.nvmlExcludedDeviceInfo_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlGetExcludedDeviceInfoByIndex(cIndex, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetMigMode function as declared in nvml/nvml.h +func nvmlDeviceSetMigMode(Device Device, Mode uint32, ActivationStatus *Return) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMode, _ := (C.uint)(Mode), cgoAllocsUnknown + cActivationStatus, _ := (*C.nvmlReturn_t)(unsafe.Pointer(ActivationStatus)), cgoAllocsUnknown + __ret := C.nvmlDeviceSetMigMode(cDevice, cMode, cActivationStatus) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMigMode function as declared in nvml/nvml.h +func nvmlDeviceGetMigMode(Device Device, CurrentMode *uint32, PendingMode *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCurrentMode, _ := (*C.uint)(unsafe.Pointer(CurrentMode)), cgoAllocsUnknown + cPendingMode, _ := (*C.uint)(unsafe.Pointer(PendingMode)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMigMode(cDevice, cCurrentMode, cPendingMode) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstanceProfileInfo function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstanceProfileInfo(Device Device, Profile uint32, Info *GpuInstanceProfileInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfile, _ := (C.uint)(Profile), cgoAllocsUnknown + cInfo, _ := (*C.nvmlGpuInstanceProfileInfo_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstanceProfileInfo(cDevice, cProfile, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstanceProfileInfoV function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstanceProfileInfoV(Device Device, Profile uint32, Info *GpuInstanceProfileInfo_v2) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfile, _ := (C.uint)(Profile), cgoAllocsUnknown + cInfo, _ := (*C.nvmlGpuInstanceProfileInfo_v2_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstanceProfileInfoV(cDevice, cProfile, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstancePossiblePlacements_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstancePossiblePlacements_v2(Device Device, ProfileId uint32, Placements *GpuInstancePlacement, Count *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cPlacements, _ := (*C.nvmlGpuInstancePlacement_t)(unsafe.Pointer(Placements)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstancePossiblePlacements_v2(cDevice, cProfileId, cPlacements, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstanceRemainingCapacity function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstanceRemainingCapacity(Device Device, ProfileId uint32, Count *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstanceRemainingCapacity(cDevice, cProfileId, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceCreateGpuInstance function as declared in nvml/nvml.h +func nvmlDeviceCreateGpuInstance(Device Device, ProfileId uint32, GpuInstance *GpuInstance) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cGpuInstance, _ := (*C.nvmlGpuInstance_t)(unsafe.Pointer(GpuInstance)), cgoAllocsUnknown + __ret := C.nvmlDeviceCreateGpuInstance(cDevice, cProfileId, cGpuInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceCreateGpuInstanceWithPlacement function as declared in nvml/nvml.h +func nvmlDeviceCreateGpuInstanceWithPlacement(Device Device, ProfileId uint32, Placement *GpuInstancePlacement, GpuInstance *GpuInstance) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cPlacement, _ := (*C.nvmlGpuInstancePlacement_t)(unsafe.Pointer(Placement)), cgoAllocsUnknown + cGpuInstance, _ := (*C.nvmlGpuInstance_t)(unsafe.Pointer(GpuInstance)), cgoAllocsUnknown + __ret := C.nvmlDeviceCreateGpuInstanceWithPlacement(cDevice, cProfileId, cPlacement, cGpuInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceDestroy function as declared in nvml/nvml.h +func nvmlGpuInstanceDestroy(GpuInstance GpuInstance) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceDestroy(cGpuInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstances function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstances(Device Device, ProfileId uint32, GpuInstances *GpuInstance, Count *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cGpuInstances, _ := (*C.nvmlGpuInstance_t)(unsafe.Pointer(GpuInstances)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstances(cDevice, cProfileId, cGpuInstances, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstanceById function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstanceById(Device Device, Id uint32, GpuInstance *GpuInstance) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cId, _ := (C.uint)(Id), cgoAllocsUnknown + cGpuInstance, _ := (*C.nvmlGpuInstance_t)(unsafe.Pointer(GpuInstance)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstanceById(cDevice, cId, cGpuInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceGetInfo function as declared in nvml/nvml.h +func nvmlGpuInstanceGetInfo(GpuInstance GpuInstance, Info *GpuInstanceInfo) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cInfo, _ := (*C.nvmlGpuInstanceInfo_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceGetInfo(cGpuInstance, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceGetComputeInstanceProfileInfo function as declared in nvml/nvml.h +func nvmlGpuInstanceGetComputeInstanceProfileInfo(GpuInstance GpuInstance, Profile uint32, EngProfile uint32, Info *ComputeInstanceProfileInfo) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cProfile, _ := (C.uint)(Profile), cgoAllocsUnknown + cEngProfile, _ := (C.uint)(EngProfile), cgoAllocsUnknown + cInfo, _ := (*C.nvmlComputeInstanceProfileInfo_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceGetComputeInstanceProfileInfo(cGpuInstance, cProfile, cEngProfile, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceGetComputeInstanceProfileInfoV function as declared in nvml/nvml.h +func nvmlGpuInstanceGetComputeInstanceProfileInfoV(GpuInstance GpuInstance, Profile uint32, EngProfile uint32, Info *ComputeInstanceProfileInfo_v2) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cProfile, _ := (C.uint)(Profile), cgoAllocsUnknown + cEngProfile, _ := (C.uint)(EngProfile), cgoAllocsUnknown + cInfo, _ := (*C.nvmlComputeInstanceProfileInfo_v2_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceGetComputeInstanceProfileInfoV(cGpuInstance, cProfile, cEngProfile, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceGetComputeInstanceRemainingCapacity function as declared in nvml/nvml.h +func nvmlGpuInstanceGetComputeInstanceRemainingCapacity(GpuInstance GpuInstance, ProfileId uint32, Count *uint32) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceGetComputeInstanceRemainingCapacity(cGpuInstance, cProfileId, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceGetComputeInstancePossiblePlacements function as declared in nvml/nvml.h +func nvmlGpuInstanceGetComputeInstancePossiblePlacements(GpuInstance GpuInstance, ProfileId uint32, Placements *ComputeInstancePlacement, Count *uint32) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cPlacements, _ := (*C.nvmlComputeInstancePlacement_t)(unsafe.Pointer(Placements)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceGetComputeInstancePossiblePlacements(cGpuInstance, cProfileId, cPlacements, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceCreateComputeInstance function as declared in nvml/nvml.h +func nvmlGpuInstanceCreateComputeInstance(GpuInstance GpuInstance, ProfileId uint32, ComputeInstance *ComputeInstance) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cComputeInstance, _ := (*C.nvmlComputeInstance_t)(unsafe.Pointer(ComputeInstance)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceCreateComputeInstance(cGpuInstance, cProfileId, cComputeInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceCreateComputeInstanceWithPlacement function as declared in nvml/nvml.h +func nvmlGpuInstanceCreateComputeInstanceWithPlacement(GpuInstance GpuInstance, ProfileId uint32, Placement *ComputeInstancePlacement, ComputeInstance *ComputeInstance) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cPlacement, _ := (*C.nvmlComputeInstancePlacement_t)(unsafe.Pointer(Placement)), cgoAllocsUnknown + cComputeInstance, _ := (*C.nvmlComputeInstance_t)(unsafe.Pointer(ComputeInstance)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceCreateComputeInstanceWithPlacement(cGpuInstance, cProfileId, cPlacement, cComputeInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlComputeInstanceDestroy function as declared in nvml/nvml.h +func nvmlComputeInstanceDestroy(ComputeInstance ComputeInstance) Return { + cComputeInstance, _ := *(*C.nvmlComputeInstance_t)(unsafe.Pointer(&ComputeInstance)), cgoAllocsUnknown + __ret := C.nvmlComputeInstanceDestroy(cComputeInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceGetComputeInstances function as declared in nvml/nvml.h +func nvmlGpuInstanceGetComputeInstances(GpuInstance GpuInstance, ProfileId uint32, ComputeInstances *ComputeInstance, Count *uint32) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cComputeInstances, _ := (*C.nvmlComputeInstance_t)(unsafe.Pointer(ComputeInstances)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceGetComputeInstances(cGpuInstance, cProfileId, cComputeInstances, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlGpuInstanceGetComputeInstanceById function as declared in nvml/nvml.h +func nvmlGpuInstanceGetComputeInstanceById(GpuInstance GpuInstance, Id uint32, ComputeInstance *ComputeInstance) Return { + cGpuInstance, _ := *(*C.nvmlGpuInstance_t)(unsafe.Pointer(&GpuInstance)), cgoAllocsUnknown + cId, _ := (C.uint)(Id), cgoAllocsUnknown + cComputeInstance, _ := (*C.nvmlComputeInstance_t)(unsafe.Pointer(ComputeInstance)), cgoAllocsUnknown + __ret := C.nvmlGpuInstanceGetComputeInstanceById(cGpuInstance, cId, cComputeInstance) + __v := (Return)(__ret) + return __v +} + +// nvmlComputeInstanceGetInfo_v2 function as declared in nvml/nvml.h +func nvmlComputeInstanceGetInfo_v2(ComputeInstance ComputeInstance, Info *ComputeInstanceInfo) Return { + cComputeInstance, _ := *(*C.nvmlComputeInstance_t)(unsafe.Pointer(&ComputeInstance)), cgoAllocsUnknown + cInfo, _ := (*C.nvmlComputeInstanceInfo_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlComputeInstanceGetInfo_v2(cComputeInstance, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceIsMigDeviceHandle function as declared in nvml/nvml.h +func nvmlDeviceIsMigDeviceHandle(Device Device, IsMigDevice *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIsMigDevice, _ := (*C.uint)(unsafe.Pointer(IsMigDevice)), cgoAllocsUnknown + __ret := C.nvmlDeviceIsMigDeviceHandle(cDevice, cIsMigDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstanceId function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstanceId(Device Device, Id *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cId, _ := (*C.uint)(unsafe.Pointer(Id)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstanceId(cDevice, cId) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetComputeInstanceId function as declared in nvml/nvml.h +func nvmlDeviceGetComputeInstanceId(Device Device, Id *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cId, _ := (*C.uint)(unsafe.Pointer(Id)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetComputeInstanceId(cDevice, cId) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMaxMigDeviceCount function as declared in nvml/nvml.h +func nvmlDeviceGetMaxMigDeviceCount(Device Device, Count *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMaxMigDeviceCount(cDevice, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMigDeviceHandleByIndex function as declared in nvml/nvml.h +func nvmlDeviceGetMigDeviceHandleByIndex(Device Device, Index uint32, MigDevice *Device) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cIndex, _ := (C.uint)(Index), cgoAllocsUnknown + cMigDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(MigDevice)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMigDeviceHandleByIndex(cDevice, cIndex, cMigDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDeviceHandleFromMigDeviceHandle function as declared in nvml/nvml.h +func nvmlDeviceGetDeviceHandleFromMigDeviceHandle(MigDevice Device, Device *Device) Return { + cMigDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&MigDevice)), cgoAllocsUnknown + cDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDeviceHandleFromMigDeviceHandle(cMigDevice, cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetBusType function as declared in nvml/nvml.h +func nvmlDeviceGetBusType(Device Device, _type *BusType) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + c_type, _ := (*C.nvmlBusType_t)(unsafe.Pointer(_type)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetBusType(cDevice, c_type) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetDynamicPstatesInfo function as declared in nvml/nvml.h +func nvmlDeviceGetDynamicPstatesInfo(Device Device, PDynamicPstatesInfo *GpuDynamicPstatesInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPDynamicPstatesInfo, _ := (*C.nvmlGpuDynamicPstatesInfo_t)(unsafe.Pointer(PDynamicPstatesInfo)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetDynamicPstatesInfo(cDevice, cPDynamicPstatesInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetFanSpeed_v2 function as declared in nvml/nvml.h +func nvmlDeviceSetFanSpeed_v2(Device Device, Fan uint32, Speed uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cFan, _ := (C.uint)(Fan), cgoAllocsUnknown + cSpeed, _ := (C.uint)(Speed), cgoAllocsUnknown + __ret := C.nvmlDeviceSetFanSpeed_v2(cDevice, cFan, cSpeed) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpcClkVfOffset function as declared in nvml/nvml.h +func nvmlDeviceGetGpcClkVfOffset(Device Device, Offset *int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cOffset, _ := (*C.int)(unsafe.Pointer(Offset)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpcClkVfOffset(cDevice, cOffset) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetGpcClkVfOffset function as declared in nvml/nvml.h +func nvmlDeviceSetGpcClkVfOffset(Device Device, Offset int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cOffset, _ := (C.int)(Offset), cgoAllocsUnknown + __ret := C.nvmlDeviceSetGpcClkVfOffset(cDevice, cOffset) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMemClkVfOffset function as declared in nvml/nvml.h +func nvmlDeviceGetMemClkVfOffset(Device Device, Offset *int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cOffset, _ := (*C.int)(unsafe.Pointer(Offset)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMemClkVfOffset(cDevice, cOffset) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetMemClkVfOffset function as declared in nvml/nvml.h +func nvmlDeviceSetMemClkVfOffset(Device Device, Offset int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cOffset, _ := (C.int)(Offset), cgoAllocsUnknown + __ret := C.nvmlDeviceSetMemClkVfOffset(cDevice, cOffset) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMinMaxClockOfPState function as declared in nvml/nvml.h +func nvmlDeviceGetMinMaxClockOfPState(Device Device, _type ClockType, Pstate Pstates, MinClockMHz *uint32, MaxClockMHz *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + c_type, _ := (C.nvmlClockType_t)(_type), cgoAllocsUnknown + cPstate, _ := (C.nvmlPstates_t)(Pstate), cgoAllocsUnknown + cMinClockMHz, _ := (*C.uint)(unsafe.Pointer(MinClockMHz)), cgoAllocsUnknown + cMaxClockMHz, _ := (*C.uint)(unsafe.Pointer(MaxClockMHz)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMinMaxClockOfPState(cDevice, c_type, cPstate, cMinClockMHz, cMaxClockMHz) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetSupportedPerformanceStates function as declared in nvml/nvml.h +func nvmlDeviceGetSupportedPerformanceStates(Device Device, Pstates *Pstates, Size uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPstates, _ := (*C.nvmlPstates_t)(unsafe.Pointer(Pstates)), cgoAllocsUnknown + cSize, _ := (C.uint)(Size), cgoAllocsUnknown + __ret := C.nvmlDeviceGetSupportedPerformanceStates(cDevice, cPstates, cSize) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpcClkMinMaxVfOffset function as declared in nvml/nvml.h +func nvmlDeviceGetGpcClkMinMaxVfOffset(Device Device, MinOffset *int32, MaxOffset *int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMinOffset, _ := (*C.int)(unsafe.Pointer(MinOffset)), cgoAllocsUnknown + cMaxOffset, _ := (*C.int)(unsafe.Pointer(MaxOffset)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpcClkMinMaxVfOffset(cDevice, cMinOffset, cMaxOffset) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMemClkMinMaxVfOffset function as declared in nvml/nvml.h +func nvmlDeviceGetMemClkMinMaxVfOffset(Device Device, MinOffset *int32, MaxOffset *int32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cMinOffset, _ := (*C.int)(unsafe.Pointer(MinOffset)), cgoAllocsUnknown + cMaxOffset, _ := (*C.int)(unsafe.Pointer(MaxOffset)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMemClkMinMaxVfOffset(cDevice, cMinOffset, cMaxOffset) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuFabricInfo function as declared in nvml/nvml.h +func nvmlDeviceGetGpuFabricInfo(Device Device, GpuFabricInfo *GpuFabricInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cGpuFabricInfo, _ := (*C.nvmlGpuFabricInfo_t)(unsafe.Pointer(GpuFabricInfo)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuFabricInfo(cDevice, cGpuFabricInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlGpmMetricsGet function as declared in nvml/nvml.h +func nvmlGpmMetricsGet(MetricsGet *GpmMetricsGetType) Return { + cMetricsGet, _ := (*C.nvmlGpmMetricsGet_t)(unsafe.Pointer(MetricsGet)), cgoAllocsUnknown + __ret := C.nvmlGpmMetricsGet(cMetricsGet) + __v := (Return)(__ret) + return __v +} + +// nvmlGpmSampleFree function as declared in nvml/nvml.h +func nvmlGpmSampleFree(GpmSample GpmSample) Return { + cGpmSample, _ := *(*C.nvmlGpmSample_t)(unsafe.Pointer(&GpmSample)), cgoAllocsUnknown + __ret := C.nvmlGpmSampleFree(cGpmSample) + __v := (Return)(__ret) + return __v +} + +// nvmlGpmSampleAlloc function as declared in nvml/nvml.h +func nvmlGpmSampleAlloc(GpmSample *GpmSample) Return { + cGpmSample, _ := (*C.nvmlGpmSample_t)(unsafe.Pointer(GpmSample)), cgoAllocsUnknown + __ret := C.nvmlGpmSampleAlloc(cGpmSample) + __v := (Return)(__ret) + return __v +} + +// nvmlGpmSampleGet function as declared in nvml/nvml.h +func nvmlGpmSampleGet(Device Device, GpmSample GpmSample) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cGpmSample, _ := *(*C.nvmlGpmSample_t)(unsafe.Pointer(&GpmSample)), cgoAllocsUnknown + __ret := C.nvmlGpmSampleGet(cDevice, cGpmSample) + __v := (Return)(__ret) + return __v +} + +// nvmlGpmMigSampleGet function as declared in nvml/nvml.h +func nvmlGpmMigSampleGet(Device Device, GpuInstanceId uint32, GpmSample GpmSample) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cGpuInstanceId, _ := (C.uint)(GpuInstanceId), cgoAllocsUnknown + cGpmSample, _ := *(*C.nvmlGpmSample_t)(unsafe.Pointer(&GpmSample)), cgoAllocsUnknown + __ret := C.nvmlGpmMigSampleGet(cDevice, cGpuInstanceId, cGpmSample) + __v := (Return)(__ret) + return __v +} + +// nvmlGpmQueryDeviceSupport function as declared in nvml/nvml.h +func nvmlGpmQueryDeviceSupport(Device Device, GpmSupport *GpmSupport) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cGpmSupport, _ := (*C.nvmlGpmSupport_t)(unsafe.Pointer(GpmSupport)), cgoAllocsUnknown + __ret := C.nvmlGpmQueryDeviceSupport(cDevice, cGpmSupport) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceCcuGetStreamState function as declared in nvml/nvml.h +func nvmlDeviceCcuGetStreamState(Device Device, State *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cState, _ := (*C.uint)(unsafe.Pointer(State)), cgoAllocsUnknown + __ret := C.nvmlDeviceCcuGetStreamState(cDevice, cState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceCcuSetStreamState function as declared in nvml/nvml.h +func nvmlDeviceCcuSetStreamState(Device Device, State uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cState, _ := (C.uint)(State), cgoAllocsUnknown + __ret := C.nvmlDeviceCcuSetStreamState(cDevice, cState) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceSetNvLinkDeviceLowPowerThreshold function as declared in nvml/nvml.h +func nvmlDeviceSetNvLinkDeviceLowPowerThreshold(Device Device, Info *NvLinkPowerThres) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfo, _ := (*C.nvmlNvLinkPowerThres_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlDeviceSetNvLinkDeviceLowPowerThreshold(cDevice, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlInit_v1 function as declared in nvml/nvml.h +func nvmlInit_v1() Return { + __ret := C.nvmlInit() + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetCount_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetCount_v1(DeviceCount *uint32) Return { + cDeviceCount, _ := (*C.uint)(unsafe.Pointer(DeviceCount)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetCount(cDeviceCount) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetHandleByIndex_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetHandleByIndex_v1(Index uint32, Device *Device) Return { + cIndex, _ := (C.uint)(Index), cgoAllocsUnknown + cDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetHandleByIndex(cIndex, cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetHandleByPciBusId_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetHandleByPciBusId_v1(PciBusId string, Device *Device) Return { + cPciBusId, _ := unpackPCharString(PciBusId) + cDevice, _ := (*C.nvmlDevice_t)(unsafe.Pointer(Device)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetHandleByPciBusId(cPciBusId, cDevice) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPciInfo_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetPciInfo_v1(Device Device, Pci *PciInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPci, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(Pci)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPciInfo(cDevice, cPci) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetPciInfo_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetPciInfo_v2(Device Device, Pci *PciInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPci, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(Pci)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetPciInfo_v2(cDevice, cPci) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetNvLinkRemotePciInfo_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetNvLinkRemotePciInfo_v1(Device Device, Link uint32, Pci *PciInfo) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cLink, _ := (C.uint)(Link), cgoAllocsUnknown + cPci, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(Pci)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetNvLinkRemotePciInfo(cDevice, cLink, cPci) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGridLicensableFeatures_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetGridLicensableFeatures_v1(Device Device, PGridLicensableFeatures *GridLicensableFeatures) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPGridLicensableFeatures, _ := (*C.nvmlGridLicensableFeatures_t)(unsafe.Pointer(PGridLicensableFeatures)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGridLicensableFeatures(cDevice, cPGridLicensableFeatures) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGridLicensableFeatures_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetGridLicensableFeatures_v2(Device Device, PGridLicensableFeatures *GridLicensableFeatures) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPGridLicensableFeatures, _ := (*C.nvmlGridLicensableFeatures_t)(unsafe.Pointer(PGridLicensableFeatures)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGridLicensableFeatures_v2(cDevice, cPGridLicensableFeatures) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGridLicensableFeatures_v3 function as declared in nvml/nvml.h +func nvmlDeviceGetGridLicensableFeatures_v3(Device Device, PGridLicensableFeatures *GridLicensableFeatures) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cPGridLicensableFeatures, _ := (*C.nvmlGridLicensableFeatures_t)(unsafe.Pointer(PGridLicensableFeatures)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGridLicensableFeatures_v3(cDevice, cPGridLicensableFeatures) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceRemoveGpu_v1 function as declared in nvml/nvml.h +func nvmlDeviceRemoveGpu_v1(PciInfo *PciInfo) Return { + cPciInfo, _ := (*C.nvmlPciInfo_t)(unsafe.Pointer(PciInfo)), cgoAllocsUnknown + __ret := C.nvmlDeviceRemoveGpu(cPciInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlEventSetWait_v1 function as declared in nvml/nvml.h +func nvmlEventSetWait_v1(Set EventSet, Data *EventData, Timeoutms uint32) Return { + cSet, _ := *(*C.nvmlEventSet_t)(unsafe.Pointer(&Set)), cgoAllocsUnknown + cData, _ := (*C.nvmlEventData_t)(unsafe.Pointer(Data)), cgoAllocsUnknown + cTimeoutms, _ := (C.uint)(Timeoutms), cgoAllocsUnknown + __ret := C.nvmlEventSetWait(cSet, cData, cTimeoutms) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetAttributes_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetAttributes_v1(Device Device, Attributes *DeviceAttributes) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cAttributes, _ := (*C.nvmlDeviceAttributes_t)(unsafe.Pointer(Attributes)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetAttributes(cDevice, cAttributes) + __v := (Return)(__ret) + return __v +} + +// nvmlComputeInstanceGetInfo_v1 function as declared in nvml/nvml.h +func nvmlComputeInstanceGetInfo_v1(ComputeInstance ComputeInstance, Info *ComputeInstanceInfo) Return { + cComputeInstance, _ := *(*C.nvmlComputeInstance_t)(unsafe.Pointer(&ComputeInstance)), cgoAllocsUnknown + cInfo, _ := (*C.nvmlComputeInstanceInfo_t)(unsafe.Pointer(Info)), cgoAllocsUnknown + __ret := C.nvmlComputeInstanceGetInfo(cComputeInstance, cInfo) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetComputeRunningProcesses_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetComputeRunningProcesses_v1(Device Device, InfoCount *uint32, Infos *ProcessInfo_v1) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_v1_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetComputeRunningProcesses(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetComputeRunningProcesses_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetComputeRunningProcesses_v2(Device Device, InfoCount *uint32, Infos *ProcessInfo_v2) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_v2_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetComputeRunningProcesses_v2(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGraphicsRunningProcesses_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetGraphicsRunningProcesses_v1(Device Device, InfoCount *uint32, Infos *ProcessInfo_v1) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_v1_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGraphicsRunningProcesses(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGraphicsRunningProcesses_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetGraphicsRunningProcesses_v2(Device Device, InfoCount *uint32, Infos *ProcessInfo_v2) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_v2_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGraphicsRunningProcesses_v2(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMPSComputeRunningProcesses_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetMPSComputeRunningProcesses_v1(Device Device, InfoCount *uint32, Infos *ProcessInfo_v1) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_v1_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMPSComputeRunningProcesses(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetMPSComputeRunningProcesses_v2 function as declared in nvml/nvml.h +func nvmlDeviceGetMPSComputeRunningProcesses_v2(Device Device, InfoCount *uint32, Infos *ProcessInfo_v2) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cInfoCount, _ := (*C.uint)(unsafe.Pointer(InfoCount)), cgoAllocsUnknown + cInfos, _ := (*C.nvmlProcessInfo_v2_t)(unsafe.Pointer(Infos)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetMPSComputeRunningProcesses_v2(cDevice, cInfoCount, cInfos) + __v := (Return)(__ret) + return __v +} + +// nvmlDeviceGetGpuInstancePossiblePlacements_v1 function as declared in nvml/nvml.h +func nvmlDeviceGetGpuInstancePossiblePlacements_v1(Device Device, ProfileId uint32, Placements *GpuInstancePlacement, Count *uint32) Return { + cDevice, _ := *(*C.nvmlDevice_t)(unsafe.Pointer(&Device)), cgoAllocsUnknown + cProfileId, _ := (C.uint)(ProfileId), cgoAllocsUnknown + cPlacements, _ := (*C.nvmlGpuInstancePlacement_t)(unsafe.Pointer(Placements)), cgoAllocsUnknown + cCount, _ := (*C.uint)(unsafe.Pointer(Count)), cgoAllocsUnknown + __ret := C.nvmlDeviceGetGpuInstancePossiblePlacements(cDevice, cProfileId, cPlacements, cCount) + __v := (Return)(__ret) + return __v +} + +// nvmlVgpuInstanceGetLicenseInfo_v1 function as declared in nvml/nvml.h +func nvmlVgpuInstanceGetLicenseInfo_v1(VgpuInstance VgpuInstance, LicenseInfo *VgpuLicenseInfo) Return { + cVgpuInstance, _ := (C.nvmlVgpuInstance_t)(VgpuInstance), cgoAllocsUnknown + cLicenseInfo, _ := (*C.nvmlVgpuLicenseInfo_t)(unsafe.Pointer(LicenseInfo)), cgoAllocsUnknown + __ret := C.nvmlVgpuInstanceGetLicenseInfo(cVgpuInstance, cLicenseInfo) + __v := (Return)(__ret) + return __v +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/nvml.h b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/nvml.h new file mode 100644 index 0000000..8c71ff8 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/nvml.h @@ -0,0 +1,9689 @@ +/*** NVML VERSION: 12.0.76 ***/ +/*** From https://api.anaconda.org/download/nvidia/cuda-nvml-dev/12.0.76/linux-64/cuda-nvml-dev-12.0.76-0.tar.bz2 ***/ +/* + * Copyright 1993-2022 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. Users and possessors of this source code + * are hereby granted a nonexclusive, royalty-free license to use this code + * in individual and commercial software. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + * + * Any use of this source code in individual and commercial software must + * include, in the user documentation and internal comments to the code, + * the above Disclaimer and U.S. Government End Users Notice. + */ + +/* +NVML API Reference + +The NVIDIA Management Library (NVML) is a C-based programmatic interface for monitoring and +managing various states within NVIDIA Tesla &tm; GPUs. It is intended to be a platform for building +3rd party applications, and is also the underlying library for the NVIDIA-supported nvidia-smi +tool. NVML is thread-safe so it is safe to make simultaneous NVML calls from multiple threads. + +API Documentation + +Supported platforms: +- Windows: Windows Server 2008 R2 64bit, Windows Server 2012 R2 64bit, Windows 7 64bit, Windows 8 64bit, Windows 10 64bit +- Linux: 32-bit and 64-bit +- Hypervisors: Windows Server 2008R2/2012 Hyper-V 64bit, Citrix XenServer 6.2 SP1+, VMware ESX 5.1/5.5 + +Supported products: +- Full Support + - All Tesla products, starting with the Fermi architecture + - All Quadro products, starting with the Fermi architecture + - All vGPU Software products, starting with the Kepler architecture + - Selected GeForce Titan products +- Limited Support + - All Geforce products, starting with the Fermi architecture + +The NVML library can be found at \%ProgramW6432\%\\"NVIDIA Corporation"\\NVSMI\\ on Windows. It is +not be added to the system path by default. To dynamically link to NVML, add this path to the PATH +environmental variable. To dynamically load NVML, call LoadLibrary with this path. + +On Linux the NVML library will be found on the standard library path. For 64 bit Linux, both the 32 bit +and 64 bit NVML libraries will be installed. + +Online documentation for this library is available at http://docs.nvidia.com/deploy/nvml-api/index.html +*/ + +#ifndef __nvml_nvml_h__ +#define __nvml_nvml_h__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * On Windows, set up methods for DLL export + * define NVML_STATIC_IMPORT when using nvml_loader library + */ +#if defined _WINDOWS + #if !defined NVML_STATIC_IMPORT + #if defined NVML_LIB_EXPORT + #define DECLDIR __declspec(dllexport) + #else + #define DECLDIR __declspec(dllimport) + #endif + #else + #define DECLDIR + #endif +#else + #define DECLDIR +#endif + +/** + * NVML API versioning support + */ +#define NVML_API_VERSION 11 +#define NVML_API_VERSION_STR "11" +/** + * Defining NVML_NO_UNVERSIONED_FUNC_DEFS will disable "auto upgrading" of APIs. + * e.g. the user will have to call nvmlInit_v2 instead of nvmlInit. Enable this + * guard if you need to support older versions of the API + */ +#ifndef NVML_NO_UNVERSIONED_FUNC_DEFS + #define nvmlInit nvmlInit_v2 + #define nvmlDeviceGetPciInfo nvmlDeviceGetPciInfo_v3 + #define nvmlDeviceGetCount nvmlDeviceGetCount_v2 + #define nvmlDeviceGetHandleByIndex nvmlDeviceGetHandleByIndex_v2 + #define nvmlDeviceGetHandleByPciBusId nvmlDeviceGetHandleByPciBusId_v2 + #define nvmlDeviceGetNvLinkRemotePciInfo nvmlDeviceGetNvLinkRemotePciInfo_v2 + #define nvmlDeviceRemoveGpu nvmlDeviceRemoveGpu_v2 + #define nvmlDeviceGetGridLicensableFeatures nvmlDeviceGetGridLicensableFeatures_v4 + #define nvmlEventSetWait nvmlEventSetWait_v2 + #define nvmlDeviceGetAttributes nvmlDeviceGetAttributes_v2 + #define nvmlComputeInstanceGetInfo nvmlComputeInstanceGetInfo_v2 + #define nvmlDeviceGetComputeRunningProcesses nvmlDeviceGetComputeRunningProcesses_v3 + #define nvmlDeviceGetGraphicsRunningProcesses nvmlDeviceGetGraphicsRunningProcesses_v3 + #define nvmlDeviceGetMPSComputeRunningProcesses nvmlDeviceGetMPSComputeRunningProcesses_v3 + #define nvmlBlacklistDeviceInfo_t nvmlExcludedDeviceInfo_t + #define nvmlGetBlacklistDeviceCount nvmlGetExcludedDeviceCount + #define nvmlGetBlacklistDeviceInfoByIndex nvmlGetExcludedDeviceInfoByIndex + #define nvmlDeviceGetGpuInstancePossiblePlacements nvmlDeviceGetGpuInstancePossiblePlacements_v2 + #define nvmlVgpuInstanceGetLicenseInfo nvmlVgpuInstanceGetLicenseInfo_v2 +#endif // #ifndef NVML_NO_UNVERSIONED_FUNC_DEFS + +#define NVML_STRUCT_VERSION(data, ver) (unsigned int)(sizeof(nvml ## data ## _v ## ver ## _t) | \ + (ver << 24U)) + +/***************************************************************************************************/ +/** @defgroup nvmlDeviceStructs Device Structs + * @{ + */ +/***************************************************************************************************/ + +/** + * Special constant that some fields take when they are not available. + * Used when only part of the struct is not available. + * + * Each structure explicitly states when to check for this value. + */ +#define NVML_VALUE_NOT_AVAILABLE (-1) + +typedef struct +{ + struct nvmlDevice_st* handle; +} nvmlDevice_t; + +/** + * Buffer size guaranteed to be large enough for pci bus id + */ +#define NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE 32 + +/** + * Buffer size guaranteed to be large enough for pci bus id for ::busIdLegacy + */ +#define NVML_DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE 16 + +/** + * PCI information about a GPU device. + */ +typedef struct nvmlPciInfo_st +{ + char busIdLegacy[NVML_DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE]; //!< The legacy tuple domain:bus:device.function PCI identifier (& NULL terminator) + unsigned int domain; //!< The PCI domain on which the device's bus resides, 0 to 0xffffffff + unsigned int bus; //!< The bus on which the device resides, 0 to 0xff + unsigned int device; //!< The device's id on the bus, 0 to 31 + unsigned int pciDeviceId; //!< The combined 16-bit device id and 16-bit vendor id + + // Added in NVML 2.285 API + unsigned int pciSubSystemId; //!< The 32-bit Sub System Device ID + + char busId[NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE]; //!< The tuple domain:bus:device.function PCI identifier (& NULL terminator) +} nvmlPciInfo_t; + +/** + * PCI format string for ::busIdLegacy + */ +#define NVML_DEVICE_PCI_BUS_ID_LEGACY_FMT "%04X:%02X:%02X.0" + +/** + * PCI format string for ::busId + */ +#define NVML_DEVICE_PCI_BUS_ID_FMT "%08X:%02X:%02X.0" + +/** + * Utility macro for filling the pci bus id format from a nvmlPciInfo_t + */ +#define NVML_DEVICE_PCI_BUS_ID_FMT_ARGS(pciInfo) (pciInfo)->domain, \ + (pciInfo)->bus, \ + (pciInfo)->device + +/** + * Detailed ECC error counts for a device. + * + * @deprecated Different GPU families can have different memory error counters + * See \ref nvmlDeviceGetMemoryErrorCounter + */ +typedef struct nvmlEccErrorCounts_st +{ + unsigned long long l1Cache; //!< L1 cache errors + unsigned long long l2Cache; //!< L2 cache errors + unsigned long long deviceMemory; //!< Device memory errors + unsigned long long registerFile; //!< Register file errors +} nvmlEccErrorCounts_t; + +/** + * Utilization information for a device. + * Each sample period may be between 1 second and 1/6 second, depending on the product being queried. + */ +typedef struct nvmlUtilization_st +{ + unsigned int gpu; //!< Percent of time over the past sample period during which one or more kernels was executing on the GPU + unsigned int memory; //!< Percent of time over the past sample period during which global (device) memory was being read or written +} nvmlUtilization_t; + +/** + * Memory allocation information for a device (v1). + * The total amount is equal to the sum of the amounts of free and used memory. + */ +typedef struct nvmlMemory_st +{ + unsigned long long total; //!< Total physical device memory (in bytes) + unsigned long long free; //!< Unallocated device memory (in bytes) + unsigned long long used; //!< Sum of Reserved and Allocated device memory (in bytes). + //!< Note that the driver/GPU always sets aside a small amount of memory for bookkeeping +} nvmlMemory_t; + +/** + * Memory allocation information for a device (v2). + * + * Version 2 adds versioning for the struct and the amount of system-reserved memory as an output. + * @note The \ref nvmlMemory_v2_t.used amount also includes the \ref nvmlMemory_v2_t.reserved amount. + */ +typedef struct nvmlMemory_v2_st +{ + unsigned int version; //!< Structure format version (must be 2) + unsigned long long total; //!< Total physical device memory (in bytes) + unsigned long long reserved; //!< Device memory (in bytes) reserved for system use (driver or firmware) + unsigned long long free; //!< Unallocated device memory (in bytes) + unsigned long long used; //!< Allocated device memory (in bytes). Note that the driver/GPU always sets aside a small amount of memory for bookkeeping +} nvmlMemory_v2_t; + +#define nvmlMemory_v2 NVML_STRUCT_VERSION(Memory, 2) + +/** + * BAR1 Memory allocation Information for a device + */ +typedef struct nvmlBAR1Memory_st +{ + unsigned long long bar1Total; //!< Total BAR1 Memory (in bytes) + unsigned long long bar1Free; //!< Unallocated BAR1 Memory (in bytes) + unsigned long long bar1Used; //!< Allocated Used Memory (in bytes) +}nvmlBAR1Memory_t; + +/** + * Information about running compute processes on the GPU, legacy version + * for older versions of the API. + */ +typedef struct nvmlProcessInfo_v1_st +{ + unsigned int pid; //!< Process ID + unsigned long long usedGpuMemory; //!< Amount of used GPU memory in bytes. + //! Under WDDM, \ref NVML_VALUE_NOT_AVAILABLE is always reported + //! because Windows KMD manages all the memory and not the NVIDIA driver +} nvmlProcessInfo_v1_t; + +/** + * Information about running compute processes on the GPU + */ +typedef struct nvmlProcessInfo_v2_st +{ + unsigned int pid; //!< Process ID + unsigned long long usedGpuMemory; //!< Amount of used GPU memory in bytes. + //! Under WDDM, \ref NVML_VALUE_NOT_AVAILABLE is always reported + //! because Windows KMD manages all the memory and not the NVIDIA driver + unsigned int gpuInstanceId; //!< If MIG is enabled, stores a valid GPU instance ID. gpuInstanceId is set to + // 0xFFFFFFFF otherwise. + unsigned int computeInstanceId; //!< If MIG is enabled, stores a valid compute instance ID. computeInstanceId is set to + // 0xFFFFFFFF otherwise. +} nvmlProcessInfo_v2_t; + +/** + * Information about running compute processes on the GPU + * Version 2 adds versioning for the struct + */ +typedef struct nvmlProcessInfo_st +{ + unsigned int pid; //!< Process ID + unsigned long long usedGpuMemory; //!< Amount of used GPU memory in bytes. + //! Under WDDM, \ref NVML_VALUE_NOT_AVAILABLE is always reported + //! because Windows KMD manages all the memory and not the NVIDIA driver + unsigned int gpuInstanceId; //!< If MIG is enabled, stores a valid GPU instance ID. gpuInstanceId is set to + // 0xFFFFFFFF otherwise. + unsigned int computeInstanceId; //!< If MIG is enabled, stores a valid compute instance ID. computeInstanceId is set to + // 0xFFFFFFFF otherwise. +} nvmlProcessInfo_t; + +typedef struct nvmlDeviceAttributes_st +{ + unsigned int multiprocessorCount; //!< Streaming Multiprocessor count + unsigned int sharedCopyEngineCount; //!< Shared Copy Engine count + unsigned int sharedDecoderCount; //!< Shared Decoder Engine count + unsigned int sharedEncoderCount; //!< Shared Encoder Engine count + unsigned int sharedJpegCount; //!< Shared JPEG Engine count + unsigned int sharedOfaCount; //!< Shared OFA Engine count + unsigned int gpuInstanceSliceCount; //!< GPU instance slice count + unsigned int computeInstanceSliceCount; //!< Compute instance slice count + unsigned long long memorySizeMB; //!< Device memory size (in MiB) +} nvmlDeviceAttributes_t; + +/** + * Possible values that classify the remap availability for each bank. The max + * field will contain the number of banks that have maximum remap availability + * (all reserved rows are available). None means that there are no reserved + * rows available. + */ +typedef struct nvmlRowRemapperHistogramValues_st +{ + unsigned int max; + unsigned int high; + unsigned int partial; + unsigned int low; + unsigned int none; +} nvmlRowRemapperHistogramValues_t; + +/** + * Enum to represent type of bridge chip + */ +typedef enum nvmlBridgeChipType_enum +{ + NVML_BRIDGE_CHIP_PLX = 0, + NVML_BRIDGE_CHIP_BRO4 = 1 +}nvmlBridgeChipType_t; + +/** + * Maximum number of NvLink links supported + */ +#define NVML_NVLINK_MAX_LINKS 18 + +/** + * Enum to represent the NvLink utilization counter packet units + */ +typedef enum nvmlNvLinkUtilizationCountUnits_enum +{ + NVML_NVLINK_COUNTER_UNIT_CYCLES = 0, // count by cycles + NVML_NVLINK_COUNTER_UNIT_PACKETS = 1, // count by packets + NVML_NVLINK_COUNTER_UNIT_BYTES = 2, // count by bytes + NVML_NVLINK_COUNTER_UNIT_RESERVED = 3, // count reserved for internal use + // this must be last + NVML_NVLINK_COUNTER_UNIT_COUNT +} nvmlNvLinkUtilizationCountUnits_t; + +/** + * Enum to represent the NvLink utilization counter packet types to count + * ** this is ONLY applicable with the units as packets or bytes + * ** as specified in \a nvmlNvLinkUtilizationCountUnits_t + * ** all packet filter descriptions are target GPU centric + * ** these can be "OR'd" together + */ +typedef enum nvmlNvLinkUtilizationCountPktTypes_enum +{ + NVML_NVLINK_COUNTER_PKTFILTER_NOP = 0x1, // no operation packets + NVML_NVLINK_COUNTER_PKTFILTER_READ = 0x2, // read packets + NVML_NVLINK_COUNTER_PKTFILTER_WRITE = 0x4, // write packets + NVML_NVLINK_COUNTER_PKTFILTER_RATOM = 0x8, // reduction atomic requests + NVML_NVLINK_COUNTER_PKTFILTER_NRATOM = 0x10, // non-reduction atomic requests + NVML_NVLINK_COUNTER_PKTFILTER_FLUSH = 0x20, // flush requests + NVML_NVLINK_COUNTER_PKTFILTER_RESPDATA = 0x40, // responses with data + NVML_NVLINK_COUNTER_PKTFILTER_RESPNODATA = 0x80, // responses without data + NVML_NVLINK_COUNTER_PKTFILTER_ALL = 0xFF // all packets +} nvmlNvLinkUtilizationCountPktTypes_t; + +/** + * Struct to define the NVLINK counter controls + */ +typedef struct nvmlNvLinkUtilizationControl_st +{ + nvmlNvLinkUtilizationCountUnits_t units; + nvmlNvLinkUtilizationCountPktTypes_t pktfilter; +} nvmlNvLinkUtilizationControl_t; + +/** + * Enum to represent NvLink queryable capabilities + */ +typedef enum nvmlNvLinkCapability_enum +{ + NVML_NVLINK_CAP_P2P_SUPPORTED = 0, // P2P over NVLink is supported + NVML_NVLINK_CAP_SYSMEM_ACCESS = 1, // Access to system memory is supported + NVML_NVLINK_CAP_P2P_ATOMICS = 2, // P2P atomics are supported + NVML_NVLINK_CAP_SYSMEM_ATOMICS= 3, // System memory atomics are supported + NVML_NVLINK_CAP_SLI_BRIDGE = 4, // SLI is supported over this link + NVML_NVLINK_CAP_VALID = 5, // Link is supported on this device + // should be last + NVML_NVLINK_CAP_COUNT +} nvmlNvLinkCapability_t; + +/** + * Enum to represent NvLink queryable error counters + */ +typedef enum nvmlNvLinkErrorCounter_enum +{ + NVML_NVLINK_ERROR_DL_REPLAY = 0, // Data link transmit replay error counter + NVML_NVLINK_ERROR_DL_RECOVERY = 1, // Data link transmit recovery error counter + NVML_NVLINK_ERROR_DL_CRC_FLIT = 2, // Data link receive flow control digit CRC error counter + NVML_NVLINK_ERROR_DL_CRC_DATA = 3, // Data link receive data CRC error counter + NVML_NVLINK_ERROR_DL_ECC_DATA = 4, // Data link receive data ECC error counter + + // this must be last + NVML_NVLINK_ERROR_COUNT +} nvmlNvLinkErrorCounter_t; + +/** + * Enum to represent NvLink's remote device type + */ +typedef enum nvmlIntNvLinkDeviceType_enum +{ + NVML_NVLINK_DEVICE_TYPE_GPU = 0x00, + NVML_NVLINK_DEVICE_TYPE_IBMNPU = 0x01, + NVML_NVLINK_DEVICE_TYPE_SWITCH = 0x02, + NVML_NVLINK_DEVICE_TYPE_UNKNOWN = 0xFF +} nvmlIntNvLinkDeviceType_t; + +/** + * Represents level relationships within a system between two GPUs + * The enums are spaced to allow for future relationships + */ +typedef enum nvmlGpuLevel_enum +{ + NVML_TOPOLOGY_INTERNAL = 0, // e.g. Tesla K80 + NVML_TOPOLOGY_SINGLE = 10, // all devices that only need traverse a single PCIe switch + NVML_TOPOLOGY_MULTIPLE = 20, // all devices that need not traverse a host bridge + NVML_TOPOLOGY_HOSTBRIDGE = 30, // all devices that are connected to the same host bridge + NVML_TOPOLOGY_NODE = 40, // all devices that are connected to the same NUMA node but possibly multiple host bridges + NVML_TOPOLOGY_SYSTEM = 50 // all devices in the system + + // there is purposefully no COUNT here because of the need for spacing above +} nvmlGpuTopologyLevel_t; + +/* Compatibility for CPU->NODE renaming */ +#define NVML_TOPOLOGY_CPU NVML_TOPOLOGY_NODE + +/* P2P Capability Index Status*/ +typedef enum nvmlGpuP2PStatus_enum +{ + NVML_P2P_STATUS_OK = 0, + NVML_P2P_STATUS_CHIPSET_NOT_SUPPORED, + NVML_P2P_STATUS_GPU_NOT_SUPPORTED, + NVML_P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED, + NVML_P2P_STATUS_DISABLED_BY_REGKEY, + NVML_P2P_STATUS_NOT_SUPPORTED, + NVML_P2P_STATUS_UNKNOWN + +} nvmlGpuP2PStatus_t; + +/* P2P Capability Index*/ +typedef enum nvmlGpuP2PCapsIndex_enum +{ + NVML_P2P_CAPS_INDEX_READ = 0, + NVML_P2P_CAPS_INDEX_WRITE, + NVML_P2P_CAPS_INDEX_NVLINK, + NVML_P2P_CAPS_INDEX_ATOMICS, + NVML_P2P_CAPS_INDEX_PROP, + NVML_P2P_CAPS_INDEX_UNKNOWN +}nvmlGpuP2PCapsIndex_t; + +/** + * Maximum limit on Physical Bridges per Board + */ +#define NVML_MAX_PHYSICAL_BRIDGE (128) + +/** + * Information about the Bridge Chip Firmware + */ +typedef struct nvmlBridgeChipInfo_st +{ + nvmlBridgeChipType_t type; //!< Type of Bridge Chip + unsigned int fwVersion; //!< Firmware Version. 0=Version is unavailable +}nvmlBridgeChipInfo_t; + +/** + * This structure stores the complete Hierarchy of the Bridge Chip within the board. The immediate + * bridge is stored at index 0 of bridgeInfoList, parent to immediate bridge is at index 1 and so forth. + */ +typedef struct nvmlBridgeChipHierarchy_st +{ + unsigned char bridgeCount; //!< Number of Bridge Chips on the Board + nvmlBridgeChipInfo_t bridgeChipInfo[NVML_MAX_PHYSICAL_BRIDGE]; //!< Hierarchy of Bridge Chips on the board +}nvmlBridgeChipHierarchy_t; + +/** + * Represents Type of Sampling Event + */ +typedef enum nvmlSamplingType_enum +{ + NVML_TOTAL_POWER_SAMPLES = 0, //!< To represent total power drawn by GPU + NVML_GPU_UTILIZATION_SAMPLES = 1, //!< To represent percent of time during which one or more kernels was executing on the GPU + NVML_MEMORY_UTILIZATION_SAMPLES = 2, //!< To represent percent of time during which global (device) memory was being read or written + NVML_ENC_UTILIZATION_SAMPLES = 3, //!< To represent percent of time during which NVENC remains busy + NVML_DEC_UTILIZATION_SAMPLES = 4, //!< To represent percent of time during which NVDEC remains busy + NVML_PROCESSOR_CLK_SAMPLES = 5, //!< To represent processor clock samples + NVML_MEMORY_CLK_SAMPLES = 6, //!< To represent memory clock samples + + // Keep this last + NVML_SAMPLINGTYPE_COUNT +}nvmlSamplingType_t; + +/** + * Represents the queryable PCIe utilization counters + */ +typedef enum nvmlPcieUtilCounter_enum +{ + NVML_PCIE_UTIL_TX_BYTES = 0, // 1KB granularity + NVML_PCIE_UTIL_RX_BYTES = 1, // 1KB granularity + + // Keep this last + NVML_PCIE_UTIL_COUNT +} nvmlPcieUtilCounter_t; + +/** + * Represents the type for sample value returned + */ +typedef enum nvmlValueType_enum +{ + NVML_VALUE_TYPE_DOUBLE = 0, + NVML_VALUE_TYPE_UNSIGNED_INT = 1, + NVML_VALUE_TYPE_UNSIGNED_LONG = 2, + NVML_VALUE_TYPE_UNSIGNED_LONG_LONG = 3, + NVML_VALUE_TYPE_SIGNED_LONG_LONG = 4, + + // Keep this last + NVML_VALUE_TYPE_COUNT +}nvmlValueType_t; + + +/** + * Union to represent different types of Value + */ +typedef union nvmlValue_st +{ + double dVal; //!< If the value is double + unsigned int uiVal; //!< If the value is unsigned int + unsigned long ulVal; //!< If the value is unsigned long + unsigned long long ullVal; //!< If the value is unsigned long long + signed long long sllVal; //!< If the value is signed long long +}nvmlValue_t; + +/** + * Information for Sample + */ +typedef struct nvmlSample_st +{ + unsigned long long timeStamp; //!< CPU Timestamp in microseconds + nvmlValue_t sampleValue; //!< Sample Value +}nvmlSample_t; + +/** + * Represents type of perf policy for which violation times can be queried + */ +typedef enum nvmlPerfPolicyType_enum +{ + NVML_PERF_POLICY_POWER = 0, //!< How long did power violations cause the GPU to be below application clocks + NVML_PERF_POLICY_THERMAL = 1, //!< How long did thermal violations cause the GPU to be below application clocks + NVML_PERF_POLICY_SYNC_BOOST = 2, //!< How long did sync boost cause the GPU to be below application clocks + NVML_PERF_POLICY_BOARD_LIMIT = 3, //!< How long did the board limit cause the GPU to be below application clocks + NVML_PERF_POLICY_LOW_UTILIZATION = 4, //!< How long did low utilization cause the GPU to be below application clocks + NVML_PERF_POLICY_RELIABILITY = 5, //!< How long did the board reliability limit cause the GPU to be below application clocks + + NVML_PERF_POLICY_TOTAL_APP_CLOCKS = 10, //!< Total time the GPU was held below application clocks by any limiter (0 - 5 above) + NVML_PERF_POLICY_TOTAL_BASE_CLOCKS = 11, //!< Total time the GPU was held below base clocks + + // Keep this last + NVML_PERF_POLICY_COUNT +}nvmlPerfPolicyType_t; + +/** + * Struct to hold perf policy violation status data + */ +typedef struct nvmlViolationTime_st +{ + unsigned long long referenceTime; //!< referenceTime represents CPU timestamp in microseconds + unsigned long long violationTime; //!< violationTime in Nanoseconds +}nvmlViolationTime_t; + +#define NVML_MAX_THERMAL_SENSORS_PER_GPU 3 + +typedef enum +{ + NVML_THERMAL_TARGET_NONE = 0, + NVML_THERMAL_TARGET_GPU = 1, //!< GPU core temperature requires NvPhysicalGpuHandle + NVML_THERMAL_TARGET_MEMORY = 2, //!< GPU memory temperature requires NvPhysicalGpuHandle + NVML_THERMAL_TARGET_POWER_SUPPLY = 4, //!< GPU power supply temperature requires NvPhysicalGpuHandle + NVML_THERMAL_TARGET_BOARD = 8, //!< GPU board ambient temperature requires NvPhysicalGpuHandle + NVML_THERMAL_TARGET_VCD_BOARD = 9, //!< Visual Computing Device Board temperature requires NvVisualComputingDeviceHandle + NVML_THERMAL_TARGET_VCD_INLET = 10, //!< Visual Computing Device Inlet temperature requires NvVisualComputingDeviceHandle + NVML_THERMAL_TARGET_VCD_OUTLET = 11, //!< Visual Computing Device Outlet temperature requires NvVisualComputingDeviceHandle + + NVML_THERMAL_TARGET_ALL = 15, + NVML_THERMAL_TARGET_UNKNOWN = -1, +} nvmlThermalTarget_t; + +typedef enum +{ + NVML_THERMAL_CONTROLLER_NONE = 0, + NVML_THERMAL_CONTROLLER_GPU_INTERNAL, + NVML_THERMAL_CONTROLLER_ADM1032, + NVML_THERMAL_CONTROLLER_ADT7461, + NVML_THERMAL_CONTROLLER_MAX6649, + NVML_THERMAL_CONTROLLER_MAX1617, + NVML_THERMAL_CONTROLLER_LM99, + NVML_THERMAL_CONTROLLER_LM89, + NVML_THERMAL_CONTROLLER_LM64, + NVML_THERMAL_CONTROLLER_G781, + NVML_THERMAL_CONTROLLER_ADT7473, + NVML_THERMAL_CONTROLLER_SBMAX6649, + NVML_THERMAL_CONTROLLER_VBIOSEVT, + NVML_THERMAL_CONTROLLER_OS, + NVML_THERMAL_CONTROLLER_NVSYSCON_CANOAS, + NVML_THERMAL_CONTROLLER_NVSYSCON_E551, + NVML_THERMAL_CONTROLLER_MAX6649R, + NVML_THERMAL_CONTROLLER_ADT7473S, + NVML_THERMAL_CONTROLLER_UNKNOWN = -1, +} nvmlThermalController_t; + +typedef struct { + nvmlThermalController_t controller; + int defaultMinTemp; + int defaultMaxTemp; + int currentTemp; + nvmlThermalTarget_t target; +} nvmlGpuThermalSettingsSensor_t; + +typedef struct +{ + unsigned int count; + nvmlGpuThermalSettingsSensor_t sensor[NVML_MAX_THERMAL_SENSORS_PER_GPU]; + +} nvmlGpuThermalSettings_t; + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlDeviceEnumvs Device Enums + * @{ + */ +/***************************************************************************************************/ + +/** + * Generic enable/disable enum. + */ +typedef enum nvmlEnableState_enum +{ + NVML_FEATURE_DISABLED = 0, //!< Feature disabled + NVML_FEATURE_ENABLED = 1 //!< Feature enabled +} nvmlEnableState_t; + +//! Generic flag used to specify the default behavior of some functions. See description of particular functions for details. +#define nvmlFlagDefault 0x00 +//! Generic flag used to force some behavior. See description of particular functions for details. +#define nvmlFlagForce 0x01 + +/** + * * The Brand of the GPU + * */ +typedef enum nvmlBrandType_enum +{ + NVML_BRAND_UNKNOWN = 0, + NVML_BRAND_QUADRO = 1, + NVML_BRAND_TESLA = 2, + NVML_BRAND_NVS = 3, + NVML_BRAND_GRID = 4, // Deprecated from API reporting. Keeping definition for backward compatibility. + NVML_BRAND_GEFORCE = 5, + NVML_BRAND_TITAN = 6, + NVML_BRAND_NVIDIA_VAPPS = 7, // NVIDIA Virtual Applications + NVML_BRAND_NVIDIA_VPC = 8, // NVIDIA Virtual PC + NVML_BRAND_NVIDIA_VCS = 9, // NVIDIA Virtual Compute Server + NVML_BRAND_NVIDIA_VWS = 10, // NVIDIA RTX Virtual Workstation + NVML_BRAND_NVIDIA_CLOUD_GAMING = 11, // NVIDIA Cloud Gaming + NVML_BRAND_NVIDIA_VGAMING = NVML_BRAND_NVIDIA_CLOUD_GAMING, // Deprecated from API reporting. Keeping definition for backward compatibility. + NVML_BRAND_QUADRO_RTX = 12, + NVML_BRAND_NVIDIA_RTX = 13, + NVML_BRAND_NVIDIA = 14, + NVML_BRAND_GEFORCE_RTX = 15, // Unused + NVML_BRAND_TITAN_RTX = 16, // Unused + + // Keep this last + NVML_BRAND_COUNT +} nvmlBrandType_t; + +/** + * Temperature thresholds. + */ +typedef enum nvmlTemperatureThresholds_enum +{ + NVML_TEMPERATURE_THRESHOLD_SHUTDOWN = 0, // Temperature at which the GPU will + // shut down for HW protection + NVML_TEMPERATURE_THRESHOLD_SLOWDOWN = 1, // Temperature at which the GPU will + // begin HW slowdown + NVML_TEMPERATURE_THRESHOLD_MEM_MAX = 2, // Memory Temperature at which the GPU will + // begin SW slowdown + NVML_TEMPERATURE_THRESHOLD_GPU_MAX = 3, // GPU Temperature at which the GPU + // can be throttled below base clock + NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MIN = 4, // Minimum GPU Temperature that can be + // set as acoustic threshold + NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_CURR = 5, // Current temperature that is set as + // acoustic threshold. + NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MAX = 6, // Maximum GPU temperature that can be + // set as acoustic threshold. + // Keep this last + NVML_TEMPERATURE_THRESHOLD_COUNT +} nvmlTemperatureThresholds_t; + +/** + * Temperature sensors. + */ +typedef enum nvmlTemperatureSensors_enum +{ + NVML_TEMPERATURE_GPU = 0, //!< Temperature sensor for the GPU die + + // Keep this last + NVML_TEMPERATURE_COUNT +} nvmlTemperatureSensors_t; + +/** + * Compute mode. + * + * NVML_COMPUTEMODE_EXCLUSIVE_PROCESS was added in CUDA 4.0. + * Earlier CUDA versions supported a single exclusive mode, + * which is equivalent to NVML_COMPUTEMODE_EXCLUSIVE_THREAD in CUDA 4.0 and beyond. + */ +typedef enum nvmlComputeMode_enum +{ + NVML_COMPUTEMODE_DEFAULT = 0, //!< Default compute mode -- multiple contexts per device + NVML_COMPUTEMODE_EXCLUSIVE_THREAD = 1, //!< Support Removed + NVML_COMPUTEMODE_PROHIBITED = 2, //!< Compute-prohibited mode -- no contexts per device + NVML_COMPUTEMODE_EXCLUSIVE_PROCESS = 3, //!< Compute-exclusive-process mode -- only one context per device, usable from multiple threads at a time + + // Keep this last + NVML_COMPUTEMODE_COUNT +} nvmlComputeMode_t; + +/** + * Max Clock Monitors available + */ +#define MAX_CLK_DOMAINS 32 + +/** + * Clock Monitor error types + */ +typedef struct nvmlClkMonFaultInfo_struct { + /** + * The Domain which faulted + */ + unsigned int clkApiDomain; + + /** + * Faults Information + */ + unsigned int clkDomainFaultMask; +} nvmlClkMonFaultInfo_t; + +/** + * Clock Monitor Status + */ +typedef struct nvmlClkMonStatus_status { + /** + * Fault status Indicator + */ + unsigned int bGlobalStatus; + + /** + * Total faulted domain numbers + */ + unsigned int clkMonListSize; + + /** + * The fault Information structure + */ + nvmlClkMonFaultInfo_t clkMonList[MAX_CLK_DOMAINS]; +} nvmlClkMonStatus_t; + +/** + * ECC bit types. + * + * @deprecated See \ref nvmlMemoryErrorType_t for a more flexible type + */ +#define nvmlEccBitType_t nvmlMemoryErrorType_t + +/** + * Single bit ECC errors + * + * @deprecated Mapped to \ref NVML_MEMORY_ERROR_TYPE_CORRECTED + */ +#define NVML_SINGLE_BIT_ECC NVML_MEMORY_ERROR_TYPE_CORRECTED + +/** + * Double bit ECC errors + * + * @deprecated Mapped to \ref NVML_MEMORY_ERROR_TYPE_UNCORRECTED + */ +#define NVML_DOUBLE_BIT_ECC NVML_MEMORY_ERROR_TYPE_UNCORRECTED + +/** + * Memory error types + */ +typedef enum nvmlMemoryErrorType_enum +{ + /** + * A memory error that was corrected + * + * For ECC errors, these are single bit errors + * For Texture memory, these are errors fixed by resend + */ + NVML_MEMORY_ERROR_TYPE_CORRECTED = 0, + /** + * A memory error that was not corrected + * + * For ECC errors, these are double bit errors + * For Texture memory, these are errors where the resend fails + */ + NVML_MEMORY_ERROR_TYPE_UNCORRECTED = 1, + + + // Keep this last + NVML_MEMORY_ERROR_TYPE_COUNT //!< Count of memory error types + +} nvmlMemoryErrorType_t; + +/** + * ECC counter types. + * + * Note: Volatile counts are reset each time the driver loads. On Windows this is once per boot. On Linux this can be more frequent. + * On Linux the driver unloads when no active clients exist. If persistence mode is enabled or there is always a driver + * client active (e.g. X11), then Linux also sees per-boot behavior. If not, volatile counts are reset each time a compute app + * is run. + */ +typedef enum nvmlEccCounterType_enum +{ + NVML_VOLATILE_ECC = 0, //!< Volatile counts are reset each time the driver loads. + NVML_AGGREGATE_ECC = 1, //!< Aggregate counts persist across reboots (i.e. for the lifetime of the device) + + // Keep this last + NVML_ECC_COUNTER_TYPE_COUNT //!< Count of memory counter types +} nvmlEccCounterType_t; + +/** + * Clock types. + * + * All speeds are in Mhz. + */ +typedef enum nvmlClockType_enum +{ + NVML_CLOCK_GRAPHICS = 0, //!< Graphics clock domain + NVML_CLOCK_SM = 1, //!< SM clock domain + NVML_CLOCK_MEM = 2, //!< Memory clock domain + NVML_CLOCK_VIDEO = 3, //!< Video encoder/decoder clock domain + + // Keep this last + NVML_CLOCK_COUNT //!< Count of clock types +} nvmlClockType_t; + +/** + * Clock Ids. These are used in combination with nvmlClockType_t + * to specify a single clock value. + */ +typedef enum nvmlClockId_enum +{ + NVML_CLOCK_ID_CURRENT = 0, //!< Current actual clock value + NVML_CLOCK_ID_APP_CLOCK_TARGET = 1, //!< Target application clock + NVML_CLOCK_ID_APP_CLOCK_DEFAULT = 2, //!< Default application clock target + NVML_CLOCK_ID_CUSTOMER_BOOST_MAX = 3, //!< OEM-defined maximum clock rate + + //Keep this last + NVML_CLOCK_ID_COUNT //!< Count of Clock Ids. +} nvmlClockId_t; + +/** + * Driver models. + * + * Windows only. + */ + +typedef enum nvmlDriverModel_enum +{ + NVML_DRIVER_WDDM = 0, //!< WDDM driver model -- GPU treated as a display device + NVML_DRIVER_WDM = 1 //!< WDM (TCC) model (recommended) -- GPU treated as a generic device +} nvmlDriverModel_t; + +#define NVML_MAX_GPU_PERF_PSTATES 16 + +/** + * Allowed PStates. + */ +typedef enum nvmlPStates_enum +{ + NVML_PSTATE_0 = 0, //!< Performance state 0 -- Maximum Performance + NVML_PSTATE_1 = 1, //!< Performance state 1 + NVML_PSTATE_2 = 2, //!< Performance state 2 + NVML_PSTATE_3 = 3, //!< Performance state 3 + NVML_PSTATE_4 = 4, //!< Performance state 4 + NVML_PSTATE_5 = 5, //!< Performance state 5 + NVML_PSTATE_6 = 6, //!< Performance state 6 + NVML_PSTATE_7 = 7, //!< Performance state 7 + NVML_PSTATE_8 = 8, //!< Performance state 8 + NVML_PSTATE_9 = 9, //!< Performance state 9 + NVML_PSTATE_10 = 10, //!< Performance state 10 + NVML_PSTATE_11 = 11, //!< Performance state 11 + NVML_PSTATE_12 = 12, //!< Performance state 12 + NVML_PSTATE_13 = 13, //!< Performance state 13 + NVML_PSTATE_14 = 14, //!< Performance state 14 + NVML_PSTATE_15 = 15, //!< Performance state 15 -- Minimum Performance + NVML_PSTATE_UNKNOWN = 32 //!< Unknown performance state +} nvmlPstates_t; + +/** + * GPU Operation Mode + * + * GOM allows to reduce power usage and optimize GPU throughput by disabling GPU features. + * + * Each GOM is designed to meet specific user needs. + */ +typedef enum nvmlGom_enum +{ + NVML_GOM_ALL_ON = 0, //!< Everything is enabled and running at full speed + + NVML_GOM_COMPUTE = 1, //!< Designed for running only compute tasks. Graphics operations + //!< are not allowed + + NVML_GOM_LOW_DP = 2 //!< Designed for running graphics applications that don't require + //!< high bandwidth double precision +} nvmlGpuOperationMode_t; + +/** + * Available infoROM objects. + */ +typedef enum nvmlInforomObject_enum +{ + NVML_INFOROM_OEM = 0, //!< An object defined by OEM + NVML_INFOROM_ECC = 1, //!< The ECC object determining the level of ECC support + NVML_INFOROM_POWER = 2, //!< The power management object + + // Keep this last + NVML_INFOROM_COUNT //!< This counts the number of infoROM objects the driver knows about +} nvmlInforomObject_t; + +/** + * Return values for NVML API calls. + */ +typedef enum nvmlReturn_enum +{ + // cppcheck-suppress * + NVML_SUCCESS = 0, //!< The operation was successful + NVML_ERROR_UNINITIALIZED = 1, //!< NVML was not first initialized with nvmlInit() + NVML_ERROR_INVALID_ARGUMENT = 2, //!< A supplied argument is invalid + NVML_ERROR_NOT_SUPPORTED = 3, //!< The requested operation is not available on target device + NVML_ERROR_NO_PERMISSION = 4, //!< The current user does not have permission for operation + NVML_ERROR_ALREADY_INITIALIZED = 5, //!< Deprecated: Multiple initializations are now allowed through ref counting + NVML_ERROR_NOT_FOUND = 6, //!< A query to find an object was unsuccessful + NVML_ERROR_INSUFFICIENT_SIZE = 7, //!< An input argument is not large enough + NVML_ERROR_INSUFFICIENT_POWER = 8, //!< A device's external power cables are not properly attached + NVML_ERROR_DRIVER_NOT_LOADED = 9, //!< NVIDIA driver is not loaded + NVML_ERROR_TIMEOUT = 10, //!< User provided timeout passed + NVML_ERROR_IRQ_ISSUE = 11, //!< NVIDIA Kernel detected an interrupt issue with a GPU + NVML_ERROR_LIBRARY_NOT_FOUND = 12, //!< NVML Shared Library couldn't be found or loaded + NVML_ERROR_FUNCTION_NOT_FOUND = 13, //!< Local version of NVML doesn't implement this function + NVML_ERROR_CORRUPTED_INFOROM = 14, //!< infoROM is corrupted + NVML_ERROR_GPU_IS_LOST = 15, //!< The GPU has fallen off the bus or has otherwise become inaccessible + NVML_ERROR_RESET_REQUIRED = 16, //!< The GPU requires a reset before it can be used again + NVML_ERROR_OPERATING_SYSTEM = 17, //!< The GPU control device has been blocked by the operating system/cgroups + NVML_ERROR_LIB_RM_VERSION_MISMATCH = 18, //!< RM detects a driver/library version mismatch + NVML_ERROR_IN_USE = 19, //!< An operation cannot be performed because the GPU is currently in use + NVML_ERROR_MEMORY = 20, //!< Insufficient memory + NVML_ERROR_NO_DATA = 21, //!< No data + NVML_ERROR_VGPU_ECC_NOT_SUPPORTED = 22, //!< The requested vgpu operation is not available on target device, becasue ECC is enabled + NVML_ERROR_INSUFFICIENT_RESOURCES = 23, //!< Ran out of critical resources, other than memory + NVML_ERROR_FREQ_NOT_SUPPORTED = 24, //!< Ran out of critical resources, other than memory + NVML_ERROR_ARGUMENT_VERSION_MISMATCH = 25, //!< The provided version is invalid/unsupported + NVML_ERROR_DEPRECATED = 26, //!< The requested functionality has been deprecated + NVML_ERROR_UNKNOWN = 999 //!< An internal driver error occurred +} nvmlReturn_t; + +/** + * See \ref nvmlDeviceGetMemoryErrorCounter + */ +typedef enum nvmlMemoryLocation_enum +{ + NVML_MEMORY_LOCATION_L1_CACHE = 0, //!< GPU L1 Cache + NVML_MEMORY_LOCATION_L2_CACHE = 1, //!< GPU L2 Cache + NVML_MEMORY_LOCATION_DRAM = 2, //!< Turing+ DRAM + NVML_MEMORY_LOCATION_DEVICE_MEMORY = 2, //!< GPU Device Memory + NVML_MEMORY_LOCATION_REGISTER_FILE = 3, //!< GPU Register File + NVML_MEMORY_LOCATION_TEXTURE_MEMORY = 4, //!< GPU Texture Memory + NVML_MEMORY_LOCATION_TEXTURE_SHM = 5, //!< Shared memory + NVML_MEMORY_LOCATION_CBU = 6, //!< CBU + NVML_MEMORY_LOCATION_SRAM = 7, //!< Turing+ SRAM + // Keep this last + NVML_MEMORY_LOCATION_COUNT //!< This counts the number of memory locations the driver knows about +} nvmlMemoryLocation_t; + +/** + * Causes for page retirement + */ +typedef enum nvmlPageRetirementCause_enum +{ + NVML_PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS = 0, //!< Page was retired due to multiple single bit ECC error + NVML_PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR = 1, //!< Page was retired due to double bit ECC error + + // Keep this last + NVML_PAGE_RETIREMENT_CAUSE_COUNT +} nvmlPageRetirementCause_t; + +/** + * API types that allow changes to default permission restrictions + */ +typedef enum nvmlRestrictedAPI_enum +{ + NVML_RESTRICTED_API_SET_APPLICATION_CLOCKS = 0, //!< APIs that change application clocks, see nvmlDeviceSetApplicationsClocks + //!< and see nvmlDeviceResetApplicationsClocks + NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS = 1, //!< APIs that enable/disable Auto Boosted clocks + //!< see nvmlDeviceSetAutoBoostedClocksEnabled + // Keep this last + NVML_RESTRICTED_API_COUNT +} nvmlRestrictedAPI_t; + +/** @} */ + +/***************************************************************************************************/ +/** @addtogroup virtualGPU + * @{ + */ +/***************************************************************************************************/ +/** @defgroup nvmlVirtualGpuEnums vGPU Enums + * @{ + */ +/***************************************************************************************************/ + +/*! + * GPU virtualization mode types. + */ +typedef enum nvmlGpuVirtualizationMode { + NVML_GPU_VIRTUALIZATION_MODE_NONE = 0, //!< Represents Bare Metal GPU + NVML_GPU_VIRTUALIZATION_MODE_PASSTHROUGH = 1, //!< Device is associated with GPU-Passthorugh + NVML_GPU_VIRTUALIZATION_MODE_VGPU = 2, //!< Device is associated with vGPU inside virtual machine. + NVML_GPU_VIRTUALIZATION_MODE_HOST_VGPU = 3, //!< Device is associated with VGX hypervisor in vGPU mode + NVML_GPU_VIRTUALIZATION_MODE_HOST_VSGA = 4 //!< Device is associated with VGX hypervisor in vSGA mode +} nvmlGpuVirtualizationMode_t; + +/** + * Host vGPU modes + */ +typedef enum nvmlHostVgpuMode_enum +{ + NVML_HOST_VGPU_MODE_NON_SRIOV = 0, //!< Non SR-IOV mode + NVML_HOST_VGPU_MODE_SRIOV = 1 //!< SR-IOV mode +} nvmlHostVgpuMode_t; + +/*! + * Types of VM identifiers + */ +typedef enum nvmlVgpuVmIdType { + NVML_VGPU_VM_ID_DOMAIN_ID = 0, //!< VM ID represents DOMAIN ID + NVML_VGPU_VM_ID_UUID = 1 //!< VM ID represents UUID +} nvmlVgpuVmIdType_t; + +/** + * vGPU GUEST info state + */ +typedef enum nvmlVgpuGuestInfoState_enum +{ + NVML_VGPU_INSTANCE_GUEST_INFO_STATE_UNINITIALIZED = 0, //!< Guest-dependent fields uninitialized + NVML_VGPU_INSTANCE_GUEST_INFO_STATE_INITIALIZED = 1 //!< Guest-dependent fields initialized +} nvmlVgpuGuestInfoState_t; + +/** + * vGPU software licensable features + */ +typedef enum { + NVML_GRID_LICENSE_FEATURE_CODE_UNKNOWN = 0, //!< Unknown + NVML_GRID_LICENSE_FEATURE_CODE_VGPU = 1, //!< Virtual GPU + NVML_GRID_LICENSE_FEATURE_CODE_NVIDIA_RTX = 2, //!< Nvidia RTX + NVML_GRID_LICENSE_FEATURE_CODE_VWORKSTATION = NVML_GRID_LICENSE_FEATURE_CODE_NVIDIA_RTX, //!< Deprecated, do not use. + NVML_GRID_LICENSE_FEATURE_CODE_GAMING = 3, //!< Gaming + NVML_GRID_LICENSE_FEATURE_CODE_COMPUTE = 4 //!< Compute +} nvmlGridLicenseFeatureCode_t; + +/** + * Status codes for license expiry + */ +#define NVML_GRID_LICENSE_EXPIRY_NOT_AVAILABLE 0 //!< Expiry information not available +#define NVML_GRID_LICENSE_EXPIRY_INVALID 1 //!< Invalid expiry or error fetching expiry +#define NVML_GRID_LICENSE_EXPIRY_VALID 2 //!< Valid expiry +#define NVML_GRID_LICENSE_EXPIRY_NOT_APPLICABLE 3 //!< Expiry not applicable +#define NVML_GRID_LICENSE_EXPIRY_PERMANENT 4 //!< Permanent expiry + +/** + * vGPU queryable capabilities + */ +typedef enum nvmlVgpuCapability_enum +{ + NVML_VGPU_CAP_NVLINK_P2P = 0, //!< P2P over NVLink is supported + NVML_VGPU_CAP_GPUDIRECT = 1, //!< GPUDirect capability is supported + NVML_VGPU_CAP_MULTI_VGPU_EXCLUSIVE = 2, //!< vGPU profile cannot be mixed with other vGPU profiles in same VM + NVML_VGPU_CAP_EXCLUSIVE_TYPE = 3, //!< vGPU profile cannot run on a GPU alongside other profiles of different type + NVML_VGPU_CAP_EXCLUSIVE_SIZE = 4, //!< vGPU profile cannot run on a GPU alongside other profiles of different size + // Keep this last + NVML_VGPU_CAP_COUNT +} nvmlVgpuCapability_t; + + +/** +* vGPU driver queryable capabilities +*/ +typedef enum nvmlVgpuDriverCapability_enum +{ + NVML_VGPU_DRIVER_CAP_HETEROGENEOUS_MULTI_VGPU = 0, //!< Supports mixing of different vGPU profiles within one guest VM + // Keep this last + NVML_VGPU_DRIVER_CAP_COUNT +} nvmlVgpuDriverCapability_t; + + +/** +* Device vGPU queryable capabilities +*/ +typedef enum nvmlDeviceVgpuCapability_enum +{ + NVML_DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU = 0, //!< Fractional vGPU profiles on this GPU can be used in multi-vGPU configurations + NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES = 1, //!< Supports concurrent execution of timesliced vGPU profiles of differing types + NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES = 2, //!< Supports concurrent execution of timesliced vGPU profiles of differing framebuffer sizes + // Keep this last + NVML_DEVICE_VGPU_CAP_COUNT +} nvmlDeviceVgpuCapability_t; + +/** @} */ + +/***************************************************************************************************/ + +/** @defgroup nvmlVgpuConstants vGPU Constants + * @{ + */ +/***************************************************************************************************/ + +/** + * Buffer size guaranteed to be large enough for \ref nvmlVgpuTypeGetLicense + */ +#define NVML_GRID_LICENSE_BUFFER_SIZE 128 + +#define NVML_VGPU_NAME_BUFFER_SIZE 64 + +#define NVML_GRID_LICENSE_FEATURE_MAX_COUNT 3 + +#define INVALID_GPU_INSTANCE_PROFILE_ID 0xFFFFFFFF + +#define INVALID_GPU_INSTANCE_ID 0xFFFFFFFF + +/*! + * Macros for vGPU instance's virtualization capabilities bitfield. + */ +#define NVML_VGPU_VIRTUALIZATION_CAP_MIGRATION 0:0 +#define NVML_VGPU_VIRTUALIZATION_CAP_MIGRATION_NO 0x0 +#define NVML_VGPU_VIRTUALIZATION_CAP_MIGRATION_YES 0x1 + +/*! + * Macros for pGPU's virtualization capabilities bitfield. + */ +#define NVML_VGPU_PGPU_VIRTUALIZATION_CAP_MIGRATION 0:0 +#define NVML_VGPU_PGPU_VIRTUALIZATION_CAP_MIGRATION_NO 0x0 +#define NVML_VGPU_PGPU_VIRTUALIZATION_CAP_MIGRATION_YES 0x1 + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlVgpuStructs vGPU Structs + * @{ + */ +/***************************************************************************************************/ + +typedef unsigned int nvmlVgpuTypeId_t; + +typedef unsigned int nvmlVgpuInstance_t; + +/** + * Structure to store Utilization Value and vgpuInstance + */ +typedef struct nvmlVgpuInstanceUtilizationSample_st +{ + nvmlVgpuInstance_t vgpuInstance; //!< vGPU Instance + unsigned long long timeStamp; //!< CPU Timestamp in microseconds + nvmlValue_t smUtil; //!< SM (3D/Compute) Util Value + nvmlValue_t memUtil; //!< Frame Buffer Memory Util Value + nvmlValue_t encUtil; //!< Encoder Util Value + nvmlValue_t decUtil; //!< Decoder Util Value +} nvmlVgpuInstanceUtilizationSample_t; + +/** + * Structure to store Utilization Value, vgpuInstance and subprocess information + */ +typedef struct nvmlVgpuProcessUtilizationSample_st +{ + nvmlVgpuInstance_t vgpuInstance; //!< vGPU Instance + unsigned int pid; //!< PID of process running within the vGPU VM + char processName[NVML_VGPU_NAME_BUFFER_SIZE]; //!< Name of process running within the vGPU VM + unsigned long long timeStamp; //!< CPU Timestamp in microseconds + unsigned int smUtil; //!< SM (3D/Compute) Util Value + unsigned int memUtil; //!< Frame Buffer Memory Util Value + unsigned int encUtil; //!< Encoder Util Value + unsigned int decUtil; //!< Decoder Util Value +} nvmlVgpuProcessUtilizationSample_t; + +/** + * vGPU scheduler policies + */ +#define NVML_VGPU_SCHEDULER_POLICY_UNKNOWN 0 +#define NVML_VGPU_SCHEDULER_POLICY_BEST_EFFORT 1 +#define NVML_VGPU_SCHEDULER_POLICY_EQUAL_SHARE 2 +#define NVML_VGPU_SCHEDULER_POLICY_FIXED_SHARE 3 + +#define NVML_SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT 3 + +#define NVML_SCHEDULER_SW_MAX_LOG_ENTRIES 200 + +typedef struct { + unsigned int avgFactor; + unsigned int timeslice; +} nvmlVgpuSchedulerParamsVgpuSchedDataWithARR_t; + +typedef struct { + unsigned int timeslice; +} nvmlVgpuSchedulerParamsVgpuSchedData_t; + +/** + * Union to represent the vGPU Scheduler Parameters + */ +typedef union +{ + nvmlVgpuSchedulerParamsVgpuSchedDataWithARR_t vgpuSchedDataWithARR; + + nvmlVgpuSchedulerParamsVgpuSchedData_t vgpuSchedData; + +} nvmlVgpuSchedulerParams_t; + +/** + * Structure to store the state and logs of a software runlist + */ +typedef struct nvmlVgpuSchedulerLogEntries_st +{ + unsigned long long timestamp; //!< Timestamp in ns when this software runlist was preeempted + unsigned long long timeRunTotal; //!< Total time in ns this software runlist has run + unsigned long long timeRun; //!< Time in ns this software runlist ran before preemption + unsigned int swRunlistId; //!< Software runlist Id + unsigned long long targetTimeSlice; //!< The actual timeslice after deduction + unsigned long long cumulativePreemptionTime; //!< Preemption time in ns for this SW runlist +} nvmlVgpuSchedulerLogEntry_t; + +/** + * Structure to store a vGPU software scheduler log + */ +typedef struct nvmlVgpuSchedulerLog_st +{ + unsigned int engineId; //!< Engine whose software runlist log entries are fetched + unsigned int schedulerPolicy; //!< Scheduler policy + unsigned int isEnabledARR; //!< Flag to check Adaptive Round Robin scheduler mode + nvmlVgpuSchedulerParams_t schedulerParams; + unsigned int entriesCount; //!< Count of log entries fetched + nvmlVgpuSchedulerLogEntry_t logEntries[NVML_SCHEDULER_SW_MAX_LOG_ENTRIES]; +} nvmlVgpuSchedulerLog_t; + +/** + * Structure to store the vGPU scheduler state + */ +typedef struct nvmlVgpuSchedulerGetState_st +{ + unsigned int schedulerPolicy; //!< Scheduler policy + unsigned int isEnabledARR; //!< Flag to check Adaptive Round Robin scheduler mode + nvmlVgpuSchedulerParams_t schedulerParams; +} nvmlVgpuSchedulerGetState_t; + +typedef struct { + unsigned int avgFactor; + unsigned int frequency; +} nvmlVgpuSchedulerSetParamsVgpuSchedDataWithARR_t; + +typedef struct { + unsigned int timeslice; +} nvmlVgpuSchedulerSetParamsVgpuSchedData_t; + +/** + * Union to represent the vGPU Scheduler set Parameters + */ +typedef union +{ + nvmlVgpuSchedulerSetParamsVgpuSchedDataWithARR_t vgpuSchedDataWithARR; + + nvmlVgpuSchedulerSetParamsVgpuSchedData_t vgpuSchedData; + +} nvmlVgpuSchedulerSetParams_t; + +/** + * Structure to set the vGPU scheduler state + */ +typedef struct nvmlVgpuSchedulerSetState_st +{ + unsigned int schedulerPolicy; //!< Scheduler policy + unsigned int enableARRMode; //!< Flag to enable/disable Adaptive Round Robin scheduler + nvmlVgpuSchedulerSetParams_t schedulerParams; +} nvmlVgpuSchedulerSetState_t; + +/** + * Structure to store the vGPU scheduler capabilities + */ +typedef struct nvmlVgpuSchedulerCapabilities_st +{ + unsigned int supportedSchedulers[NVML_SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT]; //!< List the supported vGPU schedulers on the device + unsigned int maxTimeslice; //!< Maximum timeslice value in ns + unsigned int minTimeslice; //!< Minimum timeslice value in ns + unsigned int isArrModeSupported; //!< Flag to check Adaptive Round Robin mode enabled/disabled. + unsigned int maxFrequencyForARR; //!< Maximum frequency for Adaptive Round Robin mode + unsigned int minFrequencyForARR; //!< Minimum frequency for Adaptive Round Robin mode + unsigned int maxAvgFactorForARR; //!< Maximum averaging factor for Adaptive Round Robin mode + unsigned int minAvgFactorForARR; //!< Minimum averaging factor for Adaptive Round Robin mode +} nvmlVgpuSchedulerCapabilities_t; + +/** + * Structure to store the vGPU license expiry details + */ +typedef struct nvmlVgpuLicenseExpiry_st +{ + unsigned int year; //!< Year of license expiry + unsigned short month; //!< Month of license expiry + unsigned short day; //!< Day of license expiry + unsigned short hour; //!< Hour of license expiry + unsigned short min; //!< Minutes of license expiry + unsigned short sec; //!< Seconds of license expiry + unsigned char status; //!< License expiry status +} nvmlVgpuLicenseExpiry_t; + +/** + * vGPU license state + */ +#define NVML_GRID_LICENSE_STATE_UNKNOWN 0 //!< Unknown state +#define NVML_GRID_LICENSE_STATE_UNINITIALIZED 1 //!< Uninitialized state +#define NVML_GRID_LICENSE_STATE_UNLICENSED_UNRESTRICTED 2 //!< Unlicensed unrestricted state +#define NVML_GRID_LICENSE_STATE_UNLICENSED_RESTRICTED 3 //!< Unlicensed restricted state +#define NVML_GRID_LICENSE_STATE_UNLICENSED 4 //!< Unlicensed state +#define NVML_GRID_LICENSE_STATE_LICENSED 5 //!< Licensed state + +typedef struct nvmlVgpuLicenseInfo_st +{ + unsigned char isLicensed; //!< License status + nvmlVgpuLicenseExpiry_t licenseExpiry; //!< License expiry information + unsigned int currentState; //!< Current license state +} nvmlVgpuLicenseInfo_t; + +/** + * Structure to store utilization value and process Id + */ +typedef struct nvmlProcessUtilizationSample_st +{ + unsigned int pid; //!< PID of process + unsigned long long timeStamp; //!< CPU Timestamp in microseconds + unsigned int smUtil; //!< SM (3D/Compute) Util Value + unsigned int memUtil; //!< Frame Buffer Memory Util Value + unsigned int encUtil; //!< Encoder Util Value + unsigned int decUtil; //!< Decoder Util Value +} nvmlProcessUtilizationSample_t; + +/** + * Structure to store license expiry date and time values + */ +typedef struct nvmlGridLicenseExpiry_st +{ + unsigned int year; //!< Year value of license expiry + unsigned short month; //!< Month value of license expiry + unsigned short day; //!< Day value of license expiry + unsigned short hour; //!< Hour value of license expiry + unsigned short min; //!< Minutes value of license expiry + unsigned short sec; //!< Seconds value of license expiry + unsigned char status; //!< License expiry status +} nvmlGridLicenseExpiry_t; + +/** + * Structure containing vGPU software licensable feature information + */ +typedef struct nvmlGridLicensableFeature_st +{ + nvmlGridLicenseFeatureCode_t featureCode; //!< Licensed feature code + unsigned int featureState; //!< Non-zero if feature is currently licensed, otherwise zero + char licenseInfo[NVML_GRID_LICENSE_BUFFER_SIZE]; //!< Deprecated. + char productName[NVML_GRID_LICENSE_BUFFER_SIZE]; //!< Product name of feature + unsigned int featureEnabled; //!< Non-zero if feature is enabled, otherwise zero + nvmlGridLicenseExpiry_t licenseExpiry; //!< License expiry structure containing date and time +} nvmlGridLicensableFeature_t; + +/** + * Structure to store vGPU software licensable features + */ +typedef struct nvmlGridLicensableFeatures_st +{ + int isGridLicenseSupported; //!< Non-zero if vGPU Software Licensing is supported on the system, otherwise zero + unsigned int licensableFeaturesCount; //!< Entries returned in \a gridLicensableFeatures array + nvmlGridLicensableFeature_t gridLicensableFeatures[NVML_GRID_LICENSE_FEATURE_MAX_COUNT]; //!< Array of vGPU software licensable features. +} nvmlGridLicensableFeatures_t; + +/** + * GSP firmware + */ +#define NVML_GSP_FIRMWARE_VERSION_BUF_SIZE 0x40 + +/** + * Simplified chip architecture + */ +#define NVML_DEVICE_ARCH_KEPLER 2 // Devices based on the NVIDIA Kepler architecture +#define NVML_DEVICE_ARCH_MAXWELL 3 // Devices based on the NVIDIA Maxwell architecture +#define NVML_DEVICE_ARCH_PASCAL 4 // Devices based on the NVIDIA Pascal architecture +#define NVML_DEVICE_ARCH_VOLTA 5 // Devices based on the NVIDIA Volta architecture +#define NVML_DEVICE_ARCH_TURING 6 // Devices based on the NVIDIA Turing architecture + +#define NVML_DEVICE_ARCH_AMPERE 7 // Devices based on the NVIDIA Ampere architecture + +#define NVML_DEVICE_ARCH_ADA 8 // Devices based on the NVIDIA Ada architecture + +#define NVML_DEVICE_ARCH_HOPPER 9 // Devices based on the NVIDIA Hopper architecture + +#define NVML_DEVICE_ARCH_UNKNOWN 0xffffffff // Anything else, presumably something newer + +typedef unsigned int nvmlDeviceArchitecture_t; + +/** + * PCI bus types + */ +#define NVML_BUS_TYPE_UNKNOWN 0 +#define NVML_BUS_TYPE_PCI 1 +#define NVML_BUS_TYPE_PCIE 2 +#define NVML_BUS_TYPE_FPCI 3 +#define NVML_BUS_TYPE_AGP 4 + +typedef unsigned int nvmlBusType_t; + +/** + * Device Power Modes + */ + +/** + * Device Fan control policy + */ +#define NVML_FAN_POLICY_TEMPERATURE_CONTINOUS_SW 0 +#define NVML_FAN_POLICY_MANUAL 1 + +typedef unsigned int nvmlFanControlPolicy_t; + +/** + * Device Power Source + */ +#define NVML_POWER_SOURCE_AC 0x00000000 +#define NVML_POWER_SOURCE_BATTERY 0x00000001 + +typedef unsigned int nvmlPowerSource_t; + +/* + * Device PCIE link Max Speed + */ +#define NVML_PCIE_LINK_MAX_SPEED_INVALID 0x00000000 +#define NVML_PCIE_LINK_MAX_SPEED_2500MBPS 0x00000001 +#define NVML_PCIE_LINK_MAX_SPEED_5000MBPS 0x00000002 +#define NVML_PCIE_LINK_MAX_SPEED_8000MBPS 0x00000003 +#define NVML_PCIE_LINK_MAX_SPEED_16000MBPS 0x00000004 +#define NVML_PCIE_LINK_MAX_SPEED_32000MBPS 0x00000005 +#define NVML_PCIE_LINK_MAX_SPEED_64000MBPS 0x00000006 + +/* + * Adaptive clocking status + */ +#define NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED 0x00000000 +#define NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED 0x00000001 + +#define NVML_MAX_GPU_UTILIZATIONS 8 +typedef enum nvmlGpuUtilizationDomainId_t +{ + NVML_GPU_UTILIZATION_DOMAIN_GPU = 0, //!< Graphics engine domain + NVML_GPU_UTILIZATION_DOMAIN_FB = 1, //!< Frame buffer domain + NVML_GPU_UTILIZATION_DOMAIN_VID = 2, //!< Video engine domain + NVML_GPU_UTILIZATION_DOMAIN_BUS = 3, //!< Bus interface domain +} nvmlGpuUtilizationDomainId_t; + +typedef struct { + unsigned int bIsPresent; + unsigned int percentage; + unsigned int incThreshold; + unsigned int decThreshold; +} nvmlGpuDynamicPstatesInfoUtilization_t; + +typedef struct nvmlGpuDynamicPstatesInfo_st +{ + unsigned int flags; //!< Reserved for future use + nvmlGpuDynamicPstatesInfoUtilization_t utilization[NVML_MAX_GPU_UTILIZATIONS]; +} nvmlGpuDynamicPstatesInfo_t; + +/** @} */ +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlFieldValueEnums Field Value Enums + * @{ + */ +/***************************************************************************************************/ + +/** + * Field Identifiers. + * + * All Identifiers pertain to a device. Each ID is only used once and is guaranteed never to change. + */ +#define NVML_FI_DEV_ECC_CURRENT 1 //!< Current ECC mode. 1=Active. 0=Inactive +#define NVML_FI_DEV_ECC_PENDING 2 //!< Pending ECC mode. 1=Active. 0=Inactive +/* ECC Count Totals */ +#define NVML_FI_DEV_ECC_SBE_VOL_TOTAL 3 //!< Total single bit volatile ECC errors +#define NVML_FI_DEV_ECC_DBE_VOL_TOTAL 4 //!< Total double bit volatile ECC errors +#define NVML_FI_DEV_ECC_SBE_AGG_TOTAL 5 //!< Total single bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_DBE_AGG_TOTAL 6 //!< Total double bit aggregate (persistent) ECC errors +/* Individual ECC locations */ +#define NVML_FI_DEV_ECC_SBE_VOL_L1 7 //!< L1 cache single bit volatile ECC errors +#define NVML_FI_DEV_ECC_DBE_VOL_L1 8 //!< L1 cache double bit volatile ECC errors +#define NVML_FI_DEV_ECC_SBE_VOL_L2 9 //!< L2 cache single bit volatile ECC errors +#define NVML_FI_DEV_ECC_DBE_VOL_L2 10 //!< L2 cache double bit volatile ECC errors +#define NVML_FI_DEV_ECC_SBE_VOL_DEV 11 //!< Device memory single bit volatile ECC errors +#define NVML_FI_DEV_ECC_DBE_VOL_DEV 12 //!< Device memory double bit volatile ECC errors +#define NVML_FI_DEV_ECC_SBE_VOL_REG 13 //!< Register file single bit volatile ECC errors +#define NVML_FI_DEV_ECC_DBE_VOL_REG 14 //!< Register file double bit volatile ECC errors +#define NVML_FI_DEV_ECC_SBE_VOL_TEX 15 //!< Texture memory single bit volatile ECC errors +#define NVML_FI_DEV_ECC_DBE_VOL_TEX 16 //!< Texture memory double bit volatile ECC errors +#define NVML_FI_DEV_ECC_DBE_VOL_CBU 17 //!< CBU double bit volatile ECC errors +#define NVML_FI_DEV_ECC_SBE_AGG_L1 18 //!< L1 cache single bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_DBE_AGG_L1 19 //!< L1 cache double bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_SBE_AGG_L2 20 //!< L2 cache single bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_DBE_AGG_L2 21 //!< L2 cache double bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_SBE_AGG_DEV 22 //!< Device memory single bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_DBE_AGG_DEV 23 //!< Device memory double bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_SBE_AGG_REG 24 //!< Register File single bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_DBE_AGG_REG 25 //!< Register File double bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_SBE_AGG_TEX 26 //!< Texture memory single bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_DBE_AGG_TEX 27 //!< Texture memory double bit aggregate (persistent) ECC errors +#define NVML_FI_DEV_ECC_DBE_AGG_CBU 28 //!< CBU double bit aggregate ECC errors + +/* Page Retirement */ +#define NVML_FI_DEV_RETIRED_SBE 29 //!< Number of retired pages because of single bit errors +#define NVML_FI_DEV_RETIRED_DBE 30 //!< Number of retired pages because of double bit errors +#define NVML_FI_DEV_RETIRED_PENDING 31 //!< If any pages are pending retirement. 1=yes. 0=no. + +/* NvLink Flit Error Counters */ +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L0 32 //!< NVLink flow control CRC Error Counter for Lane 0 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L1 33 //!< NVLink flow control CRC Error Counter for Lane 1 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L2 34 //!< NVLink flow control CRC Error Counter for Lane 2 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L3 35 //!< NVLink flow control CRC Error Counter for Lane 3 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L4 36 //!< NVLink flow control CRC Error Counter for Lane 4 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L5 37 //!< NVLink flow control CRC Error Counter for Lane 5 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_TOTAL 38 //!< NVLink flow control CRC Error Counter total for all Lanes + +/* NvLink CRC Data Error Counters */ +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L0 39 //!< NVLink data CRC Error Counter for Lane 0 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L1 40 //!< NVLink data CRC Error Counter for Lane 1 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L2 41 //!< NVLink data CRC Error Counter for Lane 2 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L3 42 //!< NVLink data CRC Error Counter for Lane 3 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L4 43 //!< NVLink data CRC Error Counter for Lane 4 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L5 44 //!< NVLink data CRC Error Counter for Lane 5 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_TOTAL 45 //!< NvLink data CRC Error Counter total for all Lanes + +/* NvLink Replay Error Counters */ +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L0 46 //!< NVLink Replay Error Counter for Lane 0 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L1 47 //!< NVLink Replay Error Counter for Lane 1 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L2 48 //!< NVLink Replay Error Counter for Lane 2 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L3 49 //!< NVLink Replay Error Counter for Lane 3 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L4 50 //!< NVLink Replay Error Counter for Lane 4 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L5 51 //!< NVLink Replay Error Counter for Lane 5 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_TOTAL 52 //!< NVLink Replay Error Counter total for all Lanes + +/* NvLink Recovery Error Counters */ +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L0 53 //!< NVLink Recovery Error Counter for Lane 0 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L1 54 //!< NVLink Recovery Error Counter for Lane 1 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L2 55 //!< NVLink Recovery Error Counter for Lane 2 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L3 56 //!< NVLink Recovery Error Counter for Lane 3 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L4 57 //!< NVLink Recovery Error Counter for Lane 4 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L5 58 //!< NVLink Recovery Error Counter for Lane 5 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_TOTAL 59 //!< NVLink Recovery Error Counter total for all Lanes + +/* NvLink Bandwidth Counters */ +/* + * NVML_FI_DEV_NVLINK_BANDWIDTH_* field values are now deprecated. + * Please use the following field values instead: + * NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_TX + * NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_RX + * NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_TX + * NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_RX + */ +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L0 60 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 0 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L1 61 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 1 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L2 62 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 2 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L3 63 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 3 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L4 64 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 4 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L5 65 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 5 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_TOTAL 66 //!< NVLink Bandwidth Counter Total for Counter Set 0, All Lanes + +/* NvLink Bandwidth Counters */ +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L0 67 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 0 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L1 68 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 1 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L2 69 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 2 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L3 70 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 3 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L4 71 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 4 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L5 72 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 5 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_TOTAL 73 //!< NVLink Bandwidth Counter Total for Counter Set 1, All Lanes + +/* NVML Perf Policy Counters */ +#define NVML_FI_DEV_PERF_POLICY_POWER 74 //!< Perf Policy Counter for Power Policy +#define NVML_FI_DEV_PERF_POLICY_THERMAL 75 //!< Perf Policy Counter for Thermal Policy +#define NVML_FI_DEV_PERF_POLICY_SYNC_BOOST 76 //!< Perf Policy Counter for Sync boost Policy +#define NVML_FI_DEV_PERF_POLICY_BOARD_LIMIT 77 //!< Perf Policy Counter for Board Limit +#define NVML_FI_DEV_PERF_POLICY_LOW_UTILIZATION 78 //!< Perf Policy Counter for Low GPU Utilization Policy +#define NVML_FI_DEV_PERF_POLICY_RELIABILITY 79 //!< Perf Policy Counter for Reliability Policy +#define NVML_FI_DEV_PERF_POLICY_TOTAL_APP_CLOCKS 80 //!< Perf Policy Counter for Total App Clock Policy +#define NVML_FI_DEV_PERF_POLICY_TOTAL_BASE_CLOCKS 81 //!< Perf Policy Counter for Total Base Clocks Policy + +/* Memory temperatures */ +#define NVML_FI_DEV_MEMORY_TEMP 82 //!< Memory temperature for the device + +/* Energy Counter */ +#define NVML_FI_DEV_TOTAL_ENERGY_CONSUMPTION 83 //!< Total energy consumption for the GPU in mJ since the driver was last reloaded + +/* NVLink Speed */ +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L0 84 //!< NVLink Speed in MBps for Link 0 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L1 85 //!< NVLink Speed in MBps for Link 1 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L2 86 //!< NVLink Speed in MBps for Link 2 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L3 87 //!< NVLink Speed in MBps for Link 3 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L4 88 //!< NVLink Speed in MBps for Link 4 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L5 89 //!< NVLink Speed in MBps for Link 5 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_COMMON 90 //!< Common NVLink Speed in MBps for active links + +#define NVML_FI_DEV_NVLINK_LINK_COUNT 91 //!< Number of NVLinks present on the device + +#define NVML_FI_DEV_RETIRED_PENDING_SBE 92 //!< If any pages are pending retirement due to SBE. 1=yes. 0=no. +#define NVML_FI_DEV_RETIRED_PENDING_DBE 93 //!< If any pages are pending retirement due to DBE. 1=yes. 0=no. + +#define NVML_FI_DEV_PCIE_REPLAY_COUNTER 94 //!< PCIe replay counter +#define NVML_FI_DEV_PCIE_REPLAY_ROLLOVER_COUNTER 95 //!< PCIe replay rollover counter + +/* NvLink Flit Error Counters */ +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L6 96 //!< NVLink flow control CRC Error Counter for Lane 6 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L7 97 //!< NVLink flow control CRC Error Counter for Lane 7 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L8 98 //!< NVLink flow control CRC Error Counter for Lane 8 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L9 99 //!< NVLink flow control CRC Error Counter for Lane 9 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L10 100 //!< NVLink flow control CRC Error Counter for Lane 10 +#define NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L11 101 //!< NVLink flow control CRC Error Counter for Lane 11 + +/* NvLink CRC Data Error Counters */ +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L6 102 //!< NVLink data CRC Error Counter for Lane 6 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L7 103 //!< NVLink data CRC Error Counter for Lane 7 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L8 104 //!< NVLink data CRC Error Counter for Lane 8 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L9 105 //!< NVLink data CRC Error Counter for Lane 9 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L10 106 //!< NVLink data CRC Error Counter for Lane 10 +#define NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L11 107 //!< NVLink data CRC Error Counter for Lane 11 + +/* NvLink Replay Error Counters */ +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L6 108 //!< NVLink Replay Error Counter for Lane 6 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L7 109 //!< NVLink Replay Error Counter for Lane 7 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L8 110 //!< NVLink Replay Error Counter for Lane 8 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L9 111 //!< NVLink Replay Error Counter for Lane 9 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L10 112 //!< NVLink Replay Error Counter for Lane 10 +#define NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L11 113 //!< NVLink Replay Error Counter for Lane 11 + +/* NvLink Recovery Error Counters */ +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L6 114 //!< NVLink Recovery Error Counter for Lane 6 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L7 115 //!< NVLink Recovery Error Counter for Lane 7 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L8 116 //!< NVLink Recovery Error Counter for Lane 8 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L9 117 //!< NVLink Recovery Error Counter for Lane 9 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L10 118 //!< NVLink Recovery Error Counter for Lane 10 +#define NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L11 119 //!< NVLink Recovery Error Counter for Lane 11 + +/* NvLink Bandwidth Counters */ +/* + * NVML_FI_DEV_NVLINK_BANDWIDTH_* field values are now deprecated. + * Please use the following field values instead: + * NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_TX + * NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_RX + * NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_TX + * NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_RX + */ +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L6 120 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 6 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L7 121 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 7 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L8 122 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 8 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L9 123 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 9 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L10 124 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 10 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L11 125 //!< NVLink Bandwidth Counter for Counter Set 0, Lane 11 + +/* NvLink Bandwidth Counters */ +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L6 126 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 6 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L7 127 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 7 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L8 128 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 8 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L9 129 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 9 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L10 130 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 10 +#define NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L11 131 //!< NVLink Bandwidth Counter for Counter Set 1, Lane 11 + +/* NVLink Speed */ +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L6 132 //!< NVLink Speed in MBps for Link 6 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L7 133 //!< NVLink Speed in MBps for Link 7 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L8 134 //!< NVLink Speed in MBps for Link 8 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L9 135 //!< NVLink Speed in MBps for Link 9 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L10 136 //!< NVLink Speed in MBps for Link 10 +#define NVML_FI_DEV_NVLINK_SPEED_MBPS_L11 137 //!< NVLink Speed in MBps for Link 11 + +/** + * NVLink throughput counters field values + * + * Link ID needs to be specified in the scopeId field in nvmlFieldValue_t. + * A scopeId of UINT_MAX returns aggregate value summed up across all links + * for the specified counter type in fieldId. + */ +#define NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_TX 138 //!< NVLink TX Data throughput in KiB +#define NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_RX 139 //!< NVLink RX Data throughput in KiB +#define NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_TX 140 //!< NVLink TX Data + protocol overhead in KiB +#define NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_RX 141 //!< NVLink RX Data + protocol overhead in KiB + +/* Row Remapper */ +#define NVML_FI_DEV_REMAPPED_COR 142 //!< Number of remapped rows due to correctable errors +#define NVML_FI_DEV_REMAPPED_UNC 143 //!< Number of remapped rows due to uncorrectable errors +#define NVML_FI_DEV_REMAPPED_PENDING 144 //!< If any rows are pending remapping. 1=yes 0=no +#define NVML_FI_DEV_REMAPPED_FAILURE 145 //!< If any rows failed to be remapped 1=yes 0=no + +/** + * Remote device NVLink ID + * + * Link ID needs to be specified in the scopeId field in nvmlFieldValue_t. + */ +#define NVML_FI_DEV_NVLINK_REMOTE_NVLINK_ID 146 //!< Remote device NVLink ID + +/** + * NVSwitch: connected NVLink count + */ +#define NVML_FI_DEV_NVSWITCH_CONNECTED_LINK_COUNT 147 //!< Number of NVLinks connected to NVSwitch + +/* NvLink ECC Data Error Counters + * + * Lane ID needs to be specified in the scopeId field in nvmlFieldValue_t. + * + */ +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L0 148 //!< NVLink data ECC Error Counter for Link 0 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L1 149 //!< NVLink data ECC Error Counter for Link 1 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L2 150 //!< NVLink data ECC Error Counter for Link 2 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L3 151 //!< NVLink data ECC Error Counter for Link 3 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L4 152 //!< NVLink data ECC Error Counter for Link 4 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L5 153 //!< NVLink data ECC Error Counter for Link 5 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L6 154 //!< NVLink data ECC Error Counter for Link 6 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L7 155 //!< NVLink data ECC Error Counter for Link 7 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L8 156 //!< NVLink data ECC Error Counter for Link 8 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L9 157 //!< NVLink data ECC Error Counter for Link 9 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L10 158 //!< NVLink data ECC Error Counter for Link 10 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L11 159 //!< NVLink data ECC Error Counter for Link 11 +#define NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_TOTAL 160 //!< NvLink data ECC Error Counter total for all Links + +#define NVML_FI_DEV_NVLINK_ERROR_DL_REPLAY 161 +#define NVML_FI_DEV_NVLINK_ERROR_DL_RECOVERY 162 +#define NVML_FI_DEV_NVLINK_ERROR_DL_CRC 163 +#define NVML_FI_DEV_NVLINK_GET_SPEED 164 +#define NVML_FI_DEV_NVLINK_GET_STATE 165 +#define NVML_FI_DEV_NVLINK_GET_VERSION 166 + +#define NVML_FI_DEV_NVLINK_GET_POWER_STATE 167 +#define NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD 168 + +#define NVML_FI_DEV_PCIE_L0_TO_RECOVERY_COUNTER 169 + +#define NVML_FI_MAX 170 //!< One greater than the largest field ID defined above + +/** + * Information for a Field Value Sample + */ +typedef struct nvmlFieldValue_st +{ + unsigned int fieldId; //!< ID of the NVML field to retrieve. This must be set before any call that uses this struct. See the constants starting with NVML_FI_ above. + unsigned int scopeId; //!< Scope ID can represent data used by NVML depending on fieldId's context. For example, for NVLink throughput counter data, scopeId can represent linkId. + long long timestamp; //!< CPU Timestamp of this value in microseconds since 1970 + long long latencyUsec; //!< How long this field value took to update (in usec) within NVML. This may be averaged across several fields that are serviced by the same driver call. + nvmlValueType_t valueType; //!< Type of the value stored in value + nvmlReturn_t nvmlReturn; //!< Return code for retrieving this value. This must be checked before looking at value, as value is undefined if nvmlReturn != NVML_SUCCESS + nvmlValue_t value; //!< Value for this field. This is only valid if nvmlReturn == NVML_SUCCESS +} nvmlFieldValue_t; + + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlUnitStructs Unit Structs + * @{ + */ +/***************************************************************************************************/ + +typedef struct +{ + struct nvmlUnit_st* handle; +} nvmlUnit_t; + +/** + * Description of HWBC entry + */ +typedef struct nvmlHwbcEntry_st +{ + unsigned int hwbcId; + char firmwareVersion[32]; +} nvmlHwbcEntry_t; + +/** + * Fan state enum. + */ +typedef enum nvmlFanState_enum +{ + NVML_FAN_NORMAL = 0, //!< Fan is working properly + NVML_FAN_FAILED = 1 //!< Fan has failed +} nvmlFanState_t; + +/** + * Led color enum. + */ +typedef enum nvmlLedColor_enum +{ + NVML_LED_COLOR_GREEN = 0, //!< GREEN, indicates good health + NVML_LED_COLOR_AMBER = 1 //!< AMBER, indicates problem +} nvmlLedColor_t; + + +/** + * LED states for an S-class unit. + */ +typedef struct nvmlLedState_st +{ + char cause[256]; //!< If amber, a text description of the cause + nvmlLedColor_t color; //!< GREEN or AMBER +} nvmlLedState_t; + +/** + * Static S-class unit info. + */ +typedef struct nvmlUnitInfo_st +{ + char name[96]; //!< Product name + char id[96]; //!< Product identifier + char serial[96]; //!< Product serial number + char firmwareVersion[96]; //!< Firmware version +} nvmlUnitInfo_t; + +/** + * Power usage information for an S-class unit. + * The power supply state is a human readable string that equals "Normal" or contains + * a combination of "Abnormal" plus one or more of the following: + * + * - High voltage + * - Fan failure + * - Heatsink temperature + * - Current limit + * - Voltage below UV alarm threshold + * - Low-voltage + * - SI2C remote off command + * - MOD_DISABLE input + * - Short pin transition +*/ +typedef struct nvmlPSUInfo_st +{ + char state[256]; //!< The power supply state + unsigned int current; //!< PSU current (A) + unsigned int voltage; //!< PSU voltage (V) + unsigned int power; //!< PSU power draw (W) +} nvmlPSUInfo_t; + +/** + * Fan speed reading for a single fan in an S-class unit. + */ +typedef struct nvmlUnitFanInfo_st +{ + unsigned int speed; //!< Fan speed (RPM) + nvmlFanState_t state; //!< Flag that indicates whether fan is working properly +} nvmlUnitFanInfo_t; + +/** + * Fan speed readings for an entire S-class unit. + */ +typedef struct nvmlUnitFanSpeeds_st +{ + nvmlUnitFanInfo_t fans[24]; //!< Fan speed data for each fan + unsigned int count; //!< Number of fans in unit +} nvmlUnitFanSpeeds_t; + +/** @} */ + +/***************************************************************************************************/ +/** @addtogroup nvmlEvents + * @{ + */ +/***************************************************************************************************/ + +/** + * Handle to an event set + */ +typedef struct +{ + struct nvmlEventSet_st* handle; +} nvmlEventSet_t; + +/** @defgroup nvmlEventType Event Types + * @{ + * Event Types which user can be notified about. + * See description of particular functions for details. + * + * See \ref nvmlDeviceRegisterEvents and \ref nvmlDeviceGetSupportedEventTypes to check which devices + * support each event. + * + * Types can be combined with bitwise or operator '|' when passed to \ref nvmlDeviceRegisterEvents + */ +//! Event about single bit ECC errors +/** + * \note A corrected texture memory error is not an ECC error, so it does not generate a single bit event + */ +#define nvmlEventTypeSingleBitEccError 0x0000000000000001LL + +//! Event about double bit ECC errors +/** + * \note An uncorrected texture memory error is not an ECC error, so it does not generate a double bit event + */ +#define nvmlEventTypeDoubleBitEccError 0x0000000000000002LL + +//! Event about PState changes +/** + * \note On Fermi architecture PState changes are also an indicator that GPU is throttling down due to + * no work being executed on the GPU, power capping or thermal capping. In a typical situation, + * Fermi-based GPU should stay in P0 for the duration of the execution of the compute process. + */ +#define nvmlEventTypePState 0x0000000000000004LL + +//! Event that Xid critical error occurred +#define nvmlEventTypeXidCriticalError 0x0000000000000008LL + +//! Event about clock changes +/** + * Kepler only + */ +#define nvmlEventTypeClock 0x0000000000000010LL + +//! Event about AC/Battery power source changes +#define nvmlEventTypePowerSourceChange 0x0000000000000080LL + +//! Event about MIG configuration changes +#define nvmlEventMigConfigChange 0x0000000000000100LL + +//! Mask with no events +#define nvmlEventTypeNone 0x0000000000000000LL + +//! Mask of all events +#define nvmlEventTypeAll (nvmlEventTypeNone \ + | nvmlEventTypeSingleBitEccError \ + | nvmlEventTypeDoubleBitEccError \ + | nvmlEventTypePState \ + | nvmlEventTypeClock \ + | nvmlEventTypeXidCriticalError \ + | nvmlEventTypePowerSourceChange \ + | nvmlEventMigConfigChange \ + ) +/** @} */ + +/** + * Information about occurred event + */ +typedef struct nvmlEventData_st +{ + nvmlDevice_t device; //!< Specific device where the event occurred + unsigned long long eventType; //!< Information about what specific event occurred + unsigned long long eventData; //!< Stores XID error for the device in the event of nvmlEventTypeXidCriticalError, + // eventData is 0 for any other event. eventData is set as 999 for unknown xid error. + unsigned int gpuInstanceId; //!< If MIG is enabled and nvmlEventTypeXidCriticalError event is attributable to a GPU + // instance, stores a valid GPU instance ID. gpuInstanceId is set to 0xFFFFFFFF + // otherwise. + unsigned int computeInstanceId; //!< If MIG is enabled and nvmlEventTypeXidCriticalError event is attributable to a + // compute instance, stores a valid compute instance ID. computeInstanceId is set to + // 0xFFFFFFFF otherwise. +} nvmlEventData_t; + +/** @} */ + +/***************************************************************************************************/ +/** @addtogroup nvmlClocksThrottleReasons + * @{ + */ +/***************************************************************************************************/ + +/** Nothing is running on the GPU and the clocks are dropping to Idle state + * \note This limiter may be removed in a later release + */ +#define nvmlClocksThrottleReasonGpuIdle 0x0000000000000001LL + +/** GPU clocks are limited by current setting of applications clocks + * + * @see nvmlDeviceSetApplicationsClocks + * @see nvmlDeviceGetApplicationsClock + */ +#define nvmlClocksThrottleReasonApplicationsClocksSetting 0x0000000000000002LL + +/** + * @deprecated Renamed to \ref nvmlClocksThrottleReasonApplicationsClocksSetting + * as the name describes the situation more accurately. + */ +#define nvmlClocksThrottleReasonUserDefinedClocks nvmlClocksThrottleReasonApplicationsClocksSetting + +/** SW Power Scaling algorithm is reducing the clocks below requested clocks + * + * @see nvmlDeviceGetPowerUsage + * @see nvmlDeviceSetPowerManagementLimit + * @see nvmlDeviceGetPowerManagementLimit + */ +#define nvmlClocksThrottleReasonSwPowerCap 0x0000000000000004LL + +/** HW Slowdown (reducing the core clocks by a factor of 2 or more) is engaged + * + * This is an indicator of: + * - temperature being too high + * - External Power Brake Assertion is triggered (e.g. by the system power supply) + * - Power draw is too high and Fast Trigger protection is reducing the clocks + * - May be also reported during PState or clock change + * - This behavior may be removed in a later release. + * + * @see nvmlDeviceGetTemperature + * @see nvmlDeviceGetTemperatureThreshold + * @see nvmlDeviceGetPowerUsage + */ +#define nvmlClocksThrottleReasonHwSlowdown 0x0000000000000008LL + +/** Sync Boost + * + * This GPU has been added to a Sync boost group with nvidia-smi or DCGM in + * order to maximize performance per watt. All GPUs in the sync boost group + * will boost to the minimum possible clocks across the entire group. Look at + * the throttle reasons for other GPUs in the system to see why those GPUs are + * holding this one at lower clocks. + * + */ +#define nvmlClocksThrottleReasonSyncBoost 0x0000000000000010LL + +/** SW Thermal Slowdown + * + * This is an indicator of one or more of the following: + * - Current GPU temperature above the GPU Max Operating Temperature + * - Current memory temperature above the Memory Max Operating Temperature + * + */ +#define nvmlClocksThrottleReasonSwThermalSlowdown 0x0000000000000020LL + +/** HW Thermal Slowdown (reducing the core clocks by a factor of 2 or more) is engaged + * + * This is an indicator of: + * - temperature being too high + * + * @see nvmlDeviceGetTemperature + * @see nvmlDeviceGetTemperatureThreshold + * @see nvmlDeviceGetPowerUsage + */ +#define nvmlClocksThrottleReasonHwThermalSlowdown 0x0000000000000040LL + +/** HW Power Brake Slowdown (reducing the core clocks by a factor of 2 or more) is engaged + * + * This is an indicator of: + * - External Power Brake Assertion being triggered (e.g. by the system power supply) + * + * @see nvmlDeviceGetTemperature + * @see nvmlDeviceGetTemperatureThreshold + * @see nvmlDeviceGetPowerUsage + */ +#define nvmlClocksThrottleReasonHwPowerBrakeSlowdown 0x0000000000000080LL + +/** GPU clocks are limited by current setting of Display clocks + * + * @see bug 1997531 + */ +#define nvmlClocksThrottleReasonDisplayClockSetting 0x0000000000000100LL + +/** Bit mask representing no clocks throttling + * + * Clocks are as high as possible. + * */ +#define nvmlClocksThrottleReasonNone 0x0000000000000000LL + +/** Bit mask representing all supported clocks throttling reasons + * New reasons might be added to this list in the future + */ +#define nvmlClocksThrottleReasonAll (nvmlClocksThrottleReasonNone \ + | nvmlClocksThrottleReasonGpuIdle \ + | nvmlClocksThrottleReasonApplicationsClocksSetting \ + | nvmlClocksThrottleReasonSwPowerCap \ + | nvmlClocksThrottleReasonHwSlowdown \ + | nvmlClocksThrottleReasonSyncBoost \ + | nvmlClocksThrottleReasonSwThermalSlowdown \ + | nvmlClocksThrottleReasonHwThermalSlowdown \ + | nvmlClocksThrottleReasonHwPowerBrakeSlowdown \ + | nvmlClocksThrottleReasonDisplayClockSetting \ +) +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlAccountingStats Accounting Statistics + * @{ + * + * Set of APIs designed to provide per process information about usage of GPU. + * + * @note All accounting statistics and accounting mode live in nvidia driver and reset + * to default (Disabled) when driver unloads. + * It is advised to run with persistence mode enabled. + * + * @note Enabling accounting mode has no negative impact on the GPU performance. + */ +/***************************************************************************************************/ + +/** + * Describes accounting statistics of a process. + */ +typedef struct nvmlAccountingStats_st { + unsigned int gpuUtilization; //!< Percent of time over the process's lifetime during which one or more kernels was executing on the GPU. + //! Utilization stats just like returned by \ref nvmlDeviceGetUtilizationRates but for the life time of a + //! process (not just the last sample period). + //! Set to NVML_VALUE_NOT_AVAILABLE if nvmlDeviceGetUtilizationRates is not supported + + unsigned int memoryUtilization; //!< Percent of time over the process's lifetime during which global (device) memory was being read or written. + //! Set to NVML_VALUE_NOT_AVAILABLE if nvmlDeviceGetUtilizationRates is not supported + + unsigned long long maxMemoryUsage; //!< Maximum total memory in bytes that was ever allocated by the process. + //! Set to NVML_VALUE_NOT_AVAILABLE if nvmlProcessInfo_t->usedGpuMemory is not supported + + + unsigned long long time; //!< Amount of time in ms during which the compute context was active. The time is reported as 0 if + //!< the process is not terminated + + unsigned long long startTime; //!< CPU Timestamp in usec representing start time for the process + + unsigned int isRunning; //!< Flag to represent if the process is running (1 for running, 0 for terminated) + + unsigned int reserved[5]; //!< Reserved for future use +} nvmlAccountingStats_t; + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlEncoderStructs Encoder Structs + * @{ + */ +/***************************************************************************************************/ + +/** + * Represents type of encoder for capacity can be queried + */ +typedef enum nvmlEncoderQueryType_enum +{ + NVML_ENCODER_QUERY_H264 = 0, //!< H264 encoder + NVML_ENCODER_QUERY_HEVC = 1 //!< HEVC encoder +}nvmlEncoderType_t; + +/** + * Structure to hold encoder session data + */ +typedef struct nvmlEncoderSessionInfo_st +{ + unsigned int sessionId; //!< Unique session ID + unsigned int pid; //!< Owning process ID + nvmlVgpuInstance_t vgpuInstance; //!< Owning vGPU instance ID (only valid on vGPU hosts, otherwise zero) + nvmlEncoderType_t codecType; //!< Video encoder type + unsigned int hResolution; //!< Current encode horizontal resolution + unsigned int vResolution; //!< Current encode vertical resolution + unsigned int averageFps; //!< Moving average encode frames per second + unsigned int averageLatency; //!< Moving average encode latency in microseconds +}nvmlEncoderSessionInfo_t; + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlFBCStructs Frame Buffer Capture Structures +* @{ +*/ +/***************************************************************************************************/ + +/** + * Represents frame buffer capture session type + */ +typedef enum nvmlFBCSessionType_enum +{ + NVML_FBC_SESSION_TYPE_UNKNOWN = 0, //!< Unknwon + NVML_FBC_SESSION_TYPE_TOSYS, //!< ToSys + NVML_FBC_SESSION_TYPE_CUDA, //!< Cuda + NVML_FBC_SESSION_TYPE_VID, //!< Vid + NVML_FBC_SESSION_TYPE_HWENC //!< HEnc +} nvmlFBCSessionType_t; + +/** + * Structure to hold frame buffer capture sessions stats + */ +typedef struct nvmlFBCStats_st +{ + unsigned int sessionsCount; //!< Total no of sessions + unsigned int averageFPS; //!< Moving average new frames captured per second + unsigned int averageLatency; //!< Moving average new frame capture latency in microseconds +} nvmlFBCStats_t; + +#define NVML_NVFBC_SESSION_FLAG_DIFFMAP_ENABLED 0x00000001 //!< Bit specifying differential map state. +#define NVML_NVFBC_SESSION_FLAG_CLASSIFICATIONMAP_ENABLED 0x00000002 //!< Bit specifying classification map state. +#define NVML_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_NO_WAIT 0x00000004 //!< Bit specifying if capture was requested as non-blocking call. +#define NVML_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_INFINITE 0x00000008 //!< Bit specifying if capture was requested as blocking call. +#define NVML_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_TIMEOUT 0x00000010 //!< Bit specifying if capture was requested as blocking call with timeout period. + +/** + * Structure to hold FBC session data + */ +typedef struct nvmlFBCSessionInfo_st +{ + unsigned int sessionId; //!< Unique session ID + unsigned int pid; //!< Owning process ID + nvmlVgpuInstance_t vgpuInstance; //!< Owning vGPU instance ID (only valid on vGPU hosts, otherwise zero) + unsigned int displayOrdinal; //!< Display identifier + nvmlFBCSessionType_t sessionType; //!< Type of frame buffer capture session + unsigned int sessionFlags; //!< Session flags (one or more of NVML_NVFBC_SESSION_FLAG_XXX). + unsigned int hMaxResolution; //!< Max horizontal resolution supported by the capture session + unsigned int vMaxResolution; //!< Max vertical resolution supported by the capture session + unsigned int hResolution; //!< Horizontal resolution requested by caller in capture call + unsigned int vResolution; //!< Vertical resolution requested by caller in capture call + unsigned int averageFPS; //!< Moving average new frames captured per second + unsigned int averageLatency; //!< Moving average new frame capture latency in microseconds +} nvmlFBCSessionInfo_t; + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlDrainDefs definitions related to the drain state + * @{ + */ +/***************************************************************************************************/ + +/** + * Is the GPU device to be removed from the kernel by nvmlDeviceRemoveGpu() + */ +typedef enum nvmlDetachGpuState_enum +{ + NVML_DETACH_GPU_KEEP = 0, + NVML_DETACH_GPU_REMOVE +} nvmlDetachGpuState_t; + +/** + * Parent bridge PCIe link state requested by nvmlDeviceRemoveGpu() + */ +typedef enum nvmlPcieLinkState_enum +{ + NVML_PCIE_LINK_KEEP = 0, + NVML_PCIE_LINK_SHUT_DOWN +} nvmlPcieLinkState_t; + +/** @} */ + +#define NVML_GPU_FABRIC_UUID_LEN 16 + +#define NVML_GPU_FABRIC_STATE_NOT_SUPPORTED 0 +#define NVML_GPU_FABRIC_STATE_NOT_STARTED 1 +#define NVML_GPU_FABRIC_STATE_IN_PROGRESS 2 +#define NVML_GPU_FABRIC_STATE_COMPLETED 3 + +typedef unsigned char nvmlGpuFabricState_t; + +typedef struct { + char clusterUuid[NVML_GPU_FABRIC_UUID_LEN]; //!< Uuid of the cluster to which this GPU belongs + nvmlReturn_t status; //!< Error status, if any. Must be checked only if state returns "complete". + unsigned int partitionId; //!< ID of the fabric partition to which this GPU belongs + nvmlGpuFabricState_t state; //!< Current state of GPU registration process +} nvmlGpuFabricInfo_t; +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlInitializationAndCleanup Initialization and Cleanup + * This chapter describes the methods that handle NVML initialization and cleanup. + * It is the user's responsibility to call \ref nvmlInit_v2() before calling any other methods, and + * nvmlShutdown() once NVML is no longer being used. + * @{ + */ +/***************************************************************************************************/ + +#define NVML_INIT_FLAG_NO_GPUS 1 //!< Don't fail nvmlInit() when no GPUs are found +#define NVML_INIT_FLAG_NO_ATTACH 2 //!< Don't attach GPUs + +/** + * Initialize NVML, but don't initialize any GPUs yet. + * + * \note nvmlInit_v3 introduces a "flags" argument, that allows passing boolean values + * modifying the behaviour of nvmlInit(). + * \note In NVML 5.319 new nvmlInit_v2 has replaced nvmlInit"_v1" (default in NVML 4.304 and older) that + * did initialize all GPU devices in the system. + * + * This allows NVML to communicate with a GPU + * when other GPUs in the system are unstable or in a bad state. When using this API, GPUs are + * discovered and initialized in nvmlDeviceGetHandleBy* functions instead. + * + * \note To contrast nvmlInit_v2 with nvmlInit"_v1", NVML 4.304 nvmlInit"_v1" will fail when any detected GPU is in + * a bad or unstable state. + * + * For all products. + * + * This method, should be called once before invoking any other methods in the library. + * A reference count of the number of initializations is maintained. Shutdown only occurs + * when the reference count reaches zero. + * + * @return + * - \ref NVML_SUCCESS if NVML has been properly initialized + * - \ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running + * - \ref NVML_ERROR_NO_PERMISSION if NVML does not have permission to talk to the driver + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlInit_v2(void); + +/** + * nvmlInitWithFlags is a variant of nvmlInit(), that allows passing a set of boolean values + * modifying the behaviour of nvmlInit(). + * Other than the "flags" parameter it is completely similar to \ref nvmlInit_v2. + * + * For all products. + * + * @param flags behaviour modifier flags + * + * @return + * - \ref NVML_SUCCESS if NVML has been properly initialized + * - \ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running + * - \ref NVML_ERROR_NO_PERMISSION if NVML does not have permission to talk to the driver + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlInitWithFlags(unsigned int flags); + +/** + * Shut down NVML by releasing all GPU resources previously allocated with \ref nvmlInit_v2(). + * + * For all products. + * + * This method should be called after NVML work is done, once for each call to \ref nvmlInit_v2() + * A reference count of the number of initializations is maintained. Shutdown only occurs + * when the reference count reaches zero. For backwards compatibility, no error is reported if + * nvmlShutdown() is called more times than nvmlInit(). + * + * @return + * - \ref NVML_SUCCESS if NVML has been properly shut down + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlShutdown(void); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlErrorReporting Error reporting + * This chapter describes helper functions for error reporting routines. + * @{ + */ +/***************************************************************************************************/ + +/** + * Helper method for converting NVML error codes into readable strings. + * + * For all products. + * + * @param result NVML error code to convert + * + * @return String representation of the error. + * + */ +const DECLDIR char* nvmlErrorString(nvmlReturn_t result); +/** @} */ + + +/***************************************************************************************************/ +/** @defgroup nvmlConstants Constants + * @{ + */ +/***************************************************************************************************/ + +/** + * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetInforomVersion and \ref nvmlDeviceGetInforomImageVersion + */ +#define NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE 16 + +/** + * Buffer size guaranteed to be large enough for storing GPU identifiers. + */ +#define NVML_DEVICE_UUID_BUFFER_SIZE 80 + +/** + * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetUUID + */ +#define NVML_DEVICE_UUID_V2_BUFFER_SIZE 96 + +/** + * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetBoardPartNumber + */ +#define NVML_DEVICE_PART_NUMBER_BUFFER_SIZE 80 + +/** + * Buffer size guaranteed to be large enough for \ref nvmlSystemGetDriverVersion + */ +#define NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE 80 + +/** + * Buffer size guaranteed to be large enough for \ref nvmlSystemGetNVMLVersion + */ +#define NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE 80 + +/** + * Buffer size guaranteed to be large enough for storing GPU device names. + */ +#define NVML_DEVICE_NAME_BUFFER_SIZE 64 + +/** + * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetName + */ +#define NVML_DEVICE_NAME_V2_BUFFER_SIZE 96 + +/** + * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetSerial + */ +#define NVML_DEVICE_SERIAL_BUFFER_SIZE 30 + +/** + * Buffer size guaranteed to be large enough for \ref nvmlDeviceGetVbiosVersion + */ +#define NVML_DEVICE_VBIOS_VERSION_BUFFER_SIZE 32 + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlSystemQueries System Queries + * This chapter describes the queries that NVML can perform against the local system. These queries + * are not device-specific. + * @{ + */ +/***************************************************************************************************/ + +/** + * Retrieves the version of the system's graphics driver. + * + * For all products. + * + * The version identifier is an alphanumeric string. It will not exceed 80 characters in length + * (including the NULL terminator). See \ref nvmlConstants::NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE. + * + * @param version Reference in which to return the version identifier + * @param length The maximum allowed length of the string returned in \a version + * + * @return + * - \ref NVML_SUCCESS if \a version has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + */ +nvmlReturn_t DECLDIR nvmlSystemGetDriverVersion(char *version, unsigned int length); + +/** + * Retrieves the version of the NVML library. + * + * For all products. + * + * The version identifier is an alphanumeric string. It will not exceed 80 characters in length + * (including the NULL terminator). See \ref nvmlConstants::NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE. + * + * @param version Reference in which to return the version identifier + * @param length The maximum allowed length of the string returned in \a version + * + * @return + * - \ref NVML_SUCCESS if \a version has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + */ +nvmlReturn_t DECLDIR nvmlSystemGetNVMLVersion(char *version, unsigned int length); + +/** + * Retrieves the version of the CUDA driver. + * + * For all products. + * + * The CUDA driver version returned will be retreived from the currently installed version of CUDA. + * If the cuda library is not found, this function will return a known supported version number. + * + * @param cudaDriverVersion Reference in which to return the version identifier + * + * @return + * - \ref NVML_SUCCESS if \a cudaDriverVersion has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a cudaDriverVersion is NULL + */ +nvmlReturn_t DECLDIR nvmlSystemGetCudaDriverVersion(int *cudaDriverVersion); + +/** + * Retrieves the version of the CUDA driver from the shared library. + * + * For all products. + * + * The returned CUDA driver version by calling cuDriverGetVersion() + * + * @param cudaDriverVersion Reference in which to return the version identifier + * + * @return + * - \ref NVML_SUCCESS if \a cudaDriverVersion has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a cudaDriverVersion is NULL + * - \ref NVML_ERROR_LIBRARY_NOT_FOUND if \a libcuda.so.1 or libcuda.dll is not found + * - \ref NVML_ERROR_FUNCTION_NOT_FOUND if \a cuDriverGetVersion() is not found in the shared library + */ +nvmlReturn_t DECLDIR nvmlSystemGetCudaDriverVersion_v2(int *cudaDriverVersion); + +/** + * Macros for converting the CUDA driver version number to Major and Minor version numbers. + */ +#define NVML_CUDA_DRIVER_VERSION_MAJOR(v) ((v)/1000) +#define NVML_CUDA_DRIVER_VERSION_MINOR(v) (((v)%1000)/10) + +/** + * Gets name of the process with provided process id + * + * For all products. + * + * Returned process name is cropped to provided length. + * name string is encoded in ANSI. + * + * @param pid The identifier of the process + * @param name Reference in which to return the process name + * @param length The maximum allowed length of the string returned in \a name + * + * @return + * - \ref NVML_SUCCESS if \a name has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a name is NULL or \a length is 0. + * - \ref NVML_ERROR_NOT_FOUND if process doesn't exists + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlSystemGetProcessName(unsigned int pid, char *name, unsigned int length); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlUnitQueries Unit Queries + * This chapter describes that queries that NVML can perform against each unit. For S-class systems only. + * In each case the device is identified with an nvmlUnit_t handle. This handle is obtained by + * calling \ref nvmlUnitGetHandleByIndex(). + * @{ + */ +/***************************************************************************************************/ + + /** + * Retrieves the number of units in the system. + * + * For S-class products. + * + * @param unitCount Reference in which to return the number of units + * + * @return + * - \ref NVML_SUCCESS if \a unitCount has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unitCount is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlUnitGetCount(unsigned int *unitCount); + +/** + * Acquire the handle for a particular unit, based on its index. + * + * For S-class products. + * + * Valid indices are derived from the \a unitCount returned by \ref nvmlUnitGetCount(). + * For example, if \a unitCount is 2 the valid indices are 0 and 1, corresponding to UNIT 0 and UNIT 1. + * + * The order in which NVML enumerates units has no guarantees of consistency between reboots. + * + * @param index The index of the target unit, >= 0 and < \a unitCount + * @param unit Reference in which to return the unit handle + * + * @return + * - \ref NVML_SUCCESS if \a unit has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a index is invalid or \a unit is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlUnitGetHandleByIndex(unsigned int index, nvmlUnit_t *unit); + +/** + * Retrieves the static information associated with a unit. + * + * For S-class products. + * + * See \ref nvmlUnitInfo_t for details on available unit info. + * + * @param unit The identifier of the target unit + * @param info Reference in which to return the unit information + * + * @return + * - \ref NVML_SUCCESS if \a info has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a info is NULL + */ +nvmlReturn_t DECLDIR nvmlUnitGetUnitInfo(nvmlUnit_t unit, nvmlUnitInfo_t *info); + +/** + * Retrieves the LED state associated with this unit. + * + * For S-class products. + * + * See \ref nvmlLedState_t for details on allowed states. + * + * @param unit The identifier of the target unit + * @param state Reference in which to return the current LED state + * + * @return + * - \ref NVML_SUCCESS if \a state has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a state is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlUnitSetLedState() + */ +nvmlReturn_t DECLDIR nvmlUnitGetLedState(nvmlUnit_t unit, nvmlLedState_t *state); + +/** + * Retrieves the PSU stats for the unit. + * + * For S-class products. + * + * See \ref nvmlPSUInfo_t for details on available PSU info. + * + * @param unit The identifier of the target unit + * @param psu Reference in which to return the PSU information + * + * @return + * - \ref NVML_SUCCESS if \a psu has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a psu is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlUnitGetPsuInfo(nvmlUnit_t unit, nvmlPSUInfo_t *psu); + +/** + * Retrieves the temperature readings for the unit, in degrees C. + * + * For S-class products. + * + * Depending on the product, readings may be available for intake (type=0), + * exhaust (type=1) and board (type=2). + * + * @param unit The identifier of the target unit + * @param type The type of reading to take + * @param temp Reference in which to return the intake temperature + * + * @return + * - \ref NVML_SUCCESS if \a temp has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit or \a type is invalid or \a temp is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlUnitGetTemperature(nvmlUnit_t unit, unsigned int type, unsigned int *temp); + +/** + * Retrieves the fan speed readings for the unit. + * + * For S-class products. + * + * See \ref nvmlUnitFanSpeeds_t for details on available fan speed info. + * + * @param unit The identifier of the target unit + * @param fanSpeeds Reference in which to return the fan speed information + * + * @return + * - \ref NVML_SUCCESS if \a fanSpeeds has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid or \a fanSpeeds is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlUnitGetFanSpeedInfo(nvmlUnit_t unit, nvmlUnitFanSpeeds_t *fanSpeeds); + +/** + * Retrieves the set of GPU devices that are attached to the specified unit. + * + * For S-class products. + * + * The \a deviceCount argument is expected to be set to the size of the input \a devices array. + * + * @param unit The identifier of the target unit + * @param deviceCount Reference in which to provide the \a devices array size, and + * to return the number of attached GPU devices + * @param devices Reference in which to return the references to the attached GPU devices + * + * @return + * - \ref NVML_SUCCESS if \a deviceCount and \a devices have been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a deviceCount indicates that the \a devices array is too small + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit is invalid, either of \a deviceCount or \a devices is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlUnitGetDevices(nvmlUnit_t unit, unsigned int *deviceCount, nvmlDevice_t *devices); + +/** + * Retrieves the IDs and firmware versions for any Host Interface Cards (HICs) in the system. + * + * For S-class products. + * + * The \a hwbcCount argument is expected to be set to the size of the input \a hwbcEntries array. + * The HIC must be connected to an S-class system for it to be reported by this function. + * + * @param hwbcCount Size of hwbcEntries array + * @param hwbcEntries Array holding information about hwbc + * + * @return + * - \ref NVML_SUCCESS if \a hwbcCount and \a hwbcEntries have been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if either \a hwbcCount or \a hwbcEntries is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a hwbcCount indicates that the \a hwbcEntries array is too small + */ +nvmlReturn_t DECLDIR nvmlSystemGetHicVersion(unsigned int *hwbcCount, nvmlHwbcEntry_t *hwbcEntries); +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlDeviceQueries Device Queries + * This chapter describes that queries that NVML can perform against each device. + * In each case the device is identified with an nvmlDevice_t handle. This handle is obtained by + * calling one of \ref nvmlDeviceGetHandleByIndex_v2(), \ref nvmlDeviceGetHandleBySerial(), + * \ref nvmlDeviceGetHandleByPciBusId_v2(). or \ref nvmlDeviceGetHandleByUUID(). + * @{ + */ +/***************************************************************************************************/ + + /** + * Retrieves the number of compute devices in the system. A compute device is a single GPU. + * + * For all products. + * + * Note: New nvmlDeviceGetCount_v2 (default in NVML 5.319) returns count of all devices in the system + * even if nvmlDeviceGetHandleByIndex_v2 returns NVML_ERROR_NO_PERMISSION for such device. + * Update your code to handle this error, or use NVML 4.304 or older nvml header file. + * For backward binary compatibility reasons _v1 version of the API is still present in the shared + * library. + * Old _v1 version of nvmlDeviceGetCount doesn't count devices that NVML has no permission to talk to. + * + * @param deviceCount Reference in which to return the number of accessible devices + * + * @return + * - \ref NVML_SUCCESS if \a deviceCount has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a deviceCount is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetCount_v2(unsigned int *deviceCount); + +/** + * Get attributes (engine counts etc.) for the given NVML device handle. + * + * @note This API currently only supports MIG device handles. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device NVML device handle + * @param attributes Device attributes + * + * @return + * - \ref NVML_SUCCESS if \a device attributes were successfully retrieved + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device handle is invalid + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAttributes_v2(nvmlDevice_t device, nvmlDeviceAttributes_t *attributes); + +/** + * Acquire the handle for a particular device, based on its index. + * + * For all products. + * + * Valid indices are derived from the \a accessibleDevices count returned by + * \ref nvmlDeviceGetCount_v2(). For example, if \a accessibleDevices is 2 the valid indices + * are 0 and 1, corresponding to GPU 0 and GPU 1. + * + * The order in which NVML enumerates devices has no guarantees of consistency between reboots. For that reason it + * is recommended that devices be looked up by their PCI ids or UUID. See + * \ref nvmlDeviceGetHandleByUUID() and \ref nvmlDeviceGetHandleByPciBusId_v2(). + * + * Note: The NVML index may not correlate with other APIs, such as the CUDA device index. + * + * Starting from NVML 5, this API causes NVML to initialize the target GPU + * NVML may initialize additional GPUs if: + * - The target GPU is an SLI slave + * + * Note: New nvmlDeviceGetCount_v2 (default in NVML 5.319) returns count of all devices in the system + * even if nvmlDeviceGetHandleByIndex_v2 returns NVML_ERROR_NO_PERMISSION for such device. + * Update your code to handle this error, or use NVML 4.304 or older nvml header file. + * For backward binary compatibility reasons _v1 version of the API is still present in the shared + * library. + * Old _v1 version of nvmlDeviceGetCount doesn't count devices that NVML has no permission to talk to. + * + * This means that nvmlDeviceGetHandleByIndex_v2 and _v1 can return different devices for the same index. + * If you don't touch macros that map old (_v1) versions to _v2 versions at the top of the file you don't + * need to worry about that. + * + * @param index The index of the target GPU, >= 0 and < \a accessibleDevices + * @param device Reference in which to return the device handle + * + * @return + * - \ref NVML_SUCCESS if \a device has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a index is invalid or \a device is NULL + * - \ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to talk to this device + * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetIndex + * @see nvmlDeviceGetCount + */ +nvmlReturn_t DECLDIR nvmlDeviceGetHandleByIndex_v2(unsigned int index, nvmlDevice_t *device); + +/** + * Acquire the handle for a particular device, based on its board serial number. + * + * For Fermi &tm; or newer fully supported devices. + * + * This number corresponds to the value printed directly on the board, and to the value returned by + * \ref nvmlDeviceGetSerial(). + * + * @deprecated Since more than one GPU can exist on a single board this function is deprecated in favor + * of \ref nvmlDeviceGetHandleByUUID. + * For dual GPU boards this function will return NVML_ERROR_INVALID_ARGUMENT. + * + * Starting from NVML 5, this API causes NVML to initialize the target GPU + * NVML may initialize additional GPUs as it searches for the target GPU + * + * @param serial The board serial number of the target GPU + * @param device Reference in which to return the device handle + * + * @return + * - \ref NVML_SUCCESS if \a device has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a serial is invalid, \a device is NULL or more than one + * device has the same serial (dual GPU boards) + * - \ref NVML_ERROR_NOT_FOUND if \a serial does not match a valid device on the system + * - \ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables + * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs + * - \ref NVML_ERROR_GPU_IS_LOST if any GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetSerial + * @see nvmlDeviceGetHandleByUUID + */ +nvmlReturn_t DECLDIR nvmlDeviceGetHandleBySerial(const char *serial, nvmlDevice_t *device); + +/** + * Acquire the handle for a particular device, based on its globally unique immutable UUID associated with each device. + * + * For all products. + * + * @param uuid The UUID of the target GPU or MIG instance + * @param device Reference in which to return the device handle or MIG device handle + * + * Starting from NVML 5, this API causes NVML to initialize the target GPU + * NVML may initialize additional GPUs as it searches for the target GPU + * + * @return + * - \ref NVML_SUCCESS if \a device has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a uuid is invalid or \a device is null + * - \ref NVML_ERROR_NOT_FOUND if \a uuid does not match a valid device on the system + * - \ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables + * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs + * - \ref NVML_ERROR_GPU_IS_LOST if any GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetUUID + */ +nvmlReturn_t DECLDIR nvmlDeviceGetHandleByUUID(const char *uuid, nvmlDevice_t *device); + +/** + * Acquire the handle for a particular device, based on its PCI bus id. + * + * For all products. + * + * This value corresponds to the nvmlPciInfo_t::busId returned by \ref nvmlDeviceGetPciInfo_v3(). + * + * Starting from NVML 5, this API causes NVML to initialize the target GPU + * NVML may initialize additional GPUs if: + * - The target GPU is an SLI slave + * + * \note NVML 4.304 and older version of nvmlDeviceGetHandleByPciBusId"_v1" returns NVML_ERROR_NOT_FOUND + * instead of NVML_ERROR_NO_PERMISSION. + * + * @param pciBusId The PCI bus id of the target GPU + * @param device Reference in which to return the device handle + * + * @return + * - \ref NVML_SUCCESS if \a device has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pciBusId is invalid or \a device is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a pciBusId does not match a valid device on the system + * - \ref NVML_ERROR_INSUFFICIENT_POWER if the attached device has improperly attached external power cables + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to talk to this device + * - \ref NVML_ERROR_IRQ_ISSUE if NVIDIA kernel detected an interrupt issue with the attached GPUs + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetHandleByPciBusId_v2(const char *pciBusId, nvmlDevice_t *device); + +/** + * Retrieves the name of this device. + * + * For all products. + * + * The name is an alphanumeric string that denotes a particular product, e.g. Tesla &tm; C2070. It will not + * exceed 96 characters in length (including the NULL terminator). See \ref + * nvmlConstants::NVML_DEVICE_NAME_V2_BUFFER_SIZE. + * + * When used with MIG device handles the API returns MIG device names which can be used to identify devices + * based on their attributes. + * + * @param device The identifier of the target device + * @param name Reference in which to return the product name + * @param length The maximum allowed length of the string returned in \a name + * + * @return + * - \ref NVML_SUCCESS if \a name has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a name is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetName(nvmlDevice_t device, char *name, unsigned int length); + +/** + * Retrieves the brand of this device. + * + * For all products. + * + * The type is a member of \ref nvmlBrandType_t defined above. + * + * @param device The identifier of the target device + * @param type Reference in which to return the product brand type + * + * @return + * - \ref NVML_SUCCESS if \a name has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a type is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetBrand(nvmlDevice_t device, nvmlBrandType_t *type); + +/** + * Retrieves the NVML index of this device. + * + * For all products. + * + * Valid indices are derived from the \a accessibleDevices count returned by + * \ref nvmlDeviceGetCount_v2(). For example, if \a accessibleDevices is 2 the valid indices + * are 0 and 1, corresponding to GPU 0 and GPU 1. + * + * The order in which NVML enumerates devices has no guarantees of consistency between reboots. For that reason it + * is recommended that devices be looked up by their PCI ids or GPU UUID. See + * \ref nvmlDeviceGetHandleByPciBusId_v2() and \ref nvmlDeviceGetHandleByUUID(). + * + * When used with MIG device handles this API returns indices that can be + * passed to \ref nvmlDeviceGetMigDeviceHandleByIndex to retrieve an identical handle. + * MIG device indices are unique within a device. + * + * Note: The NVML index may not correlate with other APIs, such as the CUDA device index. + * + * @param device The identifier of the target device + * @param index Reference in which to return the NVML index of the device + * + * @return + * - \ref NVML_SUCCESS if \a index has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a index is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetHandleByIndex() + * @see nvmlDeviceGetCount() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetIndex(nvmlDevice_t device, unsigned int *index); + +/** + * Retrieves the globally unique board serial number associated with this device's board. + * + * For all products with an inforom. + * + * The serial number is an alphanumeric string that will not exceed 30 characters (including the NULL terminator). + * This number matches the serial number tag that is physically attached to the board. See \ref + * nvmlConstants::NVML_DEVICE_SERIAL_BUFFER_SIZE. + * + * @param device The identifier of the target device + * @param serial Reference in which to return the board/module serial number + * @param length The maximum allowed length of the string returned in \a serial + * + * @return + * - \ref NVML_SUCCESS if \a serial has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a serial is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSerial(nvmlDevice_t device, char *serial, unsigned int length); + + +/***************************************************************************************************/ + +/** @defgroup nvmlAffinity CPU and Memory Affinity + * This chapter describes NVML operations that are associated with CPU and memory + * affinity. + * @{ + */ +/***************************************************************************************************/ + +//! Scope of NUMA node for affinity queries +#define NVML_AFFINITY_SCOPE_NODE 0 +//! Scope of processor socket for affinity queries +#define NVML_AFFINITY_SCOPE_SOCKET 1 + +typedef unsigned int nvmlAffinityScope_t; + +/** + * Retrieves an array of unsigned ints (sized to nodeSetSize) of bitmasks with + * the ideal memory affinity within node or socket for the device. + * For example, if NUMA node 0, 1 are ideal within the socket for the device and nodeSetSize == 1, + * result[0] = 0x3 + * + * \note If requested scope is not applicable to the target topology, the API + * will fall back to reporting the memory affinity for the immediate non-I/O + * ancestor of the device. + * + * For Kepler &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device The identifier of the target device + * @param nodeSetSize The size of the nodeSet array that is safe to access + * @param nodeSet Array reference in which to return a bitmask of NODEs, 64 NODEs per + * unsigned long on 64-bit machines, 32 on 32-bit machines + * @param scope Scope that change the default behavior + * + * @return + * - \ref NVML_SUCCESS if \a NUMA node Affinity has been filled + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, nodeSetSize == 0, nodeSet is NULL or scope is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ + +nvmlReturn_t DECLDIR nvmlDeviceGetMemoryAffinity(nvmlDevice_t device, unsigned int nodeSetSize, unsigned long *nodeSet, nvmlAffinityScope_t scope); + +/** + * Retrieves an array of unsigned ints (sized to cpuSetSize) of bitmasks with the + * ideal CPU affinity within node or socket for the device. + * For example, if processors 0, 1, 32, and 33 are ideal for the device and cpuSetSize == 2, + * result[0] = 0x3, result[1] = 0x3 + * + * \note If requested scope is not applicable to the target topology, the API + * will fall back to reporting the CPU affinity for the immediate non-I/O + * ancestor of the device. + * + * For Kepler &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device The identifier of the target device + * @param cpuSetSize The size of the cpuSet array that is safe to access + * @param cpuSet Array reference in which to return a bitmask of CPUs, 64 CPUs per + * unsigned long on 64-bit machines, 32 on 32-bit machines + * @param scope Scope that change the default behavior + * + * @return + * - \ref NVML_SUCCESS if \a cpuAffinity has been filled + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, cpuSetSize == 0, cpuSet is NULL or sope is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ + +nvmlReturn_t DECLDIR nvmlDeviceGetCpuAffinityWithinScope(nvmlDevice_t device, unsigned int cpuSetSize, unsigned long *cpuSet, nvmlAffinityScope_t scope); + +/** + * Retrieves an array of unsigned ints (sized to cpuSetSize) of bitmasks with the ideal CPU affinity for the device + * For example, if processors 0, 1, 32, and 33 are ideal for the device and cpuSetSize == 2, + * result[0] = 0x3, result[1] = 0x3 + * This is equivalent to calling \ref nvmlDeviceGetCpuAffinityWithinScope with \ref NVML_AFFINITY_SCOPE_NODE. + * + * For Kepler &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device The identifier of the target device + * @param cpuSetSize The size of the cpuSet array that is safe to access + * @param cpuSet Array reference in which to return a bitmask of CPUs, 64 CPUs per + * unsigned long on 64-bit machines, 32 on 32-bit machines + * + * @return + * - \ref NVML_SUCCESS if \a cpuAffinity has been filled + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, cpuSetSize == 0, or cpuSet is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetCpuAffinity(nvmlDevice_t device, unsigned int cpuSetSize, unsigned long *cpuSet); + +/** + * Sets the ideal affinity for the calling thread and device using the guidelines + * given in nvmlDeviceGetCpuAffinity(). Note, this is a change as of version 8.0. + * Older versions set the affinity for a calling process and all children. + * Currently supports up to 1024 processors. + * + * For Kepler &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device The identifier of the target device + * + * @return + * - \ref NVML_SUCCESS if the calling process has been successfully bound + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetCpuAffinity(nvmlDevice_t device); + +/** + * Clear all affinity bindings for the calling thread. Note, this is a change as of version + * 8.0 as older versions cleared the affinity for a calling process and all children. + * + * For Kepler &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device The identifier of the target device + * + * @return + * - \ref NVML_SUCCESS if the calling process has been successfully unbound + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceClearCpuAffinity(nvmlDevice_t device); + +/** + * Retrieve the common ancestor for two devices + * For all products. + * Supported on Linux only. + * + * @param device1 The identifier of the first device + * @param device2 The identifier of the second device + * @param pathInfo A \ref nvmlGpuTopologyLevel_t that gives the path type + * + * @return + * - \ref NVML_SUCCESS if \a pathInfo has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device1, or \a device2 is invalid, or \a pathInfo is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device or OS does not support this feature + * - \ref NVML_ERROR_UNKNOWN an error has occurred in underlying topology discovery + */ + +/** @} */ +nvmlReturn_t DECLDIR nvmlDeviceGetTopologyCommonAncestor(nvmlDevice_t device1, nvmlDevice_t device2, nvmlGpuTopologyLevel_t *pathInfo); + +/** + * Retrieve the set of GPUs that are nearest to a given device at a specific interconnectivity level + * For all products. + * Supported on Linux only. + * + * @param device The identifier of the first device + * @param level The \ref nvmlGpuTopologyLevel_t level to search for other GPUs + * @param count When zero, is set to the number of matching GPUs such that \a deviceArray + * can be malloc'd. When non-zero, \a deviceArray will be filled with \a count + * number of device handles. + * @param deviceArray An array of device handles for GPUs found at \a level + * + * @return + * - \ref NVML_SUCCESS if \a deviceArray or \a count (if initially zero) has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a level, or \a count is invalid, or \a deviceArray is NULL with a non-zero \a count + * - \ref NVML_ERROR_NOT_SUPPORTED if the device or OS does not support this feature + * - \ref NVML_ERROR_UNKNOWN an error has occurred in underlying topology discovery + */ +nvmlReturn_t DECLDIR nvmlDeviceGetTopologyNearestGpus(nvmlDevice_t device, nvmlGpuTopologyLevel_t level, unsigned int *count, nvmlDevice_t *deviceArray); + +/** + * Retrieve the set of GPUs that have a CPU affinity with the given CPU number + * For all products. + * Supported on Linux only. + * + * @param cpuNumber The CPU number + * @param count When zero, is set to the number of matching GPUs such that \a deviceArray + * can be malloc'd. When non-zero, \a deviceArray will be filled with \a count + * number of device handles. + * @param deviceArray An array of device handles for GPUs found with affinity to \a cpuNumber + * + * @return + * - \ref NVML_SUCCESS if \a deviceArray or \a count (if initially zero) has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a cpuNumber, or \a count is invalid, or \a deviceArray is NULL with a non-zero \a count + * - \ref NVML_ERROR_NOT_SUPPORTED if the device or OS does not support this feature + * - \ref NVML_ERROR_UNKNOWN an error has occurred in underlying topology discovery + */ +nvmlReturn_t DECLDIR nvmlSystemGetTopologyGpuSet(unsigned int cpuNumber, unsigned int *count, nvmlDevice_t *deviceArray); + +/** + * Retrieve the status for a given p2p capability index between a given pair of GPU + * + * @param device1 The first device + * @param device2 The second device + * @param p2pIndex p2p Capability Index being looked for between \a device1 and \a device2 + * @param p2pStatus Reference in which to return the status of the \a p2pIndex + * between \a device1 and \a device2 + * @return + * - \ref NVML_SUCCESS if \a p2pStatus has been populated + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device1 or \a device2 or \a p2pIndex is invalid or \a p2pStatus is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetP2PStatus(nvmlDevice_t device1, nvmlDevice_t device2, nvmlGpuP2PCapsIndex_t p2pIndex,nvmlGpuP2PStatus_t *p2pStatus); + +/** + * Retrieves the globally unique immutable UUID associated with this device, as a 5 part hexadecimal string, + * that augments the immutable, board serial identifier. + * + * For all products. + * + * The UUID is a globally unique identifier. It is the only available identifier for pre-Fermi-architecture products. + * It does NOT correspond to any identifier printed on the board. It will not exceed 96 characters in length + * (including the NULL terminator). See \ref nvmlConstants::NVML_DEVICE_UUID_V2_BUFFER_SIZE. + * + * When used with MIG device handles the API returns globally unique UUIDs which can be used to identify MIG + * devices across both GPU and MIG devices. UUIDs are immutable for the lifetime of a MIG device. + * + * @param device The identifier of the target device + * @param uuid Reference in which to return the GPU UUID + * @param length The maximum allowed length of the string returned in \a uuid + * + * @return + * - \ref NVML_SUCCESS if \a uuid has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a uuid is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetUUID(nvmlDevice_t device, char *uuid, unsigned int length); + +/** + * Retrieve the MDEV UUID of a vGPU instance. + * + * The MDEV UUID is a globally unique identifier of the mdev device assigned to the VM, and is returned as a 5-part hexadecimal string, + * not exceeding 80 characters in length (including the NULL terminator). + * MDEV UUID is displayed only on KVM platform. + * See \ref nvmlConstants::NVML_DEVICE_UUID_BUFFER_SIZE. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param mdevUuid Pointer to caller-supplied buffer to hold MDEV UUID + * @param size Size of buffer in bytes + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_NOT_SUPPORTED on any hypervisor other than KVM + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a mdevUuid is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a size is too small + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetMdevUUID(nvmlVgpuInstance_t vgpuInstance, char *mdevUuid, unsigned int size); + +/** + * Retrieves minor number for the device. The minor number for the device is such that the Nvidia device node file for + * each GPU will have the form /dev/nvidia[minor number]. + * + * For all products. + * Supported only for Linux + * + * @param device The identifier of the target device + * @param minorNumber Reference in which to return the minor number for the device + * @return + * - \ref NVML_SUCCESS if the minor number is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a minorNumber is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMinorNumber(nvmlDevice_t device, unsigned int *minorNumber); + +/** + * Retrieves the the device board part number which is programmed into the board's InfoROM + * + * For all products. + * + * @param device Identifier of the target device + * @param partNumber Reference to the buffer to return + * @param length Length of the buffer reference + * + * @return + * - \ref NVML_SUCCESS if \a partNumber has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_NOT_SUPPORTED if the needed VBIOS fields have not been filled + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a serial is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetBoardPartNumber(nvmlDevice_t device, char* partNumber, unsigned int length); + +/** + * Retrieves the version information for the device's infoROM object. + * + * For all products with an inforom. + * + * Fermi and higher parts have non-volatile on-board memory for persisting device info, such as aggregate + * ECC counts. The version of the data structures in this memory may change from time to time. It will not + * exceed 16 characters in length (including the NULL terminator). + * See \ref nvmlConstants::NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE. + * + * See \ref nvmlInforomObject_t for details on the available infoROM objects. + * + * @param device The identifier of the target device + * @param object The target infoROM object + * @param version Reference in which to return the infoROM version + * @param length The maximum allowed length of the string returned in \a version + * + * @return + * - \ref NVML_SUCCESS if \a version has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have an infoROM + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetInforomImageVersion + */ +nvmlReturn_t DECLDIR nvmlDeviceGetInforomVersion(nvmlDevice_t device, nvmlInforomObject_t object, char *version, unsigned int length); + +/** + * Retrieves the global infoROM image version + * + * For all products with an inforom. + * + * Image version just like VBIOS version uniquely describes the exact version of the infoROM flashed on the board + * in contrast to infoROM object version which is only an indicator of supported features. + * Version string will not exceed 16 characters in length (including the NULL terminator). + * See \ref nvmlConstants::NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE. + * + * @param device The identifier of the target device + * @param version Reference in which to return the infoROM image version + * @param length The maximum allowed length of the string returned in \a version + * + * @return + * - \ref NVML_SUCCESS if \a version has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a version is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have an infoROM + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetInforomVersion + */ +nvmlReturn_t DECLDIR nvmlDeviceGetInforomImageVersion(nvmlDevice_t device, char *version, unsigned int length); + +/** + * Retrieves the checksum of the configuration stored in the device's infoROM. + * + * For all products with an inforom. + * + * Can be used to make sure that two GPUs have the exact same configuration. + * Current checksum takes into account configuration stored in PWR and ECC infoROM objects. + * Checksum can change between driver releases or when user changes configuration (e.g. disable/enable ECC) + * + * @param device The identifier of the target device + * @param checksum Reference in which to return the infoROM configuration checksum + * + * @return + * - \ref NVML_SUCCESS if \a checksum has been set + * - \ref NVML_ERROR_CORRUPTED_INFOROM if the device's checksum couldn't be retrieved due to infoROM corruption + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a checksum is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetInforomConfigurationChecksum(nvmlDevice_t device, unsigned int *checksum); + +/** + * Reads the infoROM from the flash and verifies the checksums. + * + * For all products with an inforom. + * + * @param device The identifier of the target device + * + * @return + * - \ref NVML_SUCCESS if infoROM is not corrupted + * - \ref NVML_ERROR_CORRUPTED_INFOROM if the device's infoROM is corrupted + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceValidateInforom(nvmlDevice_t device); + +/** + * Retrieves the display mode for the device. + * + * For all products. + * + * This method indicates whether a physical display (e.g. monitor) is currently connected to + * any of the device's connectors. + * + * See \ref nvmlEnableState_t for details on allowed modes. + * + * @param device The identifier of the target device + * @param display Reference in which to return the display mode + * + * @return + * - \ref NVML_SUCCESS if \a display has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a display is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDisplayMode(nvmlDevice_t device, nvmlEnableState_t *display); + +/** + * Retrieves the display active state for the device. + * + * For all products. + * + * This method indicates whether a display is initialized on the device. + * For example whether X Server is attached to this device and has allocated memory for the screen. + * + * Display can be active even when no monitor is physically attached. + * + * See \ref nvmlEnableState_t for details on allowed modes. + * + * @param device The identifier of the target device + * @param isActive Reference in which to return the display active state + * + * @return + * - \ref NVML_SUCCESS if \a isActive has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a isActive is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDisplayActive(nvmlDevice_t device, nvmlEnableState_t *isActive); + +/** + * Retrieves the persistence mode associated with this device. + * + * For all products. + * For Linux only. + * + * When driver persistence mode is enabled the driver software state is not torn down when the last + * client disconnects. By default this feature is disabled. + * + * See \ref nvmlEnableState_t for details on allowed modes. + * + * @param device The identifier of the target device + * @param mode Reference in which to return the current driver persistence mode + * + * @return + * - \ref NVML_SUCCESS if \a mode has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetPersistenceMode() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPersistenceMode(nvmlDevice_t device, nvmlEnableState_t *mode); + +/** + * Retrieves the PCI attributes of this device. + * + * For all products. + * + * See \ref nvmlPciInfo_t for details on the available PCI info. + * + * @param device The identifier of the target device + * @param pci Reference in which to return the PCI info + * + * @return + * - \ref NVML_SUCCESS if \a pci has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pci is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPciInfo_v3(nvmlDevice_t device, nvmlPciInfo_t *pci); + +/** + * Retrieves the maximum PCIe link generation possible with this device and system + * + * I.E. for a generation 2 PCIe device attached to a generation 1 PCIe bus the max link generation this function will + * report is generation 1. + * + * For Fermi &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param maxLinkGen Reference in which to return the max PCIe link generation + * + * @return + * - \ref NVML_SUCCESS if \a maxLinkGen has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a maxLinkGen is null + * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMaxPcieLinkGeneration(nvmlDevice_t device, unsigned int *maxLinkGen); + +/** + * Retrieves the maximum PCIe link generation supported by this device + * + * For Fermi &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param maxLinkGenDevice Reference in which to return the max PCIe link generation + * + * @return + * - \ref NVML_SUCCESS if \a maxLinkGenDevice has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a maxLinkGenDevice is null + * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuMaxPcieLinkGeneration(nvmlDevice_t device, unsigned int *maxLinkGenDevice); + +/** + * Retrieves the maximum PCIe link width possible with this device and system + * + * I.E. for a device with a 16x PCIe bus width attached to a 8x PCIe system bus this function will report + * a max link width of 8. + * + * For Fermi &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param maxLinkWidth Reference in which to return the max PCIe link generation + * + * @return + * - \ref NVML_SUCCESS if \a maxLinkWidth has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a maxLinkWidth is null + * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMaxPcieLinkWidth(nvmlDevice_t device, unsigned int *maxLinkWidth); + +/** + * Retrieves the current PCIe link generation + * + * For Fermi &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param currLinkGen Reference in which to return the current PCIe link generation + * + * @return + * - \ref NVML_SUCCESS if \a currLinkGen has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a currLinkGen is null + * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetCurrPcieLinkGeneration(nvmlDevice_t device, unsigned int *currLinkGen); + +/** + * Retrieves the current PCIe link width + * + * For Fermi &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param currLinkWidth Reference in which to return the current PCIe link generation + * + * @return + * - \ref NVML_SUCCESS if \a currLinkWidth has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a currLinkWidth is null + * - \ref NVML_ERROR_NOT_SUPPORTED if PCIe link information is not available + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetCurrPcieLinkWidth(nvmlDevice_t device, unsigned int *currLinkWidth); + +/** + * Retrieve PCIe utilization information. + * This function is querying a byte counter over a 20ms interval and thus is the + * PCIe throughput over that interval. + * + * For Maxwell &tm; or newer fully supported devices. + * + * This method is not supported in virtual machines running virtual GPU (vGPU). + * + * @param device The identifier of the target device + * @param counter The specific counter that should be queried \ref nvmlPcieUtilCounter_t + * @param value Reference in which to return throughput in KB/s + * + * @return + * - \ref NVML_SUCCESS if \a value has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a counter is invalid, or \a value is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPcieThroughput(nvmlDevice_t device, nvmlPcieUtilCounter_t counter, unsigned int *value); + +/** + * Retrieve the PCIe replay counter. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param value Reference in which to return the counter's value + * + * @return + * - \ref NVML_SUCCESS if \a value has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a value is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPcieReplayCounter(nvmlDevice_t device, unsigned int *value); + +/** + * Retrieves the current clock speeds for the device. + * + * For Fermi &tm; or newer fully supported devices. + * + * See \ref nvmlClockType_t for details on available clock information. + * + * @param device The identifier of the target device + * @param type Identify which clock domain to query + * @param clock Reference in which to return the clock speed in MHz + * + * @return + * - \ref NVML_SUCCESS if \a clock has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clock is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device cannot report the specified clock + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetClockInfo(nvmlDevice_t device, nvmlClockType_t type, unsigned int *clock); + +/** + * Retrieves the maximum clock speeds for the device. + * + * For Fermi &tm; or newer fully supported devices. + * + * See \ref nvmlClockType_t for details on available clock information. + * + * \note On GPUs from Fermi family current P0 clocks (reported by \ref nvmlDeviceGetClockInfo) can differ from max clocks + * by few MHz. + * + * @param device The identifier of the target device + * @param type Identify which clock domain to query + * @param clock Reference in which to return the clock speed in MHz + * + * @return + * - \ref NVML_SUCCESS if \a clock has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clock is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device cannot report the specified clock + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMaxClockInfo(nvmlDevice_t device, nvmlClockType_t type, unsigned int *clock); + +/** + * Retrieves the current setting of a clock that applications will use unless an overspec situation occurs. + * Can be changed using \ref nvmlDeviceSetApplicationsClocks. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param clockType Identify which clock domain to query + * @param clockMHz Reference in which to return the clock in MHz + * + * @return + * - \ref NVML_SUCCESS if \a clockMHz has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetApplicationsClock(nvmlDevice_t device, nvmlClockType_t clockType, unsigned int *clockMHz); + +/** + * Retrieves the default applications clock that GPU boots with or + * defaults to after \ref nvmlDeviceResetApplicationsClocks call. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param clockType Identify which clock domain to query + * @param clockMHz Reference in which to return the default clock in MHz + * + * @return + * - \ref NVML_SUCCESS if \a clockMHz has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * \see nvmlDeviceGetApplicationsClock + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDefaultApplicationsClock(nvmlDevice_t device, nvmlClockType_t clockType, unsigned int *clockMHz); + +/** + * Resets the application clock to the default value + * + * This is the applications clock that will be used after system reboot or driver reload. + * Default value is constant, but the current value an be changed using \ref nvmlDeviceSetApplicationsClocks. + * + * On Pascal and newer hardware, if clocks were previously locked with \ref nvmlDeviceSetApplicationsClocks, + * this call will unlock clocks. This returns clocks their default behavior ofautomatically boosting above + * base clocks as thermal limits allow. + * + * @see nvmlDeviceGetApplicationsClock + * @see nvmlDeviceSetApplicationsClocks + * + * For Fermi &tm; or newer non-GeForce fully supported devices and Maxwell or newer GeForce devices. + * + * @param device The identifier of the target device + * + * @return + * - \ref NVML_SUCCESS if new settings were successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceResetApplicationsClocks(nvmlDevice_t device); + +/** + * Retrieves the clock speed for the clock specified by the clock type and clock ID. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param clockType Identify which clock domain to query + * @param clockId Identify which clock in the domain to query + * @param clockMHz Reference in which to return the clock in MHz + * + * @return + * - \ref NVML_SUCCESS if \a clockMHz has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetClock(nvmlDevice_t device, nvmlClockType_t clockType, nvmlClockId_t clockId, unsigned int *clockMHz); + +/** + * Retrieves the customer defined maximum boost clock speed specified by the given clock type. + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param clockType Identify which clock domain to query + * @param clockMHz Reference in which to return the clock in MHz + * + * @return + * - \ref NVML_SUCCESS if \a clockMHz has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clockMHz is NULL or \a clockType is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device or the \a clockType on this device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMaxCustomerBoostClock(nvmlDevice_t device, nvmlClockType_t clockType, unsigned int *clockMHz); + +/** + * Retrieves the list of possible memory clocks that can be used as an argument for \ref nvmlDeviceSetApplicationsClocks. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param count Reference in which to provide the \a clocksMHz array size, and + * to return the number of elements + * @param clocksMHz Reference in which to return the clock in MHz + * + * @return + * - \ref NVML_SUCCESS if \a count and \a clocksMHz have been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a count is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a count is too small (\a count is set to the number of + * required elements) + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetApplicationsClocks + * @see nvmlDeviceGetSupportedGraphicsClocks + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSupportedMemoryClocks(nvmlDevice_t device, unsigned int *count, unsigned int *clocksMHz); + +/** + * Retrieves the list of possible graphics clocks that can be used as an argument for \ref nvmlDeviceSetApplicationsClocks. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param memoryClockMHz Memory clock for which to return possible graphics clocks + * @param count Reference in which to provide the \a clocksMHz array size, and + * to return the number of elements + * @param clocksMHz Reference in which to return the clocks in MHz + * + * @return + * - \ref NVML_SUCCESS if \a count and \a clocksMHz have been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_NOT_FOUND if the specified \a memoryClockMHz is not a supported frequency + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clock is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a count is too small + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetApplicationsClocks + * @see nvmlDeviceGetSupportedMemoryClocks + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSupportedGraphicsClocks(nvmlDevice_t device, unsigned int memoryClockMHz, unsigned int *count, unsigned int *clocksMHz); + +/** + * Retrieve the current state of Auto Boosted clocks on a device and store it in \a isEnabled + * + * For Kepler &tm; or newer fully supported devices. + * + * Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates + * to maximize performance as thermal limits allow. + * + * On Pascal and newer hardware, Auto Aoosted clocks are controlled through application clocks. + * Use \ref nvmlDeviceSetApplicationsClocks and \ref nvmlDeviceResetApplicationsClocks to control Auto Boost + * behavior. + * + * @param device The identifier of the target device + * @param isEnabled Where to store the current state of Auto Boosted clocks of the target device + * @param defaultIsEnabled Where to store the default Auto Boosted clocks behavior of the target device that the device will + * revert to when no applications are using the GPU + * + * @return + * - \ref NVML_SUCCESS If \a isEnabled has been been set with the Auto Boosted clocks state of \a device + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a isEnabled is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support Auto Boosted clocks + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAutoBoostedClocksEnabled(nvmlDevice_t device, nvmlEnableState_t *isEnabled, nvmlEnableState_t *defaultIsEnabled); + +/** + * Try to set the current state of Auto Boosted clocks on a device. + * + * For Kepler &tm; or newer fully supported devices. + * + * Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates + * to maximize performance as thermal limits allow. Auto Boosted clocks should be disabled if fixed clock + * rates are desired. + * + * Non-root users may use this API by default but can be restricted by root from using this API by calling + * \ref nvmlDeviceSetAPIRestriction with apiType=NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS. + * Note: Persistence Mode is required to modify current Auto Boost settings, therefore, it must be enabled. + * + * On Pascal and newer hardware, Auto Boosted clocks are controlled through application clocks. + * Use \ref nvmlDeviceSetApplicationsClocks and \ref nvmlDeviceResetApplicationsClocks to control Auto Boost + * behavior. + * + * @param device The identifier of the target device + * @param enabled What state to try to set Auto Boosted clocks of the target device to + * + * @return + * - \ref NVML_SUCCESS If the Auto Boosted clocks were successfully set to the state specified by \a enabled + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support Auto Boosted clocks + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + */ +nvmlReturn_t DECLDIR nvmlDeviceSetAutoBoostedClocksEnabled(nvmlDevice_t device, nvmlEnableState_t enabled); + +/** + * Try to set the default state of Auto Boosted clocks on a device. This is the default state that Auto Boosted clocks will + * return to when no compute running processes (e.g. CUDA application which have an active context) are running + * + * For Kepler &tm; or newer non-GeForce fully supported devices and Maxwell or newer GeForce devices. + * Requires root/admin permissions. + * + * Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates + * to maximize performance as thermal limits allow. Auto Boosted clocks should be disabled if fixed clock + * rates are desired. + * + * On Pascal and newer hardware, Auto Boosted clocks are controlled through application clocks. + * Use \ref nvmlDeviceSetApplicationsClocks and \ref nvmlDeviceResetApplicationsClocks to control Auto Boost + * behavior. + * + * @param device The identifier of the target device + * @param enabled What state to try to set default Auto Boosted clocks of the target device to + * @param flags Flags that change the default behavior. Currently Unused. + * + * @return + * - \ref NVML_SUCCESS If the Auto Boosted clock's default state was successfully set to the state specified by \a enabled + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_NO_PERMISSION If the calling user does not have permission to change Auto Boosted clock's default state. + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support Auto Boosted clocks + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + */ +nvmlReturn_t DECLDIR nvmlDeviceSetDefaultAutoBoostedClocksEnabled(nvmlDevice_t device, nvmlEnableState_t enabled, unsigned int flags); + + +/** + * Retrieves the intended operating speed of the device's fan. + * + * Note: The reported speed is the intended fan speed. If the fan is physically blocked and unable to spin, the + * output will not match the actual fan speed. + * + * For all discrete products with dedicated fans. + * + * The fan speed is expressed as a percentage of the product's maximum noise tolerance fan speed. + * This value may exceed 100% in certain cases. + * + * @param device The identifier of the target device + * @param speed Reference in which to return the fan speed percentage + * + * @return + * - \ref NVML_SUCCESS if \a speed has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a speed is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a fan + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetFanSpeed(nvmlDevice_t device, unsigned int *speed); + + +/** + * Retrieves the intended operating speed of the device's specified fan. + * + * Note: The reported speed is the intended fan speed. If the fan is physically blocked and unable to spin, the + * output will not match the actual fan speed. + * + * For all discrete products with dedicated fans. + * + * The fan speed is expressed as a percentage of the product's maximum noise tolerance fan speed. + * This value may exceed 100% in certain cases. + * + * @param device The identifier of the target device + * @param fan The index of the target fan, zero indexed. + * @param speed Reference in which to return the fan speed percentage + * + * @return + * - \ref NVML_SUCCESS if \a speed has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a fan is not an acceptable index, or \a speed is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a fan or is newer than Maxwell + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetFanSpeed_v2(nvmlDevice_t device, unsigned int fan, unsigned int * speed); + +/** + * Retrieves the intended target speed of the device's specified fan. + * + * Normally, the driver dynamically adjusts the fan based on + * the needs of the GPU. But when user set fan speed using nvmlDeviceSetFanSpeed_v2, + * the driver will attempt to make the fan achieve the setting in + * nvmlDeviceSetFanSpeed_v2. The actual current speed of the fan + * is reported in nvmlDeviceGetFanSpeed_v2. + * + * For all discrete products with dedicated fans. + * + * The fan speed is expressed as a percentage of the product's maximum noise tolerance fan speed. + * This value may exceed 100% in certain cases. + * + * @param device The identifier of the target device + * @param fan The index of the target fan, zero indexed. + * @param targetSpeed Reference in which to return the fan speed percentage + * + * @return + * - \ref NVML_SUCCESS if \a speed has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a fan is not an acceptable index, or \a speed is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a fan or is newer than Maxwell + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetTargetFanSpeed(nvmlDevice_t device, unsigned int fan, unsigned int *targetSpeed); + +/** + * Sets the speed of the fan control policy to default. + * + * For all cuda-capable discrete products with fans + * + * @param device The identifier of the target device + * @param fan The index of the fan, starting at zero + * + * return + * NVML_SUCCESS if speed has been adjusted + * NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * NVML_ERROR_INVALID_ARGUMENT if device is invalid + * NVML_ERROR_NOT_SUPPORTED if the device does not support this + * (doesn't have fans) + * NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetDefaultFanSpeed_v2(nvmlDevice_t device, unsigned int fan); + +/** + * Retrieves the min and max fan speed that user can set for the GPU fan. + * + * For all cuda-capable discrete products with fans + * + * @param device The identifier of the target device + * @param minSpeed The minimum speed allowed to set + * @param maxSpeed The maximum speed allowed to set + * + * return + * NVML_SUCCESS if speed has been adjusted + * NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * NVML_ERROR_INVALID_ARGUMENT if device is invalid + * NVML_ERROR_NOT_SUPPORTED if the device does not support this + * (doesn't have fans) + * NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMinMaxFanSpeed(nvmlDevice_t device, unsigned int * minSpeed, + unsigned int * maxSpeed); + +/** + * Gets current fan control policy. + * + * For Maxwell &tm; or newer fully supported devices. + * + * For all cuda-capable discrete products with fans + * + * device The identifier of the target \a device + * policy Reference in which to return the fan control \a policy + * + * return + * NVML_SUCCESS if \a policy has been populated + * NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a policy is null or the \a fan given doesn't reference + * a fan that exists. + * NVML_ERROR_NOT_SUPPORTED if the \a device is older than Maxwell + * NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetFanControlPolicy_v2(nvmlDevice_t device, unsigned int fan, + nvmlFanControlPolicy_t *policy); + +/** + * Sets current fan control policy. + * + * For Maxwell &tm; or newer fully supported devices. + * + * Requires privileged user. + * + * For all cuda-capable discrete products with fans + * + * device The identifier of the target \a device + * policy The fan control \a policy to set + * + * return + * NVML_SUCCESS if \a policy has been set + * NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a policy is null or the \a fan given doesn't reference + * a fan that exists. + * NVML_ERROR_NOT_SUPPORTED if the \a device is older than Maxwell + * NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetFanControlPolicy(nvmlDevice_t device, unsigned int fan, + nvmlFanControlPolicy_t policy); + +/** + * Retrieves the number of fans on the device. + * + * For all discrete products with dedicated fans. + * + * @param device The identifier of the target device + * @param numFans The number of fans + * + * @return + * - \ref NVML_SUCCESS if \a fan number query was successful + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a numFans is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a fan + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNumFans(nvmlDevice_t device, unsigned int *numFans); + +/** + * Retrieves the current temperature readings for the device, in degrees C. + * + * For all products. + * + * See \ref nvmlTemperatureSensors_t for details on available temperature sensors. + * + * @param device The identifier of the target device + * @param sensorType Flag that indicates which sensor reading to retrieve + * @param temp Reference in which to return the temperature reading + * + * @return + * - \ref NVML_SUCCESS if \a temp has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a sensorType is invalid or \a temp is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have the specified sensor + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetTemperature(nvmlDevice_t device, nvmlTemperatureSensors_t sensorType, unsigned int *temp); + +/** + * Retrieves the temperature threshold for the GPU with the specified threshold type in degrees C. + * + * For Kepler &tm; or newer fully supported devices. + * + * See \ref nvmlTemperatureThresholds_t for details on available temperature thresholds. + * + * @param device The identifier of the target device + * @param thresholdType The type of threshold value queried + * @param temp Reference in which to return the temperature reading + * @return + * - \ref NVML_SUCCESS if \a temp has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a thresholdType is invalid or \a temp is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a temperature sensor or is unsupported + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetTemperatureThreshold(nvmlDevice_t device, nvmlTemperatureThresholds_t thresholdType, unsigned int *temp); + +/** + * Sets the temperature threshold for the GPU with the specified threshold type in degrees C. + * + * For Maxwell &tm; or newer fully supported devices. + * + * See \ref nvmlTemperatureThresholds_t for details on available temperature thresholds. + * + * @param device The identifier of the target device + * @param thresholdType The type of threshold value to be set + * @param temp Reference which hold the value to be set + * @return + * - \ref NVML_SUCCESS if \a temp has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a thresholdType is invalid or \a temp is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not have a temperature sensor or is unsupported + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetTemperatureThreshold(nvmlDevice_t device, nvmlTemperatureThresholds_t thresholdType, int *temp); + +/** + * Used to execute a list of thermal system instructions. + * + * @param device The identifier of the target device + * @param sensorIndex The index of the thermal sensor + * @param pThermalSettings Reference in which to return the thermal sensor information + * + * @return + * - \ref NVML_SUCCESS if \a pThermalSettings has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pThermalSettings is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetThermalSettings(nvmlDevice_t device, unsigned int sensorIndex, nvmlGpuThermalSettings_t *pThermalSettings); + +/** + * Retrieves the current performance state for the device. + * + * For Fermi &tm; or newer fully supported devices. + * + * See \ref nvmlPstates_t for details on allowed performance states. + * + * @param device The identifier of the target device + * @param pState Reference in which to return the performance state reading + * + * @return + * - \ref NVML_SUCCESS if \a pState has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pState is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPerformanceState(nvmlDevice_t device, nvmlPstates_t *pState); + +/** + * Retrieves current clocks throttling reasons. + * + * For all fully supported products. + * + * \note More than one bit can be enabled at the same time. Multiple reasons can be affecting clocks at once. + * + * @param device The identifier of the target device + * @param clocksThrottleReasons Reference in which to return bitmask of active clocks throttle + * reasons + * + * @return + * - \ref NVML_SUCCESS if \a clocksThrottleReasons has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a clocksThrottleReasons is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlClocksThrottleReasons + * @see nvmlDeviceGetSupportedClocksThrottleReasons + */ +nvmlReturn_t DECLDIR nvmlDeviceGetCurrentClocksThrottleReasons(nvmlDevice_t device, unsigned long long *clocksThrottleReasons); + +/** + * Retrieves bitmask of supported clocks throttle reasons that can be returned by + * \ref nvmlDeviceGetCurrentClocksThrottleReasons + * + * For all fully supported products. + * + * This method is not supported in virtual machines running virtual GPU (vGPU). + * + * @param device The identifier of the target device + * @param supportedClocksThrottleReasons Reference in which to return bitmask of supported + * clocks throttle reasons + * + * @return + * - \ref NVML_SUCCESS if \a supportedClocksThrottleReasons has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a supportedClocksThrottleReasons is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlClocksThrottleReasons + * @see nvmlDeviceGetCurrentClocksThrottleReasons + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSupportedClocksThrottleReasons(nvmlDevice_t device, unsigned long long *supportedClocksThrottleReasons); + +/** + * Deprecated: Use \ref nvmlDeviceGetPerformanceState. This function exposes an incorrect generalization. + * + * Retrieve the current performance state for the device. + * + * For Fermi &tm; or newer fully supported devices. + * + * See \ref nvmlPstates_t for details on allowed performance states. + * + * @param device The identifier of the target device + * @param pState Reference in which to return the performance state reading + * + * @return + * - \ref NVML_SUCCESS if \a pState has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pState is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPowerState(nvmlDevice_t device, nvmlPstates_t *pState); + +/** + * This API has been deprecated. + * + * Retrieves the power management mode associated with this device. + * + * For products from the Fermi family. + * - Requires \a NVML_INFOROM_POWER version 3.0 or higher. + * + * For from the Kepler or newer families. + * - Does not require \a NVML_INFOROM_POWER object. + * + * This flag indicates whether any power management algorithm is currently active on the device. An + * enabled state does not necessarily mean the device is being actively throttled -- only that + * that the driver will do so if the appropriate conditions are met. + * + * See \ref nvmlEnableState_t for details on allowed modes. + * + * @param device The identifier of the target device + * @param mode Reference in which to return the current power management mode + * + * @return + * - \ref NVML_SUCCESS if \a mode has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementMode(nvmlDevice_t device, nvmlEnableState_t *mode); + +/** + * Retrieves the power management limit associated with this device. + * + * For Fermi &tm; or newer fully supported devices. + * + * The power limit defines the upper boundary for the card's power draw. If + * the card's total power draw reaches this limit the power management algorithm kicks in. + * + * This reading is only available if power management mode is supported. + * See \ref nvmlDeviceGetPowerManagementMode. + * + * @param device The identifier of the target device + * @param limit Reference in which to return the power management limit in milliwatts + * + * @return + * - \ref NVML_SUCCESS if \a limit has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a limit is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementLimit(nvmlDevice_t device, unsigned int *limit); + +/** + * Retrieves information about possible values of power management limits on this device. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param minLimit Reference in which to return the minimum power management limit in milliwatts + * @param maxLimit Reference in which to return the maximum power management limit in milliwatts + * + * @return + * - \ref NVML_SUCCESS if \a minLimit and \a maxLimit have been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a minLimit or \a maxLimit is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetPowerManagementLimit + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementLimitConstraints(nvmlDevice_t device, unsigned int *minLimit, unsigned int *maxLimit); + +/** + * Retrieves default power management limit on this device, in milliwatts. + * Default power management limit is a power management limit that the device boots with. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param defaultLimit Reference in which to return the default power management limit in milliwatts + * + * @return + * - \ref NVML_SUCCESS if \a defaultLimit has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a defaultLimit is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementDefaultLimit(nvmlDevice_t device, unsigned int *defaultLimit); + +/** + * Retrieves power usage for this GPU in milliwatts and its associated circuitry (e.g. memory) + * + * For Fermi &tm; or newer fully supported devices. + * + * On Fermi and Kepler GPUs the reading is accurate to within +/- 5% of current power draw. + * + * It is only available if power management mode is supported. See \ref nvmlDeviceGetPowerManagementMode. + * + * @param device The identifier of the target device + * @param power Reference in which to return the power usage information + * + * @return + * - \ref NVML_SUCCESS if \a power has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a power is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support power readings + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPowerUsage(nvmlDevice_t device, unsigned int *power); + +/** + * Retrieves total energy consumption for this GPU in millijoules (mJ) since the driver was last reloaded + * + * For Volta &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param energy Reference in which to return the energy consumption information + * + * @return + * - \ref NVML_SUCCESS if \a energy has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a energy is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support energy readings + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetTotalEnergyConsumption(nvmlDevice_t device, unsigned long long *energy); + +/** + * Get the effective power limit that the driver enforces after taking into account all limiters + * + * Note: This can be different from the \ref nvmlDeviceGetPowerManagementLimit if other limits are set elsewhere + * This includes the out of band power limit interface + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The device to communicate with + * @param limit Reference in which to return the power management limit in milliwatts + * + * @return + * - \ref NVML_SUCCESS if \a limit has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a limit is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetEnforcedPowerLimit(nvmlDevice_t device, unsigned int *limit); + +/** + * Retrieves the current GOM and pending GOM (the one that GPU will switch to after reboot). + * + * For GK110 M-class and X-class Tesla &tm; products from the Kepler family. + * Modes \ref NVML_GOM_LOW_DP and \ref NVML_GOM_ALL_ON are supported on fully supported GeForce products. + * Not supported on Quadro ® and Tesla &tm; C-class products. + * + * @param device The identifier of the target device + * @param current Reference in which to return the current GOM + * @param pending Reference in which to return the pending GOM + * + * @return + * - \ref NVML_SUCCESS if \a mode has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a current or \a pending is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlGpuOperationMode_t + * @see nvmlDeviceSetGpuOperationMode + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuOperationMode(nvmlDevice_t device, nvmlGpuOperationMode_t *current, nvmlGpuOperationMode_t *pending); + +/** + * Retrieves the amount of used, free, reserved and total memory available on the device, in bytes. + * The reserved amount is supported on version 2 only. + * + * For all products. + * + * Enabling ECC reduces the amount of total available memory, due to the extra required parity bits. + * Under WDDM most device memory is allocated and managed on startup by Windows. + * + * Under Linux and Windows TCC, the reported amount of used memory is equal to the sum of memory allocated + * by all active channels on the device. + * + * See \ref nvmlMemory_v2_t for details on available memory info. + * + * @note In MIG mode, if device handle is provided, the API returns aggregate + * information, only if the caller has appropriate privileges. Per-instance + * information can be queried by using specific MIG device handles. + * + * @note nvmlDeviceGetMemoryInfo_v2 adds additional memory information. + * + * @param device The identifier of the target device + * @param memory Reference in which to return the memory information + * + * @return + * - \ref NVML_SUCCESS if \a memory has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a memory is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMemoryInfo(nvmlDevice_t device, nvmlMemory_t *memory); +nvmlReturn_t DECLDIR nvmlDeviceGetMemoryInfo_v2(nvmlDevice_t device, nvmlMemory_v2_t *memory); + +/** + * Retrieves the current compute mode for the device. + * + * For all products. + * + * See \ref nvmlComputeMode_t for details on allowed compute modes. + * + * @param device The identifier of the target device + * @param mode Reference in which to return the current compute mode + * + * @return + * - \ref NVML_SUCCESS if \a mode has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetComputeMode() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetComputeMode(nvmlDevice_t device, nvmlComputeMode_t *mode); + +/** + * Retrieves the CUDA compute capability of the device. + * + * For all products. + * + * Returns the major and minor compute capability version numbers of the + * device. The major and minor versions are equivalent to the + * CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR and + * CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR attributes that would be + * returned by CUDA's cuDeviceGetAttribute(). + * + * @param device The identifier of the target device + * @param major Reference in which to return the major CUDA compute capability + * @param minor Reference in which to return the minor CUDA compute capability + * + * @return + * - \ref NVML_SUCCESS if \a major and \a minor have been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a major or \a minor are NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetCudaComputeCapability(nvmlDevice_t device, int *major, int *minor); + +/** + * Retrieves the current and pending ECC modes for the device. + * + * For Fermi &tm; or newer fully supported devices. + * Only applicable to devices with ECC. + * Requires \a NVML_INFOROM_ECC version 1.0 or higher. + * + * Changing ECC modes requires a reboot. The "pending" ECC mode refers to the target mode following + * the next reboot. + * + * See \ref nvmlEnableState_t for details on allowed modes. + * + * @param device The identifier of the target device + * @param current Reference in which to return the current ECC mode + * @param pending Reference in which to return the pending ECC mode + * + * @return + * - \ref NVML_SUCCESS if \a current and \a pending have been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or either \a current or \a pending is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetEccMode() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetEccMode(nvmlDevice_t device, nvmlEnableState_t *current, nvmlEnableState_t *pending); + +/** + * Retrieves the default ECC modes for the device. + * + * For Fermi &tm; or newer fully supported devices. + * Only applicable to devices with ECC. + * Requires \a NVML_INFOROM_ECC version 1.0 or higher. + * + * See \ref nvmlEnableState_t for details on allowed modes. + * + * @param device The identifier of the target device + * @param defaultMode Reference in which to return the default ECC mode + * + * @return + * - \ref NVML_SUCCESS if \a current and \a pending have been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a default is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetEccMode() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDefaultEccMode(nvmlDevice_t device, nvmlEnableState_t *defaultMode); + +/** + * Retrieves the device boardId from 0-N. + * Devices with the same boardId indicate GPUs connected to the same PLX. Use in conjunction with + * \ref nvmlDeviceGetMultiGpuBoard() to decide if they are on the same board as well. + * The boardId returned is a unique ID for the current configuration. Uniqueness and ordering across + * reboots and system configurations is not guaranteed (i.e. if a Tesla K40c returns 0x100 and + * the two GPUs on a Tesla K10 in the same system returns 0x200 it is not guaranteed they will + * always return those values but they will always be different from each other). + * + * + * For Fermi &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param boardId Reference in which to return the device's board ID + * + * @return + * - \ref NVML_SUCCESS if \a boardId has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a boardId is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetBoardId(nvmlDevice_t device, unsigned int *boardId); + +/** + * Retrieves whether the device is on a Multi-GPU Board + * Devices that are on multi-GPU boards will set \a multiGpuBool to a non-zero value. + * + * For Fermi &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param multiGpuBool Reference in which to return a zero or non-zero value + * to indicate whether the device is on a multi GPU board + * + * @return + * - \ref NVML_SUCCESS if \a multiGpuBool has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a multiGpuBool is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMultiGpuBoard(nvmlDevice_t device, unsigned int *multiGpuBool); + +/** + * Retrieves the total ECC error counts for the device. + * + * For Fermi &tm; or newer fully supported devices. + * Only applicable to devices with ECC. + * Requires \a NVML_INFOROM_ECC version 1.0 or higher. + * Requires ECC Mode to be enabled. + * + * The total error count is the sum of errors across each of the separate memory systems, i.e. the total set of + * errors across the entire device. + * + * See \ref nvmlMemoryErrorType_t for a description of available error types.\n + * See \ref nvmlEccCounterType_t for a description of available counter types. + * + * @param device The identifier of the target device + * @param errorType Flag that specifies the type of the errors. + * @param counterType Flag that specifies the counter-type of the errors. + * @param eccCounts Reference in which to return the specified ECC errors + * + * @return + * - \ref NVML_SUCCESS if \a eccCounts has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a errorType or \a counterType is invalid, or \a eccCounts is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceClearEccErrorCounts() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetTotalEccErrors(nvmlDevice_t device, nvmlMemoryErrorType_t errorType, nvmlEccCounterType_t counterType, unsigned long long *eccCounts); + +/** + * Retrieves the detailed ECC error counts for the device. + * + * @deprecated This API supports only a fixed set of ECC error locations + * On different GPU architectures different locations are supported + * See \ref nvmlDeviceGetMemoryErrorCounter + * + * For Fermi &tm; or newer fully supported devices. + * Only applicable to devices with ECC. + * Requires \a NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based ECC counts. + * Requires \a NVML_INFOROM_ECC version 1.0 or higher to report all other ECC counts. + * Requires ECC Mode to be enabled. + * + * Detailed errors provide separate ECC counts for specific parts of the memory system. + * + * Reports zero for unsupported ECC error counters when a subset of ECC error counters are supported. + * + * See \ref nvmlMemoryErrorType_t for a description of available bit types.\n + * See \ref nvmlEccCounterType_t for a description of available counter types.\n + * See \ref nvmlEccErrorCounts_t for a description of provided detailed ECC counts. + * + * @param device The identifier of the target device + * @param errorType Flag that specifies the type of the errors. + * @param counterType Flag that specifies the counter-type of the errors. + * @param eccCounts Reference in which to return the specified ECC errors + * + * @return + * - \ref NVML_SUCCESS if \a eccCounts has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a errorType or \a counterType is invalid, or \a eccCounts is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceClearEccErrorCounts() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDetailedEccErrors(nvmlDevice_t device, nvmlMemoryErrorType_t errorType, nvmlEccCounterType_t counterType, nvmlEccErrorCounts_t *eccCounts); + +/** + * Retrieves the requested memory error counter for the device. + * + * For Fermi &tm; or newer fully supported devices. + * Requires \a NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based memory error counts. + * Requires \a NVML_INFOROM_ECC version 1.0 or higher to report all other memory error counts. + * + * Only applicable to devices with ECC. + * + * Requires ECC Mode to be enabled. + * + * @note On MIG-enabled GPUs, per instance information can be queried using specific + * MIG device handles. Per instance information is currently only supported for + * non-DRAM uncorrectable volatile errors. Querying volatile errors using device + * handles is currently not supported. + * + * See \ref nvmlMemoryErrorType_t for a description of available memory error types.\n + * See \ref nvmlEccCounterType_t for a description of available counter types.\n + * See \ref nvmlMemoryLocation_t for a description of available counter locations.\n + * + * @param device The identifier of the target device + * @param errorType Flag that specifies the type of error. + * @param counterType Flag that specifies the counter-type of the errors. + * @param locationType Specifies the location of the counter. + * @param count Reference in which to return the ECC counter + * + * @return + * - \ref NVML_SUCCESS if \a count has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a bitTyp,e \a counterType or \a locationType is + * invalid, or \a count is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support ECC error reporting in the specified memory + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMemoryErrorCounter(nvmlDevice_t device, nvmlMemoryErrorType_t errorType, + nvmlEccCounterType_t counterType, + nvmlMemoryLocation_t locationType, unsigned long long *count); + +/** + * Retrieves the current utilization rates for the device's major subsystems. + * + * For Fermi &tm; or newer fully supported devices. + * + * See \ref nvmlUtilization_t for details on available utilization rates. + * + * \note During driver initialization when ECC is enabled one can see high GPU and Memory Utilization readings. + * This is caused by ECC Memory Scrubbing mechanism that is performed during driver initialization. + * + * @note On MIG-enabled GPUs, querying device utilization rates is not currently supported. + * + * @param device The identifier of the target device + * @param utilization Reference in which to return the utilization information + * + * @return + * - \ref NVML_SUCCESS if \a utilization has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a utilization is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetUtilizationRates(nvmlDevice_t device, nvmlUtilization_t *utilization); + +/** + * Retrieves the current utilization and sampling size in microseconds for the Encoder + * + * For Kepler &tm; or newer fully supported devices. + * + * @note On MIG-enabled GPUs, querying encoder utilization is not currently supported. + * + * @param device The identifier of the target device + * @param utilization Reference to an unsigned int for encoder utilization info + * @param samplingPeriodUs Reference to an unsigned int for the sampling period in US + * + * @return + * - \ref NVML_SUCCESS if \a utilization has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a utilization is NULL, or \a samplingPeriodUs is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetEncoderUtilization(nvmlDevice_t device, unsigned int *utilization, unsigned int *samplingPeriodUs); + +/** + * Retrieves the current capacity of the device's encoder, as a percentage of maximum encoder capacity with valid values in the range 0-100. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param encoderQueryType Type of encoder to query + * @param encoderCapacity Reference to an unsigned int for the encoder capacity + * + * @return + * - \ref NVML_SUCCESS if \a encoderCapacity is fetched + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a encoderCapacity is NULL, or \a device or \a encoderQueryType + * are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if device does not support the encoder specified in \a encodeQueryType + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetEncoderCapacity (nvmlDevice_t device, nvmlEncoderType_t encoderQueryType, unsigned int *encoderCapacity); + +/** + * Retrieves the current encoder statistics for a given device. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param sessionCount Reference to an unsigned int for count of active encoder sessions + * @param averageFps Reference to an unsigned int for trailing average FPS of all active sessions + * @param averageLatency Reference to an unsigned int for encode latency in microseconds + * + * @return + * - \ref NVML_SUCCESS if \a sessionCount, \a averageFps and \a averageLatency is fetched + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a sessionCount, or \a device or \a averageFps, + * or \a averageLatency is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetEncoderStats (nvmlDevice_t device, unsigned int *sessionCount, + unsigned int *averageFps, unsigned int *averageLatency); + +/** + * Retrieves information about active encoder sessions on a target device. + * + * An array of active encoder sessions is returned in the caller-supplied buffer pointed at by \a sessionInfos. The + * array elememt count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions + * written to the buffer. + * + * If the supplied buffer is not large enough to accomodate the active session array, the function returns + * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlEncoderSessionInfo_t array required in \a sessionCount. + * To query the number of active encoder sessions, call this function with *sessionCount = 0. The code will return + * NVML_SUCCESS with number of active encoder sessions updated in *sessionCount. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param sessionCount Reference to caller supplied array size, and returns the number of sessions. + * @param sessionInfos Reference in which to return the session information + * + * @return + * - \ref NVML_SUCCESS if \a sessionInfos is fetched + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a sessionCount is too small, array element count is returned in \a sessionCount + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a sessionCount is NULL. + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by \a device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetEncoderSessions(nvmlDevice_t device, unsigned int *sessionCount, nvmlEncoderSessionInfo_t *sessionInfos); + +/** + * Retrieves the current utilization and sampling size in microseconds for the Decoder + * + * For Kepler &tm; or newer fully supported devices. + * + * @note On MIG-enabled GPUs, querying decoder utilization is not currently supported. + * + * @param device The identifier of the target device + * @param utilization Reference to an unsigned int for decoder utilization info + * @param samplingPeriodUs Reference to an unsigned int for the sampling period in US + * + * @return + * - \ref NVML_SUCCESS if \a utilization has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a utilization is NULL, or \a samplingPeriodUs is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDecoderUtilization(nvmlDevice_t device, unsigned int *utilization, unsigned int *samplingPeriodUs); + +/** +* Retrieves the active frame buffer capture sessions statistics for a given device. +* +* For Maxwell &tm; or newer fully supported devices. +* +* @param device The identifier of the target device +* @param fbcStats Reference to nvmlFBCStats_t structure contianing NvFBC stats +* +* @return +* - \ref NVML_SUCCESS if \a fbcStats is fetched +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a fbcStats is NULL +* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlDeviceGetFBCStats(nvmlDevice_t device, nvmlFBCStats_t *fbcStats); + +/** +* Retrieves information about active frame buffer capture sessions on a target device. +* +* An array of active FBC sessions is returned in the caller-supplied buffer pointed at by \a sessionInfo. The +* array element count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions +* written to the buffer. +* +* If the supplied buffer is not large enough to accomodate the active session array, the function returns +* NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlFBCSessionInfo_t array required in \a sessionCount. +* To query the number of active FBC sessions, call this function with *sessionCount = 0. The code will return +* NVML_SUCCESS with number of active FBC sessions updated in *sessionCount. +* +* For Maxwell &tm; or newer fully supported devices. +* +* @note hResolution, vResolution, averageFPS and averageLatency data for a FBC session returned in \a sessionInfo may +* be zero if there are no new frames captured since the session started. +* +* @param device The identifier of the target device +* @param sessionCount Reference to caller supplied array size, and returns the number of sessions. +* @param sessionInfo Reference in which to return the session information +* +* @return +* - \ref NVML_SUCCESS if \a sessionInfo is fetched +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a sessionCount is too small, array element count is returned in \a sessionCount +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a sessionCount is NULL. +* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlDeviceGetFBCSessions(nvmlDevice_t device, unsigned int *sessionCount, nvmlFBCSessionInfo_t *sessionInfo); + +/** + * Retrieves the current and pending driver model for the device. + * + * For Fermi &tm; or newer fully supported devices. + * For windows only. + * + * On Windows platforms the device driver can run in either WDDM or WDM (TCC) mode. If a display is attached + * to the device it must run in WDDM mode. TCC mode is preferred if a display is not attached. + * + * See \ref nvmlDriverModel_t for details on available driver models. + * + * @param device The identifier of the target device + * @param current Reference in which to return the current driver model + * @param pending Reference in which to return the pending driver model + * + * @return + * - \ref NVML_SUCCESS if either \a current and/or \a pending have been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or both \a current and \a pending are NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the platform is not windows + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceSetDriverModel() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDriverModel(nvmlDevice_t device, nvmlDriverModel_t *current, nvmlDriverModel_t *pending); + +/** + * Get VBIOS version of the device. + * + * For all products. + * + * The VBIOS version may change from time to time. It will not exceed 32 characters in length + * (including the NULL terminator). See \ref nvmlConstants::NVML_DEVICE_VBIOS_VERSION_BUFFER_SIZE. + * + * @param device The identifier of the target device + * @param version Reference to which to return the VBIOS version + * @param length The maximum allowed length of the string returned in \a version + * + * @return + * - \ref NVML_SUCCESS if \a version has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a version is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVbiosVersion(nvmlDevice_t device, char *version, unsigned int length); + +/** + * Get Bridge Chip Information for all the bridge chips on the board. + * + * For all fully supported products. + * Only applicable to multi-GPU products. + * + * @param device The identifier of the target device + * @param bridgeHierarchy Reference to the returned bridge chip Hierarchy + * + * @return + * - \ref NVML_SUCCESS if bridge chip exists + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a bridgeInfo is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if bridge chip not supported on the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetBridgeChipInfo(nvmlDevice_t device, nvmlBridgeChipHierarchy_t *bridgeHierarchy); + +/** + * Get information about processes with a compute context on a device + * + * For Fermi &tm; or newer fully supported devices. + * + * This function returns information only about compute running processes (e.g. CUDA application which have + * active context). Any graphics applications (e.g. using OpenGL, DirectX) won't be listed by this function. + * + * To query the current number of running compute processes, call this function with *infoCount = 0. The + * return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call + * \a infos is allowed to be NULL. + * + * The usedGpuMemory field returned is all of the memory used by the application. + * + * Keep in mind that information returned by this call is dynamic and the number of elements might change in + * time. Allocate more space for \a infos table in case new compute processes are spawned. + * + * @note In MIG mode, if device handle is provided, the API returns aggregate information, only if + * the caller has appropriate privileges. Per-instance information can be queried by using + * specific MIG device handles. + * Querying per-instance information using MIG device handles is not supported if the device is in vGPU Host virtualization mode. + * + * @param device The device handle or MIG device handle + * @param infoCount Reference in which to provide the \a infos array size, and + * to return the number of returned elements + * @param infos Reference in which to return the process information + * + * @return + * - \ref NVML_SUCCESS if \a infoCount and \a infos have been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a infoCount indicates that the \a infos array is too small + * \a infoCount will contain minimal amount of space necessary for + * the call to complete + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, either of \a infoCount or \a infos is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by \a device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see \ref nvmlSystemGetProcessName + */ +nvmlReturn_t DECLDIR nvmlDeviceGetComputeRunningProcesses_v3(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_t *infos); + +/** + * Get information about processes with a graphics context on a device + * + * For Kepler &tm; or newer fully supported devices. + * + * This function returns information only about graphics based processes + * (eg. applications using OpenGL, DirectX) + * + * To query the current number of running graphics processes, call this function with *infoCount = 0. The + * return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call + * \a infos is allowed to be NULL. + * + * The usedGpuMemory field returned is all of the memory used by the application. + * + * Keep in mind that information returned by this call is dynamic and the number of elements might change in + * time. Allocate more space for \a infos table in case new graphics processes are spawned. + * + * @note In MIG mode, if device handle is provided, the API returns aggregate information, only if + * the caller has appropriate privileges. Per-instance information can be queried by using + * specific MIG device handles. + * Querying per-instance information using MIG device handles is not supported if the device is in vGPU Host virtualization mode. + * + * @param device The device handle or MIG device handle + * @param infoCount Reference in which to provide the \a infos array size, and + * to return the number of returned elements + * @param infos Reference in which to return the process information + * + * @return + * - \ref NVML_SUCCESS if \a infoCount and \a infos have been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a infoCount indicates that the \a infos array is too small + * \a infoCount will contain minimal amount of space necessary for + * the call to complete + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, either of \a infoCount or \a infos is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by \a device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see \ref nvmlSystemGetProcessName + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGraphicsRunningProcesses_v3(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_t *infos); + +/** + * Get information about processes with a MPS compute context on a device + * + * For Volta &tm; or newer fully supported devices. + * + * This function returns information only about compute running processes (e.g. CUDA application which have + * active context) utilizing MPS. Any graphics applications (e.g. using OpenGL, DirectX) won't be listed by + * this function. + * + * To query the current number of running compute processes, call this function with *infoCount = 0. The + * return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call + * \a infos is allowed to be NULL. + * + * The usedGpuMemory field returned is all of the memory used by the application. + * + * Keep in mind that information returned by this call is dynamic and the number of elements might change in + * time. Allocate more space for \a infos table in case new compute processes are spawned. + * + * @note In MIG mode, if device handle is provided, the API returns aggregate information, only if + * the caller has appropriate privileges. Per-instance information can be queried by using + * specific MIG device handles. + * Querying per-instance information using MIG device handles is not supported if the device is in vGPU Host virtualization mode. + * + * @param device The device handle or MIG device handle + * @param infoCount Reference in which to provide the \a infos array size, and + * to return the number of returned elements + * @param infos Reference in which to return the process information + * + * @return + * - \ref NVML_SUCCESS if \a infoCount and \a infos have been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a infoCount indicates that the \a infos array is too small + * \a infoCount will contain minimal amount of space necessary for + * the call to complete + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, either of \a infoCount or \a infos is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by \a device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see \ref nvmlSystemGetProcessName + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMPSComputeRunningProcesses_v3(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_t *infos); + +/** + * Check if the GPU devices are on the same physical board. + * + * For all fully supported products. + * + * @param device1 The first GPU device + * @param device2 The second GPU device + * @param onSameBoard Reference in which to return the status. + * Non-zero indicates that the GPUs are on the same board. + * + * @return + * - \ref NVML_SUCCESS if \a onSameBoard has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a dev1 or \a dev2 are invalid or \a onSameBoard is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this check is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the either GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceOnSameBoard(nvmlDevice_t device1, nvmlDevice_t device2, int *onSameBoard); + +/** + * Retrieves the root/admin permissions on the target API. See \a nvmlRestrictedAPI_t for the list of supported APIs. + * If an API is restricted only root users can call that API. See \a nvmlDeviceSetAPIRestriction to change current permissions. + * + * For all fully supported products. + * + * @param device The identifier of the target device + * @param apiType Target API type for this operation + * @param isRestricted Reference in which to return the current restriction + * NVML_FEATURE_ENABLED indicates that the API is root-only + * NVML_FEATURE_DISABLED indicates that the API is accessible to all users + * + * @return + * - \ref NVML_SUCCESS if \a isRestricted has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a apiType incorrect or \a isRestricted is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device or the device does not support + * the feature that is being queried (E.G. Enabling/disabling Auto Boosted clocks is + * not supported by the device) + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlRestrictedAPI_t + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAPIRestriction(nvmlDevice_t device, nvmlRestrictedAPI_t apiType, nvmlEnableState_t *isRestricted); + +/** + * Gets recent samples for the GPU. + * + * For Kepler &tm; or newer fully supported devices. + * + * Based on type, this method can be used to fetch the power, utilization or clock samples maintained in the buffer by + * the driver. + * + * Power, Utilization and Clock samples are returned as type "unsigned int" for the union nvmlValue_t. + * + * To get the size of samples that user needs to allocate, the method is invoked with samples set to NULL. + * The returned samplesCount will provide the number of samples that can be queried. The user needs to + * allocate the buffer with size as samplesCount * sizeof(nvmlSample_t). + * + * lastSeenTimeStamp represents CPU timestamp in microseconds. Set it to 0 to fetch all the samples maintained by the + * underlying buffer. Set lastSeenTimeStamp to one of the timeStamps retrieved from the date of the previous query + * to get more recent samples. + * + * This method fetches the number of entries which can be accommodated in the provided samples array, and the + * reference samplesCount is updated to indicate how many samples were actually retrieved. The advantage of using this + * method for samples in contrast to polling via existing methods is to get get higher frequency data at lower polling cost. + * + * @note On MIG-enabled GPUs, querying the following sample types, NVML_GPU_UTILIZATION_SAMPLES, NVML_MEMORY_UTILIZATION_SAMPLES + * NVML_ENC_UTILIZATION_SAMPLES and NVML_DEC_UTILIZATION_SAMPLES, is not currently supported. + * + * @param device The identifier for the target device + * @param type Type of sampling event + * @param lastSeenTimeStamp Return only samples with timestamp greater than lastSeenTimeStamp. + * @param sampleValType Output parameter to represent the type of sample value as described in nvmlSampleVal_t + * @param sampleCount Reference to provide the number of elements which can be queried in samples array + * @param samples Reference in which samples are returned + + * @return + * - \ref NVML_SUCCESS if samples are successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a samplesCount is NULL or + * reference to \a sampleCount is 0 for non null \a samples + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_FOUND if sample entries are not found + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSamples(nvmlDevice_t device, nvmlSamplingType_t type, unsigned long long lastSeenTimeStamp, + nvmlValueType_t *sampleValType, unsigned int *sampleCount, nvmlSample_t *samples); + +/** + * Gets Total, Available and Used size of BAR1 memory. + * + * BAR1 is used to map the FB (device memory) so that it can be directly accessed by the CPU or by 3rd party + * devices (peer-to-peer on the PCIE bus). + * + * @note In MIG mode, if device handle is provided, the API returns aggregate + * information, only if the caller has appropriate privileges. Per-instance + * information can be queried by using specific MIG device handles. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param bar1Memory Reference in which BAR1 memory + * information is returned. + * + * @return + * - \ref NVML_SUCCESS if BAR1 memory is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a bar1Memory is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetBAR1MemoryInfo(nvmlDevice_t device, nvmlBAR1Memory_t *bar1Memory); + +/** + * Gets the duration of time during which the device was throttled (lower than requested clocks) due to power + * or thermal constraints. + * + * The method is important to users who are tying to understand if their GPUs throttle at any point during their applications. The + * difference in violation times at two different reference times gives the indication of GPU throttling event. + * + * Violation for thermal capping is not supported at this time. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param perfPolicyType Represents Performance policy which can trigger GPU throttling + * @param violTime Reference to which violation time related information is returned + * + * + * @return + * - \ref NVML_SUCCESS if violation time is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a perfPolicyType is invalid, or \a violTime is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetViolationStatus(nvmlDevice_t device, nvmlPerfPolicyType_t perfPolicyType, nvmlViolationTime_t *violTime); + +/** + * Gets the device's interrupt number + * + * @param device The identifier of the target device + * @param irqNum The interrupt number associated with the specified device + * + * @return + * - \ref NVML_SUCCESS if irq number is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a irqNum is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetIrqNum(nvmlDevice_t device, unsigned int *irqNum); + +/** + * Gets the device's core count + * + * @param device The identifier of the target device + * @param numCores The number of cores for the specified device + * + * @return + * - \ref NVML_SUCCESS if Gpu core count is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a numCores is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNumGpuCores(nvmlDevice_t device, unsigned int *numCores); + +/** + * Gets the devices power source + * + * @param device The identifier of the target device + * @param powerSource The power source of the device + * + * @return + * - \ref NVML_SUCCESS if the current power source was successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a powerSource is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPowerSource(nvmlDevice_t device, nvmlPowerSource_t *powerSource); + +/** + * Gets the device's memory bus width + * + * @param device The identifier of the target device + * @param busWidth The devices's memory bus width + * + * @return + * - \ref NVML_SUCCESS if the memory bus width is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a busWidth is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMemoryBusWidth(nvmlDevice_t device, unsigned int *busWidth); + +/** + * Gets the device's PCIE Max Link speed in MBPS + * + * @param device The identifier of the target device + * @param maxSpeed The devices's PCIE Max Link speed in MBPS + * + * @return + * - \ref NVML_SUCCESS if Pcie Max Link Speed is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a maxSpeed is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPcieLinkMaxSpeed(nvmlDevice_t device, unsigned int *maxSpeed); + +/** + * Gets the device's PCIe Link speed in Mbps + * + * @param device The identifier of the target device + * @param pcieSpeed The devices's PCIe Max Link speed in Mbps + * + * @return + * - \ref NVML_SUCCESS if \a pcieSpeed has been retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pcieSpeed is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support PCIe speed getting + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPcieSpeed(nvmlDevice_t device, unsigned int *pcieSpeed); + +/** + * Gets the device's Adaptive Clock status + * + * @param device The identifier of the target device + * @param adaptiveClockStatus The current adaptive clocking status + * + * @return + * - \ref NVML_SUCCESS if the current adaptive clocking status is successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a adaptiveClockStatus is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAdaptiveClockInfoStatus(nvmlDevice_t device, unsigned int *adaptiveClockStatus); + +/** + * @} + */ + +/** @addtogroup nvmlAccountingStats + * @{ + */ + +/** + * Queries the state of per process accounting mode. + * + * For Kepler &tm; or newer fully supported devices. + * + * See \ref nvmlDeviceGetAccountingStats for more details. + * See \ref nvmlDeviceSetAccountingMode + * + * @param device The identifier of the target device + * @param mode Reference in which to return the current accounting mode + * + * @return + * - \ref NVML_SUCCESS if the mode has been successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode are NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAccountingMode(nvmlDevice_t device, nvmlEnableState_t *mode); + +/** + * Queries process's accounting stats. + * + * For Kepler &tm; or newer fully supported devices. + * + * Accounting stats capture GPU utilization and other statistics across the lifetime of a process. + * Accounting stats can be queried during life time of the process and after its termination. + * The time field in \ref nvmlAccountingStats_t is reported as 0 during the lifetime of the process and + * updated to actual running time after its termination. + * Accounting stats are kept in a circular buffer, newly created processes overwrite information about old + * processes. + * + * See \ref nvmlAccountingStats_t for description of each returned metric. + * List of processes that can be queried can be retrieved from \ref nvmlDeviceGetAccountingPids. + * + * @note Accounting Mode needs to be on. See \ref nvmlDeviceGetAccountingMode. + * @note Only compute and graphics applications stats can be queried. Monitoring applications stats can't be + * queried since they don't contribute to GPU utilization. + * @note In case of pid collision stats of only the latest process (that terminated last) will be reported + * + * @warning On Kepler devices per process statistics are accurate only if there's one process running on a GPU. + * + * @param device The identifier of the target device + * @param pid Process Id of the target process to query stats for + * @param stats Reference in which to return the process's accounting stats + * + * @return + * - \ref NVML_SUCCESS if stats have been successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a stats are NULL + * - \ref NVML_ERROR_NOT_FOUND if process stats were not found + * - \ref NVML_ERROR_NOT_SUPPORTED if \a device doesn't support this feature or accounting mode is disabled + * or on vGPU host. + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetAccountingBufferSize + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAccountingStats(nvmlDevice_t device, unsigned int pid, nvmlAccountingStats_t *stats); + +/** + * Queries list of processes that can be queried for accounting stats. The list of processes returned + * can be in running or terminated state. + * + * For Kepler &tm; or newer fully supported devices. + * + * To just query the number of processes ready to be queried, call this function with *count = 0 and + * pids=NULL. The return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if list is empty. + * + * For more details see \ref nvmlDeviceGetAccountingStats. + * + * @note In case of PID collision some processes might not be accessible before the circular buffer is full. + * + * @param device The identifier of the target device + * @param count Reference in which to provide the \a pids array size, and + * to return the number of elements ready to be queried + * @param pids Reference in which to return list of process ids + * + * @return + * - \ref NVML_SUCCESS if pids were successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a count is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if \a device doesn't support this feature or accounting mode is disabled + * or on vGPU host. + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a count is too small (\a count is set to + * expected value) + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetAccountingBufferSize + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAccountingPids(nvmlDevice_t device, unsigned int *count, unsigned int *pids); + +/** + * Returns the number of processes that the circular buffer with accounting pids can hold. + * + * For Kepler &tm; or newer fully supported devices. + * + * This is the maximum number of processes that accounting information will be stored for before information + * about oldest processes will get overwritten by information about new processes. + * + * @param device The identifier of the target device + * @param bufferSize Reference in which to provide the size (in number of elements) + * of the circular buffer for accounting stats. + * + * @return + * - \ref NVML_SUCCESS if buffer size was successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a bufferSize is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature or accounting mode is disabled + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetAccountingStats + * @see nvmlDeviceGetAccountingPids + */ +nvmlReturn_t DECLDIR nvmlDeviceGetAccountingBufferSize(nvmlDevice_t device, unsigned int *bufferSize); + +/** @} */ + +/** @addtogroup nvmlDeviceQueries + * @{ + */ + +/** + * Returns the list of retired pages by source, including pages that are pending retirement + * The address information provided from this API is the hardware address of the page that was retired. Note + * that this does not match the virtual address used in CUDA, but will match the address information in XID 63 + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param cause Filter page addresses by cause of retirement + * @param pageCount Reference in which to provide the \a addresses buffer size, and + * to return the number of retired pages that match \a cause + * Set to 0 to query the size without allocating an \a addresses buffer + * @param addresses Buffer to write the page addresses into + * + * @return + * - \ref NVML_SUCCESS if \a pageCount was populated and \a addresses was filled + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a pageCount indicates the buffer is not large enough to store all the + * matching page addresses. \a pageCount is set to the needed size. + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a pageCount is NULL, \a cause is invalid, or + * \a addresses is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetRetiredPages(nvmlDevice_t device, nvmlPageRetirementCause_t cause, + unsigned int *pageCount, unsigned long long *addresses); + +/** + * Returns the list of retired pages by source, including pages that are pending retirement + * The address information provided from this API is the hardware address of the page that was retired. Note + * that this does not match the virtual address used in CUDA, but will match the address information in XID 63 + * + * \note nvmlDeviceGetRetiredPages_v2 adds an additional timestamps paramter to return the time of each page's + * retirement. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param cause Filter page addresses by cause of retirement + * @param pageCount Reference in which to provide the \a addresses buffer size, and + * to return the number of retired pages that match \a cause + * Set to 0 to query the size without allocating an \a addresses buffer + * @param addresses Buffer to write the page addresses into + * @param timestamps Buffer to write the timestamps of page retirement, additional for _v2 + * + * @return + * - \ref NVML_SUCCESS if \a pageCount was populated and \a addresses was filled + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a pageCount indicates the buffer is not large enough to store all the + * matching page addresses. \a pageCount is set to the needed size. + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a pageCount is NULL, \a cause is invalid, or + * \a addresses is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetRetiredPages_v2(nvmlDevice_t device, nvmlPageRetirementCause_t cause, + unsigned int *pageCount, unsigned long long *addresses, unsigned long long *timestamps); + +/** + * Check if any pages are pending retirement and need a reboot to fully retire. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param isPending Reference in which to return the pending status + * + * @return + * - \ref NVML_SUCCESS if \a isPending was populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a isPending is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetRetiredPagesPendingStatus(nvmlDevice_t device, nvmlEnableState_t *isPending); + +/** + * Get number of remapped rows. The number of rows reported will be based on + * the cause of the remapping. isPending indicates whether or not there are + * pending remappings. A reset will be required to actually remap the row. + * failureOccurred will be set if a row remapping ever failed in the past. A + * pending remapping won't affect future work on the GPU since + * error-containment and dynamic page blacklisting will take care of that. + * + * @note On MIG-enabled GPUs with active instances, querying the number of + * remapped rows is not supported + * + * For Ampere &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param corrRows Reference for number of rows remapped due to correctable errors + * @param uncRows Reference for number of rows remapped due to uncorrectable errors + * @param isPending Reference for whether or not remappings are pending + * @param failureOccurred Reference that is set when a remapping has failed in the past + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a corrRows, \a uncRows, \a isPending or \a failureOccurred is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If MIG is enabled or if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN Unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetRemappedRows(nvmlDevice_t device, unsigned int *corrRows, unsigned int *uncRows, + unsigned int *isPending, unsigned int *failureOccurred); + +/** + * Get the row remapper histogram. Returns the remap availability for each bank + * on the GPU. + * + * @param device Device handle + * @param values Histogram values + * + * @return + * - \ref NVML_SUCCESS On success + * - \ref NVML_ERROR_UNKNOWN On any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetRowRemapperHistogram(nvmlDevice_t device, nvmlRowRemapperHistogramValues_t *values); + +/** + * Get architecture for device + * + * @param device The identifier of the target device + * @param arch Reference where architecture is returned, if call successful. + * Set to NVML_DEVICE_ARCH_* upon success + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device or \a arch (output refererence) are invalid + */ +nvmlReturn_t DECLDIR nvmlDeviceGetArchitecture(nvmlDevice_t device, nvmlDeviceArchitecture_t *arch); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlUnitCommands Unit Commands + * This chapter describes NVML operations that change the state of the unit. For S-class products. + * Each of these requires root/admin access. Non-admin users will see an NVML_ERROR_NO_PERMISSION + * error code when invoking any of these methods. + * @{ + */ +/***************************************************************************************************/ + +/** + * Set the LED state for the unit. The LED can be either green (0) or amber (1). + * + * For S-class products. + * Requires root/admin permissions. + * + * This operation takes effect immediately. + * + * + * Current S-Class products don't provide unique LEDs for each unit. As such, both front + * and back LEDs will be toggled in unison regardless of which unit is specified with this command. + * + * See \ref nvmlLedColor_t for available colors. + * + * @param unit The identifier of the target unit + * @param color The target LED color + * + * @return + * - \ref NVML_SUCCESS if the LED color has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a unit or \a color is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if this is not an S-class product + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlUnitGetLedState() + */ +nvmlReturn_t DECLDIR nvmlUnitSetLedState(nvmlUnit_t unit, nvmlLedColor_t color); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlDeviceCommands Device Commands + * This chapter describes NVML operations that change the state of the device. + * Each of these requires root/admin access. Non-admin users will see an NVML_ERROR_NO_PERMISSION + * error code when invoking any of these methods. + * @{ + */ +/***************************************************************************************************/ + +/** + * Set the persistence mode for the device. + * + * For all products. + * For Linux only. + * Requires root/admin permissions. + * + * The persistence mode determines whether the GPU driver software is torn down after the last client + * exits. + * + * This operation takes effect immediately. It is not persistent across reboots. After each reboot the + * persistence mode is reset to "Disabled". + * + * See \ref nvmlEnableState_t for available modes. + * + * After calling this API with mode set to NVML_FEATURE_DISABLED on a device that has its own NUMA + * memory, the given device handle will no longer be valid, and to continue to interact with this + * device, a new handle should be obtained from one of the nvmlDeviceGetHandleBy*() APIs. This + * limitation is currently only applicable to devices that have a coherent NVLink connection to + * system memory. + * + * @param device The identifier of the target device + * @param mode The target persistence mode + * + * @return + * - \ref NVML_SUCCESS if the persistence mode was set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetPersistenceMode() + */ +nvmlReturn_t DECLDIR nvmlDeviceSetPersistenceMode(nvmlDevice_t device, nvmlEnableState_t mode); + +/** + * Set the compute mode for the device. + * + * For all products. + * Requires root/admin permissions. + * + * The compute mode determines whether a GPU can be used for compute operations and whether it can + * be shared across contexts. + * + * This operation takes effect immediately. Under Linux it is not persistent across reboots and + * always resets to "Default". Under windows it is persistent. + * + * Under windows compute mode may only be set to DEFAULT when running in WDDM + * + * @note On MIG-enabled GPUs, compute mode would be set to DEFAULT and changing it is not supported. + * + * See \ref nvmlComputeMode_t for details on available compute modes. + * + * @param device The identifier of the target device + * @param mode The target compute mode + * + * @return + * - \ref NVML_SUCCESS if the compute mode was set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetComputeMode() + */ +nvmlReturn_t DECLDIR nvmlDeviceSetComputeMode(nvmlDevice_t device, nvmlComputeMode_t mode); + +/** + * Set the ECC mode for the device. + * + * For Kepler &tm; or newer fully supported devices. + * Only applicable to devices with ECC. + * Requires \a NVML_INFOROM_ECC version 1.0 or higher. + * Requires root/admin permissions. + * + * The ECC mode determines whether the GPU enables its ECC support. + * + * This operation takes effect after the next reboot. + * + * See \ref nvmlEnableState_t for details on available modes. + * + * @param device The identifier of the target device + * @param ecc The target ECC mode + * + * @return + * - \ref NVML_SUCCESS if the ECC mode was set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a ecc is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetEccMode() + */ +nvmlReturn_t DECLDIR nvmlDeviceSetEccMode(nvmlDevice_t device, nvmlEnableState_t ecc); + +/** + * Clear the ECC error and other memory error counts for the device. + * + * For Kepler &tm; or newer fully supported devices. + * Only applicable to devices with ECC. + * Requires \a NVML_INFOROM_ECC version 2.0 or higher to clear aggregate location-based ECC counts. + * Requires \a NVML_INFOROM_ECC version 1.0 or higher to clear all other ECC counts. + * Requires root/admin permissions. + * Requires ECC Mode to be enabled. + * + * Sets all of the specified ECC counters to 0, including both detailed and total counts. + * + * This operation takes effect immediately. + * + * See \ref nvmlMemoryErrorType_t for details on available counter types. + * + * @param device The identifier of the target device + * @param counterType Flag that indicates which type of errors should be cleared. + * + * @return + * - \ref NVML_SUCCESS if the error counts were cleared + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a counterType is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see + * - nvmlDeviceGetDetailedEccErrors() + * - nvmlDeviceGetTotalEccErrors() + */ +nvmlReturn_t DECLDIR nvmlDeviceClearEccErrorCounts(nvmlDevice_t device, nvmlEccCounterType_t counterType); + +/** + * Set the driver model for the device. + * + * For Fermi &tm; or newer fully supported devices. + * For windows only. + * Requires root/admin permissions. + * + * On Windows platforms the device driver can run in either WDDM or WDM (TCC) mode. If a display is attached + * to the device it must run in WDDM mode. + * + * It is possible to force the change to WDM (TCC) while the display is still attached with a force flag (nvmlFlagForce). + * This should only be done if the host is subsequently powered down and the display is detached from the device + * before the next reboot. + * + * This operation takes effect after the next reboot. + * + * Windows driver model may only be set to WDDM when running in DEFAULT compute mode. + * + * Change driver model to WDDM is not supported when GPU doesn't support graphics acceleration or + * will not support it after reboot. See \ref nvmlDeviceSetGpuOperationMode. + * + * See \ref nvmlDriverModel_t for details on available driver models. + * See \ref nvmlFlagDefault and \ref nvmlFlagForce + * + * @param device The identifier of the target device + * @param driverModel The target driver model + * @param flags Flags that change the default behavior + * + * @return + * - \ref NVML_SUCCESS if the driver model has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a driverModel is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the platform is not windows or the device does not support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetDriverModel() + */ +nvmlReturn_t DECLDIR nvmlDeviceSetDriverModel(nvmlDevice_t device, nvmlDriverModel_t driverModel, unsigned int flags); + +typedef enum nvmlClockLimitId_enum { + NVML_CLOCK_LIMIT_ID_RANGE_START = 0xffffff00, + NVML_CLOCK_LIMIT_ID_TDP, + NVML_CLOCK_LIMIT_ID_UNLIMITED +} nvmlClockLimitId_t; + +/** + * Set clocks that device will lock to. + * + * Sets the clocks that the device will be running at to the value in the range of minGpuClockMHz to maxGpuClockMHz. + * Setting this will supercede application clock values and take effect regardless if a cuda app is running. + * See /ref nvmlDeviceSetApplicationsClocks + * + * Can be used as a setting to request constant performance. + * + * This can be called with a pair of integer clock frequencies in MHz, or a pair of /ref nvmlClockLimitId_t values. + * See the table below for valid combinations of these values. + * + * minGpuClock | maxGpuClock | Effect + * ------------+-------------+-------------------------------------------------- + * tdp | tdp | Lock clock to TDP + * unlimited | tdp | Upper bound is TDP but clock may drift below this + * tdp | unlimited | Lower bound is TDP but clock may boost above this + * unlimited | unlimited | Unlocked (== nvmlDeviceResetGpuLockedClocks) + * + * If one arg takes one of these values, the other must be one of these values as + * well. Mixed numeric and symbolic calls return NVML_ERROR_INVALID_ARGUMENT. + * + * Requires root/admin permissions. + * + * After system reboot or driver reload applications clocks go back to their default value. + * See \ref nvmlDeviceResetGpuLockedClocks. + * + * For Volta &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param minGpuClockMHz Requested minimum gpu clock in MHz + * @param maxGpuClockMHz Requested maximum gpu clock in MHz + * + * @return + * - \ref NVML_SUCCESS if new settings were successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a minGpuClockMHz and \a maxGpuClockMHz + * is not a valid clock combination + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetGpuLockedClocks(nvmlDevice_t device, unsigned int minGpuClockMHz, unsigned int maxGpuClockMHz); + +/** + * Resets the gpu clock to the default value + * + * This is the gpu clock that will be used after system reboot or driver reload. + * Default values are idle clocks, but the current values can be changed using \ref nvmlDeviceSetApplicationsClocks. + * + * @see nvmlDeviceSetGpuLockedClocks + * + * For Volta &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * + * @return + * - \ref NVML_SUCCESS if new settings were successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceResetGpuLockedClocks(nvmlDevice_t device); + +/** + * Set memory clocks that device will lock to. + * + * Sets the device's memory clocks to the value in the range of minMemClockMHz to maxMemClockMHz. + * Setting this will supersede application clock values and take effect regardless of whether a cuda app is running. + * See /ref nvmlDeviceSetApplicationsClocks + * + * Can be used as a setting to request constant performance. + * + * Requires root/admin permissions. + * + * After system reboot or driver reload applications clocks go back to their default value. + * See \ref nvmlDeviceResetMemoryLockedClocks. + * + * For Ampere &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param minMemClockMHz Requested minimum memory clock in MHz + * @param maxMemClockMHz Requested maximum memory clock in MHz + * + * @return + * - \ref NVML_SUCCESS if new settings were successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a minGpuClockMHz and \a maxGpuClockMHz + * is not a valid clock combination + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetMemoryLockedClocks(nvmlDevice_t device, unsigned int minMemClockMHz, unsigned int maxMemClockMHz); + +/** + * Resets the memory clock to the default value + * + * This is the memory clock that will be used after system reboot or driver reload. + * Default values are idle clocks, but the current values can be changed using \ref nvmlDeviceSetApplicationsClocks. + * + * @see nvmlDeviceSetMemoryLockedClocks + * + * For Ampere &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * + * @return + * - \ref NVML_SUCCESS if new settings were successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceResetMemoryLockedClocks(nvmlDevice_t device); + +/** + * Set clocks that applications will lock to. + * + * Sets the clocks that compute and graphics applications will be running at. + * e.g. CUDA driver requests these clocks during context creation which means this property + * defines clocks at which CUDA applications will be running unless some overspec event + * occurs (e.g. over power, over thermal or external HW brake). + * + * Can be used as a setting to request constant performance. + * + * On Pascal and newer hardware, this will automatically disable automatic boosting of clocks. + * + * On K80 and newer Kepler and Maxwell GPUs, users desiring fixed performance should also call + * \ref nvmlDeviceSetAutoBoostedClocksEnabled to prevent clocks from automatically boosting + * above the clock value being set. + * + * For Kepler &tm; or newer non-GeForce fully supported devices and Maxwell or newer GeForce devices. + * Requires root/admin permissions. + * + * See \ref nvmlDeviceGetSupportedMemoryClocks and \ref nvmlDeviceGetSupportedGraphicsClocks + * for details on how to list available clocks combinations. + * + * After system reboot or driver reload applications clocks go back to their default value. + * See \ref nvmlDeviceResetApplicationsClocks. + * + * @param device The identifier of the target device + * @param memClockMHz Requested memory clock in MHz + * @param graphicsClockMHz Requested graphics clock in MHz + * + * @return + * - \ref NVML_SUCCESS if new settings were successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a memClockMHz and \a graphicsClockMHz + * is not a valid clock combination + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetApplicationsClocks(nvmlDevice_t device, unsigned int memClockMHz, unsigned int graphicsClockMHz); + +/** + * Retrieves the frequency monitor fault status for the device. + * + * For Ampere &tm; or newer fully supported devices. + * Requires root user. + * + * See \ref nvmlClkMonStatus_t for details on decoding the status output. + * + * @param device The identifier of the target device + * @param status Reference in which to return the clkmon fault status + * + * @return + * - \ref NVML_SUCCESS if \a status has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a status is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetClkMonStatus() + */ +nvmlReturn_t DECLDIR nvmlDeviceGetClkMonStatus(nvmlDevice_t device, nvmlClkMonStatus_t *status); + +/** + * Set new power limit of this device. + * + * For Kepler &tm; or newer fully supported devices. + * Requires root/admin permissions. + * + * See \ref nvmlDeviceGetPowerManagementLimitConstraints to check the allowed ranges of values. + * + * \note Limit is not persistent across reboots or driver unloads. + * Enable persistent mode to prevent driver from unloading when no application is using the device. + * + * @param device The identifier of the target device + * @param limit Power management limit in milliwatts to set + * + * @return + * - \ref NVML_SUCCESS if \a limit has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a defaultLimit is out of range + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceGetPowerManagementLimitConstraints + * @see nvmlDeviceGetPowerManagementDefaultLimit + */ +nvmlReturn_t DECLDIR nvmlDeviceSetPowerManagementLimit(nvmlDevice_t device, unsigned int limit); + +/** + * Sets new GOM. See \a nvmlGpuOperationMode_t for details. + * + * For GK110 M-class and X-class Tesla &tm; products from the Kepler family. + * Modes \ref NVML_GOM_LOW_DP and \ref NVML_GOM_ALL_ON are supported on fully supported GeForce products. + * Not supported on Quadro ® and Tesla &tm; C-class products. + * Requires root/admin permissions. + * + * Changing GOMs requires a reboot. + * The reboot requirement might be removed in the future. + * + * Compute only GOMs don't support graphics acceleration. Under windows switching to these GOMs when + * pending driver model is WDDM is not supported. See \ref nvmlDeviceSetDriverModel. + * + * @param device The identifier of the target device + * @param mode Target GOM + * + * @return + * - \ref NVML_SUCCESS if \a mode has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a mode incorrect + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support GOM or specific mode + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlGpuOperationMode_t + * @see nvmlDeviceGetGpuOperationMode + */ +nvmlReturn_t DECLDIR nvmlDeviceSetGpuOperationMode(nvmlDevice_t device, nvmlGpuOperationMode_t mode); + +/** + * Changes the root/admin restructions on certain APIs. See \a nvmlRestrictedAPI_t for the list of supported APIs. + * This method can be used by a root/admin user to give non-root/admin access to certain otherwise-restricted APIs. + * The new setting lasts for the lifetime of the NVIDIA driver; it is not persistent. See \a nvmlDeviceGetAPIRestriction + * to query the current restriction settings. + * + * For Kepler &tm; or newer fully supported devices. + * Requires root/admin permissions. + * + * @param device The identifier of the target device + * @param apiType Target API type for this operation + * @param isRestricted The target restriction + * + * @return + * - \ref NVML_SUCCESS if \a isRestricted has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a apiType incorrect + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support changing API restrictions or the device does not support + * the feature that api restrictions are being set for (E.G. Enabling/disabling auto + * boosted clocks is not supported by the device) + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlRestrictedAPI_t + */ +nvmlReturn_t DECLDIR nvmlDeviceSetAPIRestriction(nvmlDevice_t device, nvmlRestrictedAPI_t apiType, nvmlEnableState_t isRestricted); + +/** + * @} + */ + +/** @addtogroup nvmlAccountingStats + * @{ + */ + +/** + * Enables or disables per process accounting. + * + * For Kepler &tm; or newer fully supported devices. + * Requires root/admin permissions. + * + * @note This setting is not persistent and will default to disabled after driver unloads. + * Enable persistence mode to be sure the setting doesn't switch off to disabled. + * + * @note Enabling accounting mode has no negative impact on the GPU performance. + * + * @note Disabling accounting clears all accounting pids information. + * + * @note On MIG-enabled GPUs, accounting mode would be set to DISABLED and changing it is not supported. + * + * See \ref nvmlDeviceGetAccountingMode + * See \ref nvmlDeviceGetAccountingStats + * See \ref nvmlDeviceClearAccountingPids + * + * @param device The identifier of the target device + * @param mode The target accounting mode + * + * @return + * - \ref NVML_SUCCESS if the new mode has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a mode are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetAccountingMode(nvmlDevice_t device, nvmlEnableState_t mode); + +/** + * Clears accounting information about all processes that have already terminated. + * + * For Kepler &tm; or newer fully supported devices. + * Requires root/admin permissions. + * + * See \ref nvmlDeviceGetAccountingMode + * See \ref nvmlDeviceGetAccountingStats + * See \ref nvmlDeviceSetAccountingMode + * + * @param device The identifier of the target device + * + * @return + * - \ref NVML_SUCCESS if accounting information has been cleared + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceClearAccountingPids(nvmlDevice_t device); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup NvLink NvLink Methods + * This chapter describes methods that NVML can perform on NVLINK enabled devices. + * @{ + */ +/***************************************************************************************************/ + +/** + * Retrieves the state of the device's NvLink for the link specified + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * @param isActive \a nvmlEnableState_t where NVML_FEATURE_ENABLED indicates that + * the link is active and NVML_FEATURE_DISABLED indicates it + * is inactive + * + * @return + * - \ref NVML_SUCCESS if \a isActive has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid or \a isActive is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkState(nvmlDevice_t device, unsigned int link, nvmlEnableState_t *isActive); + +/** + * Retrieves the version of the device's NvLink for the link specified + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * @param version Requested NvLink version + * + * @return + * - \ref NVML_SUCCESS if \a version has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid or \a version is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkVersion(nvmlDevice_t device, unsigned int link, unsigned int *version); + +/** + * Retrieves the requested capability from the device's NvLink for the link specified + * Please refer to the \a nvmlNvLinkCapability_t structure for the specific caps that can be queried + * The return value should be treated as a boolean. + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * @param capability Specifies the \a nvmlNvLinkCapability_t to be queried + * @param capResult A boolean for the queried capability indicating that feature is available + * + * @return + * - \ref NVML_SUCCESS if \a capResult has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, or \a capability is invalid or \a capResult is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkCapability(nvmlDevice_t device, unsigned int link, + nvmlNvLinkCapability_t capability, unsigned int *capResult); + +/** + * Retrieves the PCI information for the remote node on a NvLink link + * Note: pciSubSystemId is not filled in this function and is indeterminate + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * @param pci \a nvmlPciInfo_t of the remote node for the specified link + * + * @return + * - \ref NVML_SUCCESS if \a pci has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid or \a pci is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkRemotePciInfo_v2(nvmlDevice_t device, unsigned int link, nvmlPciInfo_t *pci); + +/** + * Retrieves the specified error counter value + * Please refer to \a nvmlNvLinkErrorCounter_t for error counters that are available + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * @param counter Specifies the NvLink counter to be queried + * @param counterValue Returned counter value + * + * @return + * - \ref NVML_SUCCESS if \a counter has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, or \a counter is invalid or \a counterValue is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkErrorCounter(nvmlDevice_t device, unsigned int link, + nvmlNvLinkErrorCounter_t counter, unsigned long long *counterValue); + +/** + * Resets all error counters to zero + * Please refer to \a nvmlNvLinkErrorCounter_t for the list of error counters that are reset + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * + * @return + * - \ref NVML_SUCCESS if the reset is successful + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceResetNvLinkErrorCounters(nvmlDevice_t device, unsigned int link); + +/** + * Deprecated: Setting utilization counter control is no longer supported. + * + * Set the NVLINK utilization counter control information for the specified counter, 0 or 1. + * Please refer to \a nvmlNvLinkUtilizationControl_t for the structure definition. Performs a reset + * of the counters if the reset parameter is non-zero. + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param counter Specifies the counter that should be set (0 or 1). + * @param link Specifies the NvLink link to be queried + * @param control A reference to the \a nvmlNvLinkUtilizationControl_t to set + * @param reset Resets the counters on set if non-zero + * + * @return + * - \ref NVML_SUCCESS if the control has been set successfully + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a counter, \a link, or \a control is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetNvLinkUtilizationControl(nvmlDevice_t device, unsigned int link, unsigned int counter, + nvmlNvLinkUtilizationControl_t *control, unsigned int reset); + +/** + * Deprecated: Getting utilization counter control is no longer supported. + * + * Get the NVLINK utilization counter control information for the specified counter, 0 or 1. + * Please refer to \a nvmlNvLinkUtilizationControl_t for the structure definition + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param counter Specifies the counter that should be set (0 or 1). + * @param link Specifies the NvLink link to be queried + * @param control A reference to the \a nvmlNvLinkUtilizationControl_t to place information + * + * @return + * - \ref NVML_SUCCESS if the control has been set successfully + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a counter, \a link, or \a control is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkUtilizationControl(nvmlDevice_t device, unsigned int link, unsigned int counter, + nvmlNvLinkUtilizationControl_t *control); + + +/** + * Deprecated: Use \ref nvmlDeviceGetFieldValues with NVML_FI_DEV_NVLINK_THROUGHPUT_* as field values instead. + * + * Retrieve the NVLINK utilization counter based on the current control for a specified counter. + * In general it is good practice to use \a nvmlDeviceSetNvLinkUtilizationControl + * before reading the utilization counters as they have no default state + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * @param counter Specifies the counter that should be read (0 or 1). + * @param rxcounter Receive counter return value + * @param txcounter Transmit counter return value + * + * @return + * - \ref NVML_SUCCESS if \a rxcounter and \a txcounter have been successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a counter, or \a link is invalid or \a rxcounter or \a txcounter are NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkUtilizationCounter(nvmlDevice_t device, unsigned int link, unsigned int counter, + unsigned long long *rxcounter, unsigned long long *txcounter); + +/** + * Deprecated: Freezing NVLINK utilization counters is no longer supported. + * + * Freeze the NVLINK utilization counters + * Both the receive and transmit counters are operated on by this function + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be queried + * @param counter Specifies the counter that should be frozen (0 or 1). + * @param freeze NVML_FEATURE_ENABLED = freeze the receive and transmit counters + * NVML_FEATURE_DISABLED = unfreeze the receive and transmit counters + * + * @return + * - \ref NVML_SUCCESS if counters were successfully frozen or unfrozen + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, \a counter, or \a freeze is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceFreezeNvLinkUtilizationCounter (nvmlDevice_t device, unsigned int link, + unsigned int counter, nvmlEnableState_t freeze); + +/** + * Deprecated: Resetting NVLINK utilization counters is no longer supported. + * + * Reset the NVLINK utilization counters + * Both the receive and transmit counters are operated on by this function + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param link Specifies the NvLink link to be reset + * @param counter Specifies the counter that should be reset (0 or 1) + * + * @return + * - \ref NVML_SUCCESS if counters were successfully reset + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a link, or \a counter is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceResetNvLinkUtilizationCounter (nvmlDevice_t device, unsigned int link, unsigned int counter); + +/** +* Get the NVLink device type of the remote device connected over the given link. +* +* @param device The device handle of the target GPU +* @param link The NVLink link index on the target GPU +* @param pNvLinkDeviceType Pointer in which the output remote device type is returned +* +* @return +* - \ref NVML_SUCCESS if \a pNvLinkDeviceType has been set +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_NOT_SUPPORTED if NVLink is not supported +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a link is invalid, or +* \a pNvLinkDeviceType is NULL +* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is +* otherwise inaccessible +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkRemoteDeviceType(nvmlDevice_t device, unsigned int link, nvmlIntNvLinkDeviceType_t *pNvLinkDeviceType); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlEvents Event Handling Methods + * This chapter describes methods that NVML can perform against each device to register and wait for + * some event to occur. + * @{ + */ +/***************************************************************************************************/ + +/** + * Create an empty set of events. + * Event set should be freed by \ref nvmlEventSetFree + * + * For Fermi &tm; or newer fully supported devices. + * @param set Reference in which to return the event handle + * + * @return + * - \ref NVML_SUCCESS if the event has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a set is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlEventSetFree + */ +nvmlReturn_t DECLDIR nvmlEventSetCreate(nvmlEventSet_t *set); + +/** + * Starts recording of events on a specified devices and add the events to specified \ref nvmlEventSet_t + * + * For Fermi &tm; or newer fully supported devices. + * Ecc events are available only on ECC enabled devices (see \ref nvmlDeviceGetTotalEccErrors) + * Power capping events are available only on Power Management enabled devices (see \ref nvmlDeviceGetPowerManagementMode) + * + * For Linux only. + * + * \b IMPORTANT: Operations on \a set are not thread safe + * + * This call starts recording of events on specific device. + * All events that occurred before this call are not recorded. + * Checking if some event occurred can be done with \ref nvmlEventSetWait_v2 + * + * If function reports NVML_ERROR_UNKNOWN, event set is in undefined state and should be freed. + * If function reports NVML_ERROR_NOT_SUPPORTED, event set can still be used. None of the requested eventTypes + * are registered in that case. + * + * @param device The identifier of the target device + * @param eventTypes Bitmask of \ref nvmlEventType to record + * @param set Set to which add new event types + * + * @return + * - \ref NVML_SUCCESS if the event has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a eventTypes is invalid or \a set is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the platform does not support this feature or some of requested event types + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlEventType + * @see nvmlDeviceGetSupportedEventTypes + * @see nvmlEventSetWait + * @see nvmlEventSetFree + */ +nvmlReturn_t DECLDIR nvmlDeviceRegisterEvents(nvmlDevice_t device, unsigned long long eventTypes, nvmlEventSet_t set); + +/** + * Returns information about events supported on device + * + * For Fermi &tm; or newer fully supported devices. + * + * Events are not supported on Windows. So this function returns an empty mask in \a eventTypes on Windows. + * + * @param device The identifier of the target device + * @param eventTypes Reference in which to return bitmask of supported events + * + * @return + * - \ref NVML_SUCCESS if the eventTypes has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a eventType is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlEventType + * @see nvmlDeviceRegisterEvents + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSupportedEventTypes(nvmlDevice_t device, unsigned long long *eventTypes); + +/** + * Waits on events and delivers events + * + * For Fermi &tm; or newer fully supported devices. + * + * If some events are ready to be delivered at the time of the call, function returns immediately. + * If there are no events ready to be delivered, function sleeps till event arrives + * but not longer than specified timeout. This function in certain conditions can return before + * specified timeout passes (e.g. when interrupt arrives) + * + * On Windows, in case of xid error, the function returns the most recent xid error type seen by the system. + * If there are multiple xid errors generated before nvmlEventSetWait is invoked then the last seen xid error + * type is returned for all xid error events. + * + * On Linux, every xid error event would return the associated event data and other information if applicable. + * + * In MIG mode, if device handle is provided, the API reports all the events for the available instances, + * only if the caller has appropriate privileges. In absence of required privileges, only the events which + * affect all the instances (i.e. whole device) are reported. + * + * This API does not currently support per-instance event reporting using MIG device handles. + * + * @param set Reference to set of events to wait on + * @param data Reference in which to return event data + * @param timeoutms Maximum amount of wait time in milliseconds for registered event + * + * @return + * - \ref NVML_SUCCESS if the data has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a data is NULL + * - \ref NVML_ERROR_TIMEOUT if no event arrived in specified timeout or interrupt arrived + * - \ref NVML_ERROR_GPU_IS_LOST if a GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlEventType + * @see nvmlDeviceRegisterEvents + */ +nvmlReturn_t DECLDIR nvmlEventSetWait_v2(nvmlEventSet_t set, nvmlEventData_t * data, unsigned int timeoutms); + +/** + * Releases events in the set + * + * For Fermi &tm; or newer fully supported devices. + * + * @param set Reference to events to be released + * + * @return + * - \ref NVML_SUCCESS if the event has been successfully released + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlDeviceRegisterEvents + */ +nvmlReturn_t DECLDIR nvmlEventSetFree(nvmlEventSet_t set); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlZPI Drain states + * This chapter describes methods that NVML can perform against each device to control their drain state + * and recognition by NVML and NVIDIA kernel driver. These methods can be used with out-of-band tools to + * power on/off GPUs, enable robust reset scenarios, etc. + * @{ + */ +/***************************************************************************************************/ + +/** + * Modify the drain state of a GPU. This method forces a GPU to no longer accept new incoming requests. + * Any new NVML process will no longer see this GPU. Persistence mode for this GPU must be turned off before + * this call is made. + * Must be called as administrator. + * For Linux only. + * + * For Pascal &tm; or newer fully supported devices. + * Some Kepler devices supported. + * + * @param pciInfo The PCI address of the GPU drain state to be modified + * @param newState The drain state that should be entered, see \ref nvmlEnableState_t + * + * @return + * - \ref NVML_SUCCESS if counters were successfully reset + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a nvmlIndex or \a newState is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_NO_PERMISSION if the calling process has insufficient permissions to perform operation + * - \ref NVML_ERROR_IN_USE if the device has persistence mode turned on + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceModifyDrainState (nvmlPciInfo_t *pciInfo, nvmlEnableState_t newState); + +/** + * Query the drain state of a GPU. This method is used to check if a GPU is in a currently draining + * state. + * For Linux only. + * + * For Pascal &tm; or newer fully supported devices. + * Some Kepler devices supported. + * + * @param pciInfo The PCI address of the GPU drain state to be queried + * @param currentState The current drain state for this GPU, see \ref nvmlEnableState_t + * + * @return + * - \ref NVML_SUCCESS if counters were successfully reset + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a nvmlIndex or \a currentState is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceQueryDrainState (nvmlPciInfo_t *pciInfo, nvmlEnableState_t *currentState); + +/** + * This method will remove the specified GPU from the view of both NVML and the NVIDIA kernel driver + * as long as no other processes are attached. If other processes are attached, this call will return + * NVML_ERROR_IN_USE and the GPU will be returned to its original "draining" state. Note: the + * only situation where a process can still be attached after nvmlDeviceModifyDrainState() is called + * to initiate the draining state is if that process was using, and is still using, a GPU before the + * call was made. Also note, persistence mode counts as an attachment to the GPU thus it must be disabled + * prior to this call. + * + * For long-running NVML processes please note that this will change the enumeration of current GPUs. + * For example, if there are four GPUs present and GPU1 is removed, the new enumeration will be 0-2. + * Also, device handles after the removed GPU will not be valid and must be re-established. + * Must be run as administrator. + * For Linux only. + * + * For Pascal &tm; or newer fully supported devices. + * Some Kepler devices supported. + * + * @param pciInfo The PCI address of the GPU to be removed + * @param gpuState Whether the GPU is to be removed, from the OS + * see \ref nvmlDetachGpuState_t + * @param linkState Requested upstream PCIe link state, see \ref nvmlPcieLinkState_t + * + * @return + * - \ref NVML_SUCCESS if counters were successfully reset + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a nvmlIndex is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device doesn't support this feature + * - \ref NVML_ERROR_IN_USE if the device is still in use and cannot be removed + */ +nvmlReturn_t DECLDIR nvmlDeviceRemoveGpu_v2(nvmlPciInfo_t *pciInfo, nvmlDetachGpuState_t gpuState, nvmlPcieLinkState_t linkState); + +/** + * Request the OS and the NVIDIA kernel driver to rediscover a portion of the PCI subsystem looking for GPUs that + * were previously removed. The portion of the PCI tree can be narrowed by specifying a domain, bus, and device. + * If all are zeroes then the entire PCI tree will be searched. Please note that for long-running NVML processes + * the enumeration will change based on how many GPUs are discovered and where they are inserted in bus order. + * + * In addition, all newly discovered GPUs will be initialized and their ECC scrubbed which may take several seconds + * per GPU. Also, all device handles are no longer guaranteed to be valid post discovery. + * + * Must be run as administrator. + * For Linux only. + * + * For Pascal &tm; or newer fully supported devices. + * Some Kepler devices supported. + * + * @param pciInfo The PCI tree to be searched. Only the domain, bus, and device + * fields are used in this call. + * + * @return + * - \ref NVML_SUCCESS if counters were successfully reset + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pciInfo is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the operating system does not support this feature + * - \ref NVML_ERROR_OPERATING_SYSTEM if the operating system is denying this feature + * - \ref NVML_ERROR_NO_PERMISSION if the calling process has insufficient permissions to perform operation + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceDiscoverGpus (nvmlPciInfo_t *pciInfo); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlFieldValueQueries Field Value Queries + * This chapter describes NVML operations that are associated with retrieving Field Values from NVML + * @{ + */ +/***************************************************************************************************/ + +/** + * Request values for a list of fields for a device. This API allows multiple fields to be queried at once. + * If any of the underlying fieldIds are populated by the same driver call, the results for those field IDs + * will be populated from a single call rather than making a driver call for each fieldId. + * + * @param device The device handle of the GPU to request field values for + * @param valuesCount Number of entries in values that should be retrieved + * @param values Array of \a valuesCount structures to hold field values. + * Each value's fieldId must be populated prior to this call + * + * @return + * - \ref NVML_SUCCESS if any values in \a values were populated. Note that you must + * check the nvmlReturn field of each value for each individual + * status + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a values is NULL + */ +nvmlReturn_t DECLDIR nvmlDeviceGetFieldValues(nvmlDevice_t device, int valuesCount, nvmlFieldValue_t *values); + +/** + * Clear values for a list of fields for a device. This API allows multiple fields to be cleared at once. + * + * @param device The device handle of the GPU to request field values for + * @param valuesCount Number of entries in values that should be cleared + * @param values Array of \a valuesCount structures to hold field values. + * Each value's fieldId must be populated prior to this call + * + * @return + * - \ref NVML_SUCCESS if any values in \a values were cleared. Note that you must + * check the nvmlReturn field of each value for each individual + * status + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a values is NULL + */ +nvmlReturn_t DECLDIR nvmlDeviceClearFieldValues(nvmlDevice_t device, int valuesCount, nvmlFieldValue_t *values); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup vGPU Enums, Constants and Structs + * @{ + */ +/** @} */ +/***************************************************************************************************/ + +/***************************************************************************************************/ +/** @defgroup nvmlVirtualGpuQueries vGPU APIs + * This chapter describes operations that are associated with NVIDIA vGPU Software products. + * @{ + */ +/***************************************************************************************************/ + +/** + * This method is used to get the virtualization mode corresponding to the GPU. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device Identifier of the target device + * @param pVirtualMode Reference to virtualization mode. One of NVML_GPU_VIRTUALIZATION_? + * + * @return + * - \ref NVML_SUCCESS if \a pVirtualMode is fetched + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pVirtualMode is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVirtualizationMode(nvmlDevice_t device, nvmlGpuVirtualizationMode_t *pVirtualMode); + +/** + * Queries if SR-IOV host operation is supported on a vGPU supported device. + * + * Checks whether SR-IOV host capability is supported by the device and the + * driver, and indicates device is in SR-IOV mode if both of these conditions + * are true. + * + * @param device The identifier of the target device + * @param pHostVgpuMode Reference in which to return the current vGPU mode + * + * @return + * - \ref NVML_SUCCESS if device's vGPU mode has been successfully retrieved + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device handle is 0 or \a pVgpuMode is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if \a device doesn't support this feature. + * - \ref NVML_ERROR_UNKNOWN if any unexpected error occurred + */ +nvmlReturn_t DECLDIR nvmlDeviceGetHostVgpuMode(nvmlDevice_t device, nvmlHostVgpuMode_t *pHostVgpuMode); + +/** + * This method is used to set the virtualization mode corresponding to the GPU. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device Identifier of the target device + * @param virtualMode virtualization mode. One of NVML_GPU_VIRTUALIZATION_? + * + * @return + * - \ref NVML_SUCCESS if \a pVirtualMode is set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pVirtualMode is NULL + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_SUPPORTED if setting of virtualization mode is not supported. + * - \ref NVML_ERROR_NO_PERMISSION if setting of virtualization mode is not allowed for this client. + */ +nvmlReturn_t DECLDIR nvmlDeviceSetVirtualizationMode(nvmlDevice_t device, nvmlGpuVirtualizationMode_t virtualMode); + +/** + * Retrieve the vGPU Software licensable features. + * + * Identifies whether the system supports vGPU Software Licensing. If it does, return the list of licensable feature(s) + * and their current license status. + * + * @param device Identifier of the target device + * @param pGridLicensableFeatures Pointer to structure in which vGPU software licensable features are returned + * + * @return + * - \ref NVML_SUCCESS if licensable features are successfully retrieved + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pGridLicensableFeatures is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGridLicensableFeatures_v4(nvmlDevice_t device, nvmlGridLicensableFeatures_t *pGridLicensableFeatures); + +/** + * Retrieves the current utilization and process ID + * + * For Maxwell &tm; or newer fully supported devices. + * + * Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder for processes running. + * Utilization values are returned as an array of utilization sample structures in the caller-supplied buffer pointed at + * by \a utilization. One utilization sample structure is returned per process running, that had some non-zero utilization + * during the last sample period. It includes the CPU timestamp at which the samples were recorded. Individual utilization values + * are returned as "unsigned int" values. + * + * To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with + * \a utilization set to NULL. The caller should allocate a buffer of size + * processSamplesCount * sizeof(nvmlProcessUtilizationSample_t). Invoke the function again with the allocated buffer passed + * in \a utilization, and \a processSamplesCount set to the number of entries the buffer is sized for. + * + * On successful return, the function updates \a processSamplesCount with the number of process utilization sample + * structures that were actually written. This may differ from a previously read value as instances are created or + * destroyed. + * + * lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0 + * to read utilization based on all the samples maintained by the driver's internal sample buffer. Set lastSeenTimeStamp + * to a timeStamp retrieved from a previous query to read utilization since the previous query. + * + * @note On MIG-enabled GPUs, querying process utilization is not currently supported. + * + * @param device The identifier of the target device + * @param utilization Pointer to caller-supplied buffer in which guest process utilization samples are returned + * @param processSamplesCount Pointer to caller-supplied array size, and returns number of processes running + * @param lastSeenTimeStamp Return only samples with timestamp greater than lastSeenTimeStamp. + + * @return + * - \ref NVML_SUCCESS if \a utilization has been populated + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a utilization is NULL, or \a samplingPeriodUs is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_NOT_FOUND if sample entries are not found + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetProcessUtilization(nvmlDevice_t device, nvmlProcessUtilizationSample_t *utilization, + unsigned int *processSamplesCount, unsigned long long lastSeenTimeStamp); + +/** + * Retrieve GSP firmware version. + * + * The caller passes in buffer via \a version and corresponding GSP firmware numbered version + * is returned with the same parameter in string format. + * + * @param device Device handle + * @param version The retrieved GSP firmware version + * + * @return + * - \ref NVML_SUCCESS if GSP firmware version is sucessfully retrieved + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or GSP \a version pointer is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if GSP firmware is not enabled for GPU + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGspFirmwareVersion(nvmlDevice_t device, char *version); + +/** + * Retrieve GSP firmware mode. + * + * The caller passes in integer pointers. GSP firmware enablement and default mode information is returned with + * corresponding parameters. The return value in \a isEnabled and \a defaultMode should be treated as boolean. + * + * @param device Device handle + * @param isEnabled Pointer to specify if GSP firmware is enabled + * @param defaultMode Pointer to specify if GSP firmware is supported by default on \a device + * + * @return + * - \ref NVML_SUCCESS if GSP firmware mode is sucessfully retrieved + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or any of \a isEnabled or \a defaultMode is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGspFirmwareMode(nvmlDevice_t device, unsigned int *isEnabled, unsigned int *defaultMode); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlVgpu vGPU Management + * @{ + * + * This chapter describes APIs supporting NVIDIA vGPU. + */ +/***************************************************************************************************/ + +/** + * Retrieve the requested vGPU driver capability. + * + * Refer to the \a nvmlVgpuDriverCapability_t structure for the specific capabilities that can be queried. + * The return value in \a capResult should be treated as a boolean, with a non-zero value indicating that the capability + * is supported. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param capability Specifies the \a nvmlVgpuDriverCapability_t to be queried + * @param capResult A boolean for the queried capability indicating that feature is supported + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a capability is invalid, or \a capResult is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED the API is not supported in current state or \a devices not in vGPU mode + * - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlGetVgpuDriverCapabilities(nvmlVgpuDriverCapability_t capability, unsigned int *capResult); + +/** + * Retrieve the requested vGPU capability for GPU. + * + * Refer to the \a nvmlDeviceVgpuCapability_t structure for the specific capabilities that can be queried. + * The return value in \a capResult should be treated as a boolean, with a non-zero value indicating that the capability + * is supported. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param capability Specifies the \a nvmlDeviceVgpuCapability_t to be queried + * @param capResult A boolean for the queried capability indicating that feature is supported + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a capability is invalid, or \a capResult is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED the API is not supported in current state or \a device not in vGPU mode + * - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlDeviceGetVgpuCapabilities(nvmlDevice_t device, nvmlDeviceVgpuCapability_t capability, unsigned int *capResult); + +/** + * Retrieve the supported vGPU types on a physical GPU (device). + * + * An array of supported vGPU types for the physical GPU indicated by \a device is returned in the caller-supplied buffer + * pointed at by \a vgpuTypeIds. The element count of nvmlVgpuTypeId_t array is passed in \a vgpuCount, and \a vgpuCount + * is used to return the number of vGPU types written to the buffer. + * + * If the supplied buffer is not large enough to accomodate the vGPU type array, the function returns + * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuTypeId_t array required in \a vgpuCount. + * To query the number of vGPU types supported for the GPU, call this function with *vgpuCount = 0. + * The code will return NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU types are supported. + * + * @param device The identifier of the target device + * @param vgpuCount Pointer to caller-supplied array size, and returns number of vGPU types + * @param vgpuTypeIds Pointer to caller-supplied array in which to return list of vGPU types + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_INSUFFICIENT_SIZE \a vgpuTypeIds buffer is too small, array element count is returned in \a vgpuCount + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuCount is NULL or \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSupportedVgpus(nvmlDevice_t device, unsigned int *vgpuCount, nvmlVgpuTypeId_t *vgpuTypeIds); + +/** + * Retrieve the currently creatable vGPU types on a physical GPU (device). + * + * An array of creatable vGPU types for the physical GPU indicated by \a device is returned in the caller-supplied buffer + * pointed at by \a vgpuTypeIds. The element count of nvmlVgpuTypeId_t array is passed in \a vgpuCount, and \a vgpuCount + * is used to return the number of vGPU types written to the buffer. + * + * The creatable vGPU types for a device may differ over time, as there may be restrictions on what type of vGPU types + * can concurrently run on a device. For example, if only one vGPU type is allowed at a time on a device, then the creatable + * list will be restricted to whatever vGPU type is already running on the device. + * + * If the supplied buffer is not large enough to accomodate the vGPU type array, the function returns + * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuTypeId_t array required in \a vgpuCount. + * To query the number of vGPU types createable for the GPU, call this function with *vgpuCount = 0. + * The code will return NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU types are creatable. + * + * @param device The identifier of the target device + * @param vgpuCount Pointer to caller-supplied array size, and returns number of vGPU types + * @param vgpuTypeIds Pointer to caller-supplied array in which to return list of vGPU types + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_INSUFFICIENT_SIZE \a vgpuTypeIds buffer is too small, array element count is returned in \a vgpuCount + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuCount is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetCreatableVgpus(nvmlDevice_t device, unsigned int *vgpuCount, nvmlVgpuTypeId_t *vgpuTypeIds); + +/** + * Retrieve the class of a vGPU type. It will not exceed 64 characters in length (including the NUL terminator). + * See \ref nvmlConstants::NVML_DEVICE_NAME_BUFFER_SIZE. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param vgpuTypeClass Pointer to string array to return class in + * @param size Size of string + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a vgpuTypeClass is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a size is too small + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetClass(nvmlVgpuTypeId_t vgpuTypeId, char *vgpuTypeClass, unsigned int *size); + +/** + * Retrieve the vGPU type name. + * + * The name is an alphanumeric string that denotes a particular vGPU, e.g. GRID M60-2Q. It will not + * exceed 64 characters in length (including the NUL terminator). See \ref + * nvmlConstants::NVML_DEVICE_NAME_BUFFER_SIZE. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param vgpuTypeName Pointer to buffer to return name + * @param size Size of buffer + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a name is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a size is too small + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetName(nvmlVgpuTypeId_t vgpuTypeId, char *vgpuTypeName, unsigned int *size); + +/** + * Retrieve the GPU Instance Profile ID for the given vGPU type ID. + * The API will return a valid GPU Instance Profile ID for the MIG capable vGPU types, else INVALID_GPU_INSTANCE_PROFILE_ID is + * returned. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param gpuInstanceProfileId GPU Instance Profile ID + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_NOT_SUPPORTED if \a device is not in vGPU Host virtualization mode + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a gpuInstanceProfileId is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetGpuInstanceProfileId(nvmlVgpuTypeId_t vgpuTypeId, unsigned int *gpuInstanceProfileId); + +/** + * Retrieve the device ID of a vGPU type. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param deviceID Device ID and vendor ID of the device contained in single 32 bit value + * @param subsystemID Subsytem ID and subsytem vendor ID of the device contained in single 32 bit value + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a deviceId or \a subsystemID are NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetDeviceID(nvmlVgpuTypeId_t vgpuTypeId, unsigned long long *deviceID, unsigned long long *subsystemID); + +/** + * Retrieve the vGPU framebuffer size in bytes. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param fbSize Pointer to framebuffer size in bytes + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a fbSize is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetFramebufferSize(nvmlVgpuTypeId_t vgpuTypeId, unsigned long long *fbSize); + +/** + * Retrieve count of vGPU's supported display heads. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param numDisplayHeads Pointer to number of display heads + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a numDisplayHeads is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetNumDisplayHeads(nvmlVgpuTypeId_t vgpuTypeId, unsigned int *numDisplayHeads); + +/** + * Retrieve vGPU display head's maximum supported resolution. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param displayIndex Zero-based index of display head + * @param xdim Pointer to maximum number of pixels in X dimension + * @param ydim Pointer to maximum number of pixels in Y dimension + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a xdim or \a ydim are NULL, or \a displayIndex + * is out of range. + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetResolution(nvmlVgpuTypeId_t vgpuTypeId, unsigned int displayIndex, unsigned int *xdim, unsigned int *ydim); + +/** + * Retrieve license requirements for a vGPU type + * + * The license type and version required to run the specified vGPU type is returned as an alphanumeric string, in the form + * ",", for example "GRID-Virtual-PC,2.0". If a vGPU is runnable with* more than one type of license, + * the licenses are delimited by a semicolon, for example "GRID-Virtual-PC,2.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0". + * + * The total length of the returned string will not exceed 128 characters, including the NUL terminator. + * See \ref nvmlVgpuConstants::NVML_GRID_LICENSE_BUFFER_SIZE. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param vgpuTypeLicenseString Pointer to buffer to return license info + * @param size Size of \a vgpuTypeLicenseString buffer + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a vgpuTypeLicenseString is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a size is too small + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetLicense(nvmlVgpuTypeId_t vgpuTypeId, char *vgpuTypeLicenseString, unsigned int size); + +/** + * Retrieve the static frame rate limit value of the vGPU type + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param frameRateLimit Reference to return the frame rate limit value + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_NOT_SUPPORTED if frame rate limiter is turned off for the vGPU type + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a frameRateLimit is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetFrameRateLimit(nvmlVgpuTypeId_t vgpuTypeId, unsigned int *frameRateLimit); + +/** + * Retrieve the maximum number of vGPU instances creatable on a device for given vGPU type + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param vgpuTypeId Handle to vGPU type + * @param vgpuInstanceCount Pointer to get the max number of vGPU instances + * that can be created on a deicve for given vgpuTypeId + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid or is not supported on target device, + * or \a vgpuInstanceCount is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetMaxInstances(nvmlDevice_t device, nvmlVgpuTypeId_t vgpuTypeId, unsigned int *vgpuInstanceCount); + +/** + * Retrieve the maximum number of vGPU instances supported per VM for given vGPU type + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuTypeId Handle to vGPU type + * @param vgpuInstanceCountPerVm Pointer to get the max number of vGPU instances supported per VM for given \a vgpuTypeId + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a vgpuInstanceCountPerVm is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetMaxInstancesPerVm(nvmlVgpuTypeId_t vgpuTypeId, unsigned int *vgpuInstanceCountPerVm); + +/** + * Retrieve the active vGPU instances on a device. + * + * An array of active vGPU instances is returned in the caller-supplied buffer pointed at by \a vgpuInstances. The + * array elememt count is passed in \a vgpuCount, and \a vgpuCount is used to return the number of vGPU instances + * written to the buffer. + * + * If the supplied buffer is not large enough to accomodate the vGPU instance array, the function returns + * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuInstance_t array required in \a vgpuCount. + * To query the number of active vGPU instances, call this function with *vgpuCount = 0. The code will return + * NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU Types are supported. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param device The identifier of the target device + * @param vgpuCount Pointer which passes in the array size as well as get + * back the number of types + * @param vgpuInstances Pointer to array in which to return list of vGPU instances + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a vgpuCount is NULL + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a size is too small + * - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetActiveVgpus(nvmlDevice_t device, unsigned int *vgpuCount, nvmlVgpuInstance_t *vgpuInstances); + +/** + * Retrieve the VM ID associated with a vGPU instance. + * + * The VM ID is returned as a string, not exceeding 80 characters in length (including the NUL terminator). + * See \ref nvmlConstants::NVML_DEVICE_UUID_BUFFER_SIZE. + * + * The format of the VM ID varies by platform, and is indicated by the type identifier returned in \a vmIdType. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param vmId Pointer to caller-supplied buffer to hold VM ID + * @param size Size of buffer in bytes + * @param vmIdType Pointer to hold VM ID type + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vmId or \a vmIdType is NULL, or \a vgpuInstance is 0 + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a size is too small + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetVmID(nvmlVgpuInstance_t vgpuInstance, char *vmId, unsigned int size, nvmlVgpuVmIdType_t *vmIdType); + +/** + * Retrieve the UUID of a vGPU instance. + * + * The UUID is a globally unique identifier associated with the vGPU, and is returned as a 5-part hexadecimal string, + * not exceeding 80 characters in length (including the NULL terminator). + * See \ref nvmlConstants::NVML_DEVICE_UUID_BUFFER_SIZE. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param uuid Pointer to caller-supplied buffer to hold vGPU UUID + * @param size Size of buffer in bytes + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a uuid is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a size is too small + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetUUID(nvmlVgpuInstance_t vgpuInstance, char *uuid, unsigned int size); + +/** + * Retrieve the NVIDIA driver version installed in the VM associated with a vGPU. + * + * The version is returned as an alphanumeric string in the caller-supplied buffer \a version. The length of the version + * string will not exceed 80 characters in length (including the NUL terminator). + * See \ref nvmlConstants::NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE. + * + * nvmlVgpuInstanceGetVmDriverVersion() may be called at any time for a vGPU instance. The guest VM driver version is + * returned as "Not Available" if no NVIDIA driver is installed in the VM, or the VM has not yet booted to the point where the + * NVIDIA driver is loaded and initialized. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param version Caller-supplied buffer to return driver version string + * @param length Size of \a version buffer + * + * @return + * - \ref NVML_SUCCESS if \a version has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0 + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetVmDriverVersion(nvmlVgpuInstance_t vgpuInstance, char* version, unsigned int length); + +/** + * Retrieve the framebuffer usage in bytes. + * + * Framebuffer usage is the amont of vGPU framebuffer memory that is currently in use by the VM. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuInstance The identifier of the target instance + * @param fbUsage Pointer to framebuffer usage in bytes + * + * @return + * - \ref NVML_SUCCESS successful completion + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a fbUsage is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetFbUsage(nvmlVgpuInstance_t vgpuInstance, unsigned long long *fbUsage); + +/** + * @deprecated Use \ref nvmlVgpuInstanceGetLicenseInfo_v2. + * + * Retrieve the current licensing state of the vGPU instance. + * + * If the vGPU is currently licensed, \a licensed is set to 1, otherwise it is set to 0. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param licensed Reference to return the licensing status + * + * @return + * - \ref NVML_SUCCESS if \a licensed has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a licensed is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetLicenseStatus(nvmlVgpuInstance_t vgpuInstance, unsigned int *licensed); + +/** + * Retrieve the vGPU type of a vGPU instance. + * + * Returns the vGPU type ID of vgpu assigned to the vGPU instance. + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param vgpuTypeId Reference to return the vgpuTypeId + * + * @return + * - \ref NVML_SUCCESS if \a vgpuTypeId has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a vgpuTypeId is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetType(nvmlVgpuInstance_t vgpuInstance, nvmlVgpuTypeId_t *vgpuTypeId); + +/** + * Retrieve the frame rate limit set for the vGPU instance. + * + * Returns the value of the frame rate limit set for the vGPU instance + * + * For Kepler &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param frameRateLimit Reference to return the frame rate limit + * + * @return + * - \ref NVML_SUCCESS if \a frameRateLimit has been set + * - \ref NVML_ERROR_NOT_SUPPORTED if frame rate limiter is turned off for the vGPU type + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a frameRateLimit is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetFrameRateLimit(nvmlVgpuInstance_t vgpuInstance, unsigned int *frameRateLimit); + +/** + * Retrieve the current ECC mode of vGPU instance. + * + * @param vgpuInstance The identifier of the target vGPU instance + * @param eccMode Reference in which to return the current ECC mode + * + * @return + * - \ref NVML_SUCCESS if the vgpuInstance's ECC mode has been successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a mode is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_NOT_SUPPORTED if the vGPU doesn't support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetEccMode(nvmlVgpuInstance_t vgpuInstance, nvmlEnableState_t *eccMode); + +/** + * Retrieve the encoder capacity of a vGPU instance, as a percentage of maximum encoder capacity with valid values in the range 0-100. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param encoderCapacity Reference to an unsigned int for the encoder capacity + * + * @return + * - \ref NVML_SUCCESS if \a encoderCapacity has been retrived + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a encoderQueryType is invalid + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetEncoderCapacity(nvmlVgpuInstance_t vgpuInstance, unsigned int *encoderCapacity); + +/** + * Set the encoder capacity of a vGPU instance, as a percentage of maximum encoder capacity with valid values in the range 0-100. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param encoderCapacity Unsigned int for the encoder capacity value + * + * @return + * - \ref NVML_SUCCESS if \a encoderCapacity has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a encoderCapacity is out of range of 0-100. + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceSetEncoderCapacity(nvmlVgpuInstance_t vgpuInstance, unsigned int encoderCapacity); + +/** + * Retrieves the current encoder statistics of a vGPU Instance + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param sessionCount Reference to an unsigned int for count of active encoder sessions + * @param averageFps Reference to an unsigned int for trailing average FPS of all active sessions + * @param averageLatency Reference to an unsigned int for encode latency in microseconds + * + * @return + * - \ref NVML_SUCCESS if \a sessionCount, \a averageFps and \a averageLatency is fetched + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a sessionCount , or \a averageFps or \a averageLatency is NULL + * or \a vgpuInstance is 0. + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetEncoderStats(nvmlVgpuInstance_t vgpuInstance, unsigned int *sessionCount, + unsigned int *averageFps, unsigned int *averageLatency); + +/** + * Retrieves information about all active encoder sessions on a vGPU Instance. + * + * An array of active encoder sessions is returned in the caller-supplied buffer pointed at by \a sessionInfo. The + * array element count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions + * written to the buffer. + * + * If the supplied buffer is not large enough to accomodate the active session array, the function returns + * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlEncoderSessionInfo_t array required in \a sessionCount. + * To query the number of active encoder sessions, call this function with *sessionCount = 0. The code will return + * NVML_SUCCESS with number of active encoder sessions updated in *sessionCount. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param sessionCount Reference to caller supplied array size, and returns + * the number of sessions. + * @param sessionInfo Reference to caller supplied array in which the list + * of session information us returned. + * + * @return + * - \ref NVML_SUCCESS if \a sessionInfo is fetched + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a sessionCount is too small, array element count is + returned in \a sessionCount + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a sessionCount is NULL, or \a vgpuInstance is 0. + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetEncoderSessions(nvmlVgpuInstance_t vgpuInstance, unsigned int *sessionCount, nvmlEncoderSessionInfo_t *sessionInfo); + +/** +* Retrieves the active frame buffer capture sessions statistics of a vGPU Instance +* +* For Maxwell &tm; or newer fully supported devices. +* +* @param vgpuInstance Identifier of the target vGPU instance +* @param fbcStats Reference to nvmlFBCStats_t structure contianing NvFBC stats +* +* @return +* - \ref NVML_SUCCESS if \a fbcStats is fetched +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a fbcStats is NULL +* - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetFBCStats(nvmlVgpuInstance_t vgpuInstance, nvmlFBCStats_t *fbcStats); + +/** +* Retrieves information about active frame buffer capture sessions on a vGPU Instance. +* +* An array of active FBC sessions is returned in the caller-supplied buffer pointed at by \a sessionInfo. The +* array element count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions +* written to the buffer. +* +* If the supplied buffer is not large enough to accomodate the active session array, the function returns +* NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlFBCSessionInfo_t array required in \a sessionCount. +* To query the number of active FBC sessions, call this function with *sessionCount = 0. The code will return +* NVML_SUCCESS with number of active FBC sessions updated in *sessionCount. +* +* For Maxwell &tm; or newer fully supported devices. +* +* @note hResolution, vResolution, averageFPS and averageLatency data for a FBC session returned in \a sessionInfo may +* be zero if there are no new frames captured since the session started. +* +* @param vgpuInstance Identifier of the target vGPU instance +* @param sessionCount Reference to caller supplied array size, and returns the number of sessions. +* @param sessionInfo Reference in which to return the session information +* +* @return +* - \ref NVML_SUCCESS if \a sessionInfo is fetched +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a sessionCount is NULL. +* - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system +* - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a sessionCount is too small, array element count is returned in \a sessionCount +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetFBCSessions(nvmlVgpuInstance_t vgpuInstance, unsigned int *sessionCount, nvmlFBCSessionInfo_t *sessionInfo); + +/** +* Retrieve the GPU Instance ID for the given vGPU Instance. +* The API will return a valid GPU Instance ID for MIG backed vGPU Instance, else INVALID_GPU_INSTANCE_ID is returned. +* +* For Kepler &tm; or newer fully supported devices. +* +* @param vgpuInstance Identifier of the target vGPU instance +* @param gpuInstanceId GPU Instance ID +* +* @return +* - \ref NVML_SUCCESS successful completion +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a gpuInstanceId is NULL. +* - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetGpuInstanceId(nvmlVgpuInstance_t vgpuInstance, unsigned int *gpuInstanceId); + +/** +* Retrieves the PCI Id of the given vGPU Instance i.e. the PCI Id of the GPU as seen inside the VM. +* +* The vGPU PCI id is returned as "00000000:00:00.0" if NVIDIA driver is not installed on the vGPU instance. +* +* @param vgpuInstance Identifier of the target vGPU instance +* @param vgpuPciId Caller-supplied buffer to return vGPU PCI Id string +* @param length Size of the vgpuPciId buffer +* +* @return +* - \ref NVML_SUCCESS if vGPU PCI Id is sucessfully retrieved +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a vgpuPciId is NULL +* - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system +* - \ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running on the vGPU instance +* - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a length is too small, \a length is set to required length +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetGpuPciId(nvmlVgpuInstance_t vgpuInstance, char *vgpuPciId, unsigned int *length); + +/** +* Retrieve the requested capability for a given vGPU type. Refer to the \a nvmlVgpuCapability_t structure +* for the specific capabilities that can be queried. The return value in \a capResult should be treated as +* a boolean, with a non-zero value indicating that the capability is supported. +* +* For Maxwell &tm; or newer fully supported devices. +* +* @param vgpuTypeId Handle to vGPU type +* @param capability Specifies the \a nvmlVgpuCapability_t to be queried +* @param capResult A boolean for the queried capability indicating that feature is supported +* +* @return +* - \ref NVML_SUCCESS successful completion +* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized +* - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuTypeId is invalid, or \a capability is invalid, or \a capResult is NULL +* - \ref NVML_ERROR_UNKNOWN on any unexpected error +*/ +nvmlReturn_t DECLDIR nvmlVgpuTypeGetCapabilities(nvmlVgpuTypeId_t vgpuTypeId, nvmlVgpuCapability_t capability, unsigned int *capResult); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvml vGPU Migration + * This chapter describes operations that are associated with vGPU Migration. + * @{ + */ +/***************************************************************************************************/ + +/** + * Structure representing range of vGPU versions. + */ +typedef struct nvmlVgpuVersion_st +{ + unsigned int minVersion; //!< Minimum vGPU version. + unsigned int maxVersion; //!< Maximum vGPU version. +} nvmlVgpuVersion_t; + +/** + * vGPU metadata structure. + */ +typedef struct nvmlVgpuMetadata_st +{ + unsigned int version; //!< Current version of the structure + unsigned int revision; //!< Current revision of the structure + nvmlVgpuGuestInfoState_t guestInfoState; //!< Current state of Guest-dependent fields + char guestDriverVersion[NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE]; //!< Version of driver installed in guest + char hostDriverVersion[NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE]; //!< Version of driver installed in host + unsigned int reserved[6]; //!< Reserved for internal use + unsigned int vgpuVirtualizationCaps; //!< vGPU virtualizaion capabilities bitfileld + unsigned int guestVgpuVersion; //!< vGPU version of guest driver + unsigned int opaqueDataSize; //!< Size of opaque data field in bytes + char opaqueData[4]; //!< Opaque data +} nvmlVgpuMetadata_t; + +/** + * Physical GPU metadata structure + */ +typedef struct nvmlVgpuPgpuMetadata_st +{ + unsigned int version; //!< Current version of the structure + unsigned int revision; //!< Current revision of the structure + char hostDriverVersion[NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE]; //!< Host driver version + unsigned int pgpuVirtualizationCaps; //!< Pgpu virtualizaion capabilities bitfileld + unsigned int reserved[5]; //!< Reserved for internal use + nvmlVgpuVersion_t hostSupportedVgpuRange; //!< vGPU version range supported by host driver + unsigned int opaqueDataSize; //!< Size of opaque data field in bytes + char opaqueData[4]; //!< Opaque data +} nvmlVgpuPgpuMetadata_t; + +/** + * vGPU VM compatibility codes + */ +typedef enum nvmlVgpuVmCompatibility_enum +{ + NVML_VGPU_VM_COMPATIBILITY_NONE = 0x0, //!< vGPU is not runnable + NVML_VGPU_VM_COMPATIBILITY_COLD = 0x1, //!< vGPU is runnable from a cold / powered-off state (ACPI S5) + NVML_VGPU_VM_COMPATIBILITY_HIBERNATE = 0x2, //!< vGPU is runnable from a hibernated state (ACPI S4) + NVML_VGPU_VM_COMPATIBILITY_SLEEP = 0x4, //!< vGPU is runnable from a sleeped state (ACPI S3) + NVML_VGPU_VM_COMPATIBILITY_LIVE = 0x8 //!< vGPU is runnable from a live/paused (ACPI S0) +} nvmlVgpuVmCompatibility_t; + +/** + * vGPU-pGPU compatibility limit codes + */ +typedef enum nvmlVgpuPgpuCompatibilityLimitCode_enum +{ + NVML_VGPU_COMPATIBILITY_LIMIT_NONE = 0x0, //!< Compatibility is not limited. + NVML_VGPU_COMPATIBILITY_LIMIT_HOST_DRIVER = 0x1, //!< ompatibility is limited by host driver version. + NVML_VGPU_COMPATIBILITY_LIMIT_GUEST_DRIVER = 0x2, //!< Compatibility is limited by guest driver version. + NVML_VGPU_COMPATIBILITY_LIMIT_GPU = 0x4, //!< Compatibility is limited by GPU hardware. + NVML_VGPU_COMPATIBILITY_LIMIT_OTHER = 0x80000000 //!< Compatibility is limited by an undefined factor. +} nvmlVgpuPgpuCompatibilityLimitCode_t; + +/** + * vGPU-pGPU compatibility structure + */ +typedef struct nvmlVgpuPgpuCompatibility_st +{ + nvmlVgpuVmCompatibility_t vgpuVmCompatibility; //!< Compatibility of vGPU VM. See \ref nvmlVgpuVmCompatibility_t + nvmlVgpuPgpuCompatibilityLimitCode_t compatibilityLimitCode; //!< Limiting factor for vGPU-pGPU compatibility. See \ref nvmlVgpuPgpuCompatibilityLimitCode_t +} nvmlVgpuPgpuCompatibility_t; + +/** + * Returns vGPU metadata structure for a running vGPU. The structure contains information about the vGPU and its associated VM + * such as the currently installed NVIDIA guest driver version, together with host driver version and an opaque data section + * containing internal state. + * + * nvmlVgpuInstanceGetMetadata() may be called at any time for a vGPU instance. Some fields in the returned structure are + * dependent on information obtained from the guest VM, which may not yet have reached a state where that information + * is available. The current state of these dependent fields is reflected in the info structure's \ref nvmlVgpuGuestInfoState_t field. + * + * The VMM may choose to read and save the vGPU's VM info as persistent metadata associated with the VM, and provide + * it to Virtual GPU Manager when creating a vGPU for subsequent instances of the VM. + * + * The caller passes in a buffer via \a vgpuMetadata, with the size of the buffer in \a bufferSize. If the vGPU Metadata structure + * is too large to fit in the supplied buffer, the function returns NVML_ERROR_INSUFFICIENT_SIZE with the size needed + * in \a bufferSize. + * + * @param vgpuInstance vGPU instance handle + * @param vgpuMetadata Pointer to caller-supplied buffer into which vGPU metadata is written + * @param bufferSize Size of vgpuMetadata buffer + * + * @return + * - \ref NVML_SUCCESS vGPU metadata structure was successfully returned + * - \ref NVML_ERROR_INSUFFICIENT_SIZE vgpuMetadata buffer is too small, required size is returned in \a bufferSize + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a bufferSize is NULL or \a vgpuInstance is 0; if \a vgpuMetadata is NULL and the value of \a bufferSize is not 0. + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetMetadata(nvmlVgpuInstance_t vgpuInstance, nvmlVgpuMetadata_t *vgpuMetadata, unsigned int *bufferSize); + +/** + * Returns a vGPU metadata structure for the physical GPU indicated by \a device. The structure contains information about + * the GPU and the currently installed NVIDIA host driver version that's controlling it, together with an opaque data section + * containing internal state. + * + * The caller passes in a buffer via \a pgpuMetadata, with the size of the buffer in \a bufferSize. If the \a pgpuMetadata + * structure is too large to fit in the supplied buffer, the function returns NVML_ERROR_INSUFFICIENT_SIZE with the size needed + * in \a bufferSize. + * + * @param device The identifier of the target device + * @param pgpuMetadata Pointer to caller-supplied buffer into which \a pgpuMetadata is written + * @param bufferSize Pointer to size of \a pgpuMetadata buffer + * + * @return + * - \ref NVML_SUCCESS GPU metadata structure was successfully returned + * - \ref NVML_ERROR_INSUFFICIENT_SIZE pgpuMetadata buffer is too small, required size is returned in \a bufferSize + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a bufferSize is NULL or \a device is invalid; if \a pgpuMetadata is NULL and the value of \a bufferSize is not 0. + * - \ref NVML_ERROR_NOT_SUPPORTED vGPU is not supported by the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVgpuMetadata(nvmlDevice_t device, nvmlVgpuPgpuMetadata_t *pgpuMetadata, unsigned int *bufferSize); + +/** + * Takes a vGPU instance metadata structure read from \ref nvmlVgpuInstanceGetMetadata(), and a vGPU metadata structure for a + * physical GPU read from \ref nvmlDeviceGetVgpuMetadata(), and returns compatibility information of the vGPU instance and the + * physical GPU. + * + * The caller passes in a buffer via \a compatibilityInfo, into which a compatibility information structure is written. The + * structure defines the states in which the vGPU / VM may be booted on the physical GPU. If the vGPU / VM compatibility + * with the physical GPU is limited, a limit code indicates the factor limiting compability. + * (see \ref nvmlVgpuPgpuCompatibilityLimitCode_t for details). + * + * Note: vGPU compatibility does not take into account dynamic capacity conditions that may limit a system's ability to + * boot a given vGPU or associated VM. + * + * @param vgpuMetadata Pointer to caller-supplied vGPU metadata structure + * @param pgpuMetadata Pointer to caller-supplied GPU metadata structure + * @param compatibilityInfo Pointer to caller-supplied buffer to hold compatibility info + * + * @return + * - \ref NVML_SUCCESS vGPU metadata structure was successfully returned + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuMetadata or \a pgpuMetadata or \a bufferSize are NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlGetVgpuCompatibility(nvmlVgpuMetadata_t *vgpuMetadata, nvmlVgpuPgpuMetadata_t *pgpuMetadata, nvmlVgpuPgpuCompatibility_t *compatibilityInfo); + +/** + * Returns the properties of the physical GPU indicated by the device in an ascii-encoded string format. + * + * The caller passes in a buffer via \a pgpuMetadata, with the size of the buffer in \a bufferSize. If the + * string is too large to fit in the supplied buffer, the function returns NVML_ERROR_INSUFFICIENT_SIZE with the size needed + * in \a bufferSize. + * + * @param device The identifier of the target device + * @param pgpuMetadata Pointer to caller-supplied buffer into which \a pgpuMetadata is written + * @param bufferSize Pointer to size of \a pgpuMetadata buffer + * + * @return + * - \ref NVML_SUCCESS GPU metadata structure was successfully returned + * - \ref NVML_ERROR_INSUFFICIENT_SIZE \a pgpuMetadata buffer is too small, required size is returned in \a bufferSize + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a bufferSize is NULL or \a device is invalid; if \a pgpuMetadata is NULL and the value of \a bufferSize is not 0. + * - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the system + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetPgpuMetadataString(nvmlDevice_t device, char *pgpuMetadata, unsigned int *bufferSize); + +/** + * Returns the vGPU Software scheduler logs. + * \a pSchedulerLog points to a caller-allocated structure to contain the logs. The number of elements returned will + * never exceed \a NVML_SCHEDULER_SW_MAX_LOG_ENTRIES. + * + * To get the entire logs, call the function atleast 5 times a second. + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target \a device + * @param pSchedulerLog Reference in which \a pSchedulerLog is written + * + * @return + * - \ref NVML_SUCCESS vGPU scheduler logs were successfully obtained + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pSchedulerLog is NULL or \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED The API is not supported in current state or \a device not in vGPU host mode + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVgpuSchedulerLog(nvmlDevice_t device, nvmlVgpuSchedulerLog_t *pSchedulerLog); + +/** + * Returns the vGPU scheduler state. + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target \a device + * @param pSchedulerState Reference in which \a pSchedulerState is returned + * + * @return + * - \ref NVML_SUCCESS vGPU scheduler state is successfully obtained + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pSchedulerState is NULL or \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED The API is not supported in current state or \a device not in vGPU host mode + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVgpuSchedulerState(nvmlDevice_t device, nvmlVgpuSchedulerGetState_t *pSchedulerState); + +/** + * Sets the vGPU scheduler state. + * + * For Pascal &tm; or newer fully supported devices. + * + * The scheduler state change won’t persist across module load/unload. + * Scheduler state and params will be allowed to set only when no VM is running. + * In \a nvmlVgpuSchedulerSetState_t, IFF enableARRMode=1 then + * provide avgFactorForARR and frequency as input. If enableARRMode is disabled + * then provide timeslice as input. + * + * @param device The identifier of the target \a device + * @param pSchedulerState vGPU \a pSchedulerState to set + * + * @return + * - \ref NVML_SUCCESS vGPU scheduler state has been successfully set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pSchedulerState is NULL or \a device is invalid + * - \ref NVML_ERROR_RESET_REQUIRED if setting \a pSchedulerState failed with fatal error, + * reboot is required to overcome from this error. + * - \ref NVML_ERROR_NOT_SUPPORTED The API is not supported in current state or \a device not in vGPU host mode + * or if any vGPU instance currently exists on the \a device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetVgpuSchedulerState(nvmlDevice_t device, nvmlVgpuSchedulerSetState_t *pSchedulerState); + +/** + * Returns the vGPU scheduler capabilities. + * The list of supported vGPU schedulers returned in \a nvmlVgpuSchedulerCapabilities_t is from + * the NVML_VGPU_SCHEDULER_POLICY_*. This list enumerates the supported scheduler policies + * if the engine is Graphics type. + * The other values in \a nvmlVgpuSchedulerCapabilities_t are also applicable if the engine is + * Graphics type. For other engine types, it is BEST EFFORT policy. + * If ARR is supported and enabled, scheduling frequency and averaging factor are applicable + * else timeSlice is applicable. + * + * For Pascal &tm; or newer fully supported devices. + * + * @param device The identifier of the target \a device + * @param pCapabilities Reference in which \a pCapabilities is written + * + * @return + * - \ref NVML_SUCCESS vGPU scheduler capabilities were successfully obtained + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a pCapabilities is NULL or \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED The API is not supported in current state or \a device not in vGPU host mode + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVgpuSchedulerCapabilities(nvmlDevice_t device, nvmlVgpuSchedulerCapabilities_t *pCapabilities); + +/* + * Virtual GPU (vGPU) version + * + * The NVIDIA vGPU Manager and the guest drivers are tagged with a range of supported vGPU versions. This determines the range of NVIDIA guest driver versions that + * are compatible for vGPU feature support with a given NVIDIA vGPU Manager. For vGPU feature support, the range of supported versions for the NVIDIA vGPU Manager + * and the guest driver must overlap. Otherwise, the guest driver fails to load in the VM. + * + * When the NVIDIA guest driver loads, either when the VM is booted or when the driver is installed or upgraded, a negotiation occurs between the guest driver + * and the NVIDIA vGPU Manager to select the highest mutually compatible vGPU version. The negotiated vGPU version stays the same across VM migration. + */ + +/** + * Query the ranges of supported vGPU versions. + * + * This function gets the linear range of supported vGPU versions that is preset for the NVIDIA vGPU Manager and the range set by an administrator. + * If the preset range has not been overridden by \ref nvmlSetVgpuVersion, both ranges are the same. + * + * The caller passes pointers to the following \ref nvmlVgpuVersion_t structures, into which the NVIDIA vGPU Manager writes the ranges: + * 1. \a supported structure that represents the preset range of vGPU versions supported by the NVIDIA vGPU Manager. + * 2. \a current structure that represents the range of supported vGPU versions set by an administrator. By default, this range is the same as the preset range. + * + * @param supported Pointer to the structure in which the preset range of vGPU versions supported by the NVIDIA vGPU Manager is written + * @param current Pointer to the structure in which the range of supported vGPU versions set by an administrator is written + * + * @return + * - \ref NVML_SUCCESS The vGPU version range structures were successfully obtained. + * - \ref NVML_ERROR_NOT_SUPPORTED The API is not supported. + * - \ref NVML_ERROR_INVALID_ARGUMENT The \a supported parameter or the \a current parameter is NULL. + * - \ref NVML_ERROR_UNKNOWN An error occurred while the data was being fetched. + */ +nvmlReturn_t DECLDIR nvmlGetVgpuVersion(nvmlVgpuVersion_t *supported, nvmlVgpuVersion_t *current); + +/** + * Override the preset range of vGPU versions supported by the NVIDIA vGPU Manager with a range set by an administrator. + * + * This function configures the NVIDIA vGPU Manager with a range of supported vGPU versions set by an administrator. This range must be a subset of the + * preset range that the NVIDIA vGPU Manager supports. The custom range set by an administrator takes precedence over the preset range and is advertised to + * the guest VM for negotiating the vGPU version. See \ref nvmlGetVgpuVersion for details of how to query the preset range of versions supported. + * + * This function takes a pointer to vGPU version range structure \ref nvmlVgpuVersion_t as input to override the preset vGPU version range that the NVIDIA vGPU Manager supports. + * + * After host system reboot or driver reload, the range of supported versions reverts to the range that is preset for the NVIDIA vGPU Manager. + * + * @note 1. The range set by the administrator must be a subset of the preset range that the NVIDIA vGPU Manager supports. Otherwise, an error is returned. + * 2. If the range of supported guest driver versions does not overlap the range set by the administrator, the guest driver fails to load. + * 3. If the range of supported guest driver versions overlaps the range set by the administrator, the guest driver will load with a negotiated + * vGPU version that is the maximum value in the overlapping range. + * 4. No VMs must be running on the host when this function is called. If a VM is running on the host, the call to this function fails. + * + * @param vgpuVersion Pointer to a caller-supplied range of supported vGPU versions. + * + * @return + * - \ref NVML_SUCCESS The preset range of supported vGPU versions was successfully overridden. + * - \ref NVML_ERROR_NOT_SUPPORTED The API is not supported. + * - \ref NVML_ERROR_IN_USE The range was not overridden because a VM is running on the host. + * - \ref NVML_ERROR_INVALID_ARGUMENT The \a vgpuVersion parameter specifies a range that is outside the range supported by the NVIDIA vGPU Manager or if \a vgpuVersion is NULL. + */ +nvmlReturn_t DECLDIR nvmlSetVgpuVersion(nvmlVgpuVersion_t *vgpuVersion); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlUtil vGPU Utilization and Accounting + * This chapter describes operations that are associated with vGPU Utilization and Accounting. + * @{ + */ +/***************************************************************************************************/ + +/** + * Retrieves current utilization for vGPUs on a physical GPU (device). + * + * For Kepler &tm; or newer fully supported devices. + * + * Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder for vGPU instances running + * on a device. Utilization values are returned as an array of utilization sample structures in the caller-supplied buffer + * pointed at by \a utilizationSamples. One utilization sample structure is returned per vGPU instance, and includes the + * CPU timestamp at which the samples were recorded. Individual utilization values are returned as "unsigned int" values + * in nvmlValue_t unions. The function sets the caller-supplied \a sampleValType to NVML_VALUE_TYPE_UNSIGNED_INT to + * indicate the returned value type. + * + * To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with + * \a utilizationSamples set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current vGPU instance + * count in \a vgpuInstanceSamplesCount, or NVML_SUCCESS if the current vGPU instance count is zero. The caller should allocate + * a buffer of size vgpuInstanceSamplesCount * sizeof(nvmlVgpuInstanceUtilizationSample_t). Invoke the function again with + * the allocated buffer passed in \a utilizationSamples, and \a vgpuInstanceSamplesCount set to the number of entries the + * buffer is sized for. + * + * On successful return, the function updates \a vgpuInstanceSampleCount with the number of vGPU utilization sample + * structures that were actually written. This may differ from a previously read value as vGPU instances are created or + * destroyed. + * + * lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0 + * to read utilization based on all the samples maintained by the driver's internal sample buffer. Set lastSeenTimeStamp + * to a timeStamp retrieved from a previous query to read utilization since the previous query. + * + * @param device The identifier for the target device + * @param lastSeenTimeStamp Return only samples with timestamp greater than lastSeenTimeStamp. + * @param sampleValType Pointer to caller-supplied buffer to hold the type of returned sample values + * @param vgpuInstanceSamplesCount Pointer to caller-supplied array size, and returns number of vGPU instances + * @param utilizationSamples Pointer to caller-supplied buffer in which vGPU utilization samples are returned + + * @return + * - \ref NVML_SUCCESS if utilization samples are successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a vgpuInstanceSamplesCount or \a sampleValType is + * NULL, or a sample count of 0 is passed with a non-NULL \a utilizationSamples + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if supplied \a vgpuInstanceSamplesCount is too small to return samples for all + * vGPU instances currently executing on the device + * - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_FOUND if sample entries are not found + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVgpuUtilization(nvmlDevice_t device, unsigned long long lastSeenTimeStamp, + nvmlValueType_t *sampleValType, unsigned int *vgpuInstanceSamplesCount, + nvmlVgpuInstanceUtilizationSample_t *utilizationSamples); + +/** + * Retrieves current utilization for processes running on vGPUs on a physical GPU (device). + * + * For Maxwell &tm; or newer fully supported devices. + * + * Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder for processes running on + * vGPU instances active on a device. Utilization values are returned as an array of utilization sample structures in the + * caller-supplied buffer pointed at by \a utilizationSamples. One utilization sample structure is returned per process running + * on vGPU instances, that had some non-zero utilization during the last sample period. It includes the CPU timestamp at which + * the samples were recorded. Individual utilization values are returned as "unsigned int" values. + * + * To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with + * \a utilizationSamples set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current vGPU instance + * count in \a vgpuProcessSamplesCount. The caller should allocate a buffer of size + * vgpuProcessSamplesCount * sizeof(nvmlVgpuProcessUtilizationSample_t). Invoke the function again with + * the allocated buffer passed in \a utilizationSamples, and \a vgpuProcessSamplesCount set to the number of entries the + * buffer is sized for. + * + * On successful return, the function updates \a vgpuSubProcessSampleCount with the number of vGPU sub process utilization sample + * structures that were actually written. This may differ from a previously read value depending on the number of processes that are active + * in any given sample period. + * + * lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0 + * to read utilization based on all the samples maintained by the driver's internal sample buffer. Set lastSeenTimeStamp + * to a timeStamp retrieved from a previous query to read utilization since the previous query. + * + * @param device The identifier for the target device + * @param lastSeenTimeStamp Return only samples with timestamp greater than lastSeenTimeStamp. + * @param vgpuProcessSamplesCount Pointer to caller-supplied array size, and returns number of processes running on vGPU instances + * @param utilizationSamples Pointer to caller-supplied buffer in which vGPU sub process utilization samples are returned + + * @return + * - \ref NVML_SUCCESS if utilization samples are successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a vgpuProcessSamplesCount or a sample count of 0 is + * passed with a non-NULL \a utilizationSamples + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if supplied \a vgpuProcessSamplesCount is too small to return samples for all + * vGPU instances currently executing on the device + * - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the device + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_NOT_FOUND if sample entries are not found + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetVgpuProcessUtilization(nvmlDevice_t device, unsigned long long lastSeenTimeStamp, + unsigned int *vgpuProcessSamplesCount, + nvmlVgpuProcessUtilizationSample_t *utilizationSamples); +/** + * Queries the state of per process accounting mode on vGPU. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param vgpuInstance The identifier of the target vGPU instance + * @param mode Reference in which to return the current accounting mode + * + * @return + * - \ref NVML_SUCCESS if the mode has been successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a mode is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_NOT_SUPPORTED if the vGPU doesn't support this feature + * - \ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running on the vGPU instance + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetAccountingMode(nvmlVgpuInstance_t vgpuInstance, nvmlEnableState_t *mode); + +/** + * Queries list of processes running on vGPU that can be queried for accounting stats. The list of processes + * returned can be in running or terminated state. + * + * For Maxwell &tm; or newer fully supported devices. + * + * To just query the maximum number of processes that can be queried, call this function with *count = 0 and + * pids=NULL. The return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if list is empty. + * + * For more details see \ref nvmlVgpuInstanceGetAccountingStats. + * + * @note In case of PID collision some processes might not be accessible before the circular buffer is full. + * + * @param vgpuInstance The identifier of the target vGPU instance + * @param count Reference in which to provide the \a pids array size, and + * to return the number of elements ready to be queried + * @param pids Reference in which to return list of process ids + * + * @return + * - \ref NVML_SUCCESS if pids were successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a count is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_NOT_SUPPORTED if the vGPU doesn't support this feature or accounting mode is disabled + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a count is too small (\a count is set to expected value) + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + * + * @see nvmlVgpuInstanceGetAccountingPids + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetAccountingPids(nvmlVgpuInstance_t vgpuInstance, unsigned int *count, unsigned int *pids); + +/** + * Queries process's accounting stats. + * + * For Maxwell &tm; or newer fully supported devices. + * + * Accounting stats capture GPU utilization and other statistics across the lifetime of a process, and + * can be queried during life time of the process or after its termination. + * The time field in \ref nvmlAccountingStats_t is reported as 0 during the lifetime of the process and + * updated to actual running time after its termination. + * Accounting stats are kept in a circular buffer, newly created processes overwrite information about old + * processes. + * + * See \ref nvmlAccountingStats_t for description of each returned metric. + * List of processes that can be queried can be retrieved from \ref nvmlVgpuInstanceGetAccountingPids. + * + * @note Accounting Mode needs to be on. See \ref nvmlVgpuInstanceGetAccountingMode. + * @note Only compute and graphics applications stats can be queried. Monitoring applications stats can't be + * queried since they don't contribute to GPU utilization. + * @note In case of pid collision stats of only the latest process (that terminated last) will be reported + * + * @param vgpuInstance The identifier of the target vGPU instance + * @param pid Process Id of the target process to query stats for + * @param stats Reference in which to return the process's accounting stats + * + * @return + * - \ref NVML_SUCCESS if stats have been successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a stats is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * or \a stats is not found + * - \ref NVML_ERROR_NOT_SUPPORTED if the vGPU doesn't support this feature or accounting mode is disabled + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetAccountingStats(nvmlVgpuInstance_t vgpuInstance, unsigned int pid, nvmlAccountingStats_t *stats); + +/** + * Clears accounting information of the vGPU instance that have already terminated. + * + * For Maxwell &tm; or newer fully supported devices. + * Requires root/admin permissions. + * + * @note Accounting Mode needs to be on. See \ref nvmlVgpuInstanceGetAccountingMode. + * @note Only compute and graphics applications stats are reported and can be cleared since monitoring applications + * stats don't contribute to GPU utilization. + * + * @param vgpuInstance The identifier of the target vGPU instance + * + * @return + * - \ref NVML_SUCCESS if accounting information has been cleared + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is invalid + * - \ref NVML_ERROR_NO_PERMISSION if the user doesn't have permission to perform this operation + * - \ref NVML_ERROR_NOT_SUPPORTED if the vGPU doesn't support this feature or accounting mode is disabled + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceClearAccountingPids(nvmlVgpuInstance_t vgpuInstance); + +/** + * Query the license information of the vGPU instance. + * + * For Maxwell &tm; or newer fully supported devices. + * + * @param vgpuInstance Identifier of the target vGPU instance + * @param licenseInfo Pointer to vGPU license information structure + * + * @return + * - \ref NVML_SUCCESS if information is successfully retrieved + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a vgpuInstance is 0, or \a licenseInfo is NULL + * - \ref NVML_ERROR_NOT_FOUND if \a vgpuInstance does not match a valid active vGPU instance on the system + * - \ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running on the vGPU instance + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetLicenseInfo_v2(nvmlVgpuInstance_t vgpuInstance, nvmlVgpuLicenseInfo_t *licenseInfo); +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlExcludedGpuQueries Excluded GPU Queries + * This chapter describes NVML operations that are associated with excluded GPUs. + * @{ + */ +/***************************************************************************************************/ + +/** + * Excluded GPU device information + **/ +typedef struct nvmlExcludedDeviceInfo_st +{ + nvmlPciInfo_t pciInfo; //!< The PCI information for the excluded GPU + char uuid[NVML_DEVICE_UUID_BUFFER_SIZE]; //!< The ASCII string UUID for the excluded GPU +} nvmlExcludedDeviceInfo_t; + + /** + * Retrieves the number of excluded GPU devices in the system. + * + * For all products. + * + * @param deviceCount Reference in which to return the number of excluded devices + * + * @return + * - \ref NVML_SUCCESS if \a deviceCount has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a deviceCount is NULL + */ +nvmlReturn_t DECLDIR nvmlGetExcludedDeviceCount(unsigned int *deviceCount); + +/** + * Acquire the device information for an excluded GPU device, based on its index. + * + * For all products. + * + * Valid indices are derived from the \a deviceCount returned by + * \ref nvmlGetExcludedDeviceCount(). For example, if \a deviceCount is 2 the valid indices + * are 0 and 1, corresponding to GPU 0 and GPU 1. + * + * @param index The index of the target GPU, >= 0 and < \a deviceCount + * @param info Reference in which to return the device information + * + * @return + * - \ref NVML_SUCCESS if \a device has been set + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a index is invalid or \a info is NULL + * + * @see nvmlGetExcludedDeviceCount + */ +nvmlReturn_t DECLDIR nvmlGetExcludedDeviceInfoByIndex(unsigned int index, nvmlExcludedDeviceInfo_t *info); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup nvmlMultiInstanceGPU Multi Instance GPU Management + * This chapter describes NVML operations that are associated with Multi Instance GPU management. + * @{ + */ +/***************************************************************************************************/ + +/** + * Disable Multi Instance GPU mode. + */ +#define NVML_DEVICE_MIG_DISABLE 0x0 + +/** + * Enable Multi Instance GPU mode. + */ +#define NVML_DEVICE_MIG_ENABLE 0x1 + +/** + * GPU instance profiles. + * + * These macros should be passed to \ref nvmlDeviceGetGpuInstanceProfileInfo to retrieve the + * detailed information about a GPU instance such as profile ID, engine counts. + */ +#define NVML_GPU_INSTANCE_PROFILE_1_SLICE 0x0 +#define NVML_GPU_INSTANCE_PROFILE_2_SLICE 0x1 +#define NVML_GPU_INSTANCE_PROFILE_3_SLICE 0x2 +#define NVML_GPU_INSTANCE_PROFILE_4_SLICE 0x3 +#define NVML_GPU_INSTANCE_PROFILE_7_SLICE 0x4 +#define NVML_GPU_INSTANCE_PROFILE_8_SLICE 0x5 +#define NVML_GPU_INSTANCE_PROFILE_6_SLICE 0x6 +#define NVML_GPU_INSTANCE_PROFILE_1_SLICE_REV1 0x7 +#define NVML_GPU_INSTANCE_PROFILE_2_SLICE_REV1 0x8 +#define NVML_GPU_INSTANCE_PROFILE_1_SLICE_REV2 0x9 +#define NVML_GPU_INSTANCE_PROFILE_COUNT 0xA + +typedef struct nvmlGpuInstancePlacement_st +{ + unsigned int start; //!< Index of first occupied memory slice + unsigned int size; //!< Number of memory slices occupied +} nvmlGpuInstancePlacement_t; + +/** + * GPU instance profile information. + */ +typedef struct nvmlGpuInstanceProfileInfo_st +{ + unsigned int id; //!< Unique profile ID within the device + unsigned int isP2pSupported; //!< Peer-to-Peer support + unsigned int sliceCount; //!< GPU Slice count + unsigned int instanceCount; //!< GPU instance count + unsigned int multiprocessorCount; //!< Streaming Multiprocessor count + unsigned int copyEngineCount; //!< Copy Engine count + unsigned int decoderCount; //!< Decoder Engine count + unsigned int encoderCount; //!< Encoder Engine count + unsigned int jpegCount; //!< JPEG Engine count + unsigned int ofaCount; //!< OFA Engine count + unsigned long long memorySizeMB; //!< Memory size in MBytes +} nvmlGpuInstanceProfileInfo_t; + +/** + * GPU instance profile information (v2). + * + * Version 2 adds the \ref nvmlGpuInstanceProfileInfo_v2_t.version field + * to the start of the structure, and the \ref nvmlGpuInstanceProfileInfo_v2_t.name + * field to the end. This structure is not backwards-compatible with + * \ref nvmlGpuInstanceProfileInfo_t. + */ +typedef struct nvmlGpuInstanceProfileInfo_v2_st +{ + unsigned int version; //!< Structure version identifier (set to \ref nvmlGpuInstanceProfileInfo_v2) + unsigned int id; //!< Unique profile ID within the device + unsigned int isP2pSupported; //!< Peer-to-Peer support + unsigned int sliceCount; //!< GPU Slice count + unsigned int instanceCount; //!< GPU instance count + unsigned int multiprocessorCount; //!< Streaming Multiprocessor count + unsigned int copyEngineCount; //!< Copy Engine count + unsigned int decoderCount; //!< Decoder Engine count + unsigned int encoderCount; //!< Encoder Engine count + unsigned int jpegCount; //!< JPEG Engine count + unsigned int ofaCount; //!< OFA Engine count + unsigned long long memorySizeMB; //!< Memory size in MBytes + char name[NVML_DEVICE_NAME_V2_BUFFER_SIZE]; //!< Profile name +} nvmlGpuInstanceProfileInfo_v2_t; + +/** + * Version identifier value for \ref nvmlGpuInstanceProfileInfo_v2_t.version. + */ +#define nvmlGpuInstanceProfileInfo_v2 NVML_STRUCT_VERSION(GpuInstanceProfileInfo, 2) + +typedef struct nvmlGpuInstanceInfo_st +{ + nvmlDevice_t device; //!< Parent device + unsigned int id; //!< Unique instance ID within the device + unsigned int profileId; //!< Unique profile ID within the device + nvmlGpuInstancePlacement_t placement; //!< Placement for this instance +} nvmlGpuInstanceInfo_t; + +typedef struct +{ + struct nvmlGpuInstance_st* handle; +} nvmlGpuInstance_t; + +/** + * Compute instance profiles. + * + * These macros should be passed to \ref nvmlGpuInstanceGetComputeInstanceProfileInfo to retrieve the + * detailed information about a compute instance such as profile ID, engine counts + */ +#define NVML_COMPUTE_INSTANCE_PROFILE_1_SLICE 0x0 +#define NVML_COMPUTE_INSTANCE_PROFILE_2_SLICE 0x1 +#define NVML_COMPUTE_INSTANCE_PROFILE_3_SLICE 0x2 +#define NVML_COMPUTE_INSTANCE_PROFILE_4_SLICE 0x3 +#define NVML_COMPUTE_INSTANCE_PROFILE_7_SLICE 0x4 +#define NVML_COMPUTE_INSTANCE_PROFILE_8_SLICE 0x5 +#define NVML_COMPUTE_INSTANCE_PROFILE_6_SLICE 0x6 +#define NVML_COMPUTE_INSTANCE_PROFILE_1_SLICE_REV1 0x7 +#define NVML_COMPUTE_INSTANCE_PROFILE_COUNT 0x8 + +#define NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED 0x0 //!< All the engines except multiprocessors would be shared +#define NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT 0x1 + +typedef struct nvmlComputeInstancePlacement_st +{ + unsigned int start; //!< Index of first occupied compute slice + unsigned int size; //!< Number of compute slices occupied +} nvmlComputeInstancePlacement_t; + +/** + * Compute instance profile information. + */ +typedef struct nvmlComputeInstanceProfileInfo_st +{ + unsigned int id; //!< Unique profile ID within the GPU instance + unsigned int sliceCount; //!< GPU Slice count + unsigned int instanceCount; //!< Compute instance count + unsigned int multiprocessorCount; //!< Streaming Multiprocessor count + unsigned int sharedCopyEngineCount; //!< Shared Copy Engine count + unsigned int sharedDecoderCount; //!< Shared Decoder Engine count + unsigned int sharedEncoderCount; //!< Shared Encoder Engine count + unsigned int sharedJpegCount; //!< Shared JPEG Engine count + unsigned int sharedOfaCount; //!< Shared OFA Engine count +} nvmlComputeInstanceProfileInfo_t; + +/** + * Compute instance profile information (v2). + * + * Version 2 adds the \ref nvmlComputeInstanceProfileInfo_v2_t.version field + * to the start of the structure, and the \ref nvmlComputeInstanceProfileInfo_v2_t.name + * field to the end. This structure is not backwards-compatible with + * \ref nvmlComputeInstanceProfileInfo_t. + */ +typedef struct nvmlComputeInstanceProfileInfo_v2_st +{ + unsigned int version; //!< Structure version identifier (set to \ref nvmlComputeInstanceProfileInfo_v2) + unsigned int id; //!< Unique profile ID within the GPU instance + unsigned int sliceCount; //!< GPU Slice count + unsigned int instanceCount; //!< Compute instance count + unsigned int multiprocessorCount; //!< Streaming Multiprocessor count + unsigned int sharedCopyEngineCount; //!< Shared Copy Engine count + unsigned int sharedDecoderCount; //!< Shared Decoder Engine count + unsigned int sharedEncoderCount; //!< Shared Encoder Engine count + unsigned int sharedJpegCount; //!< Shared JPEG Engine count + unsigned int sharedOfaCount; //!< Shared OFA Engine count + char name[NVML_DEVICE_NAME_V2_BUFFER_SIZE]; //!< Profile name +} nvmlComputeInstanceProfileInfo_v2_t; + +/** + * Version identifier value for \ref nvmlComputeInstanceProfileInfo_v2_t.version. + */ +#define nvmlComputeInstanceProfileInfo_v2 NVML_STRUCT_VERSION(ComputeInstanceProfileInfo, 2) + +typedef struct nvmlComputeInstanceInfo_st +{ + nvmlDevice_t device; //!< Parent device + nvmlGpuInstance_t gpuInstance; //!< Parent GPU instance + unsigned int id; //!< Unique instance ID within the GPU instance + unsigned int profileId; //!< Unique profile ID within the GPU instance + nvmlComputeInstancePlacement_t placement; //!< Placement for this instance within the GPU instance's compute slice range {0, sliceCount} +} nvmlComputeInstanceInfo_t; + +typedef struct +{ + struct nvmlComputeInstance_st* handle; +} nvmlComputeInstance_t; + +/** + * Set MIG mode for the device. + * + * For Ampere &tm; or newer fully supported devices. + * Requires root user. + * + * This mode determines whether a GPU instance can be created. + * + * This API may unbind or reset the device to activate the requested mode. Thus, the attributes associated with the + * device, such as minor number, might change. The caller of this API is expected to query such attributes again. + * + * On certain platforms like pass-through virtualization, where reset functionality may not be exposed directly, VM + * reboot is required. \a activationStatus would return \ref NVML_ERROR_RESET_REQUIRED for such cases. + * + * \a activationStatus would return the appropriate error code upon unsuccessful activation. For example, if device + * unbind fails because the device isn't idle, \ref NVML_ERROR_IN_USE would be returned. The caller of this API + * is expected to idle the device and retry setting the \a mode. + * + * @note On Windows, only disabling MIG mode is supported. \a activationStatus would return \ref + * NVML_ERROR_NOT_SUPPORTED as GPU reset is not supported on Windows through this API. + * + * @param device The identifier of the target device + * @param mode The mode to be set, \ref NVML_DEVICE_MIG_DISABLE or + * \ref NVML_DEVICE_MIG_ENABLE + * @param activationStatus The activationStatus status + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device,\a mode or \a activationStatus are invalid + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't support MIG mode + */ +nvmlReturn_t DECLDIR nvmlDeviceSetMigMode(nvmlDevice_t device, unsigned int mode, nvmlReturn_t *activationStatus); + +/** + * Get MIG mode for the device. + * + * For Ampere &tm; or newer fully supported devices. + * + * Changing MIG modes may require device unbind or reset. The "pending" MIG mode refers to the target mode following the + * next activation trigger. + * + * @param device The identifier of the target device + * @param currentMode Returns the current mode, \ref NVML_DEVICE_MIG_DISABLE or + * \ref NVML_DEVICE_MIG_ENABLE + * @param pendingMode Returns the pending mode, \ref NVML_DEVICE_MIG_DISABLE or + * \ref NVML_DEVICE_MIG_ENABLE + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a currentMode or \a pendingMode are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't support MIG mode + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMigMode(nvmlDevice_t device, unsigned int *currentMode, unsigned int *pendingMode); + +/** + * Get GPU instance profile information. + * + * Information provided by this API is immutable throughout the lifetime of a MIG mode. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device The identifier of the target device + * @param profile One of the NVML_GPU_INSTANCE_PROFILE_* + * @param info Returns detailed profile information + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profile or \a info are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or \a profile isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceProfileInfo(nvmlDevice_t device, unsigned int profile, + nvmlGpuInstanceProfileInfo_t *info); + +/** + * Versioned wrapper around \ref nvmlDeviceGetGpuInstanceProfileInfo that accepts a versioned + * \ref nvmlGpuInstanceProfileInfo_v2_t or later output structure. + * + * @note The caller must set the \ref nvmlGpuInstanceProfileInfo_v2_t.version field to the + * appropriate version prior to calling this function. For example: + * \code + * nvmlGpuInstanceProfileInfo_v2_t profileInfo = + * { .version = nvmlGpuInstanceProfileInfo_v2 }; + * nvmlReturn_t result = nvmlDeviceGetGpuInstanceProfileInfoV(device, + * profile, + * &profileInfo); + * \endcode + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device The identifier of the target device + * @param profile One of the NVML_GPU_INSTANCE_PROFILE_* + * @param info Returns detailed profile information + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profile, \a info, or \a info->version are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or \a profile isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceProfileInfoV(nvmlDevice_t device, unsigned int profile, + nvmlGpuInstanceProfileInfo_v2_t *info); + +/** + * Get GPU instance placements. + * + * A placement represents the location of a GPU instance within a device. This API only returns all the possible + * placements for the given profile. + * A created GPU instance occupies memory slices described by its placement. Creation of new GPU instance will + * fail if there is overlap with the already occupied memory slices. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param device The identifier of the target device + * @param profileId The GPU instance profile ID. See \ref nvmlDeviceGetGpuInstanceProfileInfo + * @param placements Returns placements allowed for the profile. Can be NULL to discover number + * of allowed placements for this profile. If non-NULL must be large enough + * to accommodate the placements supported by the profile. + * @param count Returns number of allowed placemenets for the profile. + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profileId or \a count are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or \a profileId isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstancePossiblePlacements_v2(nvmlDevice_t device, unsigned int profileId, + nvmlGpuInstancePlacement_t *placements, + unsigned int *count); + +/** + * Get GPU instance profile capacity. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param device The identifier of the target device + * @param profileId The GPU instance profile ID. See \ref nvmlDeviceGetGpuInstanceProfileInfo + * @param count Returns remaining instance count for the profile ID + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profileId or \a count are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or \a profileId isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceRemainingCapacity(nvmlDevice_t device, unsigned int profileId, + unsigned int *count); + +/** + * Create GPU instance. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * If the parent device is unbound, reset or the GPU instance is destroyed explicitly, the GPU instance handle would + * become invalid. The GPU instance must be recreated to acquire a valid handle. + * + * @param device The identifier of the target device + * @param profileId The GPU instance profile ID. See \ref nvmlDeviceGetGpuInstanceProfileInfo + * @param gpuInstance Returns the GPU instance handle + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profile, \a profileId or \a gpuInstance are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or in vGPU guest + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_INSUFFICIENT_RESOURCES If the requested GPU instance could not be created + */ +nvmlReturn_t DECLDIR nvmlDeviceCreateGpuInstance(nvmlDevice_t device, unsigned int profileId, + nvmlGpuInstance_t *gpuInstance); + +/** + * Create GPU instance with the specified placement. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * If the parent device is unbound, reset or the GPU instance is destroyed explicitly, the GPU instance handle would + * become invalid. The GPU instance must be recreated to acquire a valid handle. + * + * @param device The identifier of the target device + * @param profileId The GPU instance profile ID. See \ref nvmlDeviceGetGpuInstanceProfileInfo + * @param placement The requested placement. See \ref nvmlDeviceGetGpuInstancePossiblePlacements_v2 + * @param gpuInstance Returns the GPU instance handle + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profile, \a profileId, \a placement or \a gpuInstance + * are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or in vGPU guest + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_INSUFFICIENT_RESOURCES If the requested GPU instance could not be created + */ +nvmlReturn_t DECLDIR nvmlDeviceCreateGpuInstanceWithPlacement(nvmlDevice_t device, unsigned int profileId, + const nvmlGpuInstancePlacement_t *placement, + nvmlGpuInstance_t *gpuInstance); +/** + * Destroy GPU instance. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param gpuInstance The GPU instance handle + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or in vGPU guest + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_IN_USE If the GPU instance is in use. This error would be returned if processes + * (e.g. CUDA application) or compute instances are active on the + * GPU instance. + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceDestroy(nvmlGpuInstance_t gpuInstance); + +/** + * Get GPU instances for given profile ID. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param device The identifier of the target device + * @param profileId The GPU instance profile ID. See \ref nvmlDeviceGetGpuInstanceProfileInfo + * @param gpuInstances Returns pre-exiting GPU instances, the buffer must be large enough to + * accommodate the instances supported by the profile. + * See \ref nvmlDeviceGetGpuInstanceProfileInfo + * @param count The count of returned GPU instances + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profileId, \a gpuInstances or \a count are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstances(nvmlDevice_t device, unsigned int profileId, + nvmlGpuInstance_t *gpuInstances, unsigned int *count); + +/** + * Get GPU instances for given instance ID. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param device The identifier of the target device + * @param id The GPU instance ID + * @param gpuInstance Returns GPU instance + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a id or \a gpuInstance are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_NOT_FOUND If the GPU instance is not found. + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceById(nvmlDevice_t device, unsigned int id, nvmlGpuInstance_t *gpuInstance); + +/** + * Get GPU instance information. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param gpuInstance The GPU instance handle + * @param info Return GPU instance information + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance or \a info are invalid + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceGetInfo(nvmlGpuInstance_t gpuInstance, nvmlGpuInstanceInfo_t *info); + +/** + * Get compute instance profile information. + * + * Information provided by this API is immutable throughout the lifetime of a MIG mode. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param gpuInstance The identifier of the target GPU instance + * @param profile One of the NVML_COMPUTE_INSTANCE_PROFILE_* + * @param engProfile One of the NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_* + * @param info Returns detailed profile information + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance, \a profile, \a engProfile or \a info are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a profile isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceGetComputeInstanceProfileInfo(nvmlGpuInstance_t gpuInstance, unsigned int profile, + unsigned int engProfile, + nvmlComputeInstanceProfileInfo_t *info); + +/** + * Versioned wrapper around \ref nvmlGpuInstanceGetComputeInstanceProfileInfo that accepts a versioned + * \ref nvmlComputeInstanceProfileInfo_v2_t or later output structure. + * + * @note The caller must set the \ref nvmlGpuInstanceProfileInfo_v2_t.version field to the + * appropriate version prior to calling this function. For example: + * \code + * nvmlComputeInstanceProfileInfo_v2_t profileInfo = + * { .version = nvmlComputeInstanceProfileInfo_v2 }; + * nvmlReturn_t result = nvmlGpuInstanceGetComputeInstanceProfileInfoV(gpuInstance, + * profile, + * engProfile, + * &profileInfo); + * \endcode + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param gpuInstance The identifier of the target GPU instance + * @param profile One of the NVML_COMPUTE_INSTANCE_PROFILE_* + * @param engProfile One of the NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_* + * @param info Returns detailed profile information + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance, \a profile, \a engProfile, \a info, or \a info->version are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a profile isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceGetComputeInstanceProfileInfoV(nvmlGpuInstance_t gpuInstance, unsigned int profile, + unsigned int engProfile, + nvmlComputeInstanceProfileInfo_v2_t *info); + +/** + * Get compute instance profile capacity. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param gpuInstance The identifier of the target GPU instance + * @param profileId The compute instance profile ID. + * See \ref nvmlGpuInstanceGetComputeInstanceProfileInfo + * @param count Returns remaining instance count for the profile ID + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance, \a profileId or \a availableCount are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a profileId isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceGetComputeInstanceRemainingCapacity(nvmlGpuInstance_t gpuInstance, + unsigned int profileId, unsigned int *count); + +/** + * Get compute instance placements. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * A placement represents the location of a compute instance within a GPU instance. This API only returns all the possible + * placements for the given profile. + * A created compute instance occupies compute slices described by its placement. Creation of new compute instance will + * fail if there is overlap with the already occupied compute slices. + * + * @param gpuInstance The identifier of the target GPU instance + * @param profileId The compute instance profile ID. See \ref nvmlGpuInstanceGetComputeInstanceProfileInfo + * @param placements Returns placements allowed for the profile. Can be NULL to discover number + * of allowed placements for this profile. If non-NULL must be large enough + * to accommodate the placements supported by the profile. + * @param count Returns number of allowed placemenets for the profile. + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance, \a profileId or \a count are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or \a profileId isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceGetComputeInstancePossiblePlacements(nvmlGpuInstance_t gpuInstance, + unsigned int profileId, + nvmlComputeInstancePlacement_t *placements, + unsigned int *count); + +/** + * Create compute instance. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * If the parent device is unbound, reset or the parent GPU instance is destroyed or the compute instance is destroyed + * explicitly, the compute instance handle would become invalid. The compute instance must be recreated to acquire + * a valid handle. + * + * @param gpuInstance The identifier of the target GPU instance + * @param profileId The compute instance profile ID. + * See \ref nvmlGpuInstanceGetComputeInstanceProfileInfo + * @param computeInstance Returns the compute instance handle + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance, \a profile, \a profileId or \a computeInstance + * are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a profileId isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_INSUFFICIENT_RESOURCES If the requested compute instance could not be created + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceCreateComputeInstance(nvmlGpuInstance_t gpuInstance, unsigned int profileId, + nvmlComputeInstance_t *computeInstance); + +/** + * Create compute instance with the specified placement. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * If the parent device is unbound, reset or the parent GPU instance is destroyed or the compute instance is destroyed + * explicitly, the compute instance handle would become invalid. The compute instance must be recreated to acquire + * a valid handle. + * + * @param gpuInstance The identifier of the target GPU instance + * @param profileId The compute instance profile ID. + * See \ref nvmlGpuInstanceGetComputeInstanceProfileInfo + * @param placement The requested placement. See \ref nvmlGpuInstanceGetComputeInstancePossiblePlacements + * @param computeInstance Returns the compute instance handle + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance, \a profile, \a profileId or \a computeInstance + * are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a profileId isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_INSUFFICIENT_RESOURCES If the requested compute instance could not be created + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceCreateComputeInstanceWithPlacement(nvmlGpuInstance_t gpuInstance, unsigned int profileId, + const nvmlComputeInstancePlacement_t *placement, + nvmlComputeInstance_t *computeInstance); + +/** + * Destroy compute instance. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param computeInstance The compute instance handle + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a computeInstance is invalid + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_IN_USE If the compute instance is in use. This error would be returned if + * processes (e.g. CUDA application) are active on the compute instance. + */ +nvmlReturn_t DECLDIR nvmlComputeInstanceDestroy(nvmlComputeInstance_t computeInstance); + +/** + * Get compute instances for given profile ID. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param gpuInstance The identifier of the target GPU instance + * @param profileId The compute instance profile ID. + * See \ref nvmlGpuInstanceGetComputeInstanceProfileInfo + * @param computeInstances Returns pre-exiting compute instances, the buffer must be large enough to + * accommodate the instances supported by the profile. + * See \ref nvmlGpuInstanceGetComputeInstanceProfileInfo + * @param count The count of returned compute instances + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a gpuInstance, \a profileId, \a computeInstances or \a count + * are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a profileId isn't supported + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceGetComputeInstances(nvmlGpuInstance_t gpuInstance, unsigned int profileId, + nvmlComputeInstance_t *computeInstances, unsigned int *count); + +/** + * Get compute instance for given instance ID. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * Requires privileged user. + * + * @param gpuInstance The identifier of the target GPU instance + * @param id The compute instance ID + * @param computeInstance Returns compute instance + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a ID or \a computeInstance are invalid + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + * - \ref NVML_ERROR_NOT_FOUND If the compute instance is not found. + */ +nvmlReturn_t DECLDIR nvmlGpuInstanceGetComputeInstanceById(nvmlGpuInstance_t gpuInstance, unsigned int id, + nvmlComputeInstance_t *computeInstance); + +/** + * Get compute instance information. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param computeInstance The compute instance handle + * @param info Return compute instance information + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT If \a computeInstance or \a info are invalid + * - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation + */ +nvmlReturn_t DECLDIR nvmlComputeInstanceGetInfo_v2(nvmlComputeInstance_t computeInstance, nvmlComputeInstanceInfo_t *info); + +/** + * Test if the given handle refers to a MIG device. + * + * A MIG device handle is an NVML abstraction which maps to a MIG compute instance. + * These overloaded references can be used (with some restrictions) interchangeably + * with a GPU device handle to execute queries at a per-compute instance granularity. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device NVML handle to test + * @param isMigDevice True when handle refers to a MIG device + * + * @return + * - \ref NVML_SUCCESS if \a device status was successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device handle or \a isMigDevice reference is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if this check is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceIsMigDeviceHandle(nvmlDevice_t device, unsigned int *isMigDevice); + +/** + * Get GPU instance ID for the given MIG device handle. + * + * GPU instance IDs are unique per device and remain valid until the GPU instance is destroyed. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device Target MIG device handle + * @param id GPU instance ID + * + * @return + * - \ref NVML_SUCCESS if instance ID was successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a id reference is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceId(nvmlDevice_t device, unsigned int *id); + +/** + * Get compute instance ID for the given MIG device handle. + * + * Compute instance IDs are unique per GPU instance and remain valid until the compute instance + * is destroyed. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device Target MIG device handle + * @param id Compute instance ID + * + * @return + * - \ref NVML_SUCCESS if instance ID was successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a id reference is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetComputeInstanceId(nvmlDevice_t device, unsigned int *id); + +/** + * Get the maximum number of MIG devices that can exist under a given parent NVML device. + * + * Returns zero if MIG is not supported or enabled. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device Target device handle + * @param count Count of MIG devices + * + * @return + * - \ref NVML_SUCCESS if \a count was successfully retrieved + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a count reference is invalid + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMaxMigDeviceCount(nvmlDevice_t device, unsigned int *count); + +/** + * Get MIG device handle for the given index under its parent NVML device. + * + * If the compute instance is destroyed either explicitly or by destroying, + * resetting or unbinding the parent GPU instance or the GPU device itself + * the MIG device handle would remain invalid and must be requested again + * using this API. Handles may be reused and their properties can change in + * the process. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param device Reference to the parent GPU device handle + * @param index Index of the MIG device + * @param migDevice Reference to the MIG device handle + * + * @return + * - \ref NVML_SUCCESS if \a migDevice handle was successfully created + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a index or \a migDevice reference is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_NOT_FOUND if no valid MIG device was found at \a index + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMigDeviceHandleByIndex(nvmlDevice_t device, unsigned int index, + nvmlDevice_t *migDevice); + +/** + * Get parent device handle from a MIG device handle. + * + * For Ampere &tm; or newer fully supported devices. + * Supported on Linux only. + * + * @param migDevice MIG device handle + * @param device Device handle + * + * @return + * - \ref NVML_SUCCESS if \a device handle was successfully created + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a migDevice or \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDeviceHandleFromMigDeviceHandle(nvmlDevice_t migDevice, nvmlDevice_t *device); + +/** + * Get the type of the GPU Bus (PCIe, PCI, ...) + * + * @param device The identifier of the target device + * @param type The PCI Bus type + * + * return + * - \ref NVML_SUCCESS if the bus \a type is successfully retreived + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \device is invalid or \type is NULL + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetBusType(nvmlDevice_t device, nvmlBusType_t *type); + +/** + * Retrieve performance monitor samples from the associated subdevice. + * + * @param device + * @param pDynamicPstatesInfo + * + * @return + * - \ref NVML_SUCCESS if \a pDynamicPstatesInfo has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pDynamicPstatesInfo is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetDynamicPstatesInfo(nvmlDevice_t device, nvmlGpuDynamicPstatesInfo_t *pDynamicPstatesInfo); + +/** + * Sets the speed of a specified fan. + * + * WARNING: This function changes the fan control policy to manual. It means that YOU have to monitor + * the temperature and adjust the fan speed accordingly. + * If you set the fan speed too low you can burn your GPU! + * Use nvmlDeviceSetDefaultFanSpeed_v2 to restore default control policy. + * + * For all cuda-capable discrete products with fans that are Maxwell or Newer. + * + * device The identifier of the target device + * fan The index of the fan, starting at zero + * speed The target speed of the fan [0-100] in % of max speed + * + * return + * NVML_SUCCESS if the fan speed has been set + * NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * NVML_ERROR_INVALID_ARGUMENT if the device is not valid, or the speed is outside acceptable ranges, + * or if the fan index doesn't reference an actual fan. + * NVML_ERROR_NOT_SUPPORTED if the device is older than Maxwell. + * NVML_ERROR_UNKNOWN if there was an unexpected error. + */ +nvmlReturn_t DECLDIR nvmlDeviceSetFanSpeed_v2(nvmlDevice_t device, unsigned int fan, unsigned int speed); + +/** + * Retrieve the GPCCLK VF offset value + * @param[in] device The identifier of the target device + * @param[out] offset The retrieved GPCCLK VF offset value + * + * @return + * - \ref NVML_SUCCESS if \a offset has been successfully queried + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a offset is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpcClkVfOffset(nvmlDevice_t device, int *offset); + +/** + * Set the GPCCLK VF offset value + * @param[in] device The identifier of the target device + * @param[in] offset The GPCCLK VF offset value to set + * + * @return + * - \ref NVML_SUCCESS if \a offset has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a offset is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetGpcClkVfOffset(nvmlDevice_t device, int offset); + +/** + * Retrieve the MemClk (Memory Clock) VF offset value. + * @param[in] device The identifier of the target device + * @param[out] offset The retrieved MemClk VF offset value + * + * @return + * - \ref NVML_SUCCESS if \a offset has been successfully queried + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a offset is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMemClkVfOffset(nvmlDevice_t device, int *offset); + +/** + * Set the MemClk (Memory Clock) VF offset value. It requires elevated privileges. + * @param[in] device The identifier of the target device + * @param[in] offset The MemClk VF offset value to set + * + * @return + * - \ref NVML_SUCCESS if \a offset has been set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a offset is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceSetMemClkVfOffset(nvmlDevice_t device, int offset); + +/** + * Retrieve min and max clocks of some clock domain for a given PState + * + * @param device The identifier of the target device + * @param type Clock domain + * @param pstate PState to query + * @param minClockMHz Reference in which to return min clock frequency + * @param maxClockMHz Reference in which to return max clock frequency + * + * @return + * - \ref NVML_SUCCESS if everything worked + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device, \a type or \a pstate are invalid or both + * \a minClockMHz and \a maxClockMHz are NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMinMaxClockOfPState(nvmlDevice_t device, nvmlClockType_t type, nvmlPstates_t pstate, + unsigned int * minClockMHz, unsigned int * maxClockMHz); + +/** + * Get all supported Performance States (P-States) for the device. + * + * The returned array would contain a contiguous list of valid P-States supported by + * the device. If the number of supported P-States is fewer than the size of the array + * supplied missing elements would contain \a NVML_PSTATE_UNKNOWN. + * + * The number of elements in the returned list will never exceed \a NVML_MAX_GPU_PERF_PSTATES. + * + * @param device The identifier of the target device + * @param pstates Container to return the list of performance states + * supported by device + * @param size Size of the supplied \a pstates array in bytes + * + * @return + * - \ref NVML_SUCCESS if \a pstates array has been retrieved + * - \ref NVML_ERROR_INSUFFICIENT_SIZE if the the container supplied was not large enough to + * hold the resulting list + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device or \a pstates is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support performance state readings + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetSupportedPerformanceStates(nvmlDevice_t device, + nvmlPstates_t *pstates, unsigned int size); + +/** + * Retrieve the GPCCLK min max VF offset value. + * @param[in] device The identifier of the target device + * @param[out] minOffset The retrieved GPCCLK VF min offset value + * @param[out] maxOffset The retrieved GPCCLK VF max offset value + * + * @return + * - \ref NVML_SUCCESS if \a offset has been successfully queried + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a offset is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpcClkMinMaxVfOffset(nvmlDevice_t device, + int *minOffset, int *maxOffset); + +/** + * Retrieve the MemClk (Memory Clock) min max VF offset value. + * @param[in] device The identifier of the target device + * @param[out] minOffset The retrieved MemClk VF min offset value + * @param[out] maxOffset The retrieved MemClk VF max offset value + * + * @return + * - \ref NVML_SUCCESS if \a offset has been successfully queried + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a offset is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature + * - \ref NVML_ERROR_UNKNOWN on any unexpected error + */ +nvmlReturn_t DECLDIR nvmlDeviceGetMemClkMinMaxVfOffset(nvmlDevice_t device, + int *minOffset, int *maxOffset); + +/** + * Get fabric information associated with the device. + * + * %HOPPER_OR_NEWER% + * + * On Hopper + NVSwitch systems, GPU is registered with the NVIDIA Fabric Manager + * Upon successful registration, the GPU is added to the NVLink fabric to enable + * peer-to-peer communication. + * This API reports the current state of the GPU in the NVLink fabric + * along with other useful information. + * + * @param device The identifier of the target device + * @param gpuFabricInfo Information about GPU fabric state + * + * @return + * - \ref NVML_SUCCESS Upon success + * - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't support gpu fabric + */ +nvmlReturn_t DECLDIR nvmlDeviceGetGpuFabricInfo(nvmlDevice_t device, nvmlGpuFabricInfo_t *gpuFabricInfo); + +/** @} */ + +/***************************************************************************************************/ +/** @defgroup GPM NVML GPM + * @{ + */ +/***************************************************************************************************/ +/** @defgroup nvmlGpmEnums GPM Enums + * @{ + */ +/***************************************************************************************************/ + +/* GPM Metric Identifiers */ +typedef enum +{ + NVML_GPM_METRIC_GRAPHICS_UTIL = 1, /* Percentage of time any compute/graphics app was active on the GPU. 0.0 - 100.0 */ + NVML_GPM_METRIC_SM_UTIL = 2, /* Percentage of SMs that were busy. 0.0 - 100.0 */ + NVML_GPM_METRIC_SM_OCCUPANCY = 3, /* Percentage of warps that were active vs theoretical maximum. 0.0 - 100.0 */ + NVML_GPM_METRIC_INTEGER_UTIL = 4, /* Percentage of time the GPU's SMs were doing integer operations. 0.0 - 100.0 */ + NVML_GPM_METRIC_ANY_TENSOR_UTIL = 5, /* Percentage of time the GPU's SMs were doing ANY tensor operations. 0.0 - 100.0 */ + NVML_GPM_METRIC_DFMA_TENSOR_UTIL = 6, /* Percentage of time the GPU's SMs were doing DFMA tensor operations. 0.0 - 100.0 */ + NVML_GPM_METRIC_HMMA_TENSOR_UTIL = 7, /* Percentage of time the GPU's SMs were doing HMMA tensor operations. 0.0 - 100.0 */ + NVML_GPM_METRIC_IMMA_TENSOR_UTIL = 9, /* Percentage of time the GPU's SMs were doing IMMA tensor operations. 0.0 - 100.0 */ + NVML_GPM_METRIC_DRAM_BW_UTIL = 10, /* Percentage of DRAM bw used vs theoretical maximum. 0.0 - 100.0 */ + NVML_GPM_METRIC_FP64_UTIL = 11, /* Percentage of time the GPU's SMs were doing non-tensor FP64 math. 0.0 - 100.0 */ + NVML_GPM_METRIC_FP32_UTIL = 12, /* Percentage of time the GPU's SMs were doing non-tensor FP32 math. 0.0 - 100.0 */ + NVML_GPM_METRIC_FP16_UTIL = 13, /* Percentage of time the GPU's SMs were doing non-tensor FP16 math. 0.0 - 100.0 */ + NVML_GPM_METRIC_PCIE_TX_PER_SEC = 20, /* PCIe traffic from this GPU in MiB/sec */ + NVML_GPM_METRIC_PCIE_RX_PER_SEC = 21, /* PCIe traffic to this GPU in MiB/sec */ + NVML_GPM_METRIC_NVDEC_0_UTIL = 30, /* Percent utilization of NVDEC 0. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVDEC_1_UTIL = 31, /* Percent utilization of NVDEC 1. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVDEC_2_UTIL = 32, /* Percent utilization of NVDEC 2. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVDEC_3_UTIL = 33, /* Percent utilization of NVDEC 3. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVDEC_4_UTIL = 34, /* Percent utilization of NVDEC 4. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVDEC_5_UTIL = 35, /* Percent utilization of NVDEC 5. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVDEC_6_UTIL = 36, /* Percent utilization of NVDEC 6. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVDEC_7_UTIL = 37, /* Percent utilization of NVDEC 7. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_0_UTIL = 40, /* Percent utilization of NVJPG 0. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_1_UTIL = 41, /* Percent utilization of NVJPG 1. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_2_UTIL = 42, /* Percent utilization of NVJPG 2. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_3_UTIL = 43, /* Percent utilization of NVJPG 3. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_4_UTIL = 44, /* Percent utilization of NVJPG 4. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_5_UTIL = 45, /* Percent utilization of NVJPG 5. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_6_UTIL = 46, /* Percent utilization of NVJPG 6. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVJPG_7_UTIL = 47, /* Percent utilization of NVJPG 7. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVOFA_0_UTIL = 50, /* Percent utilization of NVOFA 0. 0.0 - 100.0 */ + NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC = 60, /* NvLink read bandwidth for all links in MiB/sec */ + NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC = 61, /* NvLink write bandwidth for all links in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L0_RX_PER_SEC = 62, /* NvLink read bandwidth for link 0 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L0_TX_PER_SEC = 63, /* NvLink write bandwidth for link 0 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L1_RX_PER_SEC = 64, /* NvLink read bandwidth for link 1 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L1_TX_PER_SEC = 65, /* NvLink write bandwidth for link 1 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L2_RX_PER_SEC = 66, /* NvLink read bandwidth for link 2 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L2_TX_PER_SEC = 67, /* NvLink write bandwidth for link 2 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L3_RX_PER_SEC = 68, /* NvLink read bandwidth for link 3 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L3_TX_PER_SEC = 69, /* NvLink write bandwidth for link 3 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L4_RX_PER_SEC = 70, /* NvLink read bandwidth for link 4 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L4_TX_PER_SEC = 71, /* NvLink write bandwidth for link 4 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L5_RX_PER_SEC = 72, /* NvLink read bandwidth for link 5 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L5_TX_PER_SEC = 73, /* NvLink write bandwidth for link 5 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L6_RX_PER_SEC = 74, /* NvLink read bandwidth for link 6 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L6_TX_PER_SEC = 75, /* NvLink write bandwidth for link 6 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L7_RX_PER_SEC = 76, /* NvLink read bandwidth for link 7 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L7_TX_PER_SEC = 77, /* NvLink write bandwidth for link 7 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L8_RX_PER_SEC = 78, /* NvLink read bandwidth for link 8 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L8_TX_PER_SEC = 79, /* NvLink write bandwidth for link 8 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L9_RX_PER_SEC = 80, /* NvLink read bandwidth for link 9 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L9_TX_PER_SEC = 81, /* NvLink write bandwidth for link 9 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L10_RX_PER_SEC = 82, /* NvLink read bandwidth for link 10 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L10_TX_PER_SEC = 83, /* NvLink write bandwidth for link 10 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L11_RX_PER_SEC = 84, /* NvLink read bandwidth for link 11 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L11_TX_PER_SEC = 85, /* NvLink write bandwidth for link 11 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L12_RX_PER_SEC = 86, /* NvLink read bandwidth for link 12 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L12_TX_PER_SEC = 87, /* NvLink write bandwidth for link 12 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L13_RX_PER_SEC = 88, /* NvLink read bandwidth for link 13 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L13_TX_PER_SEC = 89, /* NvLink write bandwidth for link 13 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L14_RX_PER_SEC = 90, /* NvLink read bandwidth for link 14 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L14_TX_PER_SEC = 91, /* NvLink write bandwidth for link 14 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L15_RX_PER_SEC = 92, /* NvLink read bandwidth for link 15 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L15_TX_PER_SEC = 93, /* NvLink write bandwidth for link 15 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L16_RX_PER_SEC = 94, /* NvLink read bandwidth for link 16 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L16_TX_PER_SEC = 95, /* NvLink write bandwidth for link 16 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L17_RX_PER_SEC = 96, /* NvLink read bandwidth for link 17 in MiB/sec */ + NVML_GPM_METRIC_NVLINK_L17_TX_PER_SEC = 97, /* NvLink write bandwidth for link 17 in MiB/sec */ + NVML_GPM_METRIC_MAX = 98, /* Maximum value above +1. Note that changing this + should also change NVML_GPM_METRICS_GET_VERSION + due to struct size change */ +} nvmlGpmMetricId_t; + +/** @} */ // @defgroup nvmlGpmEnums + + +/***************************************************************************************************/ +/** @defgroup nvmlGpmStructs GPM Structs + * @{ + */ +/***************************************************************************************************/ + +/* Handle to an allocated GPM sample allocated with nvmlGpmSampleAlloc() + Free this with nvmlGpmSampleFree() */ +typedef struct +{ + struct nvmlGpmSample_st* handle; +} nvmlGpmSample_t; + +typedef struct { + char *shortName; + char *longName; + char *unit; +} nvmlGpmMetricMetricInfo_t; + +typedef struct +{ + unsigned int metricId; /* IN: NVML_GPM_METRIC_? #define of which metric to retrieve */ + nvmlReturn_t nvmlReturn; /* OUT: Status of this metric. If this is nonzero, then value is not valid */ + double value; /* OUT: Value of this metric. Is only valid if nvmlReturn is 0 (NVML_SUCCESS) */ + nvmlGpmMetricMetricInfo_t metricInfo; /* OUT: Metric name and unit. Those can be NULL if not defined */ +} nvmlGpmMetric_t; + +typedef struct +{ + unsigned int version; /* IN: Set to NVML_GPM_METRICS_GET_VERSION */ + unsigned int numMetrics; /* IN: How many metrics to retrieve in metrics[] */ + nvmlGpmSample_t sample1; /* IN: Sample buffer */ + nvmlGpmSample_t sample2; /* IN: Sample buffer */ + nvmlGpmMetric_t metrics[NVML_GPM_METRIC_MAX]; /* IN/OUT: Array of metrics. Set metricId on call. + see nvmlReturn and value on return */ +} nvmlGpmMetricsGet_t; + +#define NVML_GPM_METRICS_GET_VERSION 1 + +typedef struct +{ + unsigned int version; /* IN: Set to NVML_GPM_SUPPORT_VERSION */ + unsigned int isSupportedDevice; /* OUT: Indicates device support */ +} nvmlGpmSupport_t; + +#define NVML_GPM_SUPPORT_VERSION 1 + +/** @} */ // @defgroup nvmlGPMStructs + +/***************************************************************************************************/ +/** @defgroup nvmlGpmFunctions GPM Functions + * @{ + */ +/***************************************************************************************************/ + +/** + * Calculate GPM metrics from two samples. + * + * + * @param metricsGet IN/OUT: populated nvmlGpmMetricsGet_t struct + * + * %HOPPER_OR_NEWER% + * + * @return + * - \ref NVML_SUCCESS on success + * - Nonzero NVML_ERROR_? enum on error + */ +nvmlReturn_t DECLDIR nvmlGpmMetricsGet(nvmlGpmMetricsGet_t *metricsGet); + + +/** + * Free an allocated sample buffer that was allocated with \ref nvmlGpmSampleAlloc() + * + * %HOPPER_OR_NEWER% + * + * @param gpmSample Sample to free + * + * @return + * - \ref NVML_SUCCESS on success + * - \ref NVML_ERROR_INVALID_ARGUMENT if an invalid pointer is provided + */ +nvmlReturn_t DECLDIR nvmlGpmSampleFree(nvmlGpmSample_t gpmSample); + + +/** + * Allocate a sample buffer to be used with NVML GPM . You will need to allocate + * at least two of these buffers to use with the NVML GPM feature + * + * %HOPPER_OR_NEWER% + * + * @param gpmSample Where the allocated sample will be stored + * + * @return + * - \ref NVML_SUCCESS on success + * - \ref NVML_ERROR_INVALID_ARGUMENT if an invalid pointer is provided + * - \ref NVML_ERROR_MEMORY if system memory is insufficient + */ +nvmlReturn_t DECLDIR nvmlGpmSampleAlloc(nvmlGpmSample_t *gpmSample); + +/** + * Read a sample of GPM metrics into the provided \a gpmSample buffer. After + * two samples are gathered, you can call nvmlGpmMetricGet on those samples to + * retrive metrics + * + * %HOPPER_OR_NEWER% + * + * @param device Device to get samples for + * @param gpmSample Buffer to read samples into + * + * @return + * - \ref NVML_SUCCESS on success + * - Nonzero NVML_ERROR_? enum on error + */ +nvmlReturn_t DECLDIR nvmlGpmSampleGet(nvmlDevice_t device, nvmlGpmSample_t gpmSample); + +/** + * Read a sample of GPM metrics into the provided \a gpmSample buffer for a MIG GPU Instance. + * + * After two samples are gathered, you can call nvmlGpmMetricGet on those + * samples to retrive metrics + * + * %HOPPER_OR_NEWER% + * + * @param device Device to get samples for + * @param gpuInstanceId MIG GPU Instance ID + * @param gpmSample Buffer to read samples into + * + * @return + * - \ref NVML_SUCCESS on success + * - Nonzero NVML_ERROR_? enum on error + */ +nvmlReturn_t DECLDIR nvmlGpmMigSampleGet(nvmlDevice_t device, unsigned int gpuInstanceId, nvmlGpmSample_t gpmSample); + +/** + * Indicate whether the supplied device supports GPM + * + * @param device NVML device to query for + * @param gpmSupport Structure to indicate GPM support. Indicates + * GPM support per system for the supplied device + * + * @return + * - NVML_SUCCESS on success + * - Nonzero NVML_ERROR_? enum if there is an error in processing the query + */ +nvmlReturn_t DECLDIR nvmlGpmQueryDeviceSupport(nvmlDevice_t device, nvmlGpmSupport_t *gpmSupport); + +/** @} */ // @defgroup nvmlGpmFunctions +/** @} */ // @defgroup GPM + +/***************************************************************************************************/ +/** @defgroup nvmlDevice definitions related to Counter Collection Unit + * @{ + */ +/***************************************************************************************************/ + +/* CCU Stream State */ +#define NVML_COUNTER_COLLECTION_UNIT_STREAM_STATE_DISABLE 0 +#define NVML_COUNTER_COLLECTION_UNIT_STREAM_STATE_ENABLE 1 + +/** + * Get counter collection unit stream state. + * + * %HOPPER_OR_NEWER% + * Supported on Linux, Windows TCC. + * + * @param device The identifier of the target device + * @param state Returns counter collection unit stream state + * NVML_COUNTER_COLLECTION_UNIT_STREAM_STATE_DISABLE or + * NVML_COUNTER_COLLECTION_UNIT_STREAM_STATE_ENABLE + * + * @return + * - \ref NVML_SUCCESS if \a current counter collection unit stream state were successfully queried + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a state is NULL + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + */ +nvmlReturn_t DECLDIR nvmlDeviceCcuGetStreamState(nvmlDevice_t device, unsigned int *state); + +/** + * Set counter collection unit stream state. + * + * %HOPPER_OR_NEWER% + * Supported on Linux, Windows TCC. + * + * @param device The identifier of the target device + * @param state Counter collection unit stream state, + * NVML_COUNTER_COLLECTION_UNIT_STREAM_STATE_DISABLE or + * NVML_COUNTER_COLLECTION_UNIT_STREAM_STATE_ENABLE + * + * @return + * - \ref NVML_SUCCESS if \a current counter collection unit stream state is successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + */ +nvmlReturn_t DECLDIR nvmlDeviceCcuSetStreamState(nvmlDevice_t device, unsigned int state); + +/** @} */ // @defgroup CCU + +#define NVML_NVLINK_POWER_STATE_HIGH_SPEED 0x0 +#define NVML_NVLINK_POWER_STATE_LOW 0x1 + +#define NVML_NVLINK_LOW_POWER_THRESHOLD_MIN 0x1 +#define NVML_NVLINK_LOW_POWER_THRESHOLD_MAX 0x1FFF +#define NVML_NVLINK_LOW_POWER_THRESHOLD_RESET 0xFFFFFFFF + +/* Structure containing Low Power parameters */ +typedef struct nvmlNvLinkPowerThres_st +{ + unsigned int lowPwrThreshold; //!< Low power threshold (in units of 100us) +} nvmlNvLinkPowerThres_t; + +/** + * Set NvLink Low Power Threshold for device. + * + * %HOPPER_OR_NEWER% + * + * @param device The identifier of the target device + * @param info Reference to \a nvmlNvLinkPowerThres_t struct + * input parameters + * + * @return + * - \ref NVML_SUCCESS if the \a Threshold is successfully set + * - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized + * - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a Threshold is not within range + * - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device + * + **/ +nvmlReturn_t DECLDIR nvmlDeviceSetNvLinkDeviceLowPowerThreshold(nvmlDevice_t device, nvmlNvLinkPowerThres_t *info); + +/** + * NVML API versioning support + */ + +#ifdef NVML_NO_UNVERSIONED_FUNC_DEFS +nvmlReturn_t DECLDIR nvmlInit(void); +nvmlReturn_t DECLDIR nvmlDeviceGetCount(unsigned int *deviceCount); +nvmlReturn_t DECLDIR nvmlDeviceGetHandleByIndex(unsigned int index, nvmlDevice_t *device); +nvmlReturn_t DECLDIR nvmlDeviceGetHandleByPciBusId(const char *pciBusId, nvmlDevice_t *device); +nvmlReturn_t DECLDIR nvmlDeviceGetPciInfo(nvmlDevice_t device, nvmlPciInfo_t *pci); +nvmlReturn_t DECLDIR nvmlDeviceGetPciInfo_v2(nvmlDevice_t device, nvmlPciInfo_t *pci); +nvmlReturn_t DECLDIR nvmlDeviceGetNvLinkRemotePciInfo(nvmlDevice_t device, unsigned int link, nvmlPciInfo_t *pci); +nvmlReturn_t DECLDIR nvmlDeviceGetGridLicensableFeatures(nvmlDevice_t device, nvmlGridLicensableFeatures_t *pGridLicensableFeatures); +nvmlReturn_t DECLDIR nvmlDeviceGetGridLicensableFeatures_v2(nvmlDevice_t device, nvmlGridLicensableFeatures_t *pGridLicensableFeatures); +nvmlReturn_t DECLDIR nvmlDeviceGetGridLicensableFeatures_v3(nvmlDevice_t device, nvmlGridLicensableFeatures_t *pGridLicensableFeatures); +nvmlReturn_t DECLDIR nvmlDeviceRemoveGpu(nvmlPciInfo_t *pciInfo); +nvmlReturn_t DECLDIR nvmlEventSetWait(nvmlEventSet_t set, nvmlEventData_t * data, unsigned int timeoutms); +nvmlReturn_t DECLDIR nvmlDeviceGetAttributes(nvmlDevice_t device, nvmlDeviceAttributes_t *attributes); +nvmlReturn_t DECLDIR nvmlComputeInstanceGetInfo(nvmlComputeInstance_t computeInstance, nvmlComputeInstanceInfo_t *info); +nvmlReturn_t DECLDIR nvmlDeviceGetComputeRunningProcesses(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_v1_t *infos); +nvmlReturn_t DECLDIR nvmlDeviceGetComputeRunningProcesses_v2(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_v2_t *infos); +nvmlReturn_t DECLDIR nvmlDeviceGetGraphicsRunningProcesses(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_v1_t *infos); +nvmlReturn_t DECLDIR nvmlDeviceGetGraphicsRunningProcesses_v2(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_v2_t *infos); +nvmlReturn_t DECLDIR nvmlDeviceGetMPSComputeRunningProcesses(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_v1_t *infos); +nvmlReturn_t DECLDIR nvmlDeviceGetMPSComputeRunningProcesses_v2(nvmlDevice_t device, unsigned int *infoCount, nvmlProcessInfo_v2_t *infos); +nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstancePossiblePlacements(nvmlDevice_t device, unsigned int profileId, nvmlGpuInstancePlacement_t *placements, unsigned int *count); +nvmlReturn_t DECLDIR nvmlVgpuInstanceGetLicenseInfo(nvmlVgpuInstance_t vgpuInstance, nvmlVgpuLicenseInfo_t *licenseInfo); + +#endif // #ifdef NVML_NO_UNVERSIONED_FUNC_DEFS + +#if defined(NVML_NO_UNVERSIONED_FUNC_DEFS) +// We don't define APIs to run new versions if this guard is present so there is +// no need to undef +#elif defined(__NVML_API_VERSION_INTERNAL) +#undef nvmlDeviceGetGraphicsRunningProcesses +#undef nvmlDeviceGetComputeRunningProcesses +#undef nvmlDeviceGetMPSComputeRunningProcesses +#undef nvmlDeviceGetAttributes +#undef nvmlComputeInstanceGetInfo +#undef nvmlEventSetWait +#undef nvmlDeviceGetGridLicensableFeatures +#undef nvmlDeviceRemoveGpu +#undef nvmlDeviceGetNvLinkRemotePciInfo +#undef nvmlDeviceGetPciInfo +#undef nvmlDeviceGetCount +#undef nvmlDeviceGetHandleByIndex +#undef nvmlDeviceGetHandleByPciBusId +#undef nvmlInit +#undef nvmlBlacklistDeviceInfo_t +#undef nvmlGetBlacklistDeviceCount +#undef nvmlGetBlacklistDeviceInfoByIndex +#undef nvmlDeviceGetGpuInstancePossiblePlacements +#undef nvmlVgpuInstanceGetLicenseInfo + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/return.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/return.go new file mode 100644 index 0000000..fdf1191 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/return.go @@ -0,0 +1,20 @@ +// Copyright (c) 2020, 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 nvml + +// nvml.ErrorString() +func ErrorString(Result Return) string { + return nvmlErrorString(Result) +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/system.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/system.go new file mode 100644 index 0000000..424f99b --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/system.go @@ -0,0 +1,81 @@ +// Copyright (c) 2020, 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 nvml + +// nvml.SystemGetDriverVersion() +func SystemGetDriverVersion() (string, Return) { + Version := make([]byte, SYSTEM_DRIVER_VERSION_BUFFER_SIZE) + ret := nvmlSystemGetDriverVersion(&Version[0], SYSTEM_DRIVER_VERSION_BUFFER_SIZE) + return string(Version[:clen(Version)]), ret +} + +// nvml.SystemGetNVMLVersion() +func SystemGetNVMLVersion() (string, Return) { + Version := make([]byte, SYSTEM_NVML_VERSION_BUFFER_SIZE) + ret := nvmlSystemGetNVMLVersion(&Version[0], SYSTEM_NVML_VERSION_BUFFER_SIZE) + return string(Version[:clen(Version)]), ret +} + +// nvml.SystemGetCudaDriverVersion() +func SystemGetCudaDriverVersion() (int, Return) { + var CudaDriverVersion int32 + ret := nvmlSystemGetCudaDriverVersion(&CudaDriverVersion) + return int(CudaDriverVersion), ret +} + +// nvml.SystemGetCudaDriverVersion_v2() +func SystemGetCudaDriverVersion_v2() (int, Return) { + var CudaDriverVersion int32 + ret := nvmlSystemGetCudaDriverVersion_v2(&CudaDriverVersion) + return int(CudaDriverVersion), ret +} + +// nvml.SystemGetProcessName() +func SystemGetProcessName(Pid int) (string, Return) { + Name := make([]byte, SYSTEM_PROCESS_NAME_BUFFER_SIZE) + ret := nvmlSystemGetProcessName(uint32(Pid), &Name[0], SYSTEM_PROCESS_NAME_BUFFER_SIZE) + return string(Name[:clen(Name)]), ret +} + +// nvml.SystemGetHicVersion() +func SystemGetHicVersion() ([]HwbcEntry, Return) { + var HwbcCount uint32 = 1 // Will be reduced upon returning + for { + HwbcEntries := make([]HwbcEntry, HwbcCount) + ret := nvmlSystemGetHicVersion(&HwbcCount, &HwbcEntries[0]) + if ret == SUCCESS { + return HwbcEntries[:HwbcCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + HwbcCount *= 2 + } +} + +// nvml.SystemGetTopologyGpuSet() +func SystemGetTopologyGpuSet(CpuNumber int) ([]Device, Return) { + var Count uint32 + ret := nvmlSystemGetTopologyGpuSet(uint32(CpuNumber), &Count, nil) + if ret != SUCCESS { + return nil, ret + } + if Count == 0 { + return []Device{}, ret + } + DeviceArray := make([]Device, Count) + ret = nvmlSystemGetTopologyGpuSet(uint32(CpuNumber), &Count, &DeviceArray[0]) + return DeviceArray, ret +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/types_gen.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/types_gen.go new file mode 100644 index 0000000..396886d --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/types_gen.go @@ -0,0 +1,583 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs types.go + +package nvml + +import "unsafe" + +type Device struct { + Handle *_Ctype_struct_nvmlDevice_st +} + +type PciInfo struct { + BusIdLegacy [16]int8 + Domain uint32 + Bus uint32 + Device uint32 + PciDeviceId uint32 + PciSubSystemId uint32 + BusId [32]int8 +} + +type EccErrorCounts struct { + L1Cache uint64 + L2Cache uint64 + DeviceMemory uint64 + RegisterFile uint64 +} + +type Utilization struct { + Gpu uint32 + Memory uint32 +} + +type Memory struct { + Total uint64 + Free uint64 + Used uint64 +} + +type Memory_v2 struct { + Version uint32 + Total uint64 + Reserved uint64 + Free uint64 + Used uint64 +} + +type BAR1Memory struct { + Bar1Total uint64 + Bar1Free uint64 + Bar1Used uint64 +} + +type ProcessInfo_v1 struct { + Pid uint32 + UsedGpuMemory uint64 +} + +type ProcessInfo_v2 struct { + Pid uint32 + UsedGpuMemory uint64 + GpuInstanceId uint32 + ComputeInstanceId uint32 +} + +type ProcessInfo struct { + Pid uint32 + UsedGpuMemory uint64 + GpuInstanceId uint32 + ComputeInstanceId uint32 +} + +type DeviceAttributes struct { + MultiprocessorCount uint32 + SharedCopyEngineCount uint32 + SharedDecoderCount uint32 + SharedEncoderCount uint32 + SharedJpegCount uint32 + SharedOfaCount uint32 + GpuInstanceSliceCount uint32 + ComputeInstanceSliceCount uint32 + MemorySizeMB uint64 +} + +type RowRemapperHistogramValues struct { + Max uint32 + High uint32 + Partial uint32 + Low uint32 + None uint32 +} + +type NvLinkUtilizationControl struct { + Units uint32 + Pktfilter uint32 +} + +type BridgeChipInfo struct { + Type uint32 + FwVersion uint32 +} + +type BridgeChipHierarchy struct { + BridgeCount uint8 + BridgeChipInfo [128]BridgeChipInfo +} + +const sizeofValue = unsafe.Sizeof([8]byte{}) + +type Value [sizeofValue]byte + +type Sample struct { + TimeStamp uint64 + SampleValue [8]byte +} + +type ViolationTime struct { + ReferenceTime uint64 + ViolationTime uint64 +} + +type GpuThermalSettingsSensor struct { + Controller int32 + DefaultMinTemp int32 + DefaultMaxTemp int32 + CurrentTemp int32 + Target int32 +} + +type GpuThermalSettings struct { + Count uint32 + Sensor [3]GpuThermalSettingsSensor +} + +type ClkMonFaultInfo struct { + ClkApiDomain uint32 + ClkDomainFaultMask uint32 +} + +type ClkMonStatus struct { + BGlobalStatus uint32 + ClkMonListSize uint32 + ClkMonList [32]ClkMonFaultInfo +} + +type VgpuTypeId uint32 + +type VgpuInstance uint32 + +type VgpuInstanceUtilizationSample struct { + VgpuInstance uint32 + TimeStamp uint64 + SmUtil [8]byte + MemUtil [8]byte + EncUtil [8]byte + DecUtil [8]byte +} + +type VgpuProcessUtilizationSample struct { + VgpuInstance uint32 + Pid uint32 + ProcessName [64]int8 + TimeStamp uint64 + SmUtil uint32 + MemUtil uint32 + EncUtil uint32 + DecUtil uint32 +} + +type VgpuSchedulerParamsVgpuSchedDataWithARR struct { + AvgFactor uint32 + Timeslice uint32 +} + +type VgpuSchedulerParamsVgpuSchedData struct { + Timeslice uint32 +} + +const sizeofVgpuSchedulerParams = unsafe.Sizeof([8]byte{}) + +type VgpuSchedulerParams [sizeofVgpuSchedulerParams]byte + +type VgpuSchedulerLogEntry struct { + Timestamp uint64 + TimeRunTotal uint64 + TimeRun uint64 + SwRunlistId uint32 + TargetTimeSlice uint64 + CumulativePreemptionTime uint64 +} + +type VgpuSchedulerLog struct { + EngineId uint32 + SchedulerPolicy uint32 + IsEnabledARR uint32 + SchedulerParams [8]byte + EntriesCount uint32 + LogEntries [200]VgpuSchedulerLogEntry +} + +type VgpuSchedulerGetState struct { + SchedulerPolicy uint32 + IsEnabledARR uint32 + SchedulerParams [8]byte +} + +type VgpuSchedulerSetParamsVgpuSchedDataWithARR struct { + AvgFactor uint32 + Frequency uint32 +} + +type VgpuSchedulerSetParamsVgpuSchedData struct { + Timeslice uint32 +} + +const sizeofVgpuSchedulerSetParams = unsafe.Sizeof([8]byte{}) + +type VgpuSchedulerSetParams [sizeofVgpuSchedulerSetParams]byte + +type VgpuSchedulerSetState struct { + SchedulerPolicy uint32 + EnableARRMode uint32 + SchedulerParams [8]byte +} + +type VgpuSchedulerCapabilities struct { + SupportedSchedulers [3]uint32 + MaxTimeslice uint32 + MinTimeslice uint32 + IsArrModeSupported uint32 + MaxFrequencyForARR uint32 + MinFrequencyForARR uint32 + MaxAvgFactorForARR uint32 + MinAvgFactorForARR uint32 +} + +type VgpuLicenseExpiry struct { + Year uint32 + Month uint16 + Day uint16 + Hour uint16 + Min uint16 + Sec uint16 + Status uint8 + Pad_cgo_0 [1]byte +} + +type VgpuLicenseInfo struct { + IsLicensed uint8 + LicenseExpiry VgpuLicenseExpiry + CurrentState uint32 +} + +type ProcessUtilizationSample struct { + Pid uint32 + TimeStamp uint64 + SmUtil uint32 + MemUtil uint32 + EncUtil uint32 + DecUtil uint32 +} + +type GridLicenseExpiry struct { + Year uint32 + Month uint16 + Day uint16 + Hour uint16 + Min uint16 + Sec uint16 + Status uint8 + Pad_cgo_0 [1]byte +} + +type GridLicensableFeature struct { + FeatureCode uint32 + FeatureState uint32 + LicenseInfo [128]int8 + ProductName [128]int8 + FeatureEnabled uint32 + LicenseExpiry GridLicenseExpiry +} + +type GridLicensableFeatures struct { + IsGridLicenseSupported int32 + LicensableFeaturesCount uint32 + GridLicensableFeatures [3]GridLicensableFeature +} + +type DeviceArchitecture uint32 + +type BusType uint32 + +type FanControlPolicy uint32 + +type PowerSource uint32 + +type GpuDynamicPstatesInfoUtilization struct { + BIsPresent uint32 + Percentage uint32 + IncThreshold uint32 + DecThreshold uint32 +} + +type GpuDynamicPstatesInfo struct { + Flags uint32 + Utilization [8]GpuDynamicPstatesInfoUtilization +} + +type FieldValue struct { + FieldId uint32 + ScopeId uint32 + Timestamp int64 + LatencyUsec int64 + ValueType uint32 + NvmlReturn uint32 + Value [8]byte +} + +type Unit struct { + Handle *_Ctype_struct_nvmlUnit_st +} + +type HwbcEntry struct { + HwbcId uint32 + FirmwareVersion [32]int8 +} + +type LedState struct { + Cause [256]int8 + Color uint32 +} + +type UnitInfo struct { + Name [96]int8 + Id [96]int8 + Serial [96]int8 + FirmwareVersion [96]int8 +} + +type PSUInfo struct { + State [256]int8 + Current uint32 + Voltage uint32 + Power uint32 +} + +type UnitFanInfo struct { + Speed uint32 + State uint32 +} + +type UnitFanSpeeds struct { + Fans [24]UnitFanInfo + Count uint32 +} + +type EventSet struct { + Handle *_Ctype_struct_nvmlEventSet_st +} + +type EventData struct { + Device Device + EventType uint64 + EventData uint64 + GpuInstanceId uint32 + ComputeInstanceId uint32 +} + +type AccountingStats struct { + GpuUtilization uint32 + MemoryUtilization uint32 + MaxMemoryUsage uint64 + Time uint64 + StartTime uint64 + IsRunning uint32 + Reserved [5]uint32 +} + +type EncoderSessionInfo struct { + SessionId uint32 + Pid uint32 + VgpuInstance uint32 + CodecType uint32 + HResolution uint32 + VResolution uint32 + AverageFps uint32 + AverageLatency uint32 +} + +type FBCStats struct { + SessionsCount uint32 + AverageFPS uint32 + AverageLatency uint32 +} + +type FBCSessionInfo struct { + SessionId uint32 + Pid uint32 + VgpuInstance uint32 + DisplayOrdinal uint32 + SessionType uint32 + SessionFlags uint32 + HMaxResolution uint32 + VMaxResolution uint32 + HResolution uint32 + VResolution uint32 + AverageFPS uint32 + AverageLatency uint32 +} + +type GpuFabricState byte + +type GpuFabricInfo struct { + ClusterUuid [16]int8 + Status uint32 + PartitionId uint32 + State uint8 + Pad_cgo_0 [3]byte +} + +type AffinityScope uint32 + +type VgpuVersion struct { + MinVersion uint32 + MaxVersion uint32 +} + +type nvmlVgpuMetadata struct { + Version uint32 + Revision uint32 + GuestInfoState uint32 + GuestDriverVersion [80]int8 + HostDriverVersion [80]int8 + Reserved [6]uint32 + VgpuVirtualizationCaps uint32 + GuestVgpuVersion uint32 + OpaqueDataSize uint32 + OpaqueData [4]int8 +} + +type nvmlVgpuPgpuMetadata struct { + Version uint32 + Revision uint32 + HostDriverVersion [80]int8 + PgpuVirtualizationCaps uint32 + Reserved [5]uint32 + HostSupportedVgpuRange VgpuVersion + OpaqueDataSize uint32 + OpaqueData [4]int8 +} + +type VgpuPgpuCompatibility struct { + VgpuVmCompatibility uint32 + CompatibilityLimitCode uint32 +} + +type ExcludedDeviceInfo struct { + PciInfo PciInfo + Uuid [80]int8 +} + +type GpuInstancePlacement struct { + Start uint32 + Size uint32 +} + +type GpuInstanceProfileInfo struct { + Id uint32 + IsP2pSupported uint32 + SliceCount uint32 + InstanceCount uint32 + MultiprocessorCount uint32 + CopyEngineCount uint32 + DecoderCount uint32 + EncoderCount uint32 + JpegCount uint32 + OfaCount uint32 + MemorySizeMB uint64 +} + +type GpuInstanceProfileInfo_v2 struct { + Version uint32 + Id uint32 + IsP2pSupported uint32 + SliceCount uint32 + InstanceCount uint32 + MultiprocessorCount uint32 + CopyEngineCount uint32 + DecoderCount uint32 + EncoderCount uint32 + JpegCount uint32 + OfaCount uint32 + MemorySizeMB uint64 + Name [96]int8 +} + +type GpuInstanceInfo struct { + Device Device + Id uint32 + ProfileId uint32 + Placement GpuInstancePlacement +} + +type GpuInstance struct { + Handle *_Ctype_struct_nvmlGpuInstance_st +} + +type ComputeInstancePlacement struct { + Start uint32 + Size uint32 +} + +type ComputeInstanceProfileInfo struct { + Id uint32 + SliceCount uint32 + InstanceCount uint32 + MultiprocessorCount uint32 + SharedCopyEngineCount uint32 + SharedDecoderCount uint32 + SharedEncoderCount uint32 + SharedJpegCount uint32 + SharedOfaCount uint32 +} + +type ComputeInstanceProfileInfo_v2 struct { + Version uint32 + Id uint32 + SliceCount uint32 + InstanceCount uint32 + MultiprocessorCount uint32 + SharedCopyEngineCount uint32 + SharedDecoderCount uint32 + SharedEncoderCount uint32 + SharedJpegCount uint32 + SharedOfaCount uint32 + Name [96]int8 +} + +type ComputeInstanceInfo struct { + Device Device + GpuInstance GpuInstance + Id uint32 + ProfileId uint32 + Placement ComputeInstancePlacement +} + +type ComputeInstance struct { + Handle *_Ctype_struct_nvmlComputeInstance_st +} + +type GpmSample struct { + Handle *_Ctype_struct_nvmlGpmSample_st +} + +type GpmMetricMetricInfo struct { + ShortName *int8 + LongName *int8 + Unit *int8 +} + +type GpmMetric struct { + MetricId uint32 + NvmlReturn uint32 + Value float64 + MetricInfo GpmMetricMetricInfo +} + +type GpmMetricsGetType struct { + Version uint32 + NumMetrics uint32 + Sample1 GpmSample + Sample2 GpmSample + Metrics [98]GpmMetric +} + +type GpmSupport struct { + Version uint32 + IsSupportedDevice uint32 +} + +type NvLinkPowerThres struct { + LowPwrThreshold uint32 +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/unit.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/unit.go new file mode 100644 index 0000000..aba916a --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/unit.go @@ -0,0 +1,113 @@ +// Copyright (c) 2020, 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 nvml + +// nvml.UnitGetCount() +func UnitGetCount() (int, Return) { + var UnitCount uint32 + ret := nvmlUnitGetCount(&UnitCount) + return int(UnitCount), ret +} + +// nvml.UnitGetHandleByIndex() +func UnitGetHandleByIndex(Index int) (Unit, Return) { + var Unit Unit + ret := nvmlUnitGetHandleByIndex(uint32(Index), &Unit) + return Unit, ret +} + +// nvml.UnitGetUnitInfo() +func UnitGetUnitInfo(Unit Unit) (UnitInfo, Return) { + var Info UnitInfo + ret := nvmlUnitGetUnitInfo(Unit, &Info) + return Info, ret +} + +func (Unit Unit) GetUnitInfo() (UnitInfo, Return) { + return UnitGetUnitInfo(Unit) +} + +// nvml.UnitGetLedState() +func UnitGetLedState(Unit Unit) (LedState, Return) { + var State LedState + ret := nvmlUnitGetLedState(Unit, &State) + return State, ret +} + +func (Unit Unit) GetLedState() (LedState, Return) { + return UnitGetLedState(Unit) +} + +// nvml.UnitGetPsuInfo() +func UnitGetPsuInfo(Unit Unit) (PSUInfo, Return) { + var Psu PSUInfo + ret := nvmlUnitGetPsuInfo(Unit, &Psu) + return Psu, ret +} + +func (Unit Unit) GetPsuInfo() (PSUInfo, Return) { + return UnitGetPsuInfo(Unit) +} + +// nvml.UnitGetTemperature() +func UnitGetTemperature(Unit Unit, Type int) (uint32, Return) { + var Temp uint32 + ret := nvmlUnitGetTemperature(Unit, uint32(Type), &Temp) + return Temp, ret +} + +func (Unit Unit) GetTemperature(Type int) (uint32, Return) { + return UnitGetTemperature(Unit, Type) +} + +// nvml.UnitGetFanSpeedInfo() +func UnitGetFanSpeedInfo(Unit Unit) (UnitFanSpeeds, Return) { + var FanSpeeds UnitFanSpeeds + ret := nvmlUnitGetFanSpeedInfo(Unit, &FanSpeeds) + return FanSpeeds, ret +} + +func (Unit Unit) GetFanSpeedInfo() (UnitFanSpeeds, Return) { + return UnitGetFanSpeedInfo(Unit) +} + +// nvml.UnitGetDevices() +func UnitGetDevices(Unit Unit) ([]Device, Return) { + var DeviceCount uint32 = 1 // Will be reduced upon returning + for { + Devices := make([]Device, DeviceCount) + ret := nvmlUnitGetDevices(Unit, &DeviceCount, &Devices[0]) + if ret == SUCCESS { + return Devices[:DeviceCount], ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + DeviceCount *= 2 + } +} + +func (Unit Unit) GetDevices() ([]Device, Return) { + return UnitGetDevices(Unit) +} + +// nvml.UnitSetLedState() +func UnitSetLedState(Unit Unit, Color LedColor) Return { + return nvmlUnitSetLedState(Unit, Color) +} + +func (Unit Unit) SetLedState(Color LedColor) Return { + return UnitSetLedState(Unit, Color) +} diff --git a/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/vgpu.go b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/vgpu.go new file mode 100644 index 0000000..bbb93e3 --- /dev/null +++ b/vendor/github.com/NVIDIA/go-nvml/pkg/nvml/vgpu.go @@ -0,0 +1,480 @@ +// Copyright (c) 2020, 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 nvml + +import ( + "unsafe" +) + +// nvml.VgpuMetadata +type VgpuMetadata struct { + nvmlVgpuMetadata + OpaqueData []byte +} + +// nvml.VgpuPgpuMetadata +type VgpuPgpuMetadata struct { + nvmlVgpuPgpuMetadata + OpaqueData []byte +} + +// nvml.VgpuTypeGetClass() +func VgpuTypeGetClass(VgpuTypeId VgpuTypeId) (string, Return) { + var Size uint32 = DEVICE_NAME_BUFFER_SIZE + VgpuTypeClass := make([]byte, DEVICE_NAME_BUFFER_SIZE) + ret := nvmlVgpuTypeGetClass(VgpuTypeId, &VgpuTypeClass[0], &Size) + return string(VgpuTypeClass[:clen(VgpuTypeClass)]), ret +} + +func (VgpuTypeId VgpuTypeId) GetClass() (string, Return) { + return VgpuTypeGetClass(VgpuTypeId) +} + +// nvml.VgpuTypeGetName() +func VgpuTypeGetName(VgpuTypeId VgpuTypeId) (string, Return) { + var Size uint32 = DEVICE_NAME_BUFFER_SIZE + VgpuTypeName := make([]byte, DEVICE_NAME_BUFFER_SIZE) + ret := nvmlVgpuTypeGetName(VgpuTypeId, &VgpuTypeName[0], &Size) + return string(VgpuTypeName[:clen(VgpuTypeName)]), ret +} + +func (VgpuTypeId VgpuTypeId) GetName() (string, Return) { + return VgpuTypeGetName(VgpuTypeId) +} + +// nvml.VgpuTypeGetGpuInstanceProfileId() +func VgpuTypeGetGpuInstanceProfileId(VgpuTypeId VgpuTypeId) (uint32, Return) { + var Size uint32 + ret := nvmlVgpuTypeGetGpuInstanceProfileId(VgpuTypeId, &Size) + return Size, ret +} + +func (VgpuTypeId VgpuTypeId) GetGpuInstanceProfileId() (uint32, Return) { + return VgpuTypeGetGpuInstanceProfileId(VgpuTypeId) +} + +// nvml.VgpuTypeGetDeviceID() +func VgpuTypeGetDeviceID(VgpuTypeId VgpuTypeId) (uint64, uint64, Return) { + var DeviceID, SubsystemID uint64 + ret := nvmlVgpuTypeGetDeviceID(VgpuTypeId, &DeviceID, &SubsystemID) + return DeviceID, SubsystemID, ret +} + +func (VgpuTypeId VgpuTypeId) GetDeviceID() (uint64, uint64, Return) { + return VgpuTypeGetDeviceID(VgpuTypeId) +} + +// nvml.VgpuTypeGetFramebufferSize() +func VgpuTypeGetFramebufferSize(VgpuTypeId VgpuTypeId) (uint64, Return) { + var FbSize uint64 + ret := nvmlVgpuTypeGetFramebufferSize(VgpuTypeId, &FbSize) + return FbSize, ret +} + +func (VgpuTypeId VgpuTypeId) GetFramebufferSize() (uint64, Return) { + return VgpuTypeGetFramebufferSize(VgpuTypeId) +} + +// nvml.VgpuTypeGetNumDisplayHeads() +func VgpuTypeGetNumDisplayHeads(VgpuTypeId VgpuTypeId) (int, Return) { + var NumDisplayHeads uint32 + ret := nvmlVgpuTypeGetNumDisplayHeads(VgpuTypeId, &NumDisplayHeads) + return int(NumDisplayHeads), ret +} + +func (VgpuTypeId VgpuTypeId) GetNumDisplayHeads() (int, Return) { + return VgpuTypeGetNumDisplayHeads(VgpuTypeId) +} + +// nvml.VgpuTypeGetResolution() +func VgpuTypeGetResolution(VgpuTypeId VgpuTypeId, DisplayIndex int) (uint32, uint32, Return) { + var Xdim, Ydim uint32 + ret := nvmlVgpuTypeGetResolution(VgpuTypeId, uint32(DisplayIndex), &Xdim, &Ydim) + return Xdim, Ydim, ret +} + +func (VgpuTypeId VgpuTypeId) GetResolution(DisplayIndex int) (uint32, uint32, Return) { + return VgpuTypeGetResolution(VgpuTypeId, DisplayIndex) +} + +// nvml.VgpuTypeGetLicense() +func VgpuTypeGetLicense(VgpuTypeId VgpuTypeId) (string, Return) { + VgpuTypeLicenseString := make([]byte, GRID_LICENSE_BUFFER_SIZE) + ret := nvmlVgpuTypeGetLicense(VgpuTypeId, &VgpuTypeLicenseString[0], GRID_LICENSE_BUFFER_SIZE) + return string(VgpuTypeLicenseString[:clen(VgpuTypeLicenseString)]), ret +} + +func (VgpuTypeId VgpuTypeId) GetLicense() (string, Return) { + return VgpuTypeGetLicense(VgpuTypeId) +} + +// nvml.VgpuTypeGetFrameRateLimit() +func VgpuTypeGetFrameRateLimit(VgpuTypeId VgpuTypeId) (uint32, Return) { + var FrameRateLimit uint32 + ret := nvmlVgpuTypeGetFrameRateLimit(VgpuTypeId, &FrameRateLimit) + return FrameRateLimit, ret +} + +func (VgpuTypeId VgpuTypeId) GetFrameRateLimit() (uint32, Return) { + return VgpuTypeGetFrameRateLimit(VgpuTypeId) +} + +// nvml.VgpuTypeGetMaxInstances() +func VgpuTypeGetMaxInstances(Device Device, VgpuTypeId VgpuTypeId) (int, Return) { + var VgpuInstanceCount uint32 + ret := nvmlVgpuTypeGetMaxInstances(Device, VgpuTypeId, &VgpuInstanceCount) + return int(VgpuInstanceCount), ret +} + +func (Device Device) VgpuTypeGetMaxInstances(VgpuTypeId VgpuTypeId) (int, Return) { + return VgpuTypeGetMaxInstances(Device, VgpuTypeId) +} + +func (VgpuTypeId VgpuTypeId) GetMaxInstances(Device Device) (int, Return) { + return VgpuTypeGetMaxInstances(Device, VgpuTypeId) +} + +// nvml.VgpuTypeGetMaxInstancesPerVm() +func VgpuTypeGetMaxInstancesPerVm(VgpuTypeId VgpuTypeId) (int, Return) { + var VgpuInstanceCountPerVm uint32 + ret := nvmlVgpuTypeGetMaxInstancesPerVm(VgpuTypeId, &VgpuInstanceCountPerVm) + return int(VgpuInstanceCountPerVm), ret +} + +func (VgpuTypeId VgpuTypeId) GetMaxInstancesPerVm() (int, Return) { + return VgpuTypeGetMaxInstancesPerVm(VgpuTypeId) +} + +// nvml.VgpuInstanceGetVmID() +func VgpuInstanceGetVmID(VgpuInstance VgpuInstance) (string, VgpuVmIdType, Return) { + var VmIdType VgpuVmIdType + VmId := make([]byte, DEVICE_UUID_BUFFER_SIZE) + ret := nvmlVgpuInstanceGetVmID(VgpuInstance, &VmId[0], DEVICE_UUID_BUFFER_SIZE, &VmIdType) + return string(VmId[:clen(VmId)]), VmIdType, ret +} + +func (VgpuInstance VgpuInstance) GetVmID() (string, VgpuVmIdType, Return) { + return VgpuInstanceGetVmID(VgpuInstance) +} + +// nvml.VgpuInstanceGetUUID() +func VgpuInstanceGetUUID(VgpuInstance VgpuInstance) (string, Return) { + Uuid := make([]byte, DEVICE_UUID_BUFFER_SIZE) + ret := nvmlVgpuInstanceGetUUID(VgpuInstance, &Uuid[0], DEVICE_UUID_BUFFER_SIZE) + return string(Uuid[:clen(Uuid)]), ret +} + +func (VgpuInstance VgpuInstance) GetUUID() (string, Return) { + return VgpuInstanceGetUUID(VgpuInstance) +} + +// nvml.VgpuInstanceGetVmDriverVersion() +func VgpuInstanceGetVmDriverVersion(VgpuInstance VgpuInstance) (string, Return) { + Version := make([]byte, SYSTEM_DRIVER_VERSION_BUFFER_SIZE) + ret := nvmlVgpuInstanceGetVmDriverVersion(VgpuInstance, &Version[0], SYSTEM_DRIVER_VERSION_BUFFER_SIZE) + return string(Version[:clen(Version)]), ret +} + +func (VgpuInstance VgpuInstance) GetVmDriverVersion() (string, Return) { + return VgpuInstanceGetVmDriverVersion(VgpuInstance) +} + +// nvml.VgpuInstanceGetFbUsage() +func VgpuInstanceGetFbUsage(VgpuInstance VgpuInstance) (uint64, Return) { + var FbUsage uint64 + ret := nvmlVgpuInstanceGetFbUsage(VgpuInstance, &FbUsage) + return FbUsage, ret +} + +func (VgpuInstance VgpuInstance) GetFbUsage() (uint64, Return) { + return VgpuInstanceGetFbUsage(VgpuInstance) +} + +// nvml.VgpuInstanceGetLicenseInfo() +func VgpuInstanceGetLicenseInfo(VgpuInstance VgpuInstance) (VgpuLicenseInfo, Return) { + var LicenseInfo VgpuLicenseInfo + ret := nvmlVgpuInstanceGetLicenseInfo(VgpuInstance, &LicenseInfo) + return LicenseInfo, ret +} + +func (VgpuInstance VgpuInstance) GetLicenseInfo() (VgpuLicenseInfo, Return) { + return VgpuInstanceGetLicenseInfo(VgpuInstance) +} + +// nvml.VgpuInstanceGetLicenseStatus() +func VgpuInstanceGetLicenseStatus(VgpuInstance VgpuInstance) (int, Return) { + var Licensed uint32 + ret := nvmlVgpuInstanceGetLicenseStatus(VgpuInstance, &Licensed) + return int(Licensed), ret +} + +func (VgpuInstance VgpuInstance) GetLicenseStatus() (int, Return) { + return VgpuInstanceGetLicenseStatus(VgpuInstance) +} + +// nvml.VgpuInstanceGetType() +func VgpuInstanceGetType(VgpuInstance VgpuInstance) (VgpuTypeId, Return) { + var VgpuTypeId VgpuTypeId + ret := nvmlVgpuInstanceGetType(VgpuInstance, &VgpuTypeId) + return VgpuTypeId, ret +} + +func (VgpuInstance VgpuInstance) GetType() (VgpuTypeId, Return) { + return VgpuInstanceGetType(VgpuInstance) +} + +// nvml.VgpuInstanceGetFrameRateLimit() +func VgpuInstanceGetFrameRateLimit(VgpuInstance VgpuInstance) (uint32, Return) { + var FrameRateLimit uint32 + ret := nvmlVgpuInstanceGetFrameRateLimit(VgpuInstance, &FrameRateLimit) + return FrameRateLimit, ret +} + +func (VgpuInstance VgpuInstance) GetFrameRateLimit() (uint32, Return) { + return VgpuInstanceGetFrameRateLimit(VgpuInstance) +} + +// nvml.VgpuInstanceGetEccMode() +func VgpuInstanceGetEccMode(VgpuInstance VgpuInstance) (EnableState, Return) { + var EccMode EnableState + ret := nvmlVgpuInstanceGetEccMode(VgpuInstance, &EccMode) + return EccMode, ret +} + +func (VgpuInstance VgpuInstance) GetEccMode() (EnableState, Return) { + return VgpuInstanceGetEccMode(VgpuInstance) +} + +// nvml.VgpuInstanceGetEncoderCapacity() +func VgpuInstanceGetEncoderCapacity(VgpuInstance VgpuInstance) (int, Return) { + var EncoderCapacity uint32 + ret := nvmlVgpuInstanceGetEncoderCapacity(VgpuInstance, &EncoderCapacity) + return int(EncoderCapacity), ret +} + +func (VgpuInstance VgpuInstance) GetEncoderCapacity() (int, Return) { + return VgpuInstanceGetEncoderCapacity(VgpuInstance) +} + +// nvml.VgpuInstanceSetEncoderCapacity() +func VgpuInstanceSetEncoderCapacity(VgpuInstance VgpuInstance, EncoderCapacity int) Return { + return nvmlVgpuInstanceSetEncoderCapacity(VgpuInstance, uint32(EncoderCapacity)) +} + +func (VgpuInstance VgpuInstance) SetEncoderCapacity(EncoderCapacity int) Return { + return VgpuInstanceSetEncoderCapacity(VgpuInstance, EncoderCapacity) +} + +// nvml.VgpuInstanceGetEncoderStats() +func VgpuInstanceGetEncoderStats(VgpuInstance VgpuInstance) (int, uint32, uint32, Return) { + var SessionCount, AverageFps, AverageLatency uint32 + ret := nvmlVgpuInstanceGetEncoderStats(VgpuInstance, &SessionCount, &AverageFps, &AverageLatency) + return int(SessionCount), AverageFps, AverageLatency, ret +} + +func (VgpuInstance VgpuInstance) GetEncoderStats() (int, uint32, uint32, Return) { + return VgpuInstanceGetEncoderStats(VgpuInstance) +} + +// nvml.VgpuInstanceGetEncoderSessions() +func VgpuInstanceGetEncoderSessions(VgpuInstance VgpuInstance) (int, EncoderSessionInfo, Return) { + var SessionCount uint32 + var SessionInfo EncoderSessionInfo + ret := nvmlVgpuInstanceGetEncoderSessions(VgpuInstance, &SessionCount, &SessionInfo) + return int(SessionCount), SessionInfo, ret +} + +func (VgpuInstance VgpuInstance) GetEncoderSessions() (int, EncoderSessionInfo, Return) { + return VgpuInstanceGetEncoderSessions(VgpuInstance) +} + +// nvml.VgpuInstanceGetFBCStats() +func VgpuInstanceGetFBCStats(VgpuInstance VgpuInstance) (FBCStats, Return) { + var FbcStats FBCStats + ret := nvmlVgpuInstanceGetFBCStats(VgpuInstance, &FbcStats) + return FbcStats, ret +} + +func (VgpuInstance VgpuInstance) GetFBCStats() (FBCStats, Return) { + return VgpuInstanceGetFBCStats(VgpuInstance) +} + +// nvml.VgpuInstanceGetFBCSessions() +func VgpuInstanceGetFBCSessions(VgpuInstance VgpuInstance) (int, FBCSessionInfo, Return) { + var SessionCount uint32 + var SessionInfo FBCSessionInfo + ret := nvmlVgpuInstanceGetFBCSessions(VgpuInstance, &SessionCount, &SessionInfo) + return int(SessionCount), SessionInfo, ret +} + +func (VgpuInstance VgpuInstance) GetFBCSessions() (int, FBCSessionInfo, Return) { + return VgpuInstanceGetFBCSessions(VgpuInstance) +} + +// nvml.VgpuInstanceGetGpuInstanceId() +func VgpuInstanceGetGpuInstanceId(VgpuInstance VgpuInstance) (int, Return) { + var gpuInstanceId uint32 + ret := nvmlVgpuInstanceGetGpuInstanceId(VgpuInstance, &gpuInstanceId) + return int(gpuInstanceId), ret +} + +func (VgpuInstance VgpuInstance) GetGpuInstanceId() (int, Return) { + return VgpuInstanceGetGpuInstanceId(VgpuInstance) +} + +// nvml.VgpuInstanceGetGpuPciId() +func VgpuInstanceGetGpuPciId(VgpuInstance VgpuInstance) (string, Return) { + var Length uint32 = 1 // Will be reduced upon returning + for { + VgpuPciId := make([]byte, Length) + ret := nvmlVgpuInstanceGetGpuPciId(VgpuInstance, &VgpuPciId[0], &Length) + if ret == SUCCESS { + return string(VgpuPciId[:clen(VgpuPciId)]), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return "", ret + } + Length *= 2 + } +} + +func (VgpuInstance VgpuInstance) GetGpuPciId() (string, Return) { + return VgpuInstanceGetGpuPciId(VgpuInstance) +} + +// nvml.VgpuInstanceGetMetadata() +func VgpuInstanceGetMetadata(VgpuInstance VgpuInstance) (VgpuMetadata, Return) { + var VgpuMetadata VgpuMetadata + OpaqueDataSize := unsafe.Sizeof(VgpuMetadata.nvmlVgpuMetadata.OpaqueData) + VgpuMetadataSize := unsafe.Sizeof(VgpuMetadata.nvmlVgpuMetadata) - OpaqueDataSize + for { + BufferSize := uint32(VgpuMetadataSize + OpaqueDataSize) + Buffer := make([]byte, BufferSize) + nvmlVgpuMetadataPtr := (*nvmlVgpuMetadata)(unsafe.Pointer(&Buffer[0])) + ret := nvmlVgpuInstanceGetMetadata(VgpuInstance, nvmlVgpuMetadataPtr, &BufferSize) + if ret == SUCCESS { + VgpuMetadata.nvmlVgpuMetadata = *nvmlVgpuMetadataPtr + VgpuMetadata.OpaqueData = Buffer[VgpuMetadataSize:BufferSize] + return VgpuMetadata, ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return VgpuMetadata, ret + } + OpaqueDataSize = 2 * OpaqueDataSize + } +} + +func (VgpuInstance VgpuInstance) GetMetadata() (VgpuMetadata, Return) { + return VgpuInstanceGetMetadata(VgpuInstance) +} + +// nvml.VgpuInstanceGetAccountingMode() +func VgpuInstanceGetAccountingMode(VgpuInstance VgpuInstance) (EnableState, Return) { + var Mode EnableState + ret := nvmlVgpuInstanceGetAccountingMode(VgpuInstance, &Mode) + return Mode, ret +} + +func (VgpuInstance VgpuInstance) GetAccountingMode() (EnableState, Return) { + return VgpuInstanceGetAccountingMode(VgpuInstance) +} + +// nvml.VgpuInstanceGetAccountingPids() +func VgpuInstanceGetAccountingPids(VgpuInstance VgpuInstance) ([]int, Return) { + var Count uint32 = 1 // Will be reduced upon returning + for { + Pids := make([]uint32, Count) + ret := nvmlVgpuInstanceGetAccountingPids(VgpuInstance, &Count, &Pids[0]) + if ret == SUCCESS { + return uint32SliceToIntSlice(Pids[:Count]), ret + } + if ret != ERROR_INSUFFICIENT_SIZE { + return nil, ret + } + Count *= 2 + } +} + +func (VgpuInstance VgpuInstance) GetAccountingPids() ([]int, Return) { + return VgpuInstanceGetAccountingPids(VgpuInstance) +} + +// nvml.VgpuInstanceGetAccountingStats() +func VgpuInstanceGetAccountingStats(VgpuInstance VgpuInstance, Pid int) (AccountingStats, Return) { + var Stats AccountingStats + ret := nvmlVgpuInstanceGetAccountingStats(VgpuInstance, uint32(Pid), &Stats) + return Stats, ret +} + +func (VgpuInstance VgpuInstance) GetAccountingStats(Pid int) (AccountingStats, Return) { + return VgpuInstanceGetAccountingStats(VgpuInstance, Pid) +} + +// nvml.GetVgpuCompatibility() +func GetVgpuCompatibility(nvmlVgpuMetadata *nvmlVgpuMetadata, PgpuMetadata *nvmlVgpuPgpuMetadata) (VgpuPgpuCompatibility, Return) { + var CompatibilityInfo VgpuPgpuCompatibility + ret := nvmlGetVgpuCompatibility(nvmlVgpuMetadata, PgpuMetadata, &CompatibilityInfo) + return CompatibilityInfo, ret +} + +// nvml.GetVgpuVersion() +func GetVgpuVersion() (VgpuVersion, VgpuVersion, Return) { + var Supported, Current VgpuVersion + ret := nvmlGetVgpuVersion(&Supported, &Current) + return Supported, Current, ret +} + +// nvml.SetVgpuVersion() +func SetVgpuVersion(VgpuVersion *VgpuVersion) Return { + return SetVgpuVersion(VgpuVersion) +} + +// nvml.VgpuInstanceClearAccountingPids() +func VgpuInstanceClearAccountingPids(VgpuInstance VgpuInstance) Return { + return nvmlVgpuInstanceClearAccountingPids(VgpuInstance) +} + +func (VgpuInstance VgpuInstance) ClearAccountingPids() Return { + return VgpuInstanceClearAccountingPids(VgpuInstance) +} + +// nvml.VgpuInstanceGetMdevUUID() +func VgpuInstanceGetMdevUUID(VgpuInstance VgpuInstance) (string, Return) { + MdevUuid := make([]byte, DEVICE_UUID_BUFFER_SIZE) + ret := nvmlVgpuInstanceGetMdevUUID(VgpuInstance, &MdevUuid[0], DEVICE_UUID_BUFFER_SIZE) + return string(MdevUuid[:clen(MdevUuid)]), ret +} + +func (VgpuInstance VgpuInstance) GetMdevUUID() (string, Return) { + return VgpuInstanceGetMdevUUID(VgpuInstance) +} + +// nvml.VgpuTypeGetCapabilities() +func VgpuTypeGetCapabilities(VgpuTypeId VgpuTypeId, Capability VgpuCapability) (bool, Return) { + var CapResult uint32 + ret := nvmlVgpuTypeGetCapabilities(VgpuTypeId, Capability, &CapResult) + return (CapResult != 0), ret +} + +func (VgpuTypeId VgpuTypeId) GetCapabilities(Capability VgpuCapability) (bool, Return) { + return VgpuTypeGetCapabilities(VgpuTypeId, Capability) +} + +// nvml.GetVgpuDriverCapabilities() +func GetVgpuDriverCapabilities(Capability VgpuDriverCapability) (bool, Return) { + var CapResult uint32 + ret := nvmlGetVgpuDriverCapabilities(Capability, &CapResult) + return (CapResult != 0), ret +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/LICENSE b/vendor/github.com/NVIDIA/nvidia-container-toolkit/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/capabilities.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/capabilities.go new file mode 100644 index 0000000..2ff1f40 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/capabilities.go @@ -0,0 +1,54 @@ +/** +# Copyright (c) 2022, 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 image + +// DriverCapability represents the possible values of NVIDIA_DRIVER_CAPABILITIES +type DriverCapability string + +// Constants for the supported driver capabilities +const ( + DriverCapabilityAll DriverCapability = "all" + DriverCapabilityCompat32 DriverCapability = "compat32" + DriverCapabilityCompute DriverCapability = "compute" + DriverCapabilityDisplay DriverCapability = "display" + DriverCapabilityGraphics DriverCapability = "graphics" + DriverCapabilityNgx DriverCapability = "ngx" + DriverCapabilityUtility DriverCapability = "utility" + DriverCapabilityVideo DriverCapability = "video" +) + +// DriverCapabilities represents the NVIDIA_DRIVER_CAPABILITIES set for the specified image. +type DriverCapabilities map[DriverCapability]bool + +// Has check whether the specified capability is selected. +func (c DriverCapabilities) Has(capability DriverCapability) bool { + if c[DriverCapabilityAll] { + return true + } + return c[capability] +} + +// Any checks whether any of the specified capabilites are set +func (c DriverCapabilities) Any(capabilities ...DriverCapability) bool { + for _, cap := range capabilities { + if c.Has(cap) { + return true + } + } + + return false +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/cuda_image.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/cuda_image.go new file mode 100644 index 0000000..4a255cb --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/cuda_image.go @@ -0,0 +1,190 @@ +/** +# Copyright (c) 2022, 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 image + +import ( + "fmt" + "strconv" + "strings" + + "github.com/opencontainers/runtime-spec/specs-go" + "golang.org/x/mod/semver" +) + +const ( + envCUDAVersion = "CUDA_VERSION" + envNVRequirePrefix = "NVIDIA_REQUIRE_" + envNVRequireCUDA = envNVRequirePrefix + "CUDA" + envNVRequireJetpack = envNVRequirePrefix + "JETPACK" + envNVDisableRequire = "NVIDIA_DISABLE_REQUIRE" + envNVDriverCapabilities = "NVIDIA_DRIVER_CAPABILITIES" +) + +// CUDA represents a CUDA image that can be used for GPU computing. This wraps +// a map of environment variable to values that can be used to perform lookups +// such as requirements. +type CUDA map[string]string + +// NewCUDAImageFromSpec creates a CUDA image from the input OCI runtime spec. +// The process environment is read (if present) to construc the CUDA Image. +func NewCUDAImageFromSpec(spec *specs.Spec) (CUDA, error) { + if spec == nil || spec.Process == nil { + return NewCUDAImageFromEnv(nil) + } + + return NewCUDAImageFromEnv(spec.Process.Env) +} + +// NewCUDAImageFromEnv creates a CUDA image from the input environment. The environment +// is a list of strings of the form ENVAR=VALUE. +func NewCUDAImageFromEnv(env []string) (CUDA, error) { + c := make(CUDA) + + for _, e := range env { + parts := strings.SplitN(e, "=", 2) + if len(parts) != 2 { + return nil, fmt.Errorf("invalid environment variable: %v", e) + } + c[parts[0]] = parts[1] + } + + return c, nil +} + +// IsLegacy returns whether the associated CUDA image is a "legacy" image. An +// image is considered legacy if it has a CUDA_VERSION environment variable defined +// and no NVIDIA_REQUIRE_CUDA environment variable defined. +func (i CUDA) IsLegacy() bool { + legacyCudaVersion := i[envCUDAVersion] + cudaRequire := i[envNVRequireCUDA] + return len(legacyCudaVersion) > 0 && len(cudaRequire) == 0 +} + +// GetRequirements returns the requirements from all NVIDIA_REQUIRE_ environment +// variables. +func (i CUDA) GetRequirements() ([]string, error) { + // TODO: We need not process this if disable require is set, but this will be done + // in a single follow-up to ensure that the behavioural change is accurately captured. + // if i.HasDisableRequire() { + // return nil, nil + // } + + // All variables with the "NVIDIA_REQUIRE_" prefix are passed to nvidia-container-cli + var requirements []string + for name, value := range i { + if strings.HasPrefix(name, envNVRequirePrefix) && !strings.HasPrefix(name, envNVRequireJetpack) { + requirements = append(requirements, value) + } + } + if i.IsLegacy() { + v, err := i.legacyVersion() + if err != nil { + return nil, fmt.Errorf("failed to get version: %v", err) + } + cudaRequire := fmt.Sprintf("cuda>=%s", v) + requirements = append(requirements, cudaRequire) + } + return requirements, nil +} + +// HasDisableRequire checks for the value of the NVIDIA_DISABLE_REQUIRE. If set +// to a valid (true) boolean value this can be used to disable the requirement checks +func (i CUDA) HasDisableRequire() bool { + if disable, exists := i[envNVDisableRequire]; exists { + // i.logger.Debugf("NVIDIA_DISABLE_REQUIRE=%v; skipping requirement checks", disable) + d, _ := strconv.ParseBool(disable) + return d + } + + return false +} + +// DevicesFromEnvvars returns the devices requested by the image through environment variables +func (i CUDA) DevicesFromEnvvars(envVars ...string) VisibleDevices { + // We concantenate all the devices from the specified envvars. + var isSet bool + var devices []string + requested := make(map[string]bool) + for _, envVar := range envVars { + if devs, ok := i[envVar]; ok { + isSet = true + for _, d := range strings.Split(devs, ",") { + trimmed := strings.TrimSpace(d) + if len(trimmed) == 0 { + continue + } + devices = append(devices, trimmed) + requested[trimmed] = true + } + } + } + + // Environment variable unset with legacy image: default to "all". + if !isSet && len(devices) == 0 && i.IsLegacy() { + return NewVisibleDevices("all") + } + + // Environment variable unset or empty or "void": return nil + if len(devices) == 0 || requested["void"] { + return NewVisibleDevices("void") + } + + return NewVisibleDevices(devices...) +} + +// GetDriverCapabilities returns the requested driver capabilities. +func (i CUDA) GetDriverCapabilities() DriverCapabilities { + env := i[envNVDriverCapabilities] + + capabilites := make(DriverCapabilities) + for _, c := range strings.Split(env, ",") { + capabilites[DriverCapability(c)] = true + } + + return capabilites +} + +func (i CUDA) legacyVersion() (string, error) { + majorMinor, err := parseMajorMinorVersion(i[envCUDAVersion]) + if err != nil { + return "", fmt.Errorf("invalid CUDA version: %v", err) + } + + return majorMinor, nil +} + +func parseMajorMinorVersion(version string) (string, error) { + vVersion := "v" + strings.TrimPrefix(version, "v") + + if !semver.IsValid(vVersion) { + return "", fmt.Errorf("invalid version string") + } + + majorMinor := strings.TrimPrefix(semver.MajorMinor(vVersion), "v") + parts := strings.Split(majorMinor, ".") + + var err error + _, err = strconv.ParseUint(parts[0], 10, 32) + if err != nil { + return "", fmt.Errorf("invalid major version") + } + _, err = strconv.ParseUint(parts[1], 10, 32) + if err != nil { + return "", fmt.Errorf("invalid minor version") + } + return majorMinor, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/devices.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/devices.go new file mode 100644 index 0000000..f5a6ad9 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/devices.go @@ -0,0 +1,127 @@ +/** +# Copyright (c) 2022, 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 image + +import ( + "strings" +) + +// VisibleDevices represents the devices selected in a container image +// through the NVIDIA_VISIBLE_DEVICES or other environment variables +type VisibleDevices interface { + List() []string + Has(string) bool +} + +var _ VisibleDevices = (*all)(nil) +var _ VisibleDevices = (*none)(nil) +var _ VisibleDevices = (*void)(nil) +var _ VisibleDevices = (*devices)(nil) + +// NewVisibleDevices creates a VisibleDevices based on the value of the specified envvar. +func NewVisibleDevices(envvars ...string) VisibleDevices { + for _, envvar := range envvars { + if envvar == "all" { + return all{} + } + if envvar == "none" { + return none{} + } + if envvar == "" || envvar == "void" { + return void{} + } + } + + return newDevices(envvars...) +} + +type all struct{} + +// List returns ["all"] for all devices +func (a all) List() []string { + return []string{"all"} +} + +// Has for all devices is true for any id except the empty ID +func (a all) Has(id string) bool { + return id != "" +} + +type none struct{} + +// List returns [""] for the none devices +func (n none) List() []string { + return []string{""} +} + +// Has for none devices is false for any id +func (n none) Has(id string) bool { + return false +} + +type void struct { + none +} + +// List returns nil for the void devices +func (v void) List() []string { + return nil +} + +type devices struct { + len int + lookup map[string]int +} + +func newDevices(idOrCommaSeparated ...string) devices { + lookup := make(map[string]int) + + i := 0 + for _, commaSeparated := range idOrCommaSeparated { + for _, id := range strings.Split(commaSeparated, ",") { + lookup[id] = i + i++ + } + } + + d := devices{ + len: i, + lookup: lookup, + } + return d +} + +// List returns the list of requested devices +func (d devices) List() []string { + list := make([]string, d.len) + + for id, i := range d.lookup { + list[i] = id + } + + return list +} + +// Has checks whether the specified ID is in the set of requested devices +func (d devices) Has(id string) bool { + if id == "" { + return false + } + + _, exist := d.lookup[id] + return exist +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/privileged.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/privileged.go new file mode 100644 index 0000000..a54598d --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/config/image/privileged.go @@ -0,0 +1,43 @@ +/** +# 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 image + +import ( + "github.com/opencontainers/runtime-spec/specs-go" +) + +const ( + capSysAdmin = "CAP_SYS_ADMIN" +) + +// IsPrivileged returns true if the container is a privileged container. +func IsPrivileged(s *specs.Spec) bool { + if s.Process.Capabilities == nil { + return false + } + + // We only make sure that the bounding capabibility set has + // CAP_SYS_ADMIN. This allows us to make sure that the container was + // actually started as '--privileged', but also allow non-root users to + // access the privileged NVIDIA capabilities. + for _, c := range s.Process.Capabilities.Bounding { + if c == capSysAdmin { + return true + } + } + return false +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/char_devices.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/char_devices.go new file mode 100644 index 0000000..2b14914 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/char_devices.go @@ -0,0 +1,69 @@ +/** +# Copyright (c) 2022, 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 discover + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/sirupsen/logrus" +) + +// charDevices is a discover for a list of character devices +type charDevices mounts + +var _ Discover = (*charDevices)(nil) + +// NewCharDeviceDiscoverer creates a discoverer which locates the specified set of device nodes. +func NewCharDeviceDiscoverer(logger *logrus.Logger, devices []string, root string) Discover { + locator := lookup.NewCharDeviceLocator( + lookup.WithLogger(logger), + lookup.WithRoot(root), + ) + + return NewDeviceDiscoverer(logger, locator, root, devices) +} + +// NewDeviceDiscoverer creates a discoverer which locates the specified set of device nodes using the specified locator. +func NewDeviceDiscoverer(logger *logrus.Logger, locator lookup.Locator, root string, devices []string) Discover { + m := NewMounts(logger, locator, root, devices).(*mounts) + + return (*charDevices)(m) +} + +// Mounts returns the discovered mounts for the charDevices. +// Since this explicitly specifies a device list, the mounts are nil. +func (d *charDevices) Mounts() ([]Mount, error) { + return nil, nil +} + +// Devices returns the discovered devices for the charDevices. +// Here the device nodes are first discovered as mounts and these are converted to devices. +func (d *charDevices) Devices() ([]Device, error) { + devicesAsMounts, err := (*mounts)(d).Mounts() + if err != nil { + return nil, err + } + var devices []Device + for _, mount := range devicesAsMounts { + device := Device{ + HostPath: mount.HostPath, + Path: mount.Path, + } + devices = append(devices, device) + } + + return devices, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv.go new file mode 100644 index 0000000..3af4a85 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv.go @@ -0,0 +1,107 @@ +/** +# Copyright (c) 2021, 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 discover + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/sirupsen/logrus" +) + +// NewFromCSVFiles creates a discoverer for the specified CSV files. A logger is also supplied. +// The constructed discoverer is comprised of a list, with each element in the list being associated with a +// single CSV files. +func NewFromCSVFiles(logger *logrus.Logger, files []string, driverRoot string) (Discover, error) { + if len(files) == 0 { + logger.Warnf("No CSV files specified") + return None{}, nil + } + + symlinkLocator := lookup.NewSymlinkLocator(logger, driverRoot) + locators := map[csv.MountSpecType]lookup.Locator{ + csv.MountSpecDev: lookup.NewCharDeviceLocator(lookup.WithLogger(logger), lookup.WithRoot(driverRoot)), + csv.MountSpecDir: lookup.NewDirectoryLocator(logger, driverRoot), + // Libraries and symlinks are handled in the same way + csv.MountSpecLib: symlinkLocator, + csv.MountSpecSym: symlinkLocator, + } + + var mountSpecs []*csv.MountSpec + for _, filename := range files { + targets, err := loadCSVFile(logger, filename) + if err != nil { + logger.Warnf("Skipping CSV file %v: %v", filename, err) + continue + } + mountSpecs = append(mountSpecs, targets...) + } + + return newFromMountSpecs(logger, locators, driverRoot, mountSpecs) +} + +// loadCSVFile loads the specified CSV file and returns the list of mount specs +func loadCSVFile(logger *logrus.Logger, filename string) ([]*csv.MountSpec, error) { + // Create a discoverer for each file-kind combination + targets, err := csv.NewCSVFileParser(logger, filename).Parse() + if err != nil { + return nil, fmt.Errorf("failed to parse CSV file: %v", err) + } + if len(targets) == 0 { + return nil, fmt.Errorf("CSV file is empty") + } + + return targets, nil +} + +// newFromMountSpecs creates a discoverer for the CSV file. A logger is also supplied. +// A list of csvDiscoverers is returned, with each being associated with a single MountSpecType. +func newFromMountSpecs(logger *logrus.Logger, locators map[csv.MountSpecType]lookup.Locator, driverRoot string, targets []*csv.MountSpec) (Discover, error) { + if len(targets) == 0 { + return &None{}, nil + } + + var discoverers []Discover + var mountSpecTypes []csv.MountSpecType + candidatesByType := make(map[csv.MountSpecType][]string) + for _, t := range targets { + if _, exists := candidatesByType[t.Type]; !exists { + mountSpecTypes = append(mountSpecTypes, t.Type) + } + candidatesByType[t.Type] = append(candidatesByType[t.Type], t.Path) + } + + for _, t := range mountSpecTypes { + locator, exists := locators[t] + if !exists { + return nil, fmt.Errorf("no locator defined for '%v'", t) + } + + var m Discover + switch t { + case csv.MountSpecDev: + m = NewDeviceDiscoverer(logger, locator, driverRoot, candidatesByType[t]) + default: + m = NewMounts(logger, locator, driverRoot, candidatesByType[t]) + } + discoverers = append(discoverers, m) + + } + + return &list{discoverers: discoverers}, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv/csv.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv/csv.go new file mode 100644 index 0000000..4aa5082 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv/csv.go @@ -0,0 +1,131 @@ +/** +# Copyright (c) 2021, 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 csv + +import ( + "bufio" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + + "github.com/sirupsen/logrus" +) + +const ( + // DefaultMountSpecPath is default location of CSV files that define the modifications required to the OCI spec + DefaultMountSpecPath = "/etc/nvidia-container-runtime/host-files-for-container.d" +) + +// GetFileList returns the (non-recursive) list of CSV files in the specified +// folder +func GetFileList(root string) ([]string, error) { + contents, err := os.ReadDir(root) + if err != nil && errors.Is(err, os.ErrNotExist) { + return nil, nil + } else if err != nil { + return nil, fmt.Errorf("failed to read the contents of %v: %v", root, err) + } + + var csvFilePaths []string + for _, c := range contents { + if c.IsDir() { + continue + } + if c.Name() == ".csv" { + continue + } + ext := strings.ToLower(filepath.Ext(c.Name())) + if ext != ".csv" { + continue + } + + csvFilePaths = append(csvFilePaths, filepath.Join(root, c.Name())) + } + + return csvFilePaths, nil +} + +// BaseFilesOnly filters out non-base CSV files from the list of CSV files. +func BaseFilesOnly(filenames []string) []string { + filter := map[string]bool{ + "l4t.csv": true, + "drivers.csv": true, + "devices.csv": true, + } + + var selected []string + for _, file := range filenames { + base := filepath.Base(file) + if filter[base] { + selected = append(selected, file) + } + } + + return selected +} + +// Parser specifies an interface for parsing MountSpecs +type Parser interface { + Parse() ([]*MountSpec, error) +} + +type csv struct { + logger *logrus.Logger + filename string +} + +// NewCSVFileParser creates a new parser for reading MountSpecs from the specified CSV file +func NewCSVFileParser(logger *logrus.Logger, filename string) Parser { + p := csv{ + logger: logger, + filename: filename, + } + + return &p +} + +// Parse parses the csv file and returns a list of MountSpecs in the file +func (p csv) Parse() ([]*MountSpec, error) { + reader, err := os.Open(p.filename) + if err != nil { + return nil, fmt.Errorf("failed to open %v for reading: %v", p.filename, err) + } + defer reader.Close() + + return p.parseFromReader(reader), nil +} + +// parseFromReader parses the specified file and returns a list of required jetson mounts +func (p csv) parseFromReader(reader io.Reader) []*MountSpec { + var targets []*MountSpec + + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + line := scanner.Text() + target, err := NewMountSpecFromLine(line) + if err != nil { + p.logger.Debugf("Skipping invalid mount spec '%v': %v", line, err) + continue + } + targets = append(targets, target) + } + + return targets +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv/mount_spec.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv/mount_spec.go new file mode 100644 index 0000000..3ab5f9b --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv/mount_spec.go @@ -0,0 +1,74 @@ +/** +# Copyright (c) 2021-2022, 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 csv + +import ( + "fmt" + "strings" +) + +// MountSpecType defines the mount types allowed in a CSV file +type MountSpecType string + +const ( + // MountSpecDev is used for character devices + MountSpecDev = MountSpecType("dev") + // MountSpecDir is used for directories + MountSpecDir = MountSpecType("dir") + // MountSpecLib is used for libraries or regular files + MountSpecLib = MountSpecType("lib") + // MountSpecSym is used for symlinks. + MountSpecSym = MountSpecType("sym") +) + +// MountSpec represents a Jetson mount consisting of a type and a path. +type MountSpec struct { + Type MountSpecType + Path string +} + +// NewMountSpecFromLine parses the specified line and returns the MountSpec or an error if the line is malformed +func NewMountSpecFromLine(line string) (*MountSpec, error) { + parts := strings.SplitN(strings.TrimSpace(line), ",", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("failed to parse line: %v", line) + } + mountType := strings.TrimSpace(parts[0]) + path := strings.TrimSpace(parts[1]) + + return NewMountSpec(mountType, path) +} + +// NewMountSpec creates a MountSpec with the specified type and path. An error is returned if the type is invalid. +func NewMountSpec(mountType string, path string) (*MountSpec, error) { + mt := MountSpecType(mountType) + switch mt { + case MountSpecDev, MountSpecLib, MountSpecSym, MountSpecDir: + default: + return nil, fmt.Errorf("unexpected mount type: %v", mt) + } + if path == "" { + return nil, fmt.Errorf("invalid path: %v", path) + } + + mount := MountSpec{ + Type: mt, + Path: path, + } + + return &mount, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/discover.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/discover.go new file mode 100644 index 0000000..0687055 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/discover.go @@ -0,0 +1,52 @@ +/* +# Copyright (c) 2021-2022, 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 discover + +// Config represents the configuration options for discovery +type Config struct { + DriverRoot string + NvidiaCTKPath string +} + +// Device represents a discovered character device. +type Device struct { + HostPath string + Path string +} + +// Mount represents a discovered mount. +type Mount struct { + HostPath string + Path string + Options []string +} + +// Hook represents a discovered hook. +type Hook struct { + Lifecycle string + Path string + Args []string +} + +// Discover defines an interface for discovering the devices, mounts, and hooks available on a system +// +//go:generate moq -stub -out discover_mock.go . Discover +type Discover interface { + Devices() ([]Device, error) + Mounts() ([]Mount, error) + Hooks() ([]Hook, error) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/discover_mock.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/discover_mock.go new file mode 100644 index 0000000..d9be6ff --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/discover_mock.go @@ -0,0 +1,153 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package discover + +import ( + "sync" +) + +// Ensure, that DiscoverMock does implement Discover. +// If this is not the case, regenerate this file with moq. +var _ Discover = &DiscoverMock{} + +// DiscoverMock is a mock implementation of Discover. +// +// func TestSomethingThatUsesDiscover(t *testing.T) { +// +// // make and configure a mocked Discover +// mockedDiscover := &DiscoverMock{ +// DevicesFunc: func() ([]Device, error) { +// panic("mock out the Devices method") +// }, +// HooksFunc: func() ([]Hook, error) { +// panic("mock out the Hooks method") +// }, +// MountsFunc: func() ([]Mount, error) { +// panic("mock out the Mounts method") +// }, +// } +// +// // use mockedDiscover in code that requires Discover +// // and then make assertions. +// +// } +type DiscoverMock struct { + // DevicesFunc mocks the Devices method. + DevicesFunc func() ([]Device, error) + + // HooksFunc mocks the Hooks method. + HooksFunc func() ([]Hook, error) + + // MountsFunc mocks the Mounts method. + MountsFunc func() ([]Mount, error) + + // calls tracks calls to the methods. + calls struct { + // Devices holds details about calls to the Devices method. + Devices []struct { + } + // Hooks holds details about calls to the Hooks method. + Hooks []struct { + } + // Mounts holds details about calls to the Mounts method. + Mounts []struct { + } + } + lockDevices sync.RWMutex + lockHooks sync.RWMutex + lockMounts sync.RWMutex +} + +// Devices calls DevicesFunc. +func (mock *DiscoverMock) Devices() ([]Device, error) { + callInfo := struct { + }{} + mock.lockDevices.Lock() + mock.calls.Devices = append(mock.calls.Devices, callInfo) + mock.lockDevices.Unlock() + if mock.DevicesFunc == nil { + var ( + devicesOut []Device + errOut error + ) + return devicesOut, errOut + } + return mock.DevicesFunc() +} + +// DevicesCalls gets all the calls that were made to Devices. +// Check the length with: +// +// len(mockedDiscover.DevicesCalls()) +func (mock *DiscoverMock) DevicesCalls() []struct { +} { + var calls []struct { + } + mock.lockDevices.RLock() + calls = mock.calls.Devices + mock.lockDevices.RUnlock() + return calls +} + +// Hooks calls HooksFunc. +func (mock *DiscoverMock) Hooks() ([]Hook, error) { + callInfo := struct { + }{} + mock.lockHooks.Lock() + mock.calls.Hooks = append(mock.calls.Hooks, callInfo) + mock.lockHooks.Unlock() + if mock.HooksFunc == nil { + var ( + hooksOut []Hook + errOut error + ) + return hooksOut, errOut + } + return mock.HooksFunc() +} + +// HooksCalls gets all the calls that were made to Hooks. +// Check the length with: +// +// len(mockedDiscover.HooksCalls()) +func (mock *DiscoverMock) HooksCalls() []struct { +} { + var calls []struct { + } + mock.lockHooks.RLock() + calls = mock.calls.Hooks + mock.lockHooks.RUnlock() + return calls +} + +// Mounts calls MountsFunc. +func (mock *DiscoverMock) Mounts() ([]Mount, error) { + callInfo := struct { + }{} + mock.lockMounts.Lock() + mock.calls.Mounts = append(mock.calls.Mounts, callInfo) + mock.lockMounts.Unlock() + if mock.MountsFunc == nil { + var ( + mountsOut []Mount + errOut error + ) + return mountsOut, errOut + } + return mock.MountsFunc() +} + +// MountsCalls gets all the calls that were made to Mounts. +// Check the length with: +// +// len(mockedDiscover.MountsCalls()) +func (mock *DiscoverMock) MountsCalls() []struct { +} { + var calls []struct { + } + mock.lockMounts.RLock() + calls = mock.calls.Mounts + mock.lockMounts.RUnlock() + return calls +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/filter.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/filter.go new file mode 100644 index 0000000..ee4b78a --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/filter.go @@ -0,0 +1,62 @@ +/** +# Copyright (c) 2022, 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 discover + +import "github.com/sirupsen/logrus" + +// Filter defines an interface for filtering discovered entities +type Filter interface { + DeviceIsSelected(device Device) bool +} + +// filtered represents a filtered discoverer +type filtered struct { + Discover + logger *logrus.Logger + filter Filter +} + +// newFilteredDisoverer creates a discoverer that applies the specified filter to the returned entities of the discoverer +func newFilteredDisoverer(logger *logrus.Logger, applyTo Discover, filter Filter) Discover { + return filtered{ + Discover: applyTo, + logger: logger, + filter: filter, + } +} + +// Devices returns a filtered list of devices based on the specified filter. +func (d filtered) Devices() ([]Device, error) { + devices, err := d.Discover.Devices() + if err != nil { + return nil, err + } + + if d.filter == nil { + return devices, nil + } + + var selected []Device + for _, device := range devices { + if d.filter.DeviceIsSelected(device) { + selected = append(selected, device) + } + d.logger.Debugf("skipping device %v", device) + } + + return selected, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/gds.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/gds.go new file mode 100644 index 0000000..7da5e07 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/gds.go @@ -0,0 +1,80 @@ +/** +# Copyright (c) 2022, 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 discover + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/sirupsen/logrus" +) + +type gdsDeviceDiscoverer struct { + None + logger *logrus.Logger + devices Discover + mounts Discover +} + +// NewGDSDiscoverer creates a discoverer for GPUDirect Storage devices and mounts. +func NewGDSDiscoverer(logger *logrus.Logger, root string) (Discover, error) { + devices := NewCharDeviceDiscoverer( + logger, + []string{"/dev/nvidia-fs*"}, + root, + ) + + udev := NewMounts( + logger, + lookup.NewDirectoryLocator(logger, root), + root, + []string{"/run/udev"}, + ) + + cufile := NewMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(root), + ), + root, + []string{"/etc/cufile.json"}, + ) + + d := gdsDeviceDiscoverer{ + logger: logger, + devices: devices, + mounts: Merge(udev, cufile), + } + + return &d, nil +} + +// Devices discovers the nvidia-fs device nodes for use with GPUDirect Storage +func (d *gdsDeviceDiscoverer) Devices() ([]Device, error) { + return d.devices.Devices() +} + +// Mounts discovers the required mounts for GPUDirect Storage. +// If no devices are discovered the discovered mounts are empty +func (d *gdsDeviceDiscoverer) Mounts() ([]Mount, error) { + devices, err := d.Devices() + if err != nil || len(devices) == 0 { + d.logger.Debugf("No nvidia-fs devices detected; skipping detection of mounts") + return nil, nil + } + + return d.mounts.Mounts() +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/graphics.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/graphics.go new file mode 100644 index 0000000..1f3fd91 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/graphics.go @@ -0,0 +1,386 @@ +/** +# Copyright (c) 2022, 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 discover + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/config/image" + "github.com/NVIDIA/nvidia-container-toolkit/internal/info/drm" + "github.com/NVIDIA/nvidia-container-toolkit/internal/info/proc" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda" + "github.com/sirupsen/logrus" +) + +// NewGraphicsDiscoverer returns the discoverer for graphics tools such as Vulkan. +func NewGraphicsDiscoverer(logger *logrus.Logger, devices image.VisibleDevices, cfg *Config) (Discover, error) { + driverRoot := cfg.DriverRoot + + mounts, err := NewGraphicsMountsDiscoverer(logger, driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to create mounts discoverer: %v", err) + } + + drmDeviceNodes, err := newDRMDeviceDiscoverer(logger, devices, driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to create DRM device discoverer: %v", err) + } + + drmByPathSymlinks := newCreateDRMByPathSymlinks(logger, drmDeviceNodes, cfg) + + xorg := optionalXorgDiscoverer(logger, driverRoot, cfg.NvidiaCTKPath) + + discover := Merge( + Merge(drmDeviceNodes, drmByPathSymlinks), + mounts, + xorg, + ) + + return discover, nil +} + +// NewGraphicsMountsDiscoverer creates a discoverer for the mounts required by graphics tools such as vulkan. +func NewGraphicsMountsDiscoverer(logger *logrus.Logger, driverRoot string) (Discover, error) { + locator, err := lookup.NewLibraryLocator(logger, driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to construct library locator: %v", err) + } + libraries := NewMounts( + logger, + locator, + driverRoot, + []string{ + "libnvidia-egl-gbm.so", + }, + ) + + jsonMounts := NewMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + lookup.WithSearchPaths("/etc", "/usr/share"), + ), + driverRoot, + []string{ + "glvnd/egl_vendor.d/10_nvidia.json", + "vulkan/icd.d/nvidia_icd.json", + "vulkan/implicit_layer.d/nvidia_layers.json", + "egl/egl_external_platform.d/15_nvidia_gbm.json", + "egl/egl_external_platform.d/10_nvidia_wayland.json", + }, + ) + + discover := Merge( + libraries, + jsonMounts, + ) + + return discover, nil +} + +type drmDevicesByPath struct { + None + logger *logrus.Logger + nvidiaCTKPath string + driverRoot string + devicesFrom Discover +} + +// newCreateDRMByPathSymlinks creates a discoverer for a hook to create the by-path symlinks for DRM devices discovered by the specified devices discoverer +func newCreateDRMByPathSymlinks(logger *logrus.Logger, devices Discover, cfg *Config) Discover { + d := drmDevicesByPath{ + logger: logger, + nvidiaCTKPath: FindNvidiaCTK(logger, cfg.NvidiaCTKPath), + driverRoot: cfg.DriverRoot, + devicesFrom: devices, + } + + return &d +} + +// Hooks returns a hook to create the symlinks from the required CSV files +func (d drmDevicesByPath) Hooks() ([]Hook, error) { + devices, err := d.devicesFrom.Devices() + if err != nil { + return nil, fmt.Errorf("failed to discover devices for by-path symlinks: %v", err) + } + if len(devices) == 0 { + return nil, nil + } + links, err := d.getSpecificLinkArgs(devices) + if err != nil { + return nil, fmt.Errorf("failed to determine specific links: %v", err) + } + if len(links) == 0 { + return nil, nil + } + + var args []string + for _, l := range links { + args = append(args, "--link", l) + } + + hook := CreateNvidiaCTKHook( + d.nvidiaCTKPath, + "create-symlinks", + args..., + ) + + return []Hook{hook}, nil +} + +// getSpecificLinkArgs returns the required specic links that need to be created +func (d drmDevicesByPath) getSpecificLinkArgs(devices []Device) ([]string, error) { + selectedDevices := make(map[string]bool) + for _, d := range devices { + selectedDevices[filepath.Base(d.HostPath)] = true + } + + linkLocator := lookup.NewFileLocator( + lookup.WithLogger(d.logger), + lookup.WithRoot(d.driverRoot), + ) + candidates, err := linkLocator.Locate("/dev/dri/by-path/pci-*-*") + if err != nil { + d.logger.Warningf("Failed to locate by-path links: %v; ignoring", err) + return nil, nil + } + + var links []string + for _, c := range candidates { + device, err := os.Readlink(c) + if err != nil { + d.logger.Warningf("Failed to evaluate symlink %v; ignoring", c) + continue + } + + if selectedDevices[filepath.Base(device)] { + d.logger.Debugf("adding device symlink %v -> %v", c, device) + links = append(links, fmt.Sprintf("%v::%v", device, c)) + } + } + + return links, nil +} + +// newDRMDeviceDiscoverer creates a discoverer for the DRM devices associated with the requested devices. +func newDRMDeviceDiscoverer(logger *logrus.Logger, devices image.VisibleDevices, driverRoot string) (Discover, error) { + allDevices := NewDeviceDiscoverer( + logger, + lookup.NewCharDeviceLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + ), + driverRoot, + []string{ + "/dev/dri/card*", + "/dev/dri/renderD*", + }, + ) + + filter, err := newDRMDeviceFilter(logger, devices, driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to construct DRM device filter: %v", err) + } + + // We return a discoverer that applies the DRM device filter created above to all discovered DRM device nodes. + d := newFilteredDisoverer( + logger, + allDevices, + filter, + ) + + return d, err +} + +// newDRMDeviceFilter creates a filter that matches DRM devices nodes for the visible devices. +func newDRMDeviceFilter(logger *logrus.Logger, devices image.VisibleDevices, driverRoot string) (Filter, error) { + gpuInformationPaths, err := proc.GetInformationFilePaths(driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to read GPU information: %v", err) + } + + var selectedBusIds []string + for _, f := range gpuInformationPaths { + info, err := proc.ParseGPUInformationFile(f) + if err != nil { + return nil, fmt.Errorf("failed to parse %v: %v", f, err) + } + uuid := info[proc.GPUInfoGPUUUID] + busID := info[proc.GPUInfoBusLocation] + minor := info[proc.GPUInfoDeviceMinor] + + if devices.Has(minor) || devices.Has(uuid) || devices.Has(busID) { + selectedBusIds = append(selectedBusIds, busID) + } + } + + filter := make(selectDeviceByPath) + for _, busID := range selectedBusIds { + drmDeviceNodes, err := drm.GetDeviceNodesByBusID(busID) + if err != nil { + return nil, fmt.Errorf("failed to determine DRM devices for %v: %v", busID, err) + } + for _, drmDeviceNode := range drmDeviceNodes { + filter[filepath.Join(drmDeviceNode)] = true + } + } + + return filter, nil +} + +type xorgHooks struct { + libraries Discover + driverVersion string + nvidiaCTKPath string +} + +var _ Discover = (*xorgHooks)(nil) + +// optionalXorgDiscoverer creates a discoverer for Xorg libraries. +// If the creation of the discoverer fails, a None discoverer is returned. +func optionalXorgDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string) Discover { + xorg, err := newXorgDiscoverer(logger, driverRoot, nvidiaCTKPath) + if err != nil { + logger.Warnf("Failed to create Xorg discoverer: %v; skipping xorg libraries", err) + return None{} + } + return xorg +} + +func newXorgDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string) (Discover, error) { + libCudaPaths, err := cuda.New( + cuda.WithLogger(logger), + cuda.WithDriverRoot(driverRoot), + ).Locate(".*.*") + if err != nil { + return nil, fmt.Errorf("failed to locate libcuda.so: %v", err) + } + libcudaPath := libCudaPaths[0] + + version := strings.TrimPrefix(filepath.Base(libcudaPath), "libcuda.so.") + if version == "" { + return nil, fmt.Errorf("failed to determine libcuda.so version from path: %q", libcudaPath) + } + + libRoot := filepath.Dir(libcudaPath) + xorgLibs := NewMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + lookup.WithSearchPaths(libRoot, "/usr/lib/x86_64-linux-gnu"), + lookup.WithCount(1), + ), + driverRoot, + []string{ + "nvidia/xorg/nvidia_drv.so", + fmt.Sprintf("nvidia/xorg/libglxserver_nvidia.so.%s", version), + }, + ) + xorgHooks := xorgHooks{ + libraries: xorgLibs, + driverVersion: version, + nvidiaCTKPath: FindNvidiaCTK(logger, nvidiaCTKPath), + } + + xorgConfg := NewMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + lookup.WithSearchPaths("/usr/share"), + ), + driverRoot, + []string{"X11/xorg.conf.d/10-nvidia.conf"}, + ) + + d := Merge( + xorgLibs, + xorgConfg, + xorgHooks, + ) + + return d, nil +} + +// Devices returns no devices for Xorg +func (m xorgHooks) Devices() ([]Device, error) { + return nil, nil +} + +// Hooks returns a hook to create symlinks for Xorg libraries +func (m xorgHooks) Hooks() ([]Hook, error) { + mounts, err := m.libraries.Mounts() + if err != nil { + return nil, fmt.Errorf("failed to get mounts: %v", err) + } + if len(mounts) == 0 { + return nil, nil + } + + var target string + for _, mount := range mounts { + filename := filepath.Base(mount.HostPath) + if filename == "libglxserver_nvidia.so."+m.driverVersion { + target = mount.Path + } + } + + if target == "" { + return nil, nil + } + + link := strings.TrimSuffix(target, "."+m.driverVersion) + links := []string{fmt.Sprintf("%s::%s", filepath.Base(target), link)} + symlinkHook := CreateCreateSymlinkHook( + m.nvidiaCTKPath, + links, + ) + + return symlinkHook.Hooks() +} + +// Mounts returns the libraries required for Xorg +func (m xorgHooks) Mounts() ([]Mount, error) { + return nil, nil +} + +// selectDeviceByPath is a filter that allows devices to be selected by the path +type selectDeviceByPath map[string]bool + +var _ Filter = (*selectDeviceByPath)(nil) + +// DeviceIsSelected determines whether the device's path has been selected +func (s selectDeviceByPath) DeviceIsSelected(device Device) bool { + return s[device.Path] +} + +// MountIsSelected is always true +func (s selectDeviceByPath) MountIsSelected(Mount) bool { + return true +} + +// HookIsSelected is always true +func (s selectDeviceByPath) HookIsSelected(Hook) bool { + return true +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/hooks.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/hooks.go new file mode 100644 index 0000000..87202e7 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/hooks.go @@ -0,0 +1,103 @@ +/** +# 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 discover + +import ( + "path/filepath" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/sirupsen/logrus" +) + +const ( + nvidiaCTKExecutable = "nvidia-ctk" + nvidiaCTKDefaultFilePath = "/usr/bin/nvidia-ctk" +) + +var _ Discover = (*Hook)(nil) + +// Devices returns an empty list of devices for a Hook discoverer. +func (h Hook) Devices() ([]Device, error) { + return nil, nil +} + +// Mounts returns an empty list of mounts for a Hook discoverer. +func (h Hook) Mounts() ([]Mount, error) { + return nil, nil +} + +// Hooks allows the Hook type to also implement the Discoverer interface. +// It returns a single hook +func (h Hook) Hooks() ([]Hook, error) { + return []Hook{h}, nil +} + +// CreateCreateSymlinkHook creates a hook which creates a symlink from link -> target. +func CreateCreateSymlinkHook(nvidiaCTKPath string, links []string) Discover { + if len(links) == 0 { + return None{} + } + + var args []string + for _, link := range links { + args = append(args, "--link", link) + } + return CreateNvidiaCTKHook( + nvidiaCTKPath, + "create-symlinks", + args..., + ) +} + +// CreateNvidiaCTKHook creates a hook which invokes the NVIDIA Container CLI hook subcommand. +func CreateNvidiaCTKHook(nvidiaCTKPath string, hookName string, additionalArgs ...string) Hook { + return Hook{ + Lifecycle: cdi.CreateContainerHook, + Path: nvidiaCTKPath, + Args: append([]string{filepath.Base(nvidiaCTKPath), "hook", hookName}, additionalArgs...), + } +} + +// FindNvidiaCTK locates the nvidia-ctk executable to be used in hooks. +// If an nvidia-ctk path is specified as an absolute path, it is used directly +// without checking for existence of an executable at that path. +func FindNvidiaCTK(logger *logrus.Logger, nvidiaCTKPath string) string { + if filepath.IsAbs(nvidiaCTKPath) { + logger.Debugf("Using specified NVIDIA Container Toolkit CLI path %v", nvidiaCTKPath) + return nvidiaCTKPath + } + + if nvidiaCTKPath == "" { + nvidiaCTKPath = nvidiaCTKExecutable + } + logger.Debugf("Locating NVIDIA Container Toolkit CLI as %v", nvidiaCTKPath) + lookup := lookup.NewExecutableLocator(logger, "") + hookPath := nvidiaCTKDefaultFilePath + targets, err := lookup.Locate(nvidiaCTKPath) + if err != nil { + logger.Warnf("Failed to locate %v: %v", nvidiaCTKPath, err) + } else if len(targets) == 0 { + logger.Warnf("%v not found", nvidiaCTKPath) + } else { + logger.Debugf("Found %v candidates: %v", nvidiaCTKPath, targets) + hookPath = targets[0] + } + logger.Debugf("Using NVIDIA Container Toolkit CLI path %v", hookPath) + + return hookPath +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/ipc.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/ipc.go new file mode 100644 index 0000000..0604a52 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/ipc.go @@ -0,0 +1,78 @@ +/** +# 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 discover + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/sirupsen/logrus" +) + +type ipcMounts mounts + +// NewIPCDiscoverer creats a discoverer for NVIDIA IPC sockets. +func NewIPCDiscoverer(logger *logrus.Logger, driverRoot string) (Discover, error) { + sockets := newMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + lookup.WithSearchPaths("/run", "/var/run"), + lookup.WithCount(1), + ), + driverRoot, + []string{ + "/nvidia-persistenced/socket", + "/nvidia-fabricmanager/socket", + }, + ) + + mps := newMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + lookup.WithCount(1), + ), + driverRoot, + []string{ + "/tmp/nvidia-mps", + }, + ) + + d := Merge( + (*ipcMounts)(sockets), + (*ipcMounts)(mps), + ) + return d, nil +} + +// Mounts returns the discovered mounts with "noexec" added to the mount options. +func (d *ipcMounts) Mounts() ([]Mount, error) { + mounts, err := (*mounts)(d).Mounts() + if err != nil { + return nil, err + } + + var modifiedMounts []Mount + for _, m := range mounts { + mount := m + mount.Options = append(m.Options, "noexec") + modifiedMounts = append(modifiedMounts, mount) + } + + return modifiedMounts, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/ldconfig.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/ldconfig.go new file mode 100644 index 0000000..e56f605 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/ldconfig.go @@ -0,0 +1,122 @@ +/** +# Copyright (c) 2022, 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 discover + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/sirupsen/logrus" +) + +// NewLDCacheUpdateHook creates a discoverer that updates the ldcache for the specified mounts. A logger can also be specified +func NewLDCacheUpdateHook(logger *logrus.Logger, mounts Discover, cfg *Config) (Discover, error) { + d := ldconfig{ + logger: logger, + nvidiaCTKPath: FindNvidiaCTK(logger, cfg.NvidiaCTKPath), + mountsFrom: mounts, + } + + return &d, nil +} + +type ldconfig struct { + None + logger *logrus.Logger + nvidiaCTKPath string + mountsFrom Discover +} + +// Hooks checks the required mounts for libraries and returns a hook to update the LDcache for the discovered paths. +func (d ldconfig) Hooks() ([]Hook, error) { + mounts, err := d.mountsFrom.Mounts() + if err != nil { + return nil, fmt.Errorf("failed to discover mounts for ldcache update: %v", err) + } + h := CreateLDCacheUpdateHook( + d.nvidiaCTKPath, + getLibraryPaths(mounts), + ) + return []Hook{h}, nil +} + +// CreateLDCacheUpdateHook locates the NVIDIA Container Toolkit CLI and creates a hook for updating the LD Cache +func CreateLDCacheUpdateHook(executable string, libraries []string) Hook { + var args []string + for _, f := range uniqueFolders(libraries) { + args = append(args, "--folder", f) + } + + hook := CreateNvidiaCTKHook( + executable, + "update-ldcache", + args..., + ) + + return hook + +} + +// getLibraryPaths extracts the library dirs from the specified mounts +func getLibraryPaths(mounts []Mount) []string { + var paths []string + for _, m := range mounts { + if !isLibName(m.Path) { + continue + } + paths = append(paths, m.Path) + } + return paths +} + +// isLibName checks if the specified filename is a library (i.e. ends in `.so*`) +func isLibName(filename string) bool { + + base := filepath.Base(filename) + + isLib, err := filepath.Match("lib?*.so*", base) + if !isLib || err != nil { + return false + } + + parts := strings.Split(base, ".so") + if len(parts) == 1 { + return true + } + + return parts[len(parts)-1] == "" || strings.HasPrefix(parts[len(parts)-1], ".") +} + +// uniqueFolders returns the unique set of folders for the specified files +func uniqueFolders(libraries []string) []string { + var paths []string + checked := make(map[string]bool) + + for _, l := range libraries { + dir := filepath.Dir(l) + if dir == "" { + continue + } + if checked[dir] { + continue + } + checked[dir] = true + paths = append(paths, dir) + } + return paths +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/list.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/list.go new file mode 100644 index 0000000..aa0c591 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/list.go @@ -0,0 +1,82 @@ +/* +# Copyright (c) 2021, 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 discover + +import "fmt" + +// list is a discoverer that contains a list of Discoverers. The output of the +// Mounts functions is the concatenation of the output for each of the +// elements in the list. +type list struct { + discoverers []Discover +} + +var _ Discover = (*list)(nil) + +// Merge creates a discoverer that is the composite of a list of discoveres. +func Merge(d ...Discover) Discover { + l := list{ + discoverers: d, + } + + return &l +} + +// Devices returns all devices from the included discoverers +func (d list) Devices() ([]Device, error) { + var allDevices []Device + + for i, di := range d.discoverers { + devices, err := di.Devices() + if err != nil { + return nil, fmt.Errorf("error discovering devices for discoverer %v: %v", i, err) + } + allDevices = append(allDevices, devices...) + } + + return allDevices, nil +} + +// Mounts returns all mounts from the included discoverers +func (d list) Mounts() ([]Mount, error) { + var allMounts []Mount + + for i, di := range d.discoverers { + mounts, err := di.Mounts() + if err != nil { + return nil, fmt.Errorf("error discovering mounts for discoverer %v: %v", i, err) + } + allMounts = append(allMounts, mounts...) + } + + return allMounts, nil +} + +// Hooks returns all Hooks from the included discoverers +func (d list) Hooks() ([]Hook, error) { + var allHooks []Hook + + for i, di := range d.discoverers { + hooks, err := di.Hooks() + if err != nil { + return nil, fmt.Errorf("error discovering hooks for discoverer %v: %v", i, err) + } + allHooks = append(allHooks, hooks...) + } + + return allHooks, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/mofed.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/mofed.go new file mode 100644 index 0000000..c48725e --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/mofed.go @@ -0,0 +1,35 @@ +/** +# Copyright (c) 2022, 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 discover + +import ( + "github.com/sirupsen/logrus" +) + +// NewMOFEDDiscoverer creates a discoverer for MOFED devices. +func NewMOFEDDiscoverer(logger *logrus.Logger, root string) (Discover, error) { + devices := NewCharDeviceDiscoverer( + logger, + []string{ + "/dev/infiniband/uverbs*", + "/dev/infiniband/rdma_cm", + }, + root, + ) + + return devices, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/mounts.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/mounts.go new file mode 100644 index 0000000..e60ecba --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/mounts.go @@ -0,0 +1,128 @@ +/* +# Copyright (c) 2021, 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 discover + +import ( + "fmt" + "path/filepath" + "strings" + "sync" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/sirupsen/logrus" +) + +// mounts is a generic discoverer for Mounts. It is customized by specifying the +// required entities as a list and a Locator that is used to find the target mounts +// based on the entry in the list. +type mounts struct { + None + logger *logrus.Logger + lookup lookup.Locator + root string + required []string + sync.Mutex + cache []Mount +} + +var _ Discover = (*mounts)(nil) + +// NewMounts creates a discoverer for the required mounts using the specified locator. +func NewMounts(logger *logrus.Logger, lookup lookup.Locator, root string, required []string) Discover { + return newMounts(logger, lookup, root, required) +} + +// newMounts creates a discoverer for the required mounts using the specified locator. +func newMounts(logger *logrus.Logger, lookup lookup.Locator, root string, required []string) *mounts { + return &mounts{ + logger: logger, + lookup: lookup, + root: filepath.Join("/", root), + required: required, + } +} + +func (d *mounts) Mounts() ([]Mount, error) { + if d.lookup == nil { + return nil, fmt.Errorf("no lookup defined") + } + + if d.cache != nil { + d.logger.Debugf("returning cached mounts") + return d.cache, nil + } + + d.Lock() + defer d.Unlock() + + uniqueMounts := make(map[string]Mount) + + for _, candidate := range d.required { + d.logger.Debugf("Locating %v", candidate) + located, err := d.lookup.Locate(candidate) + if err != nil { + d.logger.Warnf("Could not locate %v: %v", candidate, err) + continue + } + if len(located) == 0 { + d.logger.Warnf("Missing %v", candidate) + continue + } + d.logger.Debugf("Located %v as %v", candidate, located) + for _, p := range located { + if _, ok := uniqueMounts[p]; ok { + d.logger.Debugf("Skipping duplicate mount %v", p) + continue + } + + r := d.relativeTo(p) + if r == "" { + r = p + } + + d.logger.Infof("Selecting %v as %v", p, r) + uniqueMounts[p] = Mount{ + HostPath: p, + Path: r, + Options: []string{ + "ro", + "nosuid", + "nodev", + "bind", + }, + } + } + } + + var mounts []Mount + for _, m := range uniqueMounts { + mounts = append(mounts, m) + } + + d.cache = mounts + + return d.cache, nil +} + +// relativeTo returns the path relative to the root for the file locator +func (d *mounts) relativeTo(path string) string { + if d.root == "/" { + return path + } + + return strings.TrimPrefix(path, d.root) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/none.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/none.go new file mode 100644 index 0000000..2a1d2c5 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/none.go @@ -0,0 +1,38 @@ +/* +# Copyright (c) 2021, 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 discover + +// None is a null discoverer that returns an empty list of devices and +// mounts. +type None struct{} + +var _ Discover = (*None)(nil) + +// Devices returns an empty list of devices +func (e None) Devices() ([]Device, error) { + return []Device{}, nil +} + +// Mounts returns an empty list of mounts +func (e None) Mounts() ([]Mount, error) { + return []Mount{}, nil +} + +// Hooks returns an empty list of hooks +func (e None) Hooks() ([]Hook, error) { + return []Hook{}, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/symlinks.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/symlinks.go new file mode 100644 index 0000000..b5d344e --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/discover/symlinks.go @@ -0,0 +1,109 @@ +/** +# Copyright (c) 2022, 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 discover + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/sirupsen/logrus" +) + +type symlinks struct { + None + logger *logrus.Logger + nvidiaCTKPath string + csvFiles []string + mountsFrom Discover +} + +// NewCreateSymlinksHook creates a discoverer for a hook that creates required symlinks in the container +func NewCreateSymlinksHook(logger *logrus.Logger, csvFiles []string, mounts Discover, cfg *Config) (Discover, error) { + d := symlinks{ + logger: logger, + nvidiaCTKPath: FindNvidiaCTK(logger, cfg.NvidiaCTKPath), + csvFiles: csvFiles, + mountsFrom: mounts, + } + + return &d, nil +} + +// Hooks returns a hook to create the symlinks from the required CSV files +func (d symlinks) Hooks() ([]Hook, error) { + var args []string + for _, f := range d.csvFiles { + args = append(args, "--csv-filename", f) + } + + links, err := d.getSpecificLinkArgs() + if err != nil { + return nil, fmt.Errorf("failed to determine specific links: %v", err) + } + args = append(args, links...) + + hook := CreateNvidiaCTKHook( + d.nvidiaCTKPath, + "create-symlinks", + args..., + ) + + return []Hook{hook}, nil +} + +// getSpecificLinkArgs returns the required specic links that need to be created +func (d symlinks) getSpecificLinkArgs() ([]string, error) { + mounts, err := d.mountsFrom.Mounts() + if err != nil { + return nil, fmt.Errorf("failed to discover mounts for ldcache update: %v", err) + } + + linkProcessed := make(map[string]bool) + var links []string + for _, m := range mounts { + var target string + var link string + + lib := filepath.Base(m.Path) + + if strings.HasPrefix(lib, "libcuda.so") { + // XXX Many applications wrongly assume that libcuda.so exists (e.g. with dlopen). + target = "libcuda.so.1" + link = "libcuda.so" + } else if strings.HasPrefix(lib, "libGLX_nvidia.so") { + // XXX GLVND requires this symlink for indirect GLX support. + target = lib + link = "libGLX_indirect.so.0" + } else if strings.HasPrefix(lib, "libnvidia-opticalflow.so") { + // XXX Fix missing symlink for libnvidia-opticalflow.so. + target = "libnvidia-opticalflow.so.1" + link = "libnvidia-opticalflow.so" + } else { + continue + } + if linkProcessed[link] { + continue + } + + linkPath := filepath.Join(filepath.Dir(m.Path), link) + links = append(links, "--link", fmt.Sprintf("%v::%v", target, linkPath)) + linkProcessed[link] = true + } + + return links, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/api.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/api.go new file mode 100644 index 0000000..fd63d5a --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/api.go @@ -0,0 +1,64 @@ +/** +# 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 dxcore + +import ( + "github.com/NVIDIA/go-nvml/pkg/dl" +) + +const ( + libraryName = "libdxcore.so" + libraryLoadFlags = dl.RTLD_LAZY | dl.RTLD_GLOBAL +) + +// dxcore stores a reference the dxcore dynamic library +var dxcore *context + +// Init initializes the dxcore dynamic library +func Init() error { + c, err := initContext() + if err != nil { + return err + } + dxcore = c + return nil +} + +// Shutdown closes the dxcore dynamic library +func Shutdown() error { + if dxcore != nil && dxcore.initialized != 0 { + dxcore.deinitContext() + } + return nil +} + +// GetDriverStorePaths returns the list of driver store paths +func GetDriverStorePaths() []string { + var paths []string + selected := make(map[string]bool) + + for i := 0; i < dxcore.getAdapterCount(); i++ { + path := dxcore.getAdapter(i).getDriverStorePath() + if selected[path] { + continue + } + selected[path] = true + paths = append(paths, path) + } + + return paths +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.c b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.c new file mode 100644 index 0000000..0b61143 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.c @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + */ + +#include +#include + +#include "dxcore.h" + +// We define log_write as an empty macro to allow dxcore to remain unchanged. +#define log_write(...) + +// We define the following macros to allow dxcore to remain largely unchanged. +#define log_info(msg) log_write('I', __FILE__, __LINE__, msg) +#define log_warn(msg) log_write('W', __FILE__, __LINE__, msg) +#define log_err(msg) log_write('E', __FILE__, __LINE__, msg) +#define log_infof(fmt, ...) log_write('I', __FILE__, __LINE__, fmt, __VA_ARGS__) +#define log_warnf(fmt, ...) log_write('W', __FILE__, __LINE__, fmt, __VA_ARGS__) +#define log_errf(fmt, ...) log_write('E', __FILE__, __LINE__, fmt, __VA_ARGS__) + + +#define DXCORE_MAX_PATH 260 + +/* + * List of components we expect to find in the driver store that we need to mount + */ +static const char * const dxcore_nvidia_driver_store_components[] = { + "libcuda.so.1.1", /* Core library for cuda support */ + "libcuda_loader.so", /* Core library for cuda support on WSL */ + "libnvidia-ptxjitcompiler.so.1", /* Core library for PTX Jit support */ + "libnvidia-ml.so.1", /* Core library for nvml */ + "libnvidia-ml_loader.so", /* Core library for nvml on WSL */ + "nvidia-smi", /* nvidia-smi binary*/ + "nvcubins.bin", /* Binary containing GPU code for cuda */ +}; + + +/* + * List of functions and structures we need to communicate with libdxcore. + * Documentation on these functions can be found on docs.microsoft.com in d3dkmthk. + */ + +struct dxcore_enumAdapters2; +struct dxcore_queryAdapterInfo; + +typedef int(*pfnDxcoreEnumAdapters2)(struct dxcore_enumAdapters2* pParams); +typedef int(*pfnDxcoreQueryAdapterInfo)(struct dxcore_queryAdapterInfo* pParams); + +struct dxcore_lib { + void* hDxcoreLib; + pfnDxcoreEnumAdapters2 pDxcoreEnumAdapters2; + pfnDxcoreQueryAdapterInfo pDxcoreQueryAdapterInfo; +}; + +struct dxcore_adapterInfo +{ + unsigned int hAdapter; + struct dxcore_luid AdapterLuid; + unsigned int NumOfSources; + unsigned int bPresentMoveRegionsPreferred; +}; + +struct dxcore_enumAdapters2 +{ + unsigned int NumAdapters; + struct dxcore_adapterInfo *pAdapters; +}; + +enum dxcore_kmtqueryAdapterInfoType +{ + DXCORE_QUERYDRIVERVERSION = 13, + DXCORE_QUERYREGISTRY = 48, +}; + +enum dxcore_queryregistry_type { + DXCORE_QUERYREGISTRY_DRIVERSTOREPATH = 2, + DXCORE_QUERYREGISTRY_DRIVERIMAGEPATH = 3, +}; + +enum dxcore_queryregistry_status { + DXCORE_QUERYREGISTRY_STATUS_SUCCESS = 0, + DXCORE_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW = 1, + DXCORE_QUERYREGISTRY_STATUS_FAIL = 2, +}; + +struct dxcore_queryregistry_info { + enum dxcore_queryregistry_type QueryType; + unsigned int QueryFlags; + wchar_t ValueName[DXCORE_MAX_PATH]; + unsigned int ValueType; + unsigned int PhysicalAdapterIndex; + unsigned int OutputValueSize; + enum dxcore_queryregistry_status Status; + union { + unsigned long long OutputQword; + wchar_t Output; + }; +}; + +struct dxcore_queryAdapterInfo +{ + unsigned int hAdapter; + enum dxcore_kmtqueryAdapterInfoType Type; + void *pPrivateDriverData; + unsigned int PrivateDriverDataSize; +}; + +static int dxcore_query_adapter_info_helper(struct dxcore_lib* pLib, + unsigned int hAdapter, + enum dxcore_kmtqueryAdapterInfoType type, + void* pPrivateDriverDate, + unsigned int privateDriverDataSize) +{ + struct dxcore_queryAdapterInfo queryAdapterInfo = { 0 }; + + queryAdapterInfo.hAdapter = hAdapter; + queryAdapterInfo.Type = type; + queryAdapterInfo.pPrivateDriverData = pPrivateDriverDate; + queryAdapterInfo.PrivateDriverDataSize = privateDriverDataSize; + + return pLib->pDxcoreQueryAdapterInfo(&queryAdapterInfo); +} + +static int dxcore_query_adapter_wddm_version(struct dxcore_lib* pLib, unsigned int hAdapter, unsigned int* version) +{ + return dxcore_query_adapter_info_helper(pLib, + hAdapter, + DXCORE_QUERYDRIVERVERSION, + (void*)version, + sizeof(*version)); +} + +static int dxcore_query_adapter_driverstore(struct dxcore_lib* pLib, unsigned int hAdapter, char** ppDriverStorePath) +{ + struct dxcore_queryregistry_info params = {0}; + struct dxcore_queryregistry_info* pValue = NULL; + wchar_t* pOutput; + size_t outputSizeInBytes; + size_t outputSize; + + params.QueryType = DXCORE_QUERYREGISTRY_DRIVERSTOREPATH; + + if (dxcore_query_adapter_info_helper(pLib, + hAdapter, + DXCORE_QUERYREGISTRY, + (void*)¶ms, + sizeof(params))) + { + log_err("Failed to query driver store path size for the WDDM Adapter"); + return (-1); + } + + if (params.OutputValueSize > DXCORE_MAX_PATH * sizeof(wchar_t)) { + log_err("The driver store path size returned by dxcore is not valid"); + return (-1); + } + + outputSizeInBytes = (size_t)params.OutputValueSize; + outputSize = outputSizeInBytes / sizeof(wchar_t); + + pValue = calloc(sizeof(struct dxcore_queryregistry_info) + outputSizeInBytes + sizeof(wchar_t), 1); + if (!pValue) { + log_err("Out of memory while allocating temp buffer to query adapter info"); + return (-1); + } + + pValue->QueryType = DXCORE_QUERYREGISTRY_DRIVERSTOREPATH; + pValue->OutputValueSize = (unsigned int)outputSizeInBytes; + + if (dxcore_query_adapter_info_helper(pLib, + hAdapter, + DXCORE_QUERYREGISTRY, + (void*)pValue, + (unsigned int)(sizeof(struct dxcore_queryregistry_info) + outputSizeInBytes))) + { + log_err("Failed to query driver store path data for the WDDM Adapter"); + free(pValue); + return (-1); + } + pOutput = (wchar_t*)(&pValue->Output); + + // Make sure no matter what happened the wchar_t string is null terminated + pOutput[outputSize] = L'\0'; + + // Convert the output into a regular c string + *ppDriverStorePath = (char*)calloc(outputSize + 1, sizeof(char)); + if (!*ppDriverStorePath) { + log_err("Out of memory while allocating the buffer for the driver store path"); + free(pValue); + return (-1); + } + wcstombs(*ppDriverStorePath, pOutput, outputSize); + + free(pValue); + + return 0; +} + +static void dxcore_add_adapter(struct dxcore_context* pCtx, struct dxcore_lib* pLib, struct dxcore_adapterInfo *pAdapterInfo) +{ + unsigned int wddmVersion = 0; + char* driverStorePath = NULL; + + log_infof("Creating a new WDDM Adapter for hAdapter:%x luid:%llx", pAdapterInfo->hAdapter, *((unsigned long long*)&pAdapterInfo->AdapterLuid)); + + if (dxcore_query_adapter_wddm_version(pLib, pAdapterInfo->hAdapter, &wddmVersion)) { + log_err("Failed to query the WDDM version for the specified adapter. Skipping it."); + return; + } + + if (wddmVersion < 2700) { + log_err("Found a WDDM adapter running a driver with pre-WDDM 2.7 . Skipping it."); + return; + } + + if (dxcore_query_adapter_driverstore(pLib, pAdapterInfo->hAdapter, &driverStorePath)) { + log_err("Failed to query driver store path for the WDDM Adapter . Skipping it."); + return; + } + + // We got all the info we needed. Adding it to the tracking structure. + { + struct dxcore_adapter* newList; + newList = realloc(pCtx->adapterList, sizeof(struct dxcore_adapter) * (pCtx->adapterCount + 1)); + if (!newList) { + log_err("Out of memory when trying to add a new WDDM Adapter to the list of valid adapters"); + free(driverStorePath); + return; + } + + pCtx->adapterList = newList; + + pCtx->adapterList[pCtx->adapterCount].hAdapter = pAdapterInfo->hAdapter; + pCtx->adapterList[pCtx->adapterCount].pDriverStorePath = driverStorePath; + pCtx->adapterList[pCtx->adapterCount].wddmVersion = wddmVersion; + pCtx->adapterCount++; + } + + log_infof("Adding new adapter via dxcore hAdapter:%x luid:%llx wddm version:%d", pAdapterInfo->hAdapter, *((unsigned long long*)&pAdapterInfo->AdapterLuid), wddmVersion); +} + +static void dxcore_enum_adapters(struct dxcore_context* pCtx, struct dxcore_lib* pLib) +{ + struct dxcore_enumAdapters2 params = {0}; + unsigned int adapterIndex = 0; + + params.NumAdapters = 0; + params.pAdapters = NULL; + + if (pLib->pDxcoreEnumAdapters2(¶ms)) { + log_err("Failed to enumerate adapters via dxcore"); + return; + } + + params.pAdapters = malloc(sizeof(struct dxcore_adapterInfo) * params.NumAdapters); + if (pLib->pDxcoreEnumAdapters2(¶ms)) { + free(params.pAdapters); + log_err("Failed to enumerate adapters via dxcore"); + return; + } + + for (adapterIndex = 0; adapterIndex < params.NumAdapters; adapterIndex++) { + dxcore_add_adapter(pCtx, pLib, ¶ms.pAdapters[adapterIndex]); + } + + free(params.pAdapters); +} + +int dxcore_init_context(struct dxcore_context* pCtx) +{ + struct dxcore_lib lib = {0}; + + pCtx->initialized = 0; + pCtx->adapterCount = 0; + pCtx->adapterList = NULL; + + lib.hDxcoreLib = dlopen("libdxcore.so", RTLD_LAZY); + if (!lib.hDxcoreLib) { + goto error; + } + + lib.pDxcoreEnumAdapters2 = (pfnDxcoreEnumAdapters2)dlsym(lib.hDxcoreLib, "D3DKMTEnumAdapters2"); + if (!lib.pDxcoreEnumAdapters2) { + log_err("dxcore library is present but the symbol D3DKMTEnumAdapters2 is missing"); + goto error; + } + + lib.pDxcoreQueryAdapterInfo = (pfnDxcoreQueryAdapterInfo)dlsym(lib.hDxcoreLib, "D3DKMTQueryAdapterInfo"); + if (!lib.pDxcoreQueryAdapterInfo) { + log_err("dxcore library is present but the symbol D3DKMTQueryAdapterInfo is missing"); + goto error; + } + + dxcore_enum_adapters(pCtx, &lib); + + log_info("dxcore layer initialized successfully"); + pCtx->initialized = 1; + + dlclose(lib.hDxcoreLib); + + return 0; + +error: + dxcore_deinit_context(pCtx); + + if (lib.hDxcoreLib) + dlclose(lib.hDxcoreLib); + + return (-1); +} + +static void dxcore_deinit_adapter(struct dxcore_adapter* pAdapter) +{ + if (!pAdapter) + return; + + free(pAdapter->pDriverStorePath); +} + +void dxcore_deinit_context(struct dxcore_context* pCtx) +{ + unsigned int adapterIndex = 0; + + if (!pCtx) + return; + + for (adapterIndex = 0; adapterIndex < pCtx->adapterCount; adapterIndex++) { + dxcore_deinit_adapter(&pCtx->adapterList[adapterIndex]); + } + + free(pCtx->adapterList); + + pCtx->initialized = 0; +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.go new file mode 100644 index 0000000..76cc53f --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.go @@ -0,0 +1,59 @@ +/** +# 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 dxcore + +/* +#cgo LDFLAGS: -Wl,--unresolved-symbols=ignore-in-object-files +#include +*/ +import "C" +import ( + "fmt" + "unsafe" +) + +type context C.struct_dxcore_context +type adapter C.struct_dxcore_adapter + +// initContext initializes the dxcore context and populates the list of adapters. +func initContext() (*context, error) { + cContext := C.struct_dxcore_context{} + if C.dxcore_init_context(&cContext) != 0 { + return nil, fmt.Errorf("failed to initialize dxcore context") + } + c := (*context)(&cContext) + return c, nil +} + +// deinitContext deinitializes the dxcore context and frees the list of adapters. +func (c context) deinitContext() { + cContext := C.struct_dxcore_context(c) + C.dxcore_deinit_context(&cContext) +} + +func (c context) getAdapterCount() int { + return int(c.adapterCount) +} + +func (c context) getAdapter(index int) adapter { + arrayPointer := (*[1 << 30]C.struct_dxcore_adapter)(unsafe.Pointer(c.adapterList)) + return adapter(arrayPointer[index]) +} + +func (a adapter) getDriverStorePath() string { + return C.GoString(a.pDriverStorePath) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.h b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.h new file mode 100644 index 0000000..9c044fe --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore/dxcore.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + */ + +#ifndef HEADER_DXCORE_H_ +#define HEADER_DXCORE_H_ + +#define MAX_DXCORE_DRIVERSTORE_LIBRAIRIES (16) + +struct dxcore_luid +{ + unsigned int lowPart; + int highPart; +}; + +struct dxcore_adapter +{ + unsigned int hAdapter; + unsigned int wddmVersion; + char* pDriverStorePath; + unsigned int driverStoreComponentCount; + const char* pDriverStoreComponents[MAX_DXCORE_DRIVERSTORE_LIBRAIRIES]; + struct dxcore_context *pContext; +}; + +struct dxcore_context +{ + unsigned int adapterCount; + struct dxcore_adapter *adapterList; + + int initialized; +}; + + + +int dxcore_init_context(struct dxcore_context* pDxcore_context); +void dxcore_deinit_context(struct dxcore_context* pDxcore_context); + +#endif // HEADER_DXCORE_H_ diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/device.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/device.go new file mode 100644 index 0000000..72e6b06 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/device.go @@ -0,0 +1,60 @@ +/** +# Copyright (c) 2022, 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 edits + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type device discover.Device + +// toEdits converts a discovered device to CDI Container Edits. +func (d device) toEdits() (*cdi.ContainerEdits, error) { + deviceNode, err := d.toSpec() + if err != nil { + return nil, err + } + + e := cdi.ContainerEdits{ + ContainerEdits: &specs.ContainerEdits{ + DeviceNodes: []*specs.DeviceNode{deviceNode}, + }, + } + return &e, nil +} + +// toSpec converts a discovered Device to a CDI Spec Device. Note +// that missing info is filled in when edits are applied by querying the Device node. +func (d device) toSpec() (*specs.DeviceNode, error) { + // The HostPath field was added in the v0.5.0 CDI specification. + // The cdi package uses strict unmarshalling when loading specs from file causing failures for + // unexpected fields. + // Since the behaviour for HostPath == "" and HostPath == Path are equivalent, we clear HostPath + // if it is equal to Path to ensure compatibility with the widest range of specs. + hostPath := d.HostPath + if hostPath == d.Path { + hostPath = "" + } + s := specs.DeviceNode{ + HostPath: hostPath, + Path: d.Path, + } + + return &s, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/edits.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/edits.go new file mode 100644 index 0000000..425e01a --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/edits.go @@ -0,0 +1,115 @@ +/** +# Copyright (c) 2022, 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 edits + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/oci" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + ociSpecs "github.com/opencontainers/runtime-spec/specs-go" + "github.com/sirupsen/logrus" +) + +type edits struct { + cdi.ContainerEdits + logger *logrus.Logger +} + +// NewSpecEdits creates a SpecModifier that defines the required OCI spec edits (as CDI ContainerEdits) from the specified +// discoverer. +func NewSpecEdits(logger *logrus.Logger, d discover.Discover) (oci.SpecModifier, error) { + c, err := FromDiscoverer(d) + if err != nil { + return nil, fmt.Errorf("error constructing container edits: %v", err) + } + e := edits{ + ContainerEdits: *c, + logger: logger, + } + + return &e, nil +} + +// FromDiscoverer creates CDI container edits for the specified discoverer. +func FromDiscoverer(d discover.Discover) (*cdi.ContainerEdits, error) { + devices, err := d.Devices() + if err != nil { + return nil, fmt.Errorf("failed to discover devices: %v", err) + } + + mounts, err := d.Mounts() + if err != nil { + return nil, fmt.Errorf("failed to discover mounts: %v", err) + } + + hooks, err := d.Hooks() + if err != nil { + return nil, fmt.Errorf("failed to discover hooks: %v", err) + } + + c := NewContainerEdits() + for _, d := range devices { + edits, err := device(d).toEdits() + if err != nil { + return nil, fmt.Errorf("failed to created container edits for device: %v", err) + } + c.Append(edits) + } + + for _, m := range mounts { + c.Append(mount(m).toEdits()) + } + + for _, h := range hooks { + c.Append(hook(h).toEdits()) + } + + return c, nil +} + +// NewContainerEdits is a utility function to create a CDI ContainerEdits struct. +func NewContainerEdits() *cdi.ContainerEdits { + c := cdi.ContainerEdits{ + ContainerEdits: &specs.ContainerEdits{}, + } + return &c +} + +// Modify applies the defined edits to the incoming OCI spec +func (e *edits) Modify(spec *ociSpecs.Spec) error { + if e == nil || e.ContainerEdits.ContainerEdits == nil { + return nil + } + + e.logger.Info("Mounts:") + for _, mount := range e.Mounts { + e.logger.Infof("Mounting %v at %v", mount.HostPath, mount.ContainerPath) + } + e.logger.Infof("Devices:") + for _, device := range e.DeviceNodes { + e.logger.Infof("Injecting %v", device.Path) + } + e.logger.Infof("Hooks:") + for _, hook := range e.Hooks { + e.logger.Infof("Injecting %v %v", hook.Path, hook.Args) + } + + return e.Apply(spec) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/hook.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/hook.go new file mode 100644 index 0000000..a0e56a8 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/hook.go @@ -0,0 +1,47 @@ +/** +# Copyright (c) 2022, 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 edits + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type hook discover.Hook + +// toEdits converts a discovered hook to CDI Container Edits. +func (d hook) toEdits() *cdi.ContainerEdits { + e := cdi.ContainerEdits{ + ContainerEdits: &specs.ContainerEdits{ + Hooks: []*specs.Hook{d.toSpec()}, + }, + } + return &e +} + +// toSpec converts a discovered Hook to a CDI Spec Hook. Note +// that missing info is filled in when edits are applied by querying the Hook node. +func (d hook) toSpec() *specs.Hook { + s := specs.Hook{ + HookName: d.Lifecycle, + Path: d.Path, + Args: d.Args, + } + + return &s +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/mount.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/mount.go new file mode 100644 index 0000000..a5c4558 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/edits/mount.go @@ -0,0 +1,47 @@ +/** +# Copyright (c) 2022, 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 edits + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type mount discover.Mount + +// toEdits converts a discovered mount to CDI Container Edits. +func (d mount) toEdits() *cdi.ContainerEdits { + e := cdi.ContainerEdits{ + ContainerEdits: &specs.ContainerEdits{ + Mounts: []*specs.Mount{d.toSpec()}, + }, + } + return &e +} + +// toSpec converts a discovered Mount to a CDI Spec Mount. Note +// that missing info is filled in when edits are applied by querying the Mount node. +func (d mount) toSpec() *specs.Mount { + s := specs.Mount{ + HostPath: d.HostPath, + ContainerPath: d.Path, + Options: d.Options, + } + + return &s +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/info/drm/drm_devices.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/info/drm/drm_devices.go new file mode 100644 index 0000000..3b8204b --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/info/drm/drm_devices.go @@ -0,0 +1,39 @@ +/** +# Copyright (c) 2022, 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 drm + +import ( + "fmt" + "path/filepath" +) + +// GetDeviceNodesByBusID returns the DRM devices associated with the specified PCI bus ID +func GetDeviceNodesByBusID(busID string) ([]string, error) { + drmRoot := filepath.Join("/sys/bus/pci/devices", busID, "drm") + matches, err := filepath.Glob(fmt.Sprintf("%s/*", drmRoot)) + if err != nil { + return nil, err + } + + var drmDeviceNodes []string + for _, m := range matches { + drmDeviceNode := filepath.Join("/dev/dri", filepath.Base(m)) + drmDeviceNodes = append(drmDeviceNodes, drmDeviceNode) + } + + return drmDeviceNodes, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/info/proc/information_files.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/info/proc/information_files.go new file mode 100644 index 0000000..dde7741 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/info/proc/information_files.go @@ -0,0 +1,89 @@ +/** +# Copyright (c) 2022, 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 proc + +import ( + "bufio" + "fmt" + "io" + "os" + "path/filepath" + "strings" +) + +// GPUInfoField represents the field name for information specified in a GPU's information file +type GPUInfoField string + +// The following constants define the fields of interest from the GPU information file +const ( + GPUInfoModel = GPUInfoField("Model") + GPUInfoGPUUUID = GPUInfoField("GPU UUID") + GPUInfoBusLocation = GPUInfoField("Bus Location") + GPUInfoDeviceMinor = GPUInfoField("Device Minor") +) + +// GPUInfo stores the information for a GPU as determined from its associated information file +type GPUInfo map[GPUInfoField]string + +// GetInformationFilePaths returns the list of information files associated with NVIDIA GPUs. +func GetInformationFilePaths(root string) ([]string, error) { + return filepath.Glob(filepath.Join(root, "/proc/driver/nvidia/gpus/*/information")) +} + +// ParseGPUInformationFile parses the specified GPU information file and constructs a GPUInfo structure +func ParseGPUInformationFile(path string) (GPUInfo, error) { + infoFile, err := os.Open(path) + if err != nil { + return nil, fmt.Errorf("failed to open %v: %v", path, err) + } + defer infoFile.Close() + + return gpuInfoFrom(infoFile), nil +} + +// gpuInfoFrom parses a GPUInfo struct from the specified reader +// An information file has the following strucutre: +// $ cat /proc/driver/nvidia/gpus/0000\:06\:00.0/information +// Model: Tesla V100-SXM2-16GB +// IRQ: 408 +// GPU UUID: GPU-edfee158-11c1-52b8-0517-92f30e7fac88 +// Video BIOS: 88.00.41.00.01 +// Bus Type: PCIe +// DMA Size: 47 bits +// DMA Mask: 0x7fffffffffff +// Bus Location: 0000:06:00.0 +// Device Minor: 0 +// GPU Excluded: No +func gpuInfoFrom(reader io.Reader) GPUInfo { + info := make(GPUInfo) + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + line := scanner.Text() + + parts := strings.SplitN(line, ":", 2) + if len(parts) != 2 { + continue + } + + field := GPUInfoField(parts[0]) + value := strings.TrimSpace(parts[1]) + + info[field] = value + } + + return info +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/ldcache/ldcache.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/ldcache/ldcache.go new file mode 100644 index 0000000..5493dc3 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/ldcache/ldcache.go @@ -0,0 +1,322 @@ +/* +# Copyright (c) 2021-2022, 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. +*/ + +// Adapted from https://github.com/rai-project/ldcache + +package ldcache + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "syscall" + "unsafe" + + log "github.com/sirupsen/logrus" +) + +const ldcachePath = "/etc/ld.so.cache" + +const ( + magicString1 = "ld.so-1.7.0" + magicString2 = "glibc-ld.so.cache" + magicVersion = "1.1" +) + +const ( + flagTypeMask = 0x00ff + flagTypeELF = 0x0001 + + flagArchMask = 0xff00 + flagArchI386 = 0x0000 + flagArchX8664 = 0x0300 + flagArchX32 = 0x0800 + flagArchPpc64le = 0x0500 +) + +var errInvalidCache = errors.New("invalid ld.so.cache file") + +type header1 struct { + Magic [len(magicString1) + 1]byte // include null delimiter + NLibs uint32 +} + +type entry1 struct { + Flags int32 + Key, Value uint32 +} + +type header2 struct { + Magic [len(magicString2)]byte + Version [len(magicVersion)]byte + NLibs uint32 + TableSize uint32 + _ [3]uint32 // unused + _ uint64 // force 8 byte alignment +} + +type entry2 struct { + Flags int32 + Key, Value uint32 + OSVersion uint32 + HWCap uint64 +} + +// LDCache represents the interface for performing lookups into the LDCache +type LDCache interface { + List() ([]string, []string) + Lookup(...string) ([]string, []string) +} + +type ldcache struct { + *bytes.Reader + + data, libs []byte + header header2 + entries []entry2 + + root string + logger *log.Logger +} + +// New creates a new LDCache with the specified logger and root. +func New(logger *log.Logger, root string) (LDCache, error) { + path := filepath.Join(root, ldcachePath) + + logger.Debugf("Opening ld.conf at %v", path) + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + return nil, err + } + d, err := syscall.Mmap(int(f.Fd()), 0, int(fi.Size()), + syscall.PROT_READ, syscall.MAP_PRIVATE) + if err != nil { + return nil, err + } + + cache := &ldcache{ + data: d, + Reader: bytes.NewReader(d), + root: root, + logger: logger, + } + return cache, cache.parse() +} + +func (c *ldcache) Close() error { + return syscall.Munmap(c.data) +} + +func (c *ldcache) Magic() string { + return string(c.header.Magic[:]) +} + +func (c *ldcache) Version() string { + return string(c.header.Version[:]) +} + +func strn(b []byte, n int) string { + return string(b[:n]) +} + +func (c *ldcache) parse() error { + var header header1 + + // Check for the old format (< glibc-2.2) + if c.Len() <= int(unsafe.Sizeof(header)) { + return errInvalidCache + } + if strn(c.data, len(magicString1)) == magicString1 { + if err := binary.Read(c, binary.LittleEndian, &header); err != nil { + return err + } + n := int64(header.NLibs) * int64(unsafe.Sizeof(entry1{})) + offset, err := c.Seek(n, 1) // skip old entries + if err != nil { + return err + } + n = (-offset) & int64(unsafe.Alignof(c.header)-1) + _, err = c.Seek(n, 1) // skip padding + if err != nil { + return err + } + } + + c.libs = c.data[c.Size()-int64(c.Len()):] // kv offsets start here + if err := binary.Read(c, binary.LittleEndian, &c.header); err != nil { + return err + } + if c.Magic() != magicString2 || c.Version() != magicVersion { + return errInvalidCache + } + c.entries = make([]entry2, c.header.NLibs) + if err := binary.Read(c, binary.LittleEndian, &c.entries); err != nil { + return err + } + return nil +} + +type entry struct { + libname string + bits int + value string +} + +// getEntries returns the entires of the ldcache in a go-friendly struct. +func (c *ldcache) getEntries(selected func(string) bool) []entry { + var entries []entry + for _, e := range c.entries { + bits := 0 + if ((e.Flags & flagTypeMask) & flagTypeELF) == 0 { + continue + } + switch e.Flags & flagArchMask { + case flagArchX8664: + fallthrough + case flagArchPpc64le: + bits = 64 + case flagArchX32: + fallthrough + case flagArchI386: + bits = 32 + default: + continue + } + if e.Key > uint32(len(c.libs)) || e.Value > uint32(len(c.libs)) { + continue + } + lib := bytesToString(c.libs[e.Key:]) + if lib == "" { + c.logger.Debugf("Skipping invalid lib") + continue + } + if !selected(lib) { + continue + } + value := bytesToString(c.libs[e.Value:]) + if value == "" { + c.logger.Debugf("Skipping invalid value for lib %v", lib) + continue + } + e := entry{ + libname: lib, + bits: bits, + value: value, + } + + entries = append(entries, e) + } + + return entries +} + +// List creates a list of libraires in the ldcache. +// The 32-bit and 64-bit libraries are returned separately. +func (c *ldcache) List() ([]string, []string) { + all := func(s string) bool { return true } + + return c.resolveSelected(all) +} + +// Lookup searches the ldcache for the specified prefixes. +// The 32-bit and 64-bit libraries matching the prefixes are returned. +func (c *ldcache) Lookup(libPrefixes ...string) ([]string, []string) { + c.logger.Debugf("Looking up %v in cache", libPrefixes) + + // We define a functor to check whether a given library name matches any of the prefixes + matchesAnyPrefix := func(s string) bool { + for _, p := range libPrefixes { + if strings.HasPrefix(s, p) { + return true + } + } + return false + } + + return c.resolveSelected(matchesAnyPrefix) +} + +// resolveSelected process the entries in the LDCach based on the supplied filter and returns the resolved paths. +// The paths are separated by bittage. +func (c *ldcache) resolveSelected(selected func(string) bool) ([]string, []string) { + paths := make(map[int][]string) + processed := make(map[string]bool) + + for _, e := range c.getEntries(selected) { + path, err := c.resolve(e.value) + if err != nil { + c.logger.Debugf("Could not resolve entry: %v", err) + continue + } + if processed[path] { + continue + } + paths[e.bits] = append(paths[e.bits], path) + processed[path] = true + } + + return paths[32], paths[64] +} + +// resolve resolves the specified ldcache entry based on the value being processed. +// The input is the name of the entry in the cache. +func (c *ldcache) resolve(target string) (string, error) { + name := filepath.Join(c.root, target) + + c.logger.Debugf("checking %v", string(name)) + + info, err := os.Lstat(name) + if err != nil { + return "", fmt.Errorf("failed to get file info: %v", info) + } + if info.Mode()&os.ModeSymlink == 0 { + c.logger.Debugf("Resolved regular file: %v", name) + return name, nil + } + + link, err := os.Readlink(name) + if err != nil { + return "", fmt.Errorf("failed to resolve symlink: %v", err) + } + + // We return absolute paths for all targets + if !filepath.IsAbs(link) || strings.HasPrefix(link, ".") { + link = filepath.Join(filepath.Dir(target), link) + } + + return c.resolve(link) +} + +// bytesToString converts a byte slice to a string. +// This assumes that the byte slice is null-terminated +func bytesToString(value []byte) string { + n := bytes.IndexByte(value, 0) + if n < 0 { + return "" + } + + return strn(value, n) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda/cuda.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda/cuda.go new file mode 100644 index 0000000..35688ee --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda/cuda.go @@ -0,0 +1,104 @@ +/** +# 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 cuda + +import ( + "path/filepath" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/sirupsen/logrus" +) + +type cudaLocator struct { + logger *logrus.Logger + driverRoot string +} + +// Options is a function that configures a cudaLocator. +type Options func(*cudaLocator) + +// WithLogger is an option that configures the logger used by the locator. +func WithLogger(logger *logrus.Logger) Options { + return func(c *cudaLocator) { + c.logger = logger + } +} + +// WithDriverRoot is an option that configures the driver root used by the locator. +func WithDriverRoot(driverRoot string) Options { + return func(c *cudaLocator) { + c.driverRoot = driverRoot + } +} + +// New creates a new CUDA library locator. +func New(opts ...Options) lookup.Locator { + c := &cudaLocator{} + for _, opt := range opts { + opt(c) + } + + if c.logger == nil { + c.logger = logrus.StandardLogger() + } + if c.driverRoot == "" { + c.driverRoot = "/" + } + + return c +} + +// Locate returns the path to the libcuda.so.RMVERSION file. +// libcuda.so is prefixed to the specified pattern. +func (l *cudaLocator) Locate(pattern string) ([]string, error) { + ldcacheLocator, err := lookup.NewLibraryLocator( + l.logger, + l.driverRoot, + ) + if err != nil { + l.logger.Debugf("Failed to create LDCache locator: %v", err) + } + + fullPattern := "libcuda.so" + pattern + + candidates, err := ldcacheLocator.Locate("libcuda.so") + if err == nil { + for _, c := range candidates { + if match, err := filepath.Match(fullPattern, filepath.Base(c)); err != nil || !match { + l.logger.Debugf("Skipping non-matching candidate %v: %v", c, err) + continue + } + return []string{c}, nil + } + } + l.logger.Debugf("Could not locate %q in LDCache: Checking predefined library paths.", pattern) + + pathLocator := lookup.NewFileLocator( + lookup.WithLogger(l.logger), + lookup.WithRoot(l.driverRoot), + lookup.WithSearchPaths( + "/usr/lib64", + "/usr/lib/x86_64-linux-gnu", + "/usr/lib/aarch64-linux-gnu", + "/usr/lib/x86_64-linux-gnu/nvidia/current", + "/usr/lib/aarch64-linux-gnu/nvidia/current", + ), + lookup.WithCount(1), + ) + + return pathLocator.Locate(fullPattern) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/device.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/device.go new file mode 100644 index 0000000..8ec6c4c --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/device.go @@ -0,0 +1,50 @@ +/** +# Copyright (c) 2021, 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 lookup + +import ( + "fmt" + "os" +) + +const ( + devRoot = "/dev" +) + +// NewCharDeviceLocator creates a Locator that can be used to find char devices at the specified root. A logger is +// also specified. +func NewCharDeviceLocator(opts ...Option) Locator { + opts = append(opts, + WithSearchPaths("", devRoot), + WithFilter(assertCharDevice), + ) + return NewFileLocator( + opts..., + ) +} + +// assertCharDevice checks whether the specified path is a char device and returns an error if this is not the case. +func assertCharDevice(filename string) error { + info, err := os.Lstat(filename) + if err != nil { + return fmt.Errorf("error getting info: %v", err) + } + if info.Mode()&os.ModeCharDevice == 0 { + return fmt.Errorf("%v is not a char device", filename) + } + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/dir.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/dir.go new file mode 100644 index 0000000..87b3250 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/dir.go @@ -0,0 +1,48 @@ +/* +# Copyright (c) 2021, 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 lookup + +import ( + "fmt" + "os" + + log "github.com/sirupsen/logrus" +) + +// NewDirectoryLocator creates a Locator that can be used to find directories at the specified root. A logger +// is also specified. +func NewDirectoryLocator(logger *log.Logger, root string) Locator { + return NewFileLocator( + WithLogger(logger), + WithRoot(root), + WithFilter(assertDirectory), + ) +} + +// assertDirectory checks wither the specified path is a directory. +func assertDirectory(filename string) error { + info, err := os.Stat(filename) + if err != nil { + return fmt.Errorf("error getting info for %v: %v", filename, err) + } + + if !info.IsDir() { + return fmt.Errorf("specified path '%v' is not a directory", filename) + } + + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/executable.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/executable.go new file mode 100644 index 0000000..08316ed --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/executable.go @@ -0,0 +1,87 @@ +/* +# Copyright (c) 2021, 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 lookup + +import ( + "fmt" + "os" + "strings" + + log "github.com/sirupsen/logrus" +) + +type executable struct { + file +} + +// NewExecutableLocator creates a locator to fine executable files in the path. A logger can also be specified. +func NewExecutableLocator(logger *log.Logger, root string) Locator { + paths := GetPaths(root) + + return newExecutableLocator(logger, root, paths...) +} + +func newExecutableLocator(logger *log.Logger, root string, paths ...string) *executable { + f := newFileLocator( + WithLogger(logger), + WithRoot(root), + WithSearchPaths(paths...), + WithFilter(assertExecutable), + WithCount(1), + ) + + l := executable{ + file: *f, + } + + return &l +} + +var _ Locator = (*executable)(nil) + +// Locate finds executable files with the specified pattern in the path. +// If a relative or absolute path is specified, the prefix paths are not considered. +func (p executable) Locate(pattern string) ([]string, error) { + // For absolute paths we ensure that it is executable + if strings.Contains(pattern, "/") { + err := assertExecutable(pattern) + if err != nil { + return nil, fmt.Errorf("absolute path %v is not an executable file: %v", pattern, err) + } + return []string{pattern}, nil + } + + return p.file.Locate(pattern) +} + +// assertExecutable checks whether the specified path is an execuable file. +func assertExecutable(filename string) error { + err := assertFile(filename) + if err != nil { + return err + } + info, err := os.Stat(filename) + if err != nil { + return err + } + + if info.Mode()&0111 == 0 { + return fmt.Errorf("specified file '%v' is not executable", filename) + } + + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/file.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/file.go new file mode 100644 index 0000000..c382c46 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/file.go @@ -0,0 +1,188 @@ +/* +# Copyright (c) 2021, 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 lookup + +import ( + "fmt" + "os" + "path/filepath" + + log "github.com/sirupsen/logrus" +) + +// file can be used to locate file (or file-like elements) at a specified set of +// prefixes. The validity of a file is determined by a filter function. +type file struct { + logger *log.Logger + root string + prefixes []string + filter func(string) error + count int + isOptional bool +} + +// Option defines a function for passing options to the NewFileLocator() call +type Option func(*file) + +// WithRoot sets the root for the file locator +func WithRoot(root string) Option { + return func(f *file) { + f.root = root + } +} + +// WithLogger sets the logger for the file locator +func WithLogger(logger *log.Logger) Option { + return func(f *file) { + f.logger = logger + } +} + +// WithSearchPaths sets the search paths for the file locator. +func WithSearchPaths(paths ...string) Option { + return func(f *file) { + f.prefixes = paths + } +} + +// WithFilter sets the filter for the file locator +// The filter is called for each candidate file and candidates that return nil are considered. +func WithFilter(assert func(string) error) Option { + return func(f *file) { + f.filter = assert + } +} + +// WithCount sets the maximum number of candidates to discover +func WithCount(count int) Option { + return func(f *file) { + f.count = count + } +} + +// WithOptional sets the optional flag for the file locator +// If the optional flag is set, the locator will not return an error if the file is not found. +func WithOptional(optional bool) Option { + return func(f *file) { + f.isOptional = optional + } +} + +// NewFileLocator creates a Locator that can be used to find files with the specified options. +func NewFileLocator(opts ...Option) Locator { + return newFileLocator(opts...) +} + +func newFileLocator(opts ...Option) *file { + f := &file{} + for _, opt := range opts { + opt(f) + } + if f.logger == nil { + f.logger = log.StandardLogger() + } + if f.filter == nil { + f.filter = assertFile + } + // Since the `Locate` implementations rely on the root already being specified we update + // the prefixes to include the root. + f.prefixes = getSearchPrefixes(f.root, f.prefixes...) + + return f +} + +// getSearchPrefixes generates a list of unique paths to be searched by a file locator. +// +// For each of the unique prefixes

specified, the path

is searched, where is the +// specified root. If no prefixes are specified, is returned as the only search prefix. +// +// Note that an empty root is equivalent to searching relative to the current working directory, and +// if the root filesystem should be searched instead, root should be specified as "/" explicitly. +// +// Also, a prefix of "" forces the root to be included in returned set of paths. This means that if +// the root in addition to another prefix must be searched the function should be called with: +// +// getSearchPrefixes("/root", "", "another/path") +// +// and will result in the search paths []{"/root", "/root/another/path"} being returned. +func getSearchPrefixes(root string, prefixes ...string) []string { + seen := make(map[string]bool) + var uniquePrefixes []string + for _, p := range prefixes { + if seen[p] { + continue + } + seen[p] = true + uniquePrefixes = append(uniquePrefixes, filepath.Join(root, p)) + } + + if len(uniquePrefixes) == 0 { + uniquePrefixes = append(uniquePrefixes, root) + } + + return uniquePrefixes +} + +var _ Locator = (*file)(nil) + +// Locate attempts to find files with names matching the specified pattern. +// All prefixes are searched and any matching candidates are returned. If no matches are found, an error is returned. +func (p file) Locate(pattern string) ([]string, error) { + var filenames []string + +visit: + for _, prefix := range p.prefixes { + pathPattern := filepath.Join(prefix, pattern) + candidates, err := filepath.Glob(pathPattern) + if err != nil { + p.logger.Debugf("Checking pattern '%v' failed: %v", pathPattern, err) + } + + for _, candidate := range candidates { + p.logger.Debugf("Checking candidate '%v'", candidate) + err := p.filter(candidate) + if err != nil { + p.logger.Debugf("Candidate '%v' does not meet requirements: %v", candidate, err) + continue + } + filenames = append(filenames, candidate) + if p.count > 0 && len(filenames) == p.count { + p.logger.Debugf("Found %d candidates; ignoring further candidates", len(filenames)) + break visit + } + } + } + + if !p.isOptional && len(filenames) == 0 { + return nil, fmt.Errorf("pattern %v not found", pattern) + } + return filenames, nil +} + +// assertFile checks whether the specified path is a regular file +func assertFile(filename string) error { + info, err := os.Stat(filename) + if err != nil { + return fmt.Errorf("error getting info for %v: %v", filename, err) + } + + if info.IsDir() { + return fmt.Errorf("specified path '%v' is a directory", filename) + } + + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/library.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/library.go new file mode 100644 index 0000000..225b9f5 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/library.go @@ -0,0 +1,69 @@ +/* +# Copyright (c) 2021, 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 lookup + +import ( + "fmt" + "strings" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/ldcache" + log "github.com/sirupsen/logrus" +) + +type library struct { + logger *log.Logger + symlink Locator + cache ldcache.LDCache +} + +var _ Locator = (*library)(nil) + +// NewLibraryLocator creates a library locator using the specified logger. +func NewLibraryLocator(logger *log.Logger, root string) (Locator, error) { + cache, err := ldcache.New(logger, root) + if err != nil { + return nil, fmt.Errorf("error loading ldcache: %v", err) + } + + l := library{ + logger: logger, + symlink: NewSymlinkLocator(logger, root), + cache: cache, + } + + return &l, nil +} + +// Locate finds the specified libraryname. +// If the input is a library name, the ldcache is searched otherwise the +// provided path is resolved as a symlink. +func (l library) Locate(libname string) ([]string, error) { + if strings.Contains(libname, "/") { + return l.symlink.Locate(libname) + } + + paths32, paths64 := l.cache.Lookup(libname) + if len(paths32) > 0 { + l.logger.Warnf("Ignoring 32-bit libraries for %v: %v", libname, paths32) + } + + if len(paths64) == 0 { + return nil, fmt.Errorf("64-bit library %v not found", libname) + } + + return paths64, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/locator.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/locator.go new file mode 100644 index 0000000..871e1b0 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/locator.go @@ -0,0 +1,24 @@ +/* +# Copyright (c) 2021, 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 lookup + +//go:generate moq -stub -out locator_mock.go . Locator + +// Locator defines the interface for locating files on a system. +type Locator interface { + Locate(string) ([]string, error) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/locator_mock.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/locator_mock.go new file mode 100644 index 0000000..10a73aa --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/locator_mock.go @@ -0,0 +1,78 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package lookup + +import ( + "sync" +) + +// Ensure, that LocatorMock does implement Locator. +// If this is not the case, regenerate this file with moq. +var _ Locator = &LocatorMock{} + +// LocatorMock is a mock implementation of Locator. +// +// func TestSomethingThatUsesLocator(t *testing.T) { +// +// // make and configure a mocked Locator +// mockedLocator := &LocatorMock{ +// LocateFunc: func(s string) ([]string, error) { +// panic("mock out the Locate method") +// }, +// } +// +// // use mockedLocator in code that requires Locator +// // and then make assertions. +// +// } +type LocatorMock struct { + // LocateFunc mocks the Locate method. + LocateFunc func(s string) ([]string, error) + + // calls tracks calls to the methods. + calls struct { + // Locate holds details about calls to the Locate method. + Locate []struct { + // S is the s argument value. + S string + } + } + lockLocate sync.RWMutex +} + +// Locate calls LocateFunc. +func (mock *LocatorMock) Locate(s string) ([]string, error) { + callInfo := struct { + S string + }{ + S: s, + } + mock.lockLocate.Lock() + mock.calls.Locate = append(mock.calls.Locate, callInfo) + mock.lockLocate.Unlock() + if mock.LocateFunc == nil { + var ( + stringsOut []string + errOut error + ) + return stringsOut, errOut + } + return mock.LocateFunc(s) +} + +// LocateCalls gets all the calls that were made to Locate. +// Check the length with: +// +// len(mockedLocator.LocateCalls()) +func (mock *LocatorMock) LocateCalls() []struct { + S string +} { + var calls []struct { + S string + } + mock.lockLocate.RLock() + calls = mock.calls.Locate + mock.lockLocate.RUnlock() + return calls +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/path.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/path.go new file mode 100644 index 0000000..ce692f8 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/path.go @@ -0,0 +1,69 @@ +/** +# Copyright (c) 2022, 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 lookup + +import ( + "os" + "path" + "path/filepath" + "strings" +) + +const ( + envPath = "PATH" +) + +var ( + defaultPATH = []string{"/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin"} +) + +// GetPaths returns a list of paths for a specified root. These are constructed from the +// PATH environment variable, a default path list, and the supplied root. +func GetPaths(root string) []string { + dirs := filepath.SplitList(os.Getenv(envPath)) + + inDirs := make(map[string]bool) + for _, d := range dirs { + inDirs[d] = true + } + + // directories from the environment have higher precedence + for _, d := range defaultPATH { + if inDirs[d] { + // We don't add paths that are already included + continue + } + dirs = append(dirs, d) + } + + if root != "" && root != "/" { + rootDirs := []string{} + for _, dir := range dirs { + rootDirs = append(rootDirs, path.Join(root, dir)) + } + // directories with the root prefix have higher precedence + dirs = append(rootDirs, dirs...) + } + + return dirs +} + +// GetPath returns a colon-separated path value that can be used to set the PATH +// environment variable +func GetPath(root string) string { + return strings.Join(GetPaths(root), ":") +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/symlinks.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/symlinks.go new file mode 100644 index 0000000..0d82a9e --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/symlinks.go @@ -0,0 +1,126 @@ +/** +# Copyright (c) 2021, 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 lookup + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/sirupsen/logrus" +) + +type symlinkChain struct { + file +} + +type symlink struct { + file +} + +// NewSymlinkChainLocator creats a locator that can be used for locating files through symlinks. +// A logger can also be specified. +func NewSymlinkChainLocator(logger *logrus.Logger, root string) Locator { + f := newFileLocator(WithLogger(logger), WithRoot(root)) + l := symlinkChain{ + file: *f, + } + + return &l +} + +// NewSymlinkLocator creats a locator that can be used for locating files through symlinks. +// A logger can also be specified. +func NewSymlinkLocator(logger *logrus.Logger, root string) Locator { + f := newFileLocator(WithLogger(logger), WithRoot(root)) + l := symlink{ + file: *f, + } + + return &l +} + +// Locate finds the specified pattern at the specified root. +// If the file is a symlink, the link is followed and all candidates to the final target are returned. +func (p symlinkChain) Locate(pattern string) ([]string, error) { + candidates, err := p.file.Locate(pattern) + if err != nil { + return nil, err + } + if len(candidates) == 0 { + return candidates, nil + } + + found := make(map[string]bool) + for len(candidates) > 0 { + candidate := candidates[0] + candidates = candidates[:len(candidates)-1] + if found[candidate] { + continue + } + found[candidate] = true + + info, err := os.Lstat(candidate) + if err != nil { + return nil, fmt.Errorf("failed to get file info: %v", info) + } + if info.Mode()&os.ModeSymlink == 0 { + continue + } + target, err := os.Readlink(candidate) + if err != nil { + return nil, fmt.Errorf("error checking symlink: %v", err) + } + + if !filepath.IsAbs(target) { + target, err = filepath.Abs(filepath.Join(filepath.Dir(candidate), target)) + if err != nil { + return nil, fmt.Errorf("failed to construct absolute path: %v", err) + } + } + + p.logger.Debugf("Resolved link: '%v' => '%v'", candidate, target) + if !found[target] { + candidates = append(candidates, target) + } + } + + var filenames []string + for f := range found { + filenames = append(filenames, f) + } + return filenames, nil +} + +// Locate finds the specified pattern at the specified root. +// If the file is a symlink, the link is resolved and the target returned. +func (p symlink) Locate(pattern string) ([]string, error) { + candidates, err := p.file.Locate(pattern) + if err != nil { + return nil, err + } + if len(candidates) != 1 { + return nil, fmt.Errorf("failed to uniquely resolve symlink %v: %v", pattern, candidates) + } + + target, err := filepath.EvalSymlinks(candidates[0]) + if err != nil { + return nil, fmt.Errorf("failed to resolve link: %v", err) + } + + return []string{target}, err +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/nvcaps/nvcaps.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/nvcaps/nvcaps.go new file mode 100644 index 0000000..48d98cc --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/nvcaps/nvcaps.go @@ -0,0 +1,166 @@ +/* +# Copyright (c) 2021-2022, 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 nvcaps + +import ( + "bufio" + "fmt" + "io" + "log" + "os" + "path/filepath" + "strconv" + "strings" +) + +const ( + nvidiaProcDriverPath = "/proc/driver/nvidia" + nvidiaCapabilitiesPath = nvidiaProcDriverPath + "/capabilities" + + nvcapsProcDriverPath = "/proc/driver/nvidia-caps" + nvcapsMigMinorsPath = nvcapsProcDriverPath + "/mig-minors" + nvcapsDevicePath = "/dev/nvidia-caps" +) + +// MigMinor represents the minor number of a MIG device +type MigMinor int + +// MigCap represents the path to a MIG cap file +type MigCap string + +// MigCaps stores a map of MIG cap file paths to MIG minors +type MigCaps map[MigCap]MigMinor + +// NewGPUInstanceCap creates a MigCap for the specified MIG GPU instance. +// A GPU instance is uniquely defined by the GPU minor number and GI instance ID. +func NewGPUInstanceCap(gpu, gi int) MigCap { + return MigCap(fmt.Sprintf("gpu%d/gi%d/access", gpu, gi)) +} + +// NewComputeInstanceCap creates a MigCap for the specified MIG Compute instance. +// A GPU instance is uniquely defined by the GPU minor number, GI instance ID, and CI instance ID. +func NewComputeInstanceCap(gpu, gi, ci int) MigCap { + return MigCap(fmt.Sprintf("gpu%d/gi%d/ci%d/access", gpu, gi, ci)) +} + +// GetCapDevicePath returns the path to the cap device for the specified cap. +// An error is returned if the cap is invalid. +func (m MigCaps) GetCapDevicePath(cap MigCap) (string, error) { + minor, exists := m[cap] + if !exists { + return "", fmt.Errorf("invalid MIG capability path %v", cap) + } + return minor.DevicePath(), nil +} + +// NewMigCaps creates a MigCaps structure based on the contents of the MIG minors file. +func NewMigCaps() (MigCaps, error) { + // Open nvcapsMigMinorsPath for walking. + // If the nvcapsMigMinorsPath does not exist, then we are not on a MIG + // capable machine, so there is nothing to do. + // The format of this file is discussed in: + // https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html#unique_1576522674 + minorsFile, err := os.Open(nvcapsMigMinorsPath) + if os.IsNotExist(err) { + return nil, nil + } + if err != nil { + return nil, fmt.Errorf("error opening MIG minors file: %v", err) + } + defer minorsFile.Close() + + return processMinorsFile(minorsFile), nil +} + +func processMinorsFile(minorsFile io.Reader) MigCaps { + // Walk each line of nvcapsMigMinorsPath and construct a mapping of nvidia + // capabilities path to device minor for that capability + migCaps := make(MigCaps) + scanner := bufio.NewScanner(minorsFile) + for scanner.Scan() { + cap, minor, err := processMigMinorsLine(scanner.Text()) + if err != nil { + log.Printf("Skipping line in MIG minors file: %v", err) + continue + } + migCaps[cap] = minor + } + return migCaps +} + +func processMigMinorsLine(line string) (MigCap, MigMinor, error) { + parts := strings.Split(line, " ") + if len(parts) != 2 { + return "", 0, fmt.Errorf("error processing line: %v", line) + } + + migCap := MigCap(parts[0]) + if !migCap.isValid() { + return "", 0, fmt.Errorf("invalid MIG minors line: '%v'", line) + } + + minor, err := strconv.Atoi(parts[1]) + if err != nil { + return "", 0, fmt.Errorf("error reading MIG minor from '%v': %v", line, err) + } + + return migCap, MigMinor(minor), nil +} + +func (m MigCap) isValid() bool { + cap := string(m) + switch cap { + case "config", "monitor": + return true + default: + var gpu int + var gi int + var ci int + // Look for a CI access file + n, _ := fmt.Sscanf(cap, "gpu%d/gi%d/ci%d/access", &gpu, &gi, &ci) + if n == 3 { + return true + } + // Look for a GI access file + n, _ = fmt.Sscanf(cap, "gpu%d/gi%d/access %d", &gpu, &gi) + if n == 2 { + return true + } + } + return false +} + +// ProcPath returns the proc path associated with the MIG capability +func (m MigCap) ProcPath() string { + id := string(m) + + var path string + switch id { + case "config", "monitor": + path = "mig/" + id + default: + parts := strings.SplitN(id, "/", 2) + path = strings.Join([]string{parts[0], "mig", parts[1]}, "/") + } + return filepath.Join(nvidiaCapabilitiesPath, path) +} + +// DevicePath returns the path for the nvidia-caps device with the specified +// minor number +func (m MigMinor) DevicePath() string { + return fmt.Sprintf(nvcapsDevicePath+"/nvidia-cap%d", m) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/args.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/args.go new file mode 100644 index 0000000..de85d9c --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/args.go @@ -0,0 +1,115 @@ +/* +# Copyright (c) 2021, 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 oci + +import ( + "fmt" + "path/filepath" + "strings" +) + +const ( + specFileName = "config.json" +) + +// GetBundleDir returns the bundle directory or default depending on the +// supplied command line arguments. +func GetBundleDir(args []string) (string, error) { + bundleDir, err := GetBundleDirFromArgs(args) + if err != nil { + return "", fmt.Errorf("error getting bundle dir from args: %v", err) + } + + return bundleDir, nil +} + +// GetBundleDirFromArgs checks the specified slice of strings (argv) for a 'bundle' flag as allowed by runc. +// The following are supported: +// --bundle{{SEP}}BUNDLE_PATH +// -bundle{{SEP}}BUNDLE_PATH +// -b{{SEP}}BUNDLE_PATH +// where {{SEP}} is either ' ' or '=' +func GetBundleDirFromArgs(args []string) (string, error) { + var bundleDir string + + for i := 0; i < len(args); i++ { + param := args[i] + + parts := strings.SplitN(param, "=", 2) + if !IsBundleFlag(parts[0]) { + continue + } + + // The flag has the format --bundle=/path + if len(parts) == 2 { + bundleDir = parts[1] + continue + } + + // The flag has the format --bundle /path + if i+1 < len(args) { + bundleDir = args[i+1] + i++ + continue + } + + // --bundle / -b was the last element of args + return "", fmt.Errorf("bundle option requires an argument") + } + + return bundleDir, nil +} + +// GetSpecFilePath returns the expected path to the OCI specification file for the given +// bundle directory. +func GetSpecFilePath(bundleDir string) string { + specFilePath := filepath.Join(bundleDir, specFileName) + return specFilePath +} + +// IsBundleFlag is a helper function that checks wither the specified argument represents +// a bundle flag (--bundle or -b) +func IsBundleFlag(arg string) bool { + if !strings.HasPrefix(arg, "-") { + return false + } + + trimmed := strings.TrimLeft(arg, "-") + return trimmed == "b" || trimmed == "bundle" +} + +// HasCreateSubcommand checks the supplied arguments for a 'create' subcommand +func HasCreateSubcommand(args []string) bool { + var previousWasBundle bool + for _, a := range args { + // We check for '--bundle create' explicitly to ensure that we + // don't inadvertently trigger a modification if the bundle directory + // is specified as `create` + if !previousWasBundle && IsBundleFlag(a) { + previousWasBundle = true + continue + } + + if !previousWasBundle && a == "create" { + return true + } + + previousWasBundle = false + } + + return false +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime.go new file mode 100644 index 0000000..438fc5d --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime.go @@ -0,0 +1,25 @@ +/* +# Copyright (c) 2021, 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 oci + +//go:generate moq -stub -out runtime_mock.go . Runtime + +// Runtime is an interface for a runtime shim. The Exec method accepts a list +// of command line arguments, and returns an error / nil. +type Runtime interface { + Exec([]string) error +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_low_level.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_low_level.go new file mode 100644 index 0000000..795c4e1 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_low_level.go @@ -0,0 +1,58 @@ +/* +# Copyright (c) 2021, 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 oci + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + log "github.com/sirupsen/logrus" +) + +// NewLowLevelRuntime creates a Runtime that wraps a low-level runtime executable. +// The executable specified is taken from the list of supplied candidates, with the first match +// present in the PATH being selected. A logger is also specified. +func NewLowLevelRuntime(logger *log.Logger, candidates []string) (Runtime, error) { + runtimePath, err := findRuntime(logger, candidates) + if err != nil { + return nil, fmt.Errorf("error locating runtime: %v", err) + } + + logger.Infof("Using low-level runtime %v", runtimePath) + return NewRuntimeForPath(logger, runtimePath) +} + +// findRuntime checks elements in a list of supplied candidates for a matching executable in the PATH. +// The absolute path to the first match is returned. +func findRuntime(logger *log.Logger, candidates []string) (string, error) { + if len(candidates) == 0 { + return "", fmt.Errorf("at least one runtime candidate must be specified") + } + + locator := lookup.NewExecutableLocator(logger, "/") + for _, candidate := range candidates { + logger.Debugf("Looking for runtime binary '%v'", candidate) + targets, err := locator.Locate(candidate) + if err == nil && len(targets) > 0 { + logger.Debugf("Found runtime binary '%v'", targets) + return targets[0], nil + } + logger.Debugf("Runtime binary '%v' not found: %v (targets=%v)", candidate, err, targets) + } + + return "", fmt.Errorf("no runtime binary found from candidate list: %v", candidates) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_mock.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_mock.go new file mode 100644 index 0000000..b6331f2 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_mock.go @@ -0,0 +1,77 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package oci + +import ( + "sync" +) + +// Ensure, that RuntimeMock does implement Runtime. +// If this is not the case, regenerate this file with moq. +var _ Runtime = &RuntimeMock{} + +// RuntimeMock is a mock implementation of Runtime. +// +// func TestSomethingThatUsesRuntime(t *testing.T) { +// +// // make and configure a mocked Runtime +// mockedRuntime := &RuntimeMock{ +// ExecFunc: func(strings []string) error { +// panic("mock out the Exec method") +// }, +// } +// +// // use mockedRuntime in code that requires Runtime +// // and then make assertions. +// +// } +type RuntimeMock struct { + // ExecFunc mocks the Exec method. + ExecFunc func(strings []string) error + + // calls tracks calls to the methods. + calls struct { + // Exec holds details about calls to the Exec method. + Exec []struct { + // Strings is the strings argument value. + Strings []string + } + } + lockExec sync.RWMutex +} + +// Exec calls ExecFunc. +func (mock *RuntimeMock) Exec(strings []string) error { + callInfo := struct { + Strings []string + }{ + Strings: strings, + } + mock.lockExec.Lock() + mock.calls.Exec = append(mock.calls.Exec, callInfo) + mock.lockExec.Unlock() + if mock.ExecFunc == nil { + var ( + errOut error + ) + return errOut + } + return mock.ExecFunc(strings) +} + +// ExecCalls gets all the calls that were made to Exec. +// Check the length with: +// +// len(mockedRuntime.ExecCalls()) +func (mock *RuntimeMock) ExecCalls() []struct { + Strings []string +} { + var calls []struct { + Strings []string + } + mock.lockExec.RLock() + calls = mock.calls.Exec + mock.lockExec.RUnlock() + return calls +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_modifier.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_modifier.go new file mode 100644 index 0000000..2a61445 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_modifier.go @@ -0,0 +1,85 @@ +/* +# Copyright (c) 2021, 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 oci + +import ( + "fmt" + + log "github.com/sirupsen/logrus" +) + +type modifyingRuntimeWrapper struct { + logger *log.Logger + runtime Runtime + ociSpec Spec + modifier SpecModifier +} + +var _ Runtime = (*modifyingRuntimeWrapper)(nil) + +// NewModifyingRuntimeWrapper creates a runtime wrapper that applies the specified modifier to the OCI specification +// before invoking the wrapped runtime. If the modifier is nil, the input runtime is returned. +func NewModifyingRuntimeWrapper(logger *log.Logger, runtime Runtime, spec Spec, modifier SpecModifier) Runtime { + if modifier == nil { + logger.Infof("Using low-level runtime with no modification") + return runtime + } + + rt := modifyingRuntimeWrapper{ + logger: logger, + runtime: runtime, + ociSpec: spec, + modifier: modifier, + } + return &rt +} + +// Exec checks whether a modification of the OCI specification is required and modifies it accordingly before exec-ing +// into the wrapped runtime. +func (r *modifyingRuntimeWrapper) Exec(args []string) error { + if HasCreateSubcommand(args) { + err := r.modify() + if err != nil { + return fmt.Errorf("could not apply required modification to OCI specification: %v", err) + } + r.logger.Infof("Applied required modification to OCI specification") + } else { + r.logger.Infof("No modification of OCI specification required") + } + + r.logger.Infof("Forwarding command to runtime") + return r.runtime.Exec(args) +} + +// modify loads, modifies, and flushes the OCI specification using the defined Modifier +func (r *modifyingRuntimeWrapper) modify() error { + _, err := r.ociSpec.Load() + if err != nil { + return fmt.Errorf("error loading OCI specification for modification: %v", err) + } + + err = r.ociSpec.Modify(r.modifier) + if err != nil { + return fmt.Errorf("error modifying OCI spec: %v", err) + } + + err = r.ociSpec.Flush() + if err != nil { + return fmt.Errorf("error writing modified OCI specification: %v", err) + } + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_path.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_path.go new file mode 100644 index 0000000..102e84f --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_path.go @@ -0,0 +1,65 @@ +/* +# Copyright (c) 2021, 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 oci + +import ( + "fmt" + "os" + + log "github.com/sirupsen/logrus" +) + +// pathRuntime wraps the path that a binary and defines the semanitcs for how to exec into it. +// This can be used to wrap an OCI-compliant low-level runtime binary, allowing it to be used through the +// Runtime internface. +type pathRuntime struct { + logger *log.Logger + path string + execRuntime Runtime +} + +var _ Runtime = (*pathRuntime)(nil) + +// NewRuntimeForPath creates a Runtime for the specified logger and path +func NewRuntimeForPath(logger *log.Logger, path string) (Runtime, error) { + info, err := os.Stat(path) + if err != nil { + return nil, fmt.Errorf("invalid path '%v': %v", path, err) + } + if info.IsDir() || info.Mode()&0111 == 0 { + return nil, fmt.Errorf("specified path '%v' is not an executable file", path) + } + + shim := pathRuntime{ + logger: logger, + path: path, + execRuntime: syscallExec{}, + } + + return &shim, nil +} + +// Exec exces into the binary at the path from the pathRuntime struct, passing it the supplied arguments +// after ensuring that the first argument is the path of the target binary. +func (s pathRuntime) Exec(args []string) error { + runtimeArgs := []string{s.path} + if len(args) > 1 { + runtimeArgs = append(runtimeArgs, args[1:]...) + } + + return s.execRuntime.Exec(runtimeArgs) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_syscall_exec.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_syscall_exec.go new file mode 100644 index 0000000..d752776 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/runtime_syscall_exec.go @@ -0,0 +1,38 @@ +/* +# Copyright (c) 2021, 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 oci + +import ( + "fmt" + "os" + "syscall" +) + +type syscallExec struct{} + +var _ Runtime = (*syscallExec)(nil) + +func (r syscallExec) Exec(args []string) error { + err := syscall.Exec(args[0], args, os.Environ()) + if err != nil { + return fmt.Errorf("could not exec '%v': %v", args[0], err) + } + + // syscall.Exec is not expected to return. This is an error state regardless of whether + // err is nil or not. + return fmt.Errorf("unexpected return from exec '%v'", args[0]) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec.go new file mode 100644 index 0000000..bfd7465 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec.go @@ -0,0 +1,58 @@ +/* +# Copyright (c) 2021, 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 oci + +import ( + "fmt" + + "github.com/opencontainers/runtime-spec/specs-go" + "github.com/sirupsen/logrus" +) + +// SpecModifier defines an interace for modifying a (raw) OCI spec +type SpecModifier interface { + // Modify is a method that accepts a pointer to an OCI Srec and returns an + // error. The intention is that the function would modify the spec in-place. + Modify(*specs.Spec) error +} + +// Spec defines the operations to be performed on an OCI specification +// +//go:generate moq -stub -out spec_mock.go . Spec +type Spec interface { + Load() (*specs.Spec, error) + Flush() error + Modify(SpecModifier) error + LookupEnv(string) (string, bool) +} + +// NewSpec creates fileSpec based on the command line arguments passed to the +// application using the specified logger. +func NewSpec(logger *logrus.Logger, args []string) (Spec, error) { + bundleDir, err := GetBundleDir(args) + if err != nil { + return nil, fmt.Errorf("error getting bundle directory: %v", err) + } + logger.Debugf("Using bundle directory: %v", bundleDir) + + ociSpecPath := GetSpecFilePath(bundleDir) + logger.Infof("Using OCI specification file path: %v", ociSpecPath) + + ociSpec := NewFileSpec(ociSpecPath) + + return ociSpec, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_file.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_file.go new file mode 100644 index 0000000..7fba130 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_file.go @@ -0,0 +1,111 @@ +/* +# Copyright (c) 2021, 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 oci + +import ( + "encoding/json" + "fmt" + "io" + "os" + + "github.com/opencontainers/runtime-spec/specs-go" +) + +type fileSpec struct { + memorySpec + path string +} + +var _ Spec = (*fileSpec)(nil) + +// NewFileSpec creates an object that encapsulates a file-backed OCI spec. +// This can be used to read from the file, modify the spec, and write to the +// same file. +func NewFileSpec(filepath string) Spec { + oci := fileSpec{ + path: filepath, + } + + return &oci +} + +// Load reads the contents of an OCI spec from file to be referenced internally. +// The file is opened "read-only" +func (s *fileSpec) Load() (*specs.Spec, error) { + specFile, err := os.Open(s.path) + if err != nil { + return nil, fmt.Errorf("error opening OCI specification file: %v", err) + } + defer specFile.Close() + + spec, err := LoadFrom(specFile) + if err != nil { + return nil, fmt.Errorf("error loading OCI specification from file: %v", err) + } + s.Spec = spec + return s.Spec, nil +} + +// LoadFrom reads the contents of the OCI spec from the specified io.Reader. +func LoadFrom(reader io.Reader) (*specs.Spec, error) { + decoder := json.NewDecoder(reader) + + var spec specs.Spec + + err := decoder.Decode(&spec) + if err != nil { + return nil, fmt.Errorf("error reading OCI specification: %v", err) + } + + return &spec, nil +} + +// Modify applies the specified SpecModifier to the stored OCI specification. +func (s *fileSpec) Modify(m SpecModifier) error { + return s.memorySpec.Modify(m) +} + +// Flush writes the stored OCI specification to the filepath specifed by the path member. +// The file is truncated upon opening, overwriting any existing contents. +func (s fileSpec) Flush() error { + if s.Spec == nil { + return fmt.Errorf("no OCI specification loaded") + } + + specFile, err := os.Create(s.path) + if err != nil { + return fmt.Errorf("error opening OCI specification file: %v", err) + } + defer specFile.Close() + + return flushTo(s.Spec, specFile) +} + +// flushTo writes the stored OCI specification to the specified io.Writer. +func flushTo(spec *specs.Spec, writer io.Writer) error { + if spec == nil { + return nil + } + encoder := json.NewEncoder(writer) + + err := encoder.Encode(spec) + if err != nil { + return fmt.Errorf("error writing OCI specification: %v", err) + } + + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_memory.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_memory.go new file mode 100644 index 0000000..478db5a --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_memory.go @@ -0,0 +1,83 @@ +/** +# Copyright (c) 2022, 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 oci + +import ( + "fmt" + "strings" + + "github.com/opencontainers/runtime-spec/specs-go" +) + +type memorySpec struct { + *specs.Spec +} + +// NewMemorySpec creates a Spec instance from the specified OCI spec +func NewMemorySpec(spec *specs.Spec) Spec { + s := memorySpec{ + Spec: spec, + } + + return &s +} + +// Load is a no-op for the memorySpec spec +func (s *memorySpec) Load() (*specs.Spec, error) { + return s.Spec, nil +} + +// Flush is a no-op for the memorySpec spec +func (s *memorySpec) Flush() error { + return nil +} + +// Modify applies the specified SpecModifier to the stored OCI specification. +func (s *memorySpec) Modify(m SpecModifier) error { + if s.Spec == nil { + return fmt.Errorf("cannot modify nil spec") + } + return m.Modify(s.Spec) +} + +// LookupEnv mirrors os.LookupEnv for the OCI specification. It +// retrieves the value of the environment variable named +// by the key. If the variable is present in the environment the +// value (which may be empty) is returned and the boolean is true. +// Otherwise the returned value will be empty and the boolean will +// be false. +func (s memorySpec) LookupEnv(key string) (string, bool) { + if s.Spec == nil || s.Spec.Process == nil { + return "", false + } + + for _, env := range s.Spec.Process.Env { + if !strings.HasPrefix(env, key) { + continue + } + + parts := strings.SplitN(env, "=", 2) + if parts[0] == key { + if len(parts) < 2 { + return "", true + } + return parts[1], true + } + } + + return "", false +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_mock.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_mock.go new file mode 100644 index 0000000..ff8ff64 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/spec_mock.go @@ -0,0 +1,207 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package oci + +import ( + "github.com/opencontainers/runtime-spec/specs-go" + "sync" +) + +// Ensure, that SpecMock does implement Spec. +// If this is not the case, regenerate this file with moq. +var _ Spec = &SpecMock{} + +// SpecMock is a mock implementation of Spec. +// +// func TestSomethingThatUsesSpec(t *testing.T) { +// +// // make and configure a mocked Spec +// mockedSpec := &SpecMock{ +// FlushFunc: func() error { +// panic("mock out the Flush method") +// }, +// LoadFunc: func() (*specs.Spec, error) { +// panic("mock out the Load method") +// }, +// LookupEnvFunc: func(s string) (string, bool) { +// panic("mock out the LookupEnv method") +// }, +// ModifyFunc: func(specModifier SpecModifier) error { +// panic("mock out the Modify method") +// }, +// } +// +// // use mockedSpec in code that requires Spec +// // and then make assertions. +// +// } +type SpecMock struct { + // FlushFunc mocks the Flush method. + FlushFunc func() error + + // LoadFunc mocks the Load method. + LoadFunc func() (*specs.Spec, error) + + // LookupEnvFunc mocks the LookupEnv method. + LookupEnvFunc func(s string) (string, bool) + + // ModifyFunc mocks the Modify method. + ModifyFunc func(specModifier SpecModifier) error + + // calls tracks calls to the methods. + calls struct { + // Flush holds details about calls to the Flush method. + Flush []struct { + } + // Load holds details about calls to the Load method. + Load []struct { + } + // LookupEnv holds details about calls to the LookupEnv method. + LookupEnv []struct { + // S is the s argument value. + S string + } + // Modify holds details about calls to the Modify method. + Modify []struct { + // SpecModifier is the specModifier argument value. + SpecModifier SpecModifier + } + } + lockFlush sync.RWMutex + lockLoad sync.RWMutex + lockLookupEnv sync.RWMutex + lockModify sync.RWMutex +} + +// Flush calls FlushFunc. +func (mock *SpecMock) Flush() error { + callInfo := struct { + }{} + mock.lockFlush.Lock() + mock.calls.Flush = append(mock.calls.Flush, callInfo) + mock.lockFlush.Unlock() + if mock.FlushFunc == nil { + var ( + errOut error + ) + return errOut + } + return mock.FlushFunc() +} + +// FlushCalls gets all the calls that were made to Flush. +// Check the length with: +// +// len(mockedSpec.FlushCalls()) +func (mock *SpecMock) FlushCalls() []struct { +} { + var calls []struct { + } + mock.lockFlush.RLock() + calls = mock.calls.Flush + mock.lockFlush.RUnlock() + return calls +} + +// Load calls LoadFunc. +func (mock *SpecMock) Load() (*specs.Spec, error) { + callInfo := struct { + }{} + mock.lockLoad.Lock() + mock.calls.Load = append(mock.calls.Load, callInfo) + mock.lockLoad.Unlock() + if mock.LoadFunc == nil { + var ( + specOut *specs.Spec + errOut error + ) + return specOut, errOut + } + return mock.LoadFunc() +} + +// LoadCalls gets all the calls that were made to Load. +// Check the length with: +// +// len(mockedSpec.LoadCalls()) +func (mock *SpecMock) LoadCalls() []struct { +} { + var calls []struct { + } + mock.lockLoad.RLock() + calls = mock.calls.Load + mock.lockLoad.RUnlock() + return calls +} + +// LookupEnv calls LookupEnvFunc. +func (mock *SpecMock) LookupEnv(s string) (string, bool) { + callInfo := struct { + S string + }{ + S: s, + } + mock.lockLookupEnv.Lock() + mock.calls.LookupEnv = append(mock.calls.LookupEnv, callInfo) + mock.lockLookupEnv.Unlock() + if mock.LookupEnvFunc == nil { + var ( + sOut string + bOut bool + ) + return sOut, bOut + } + return mock.LookupEnvFunc(s) +} + +// LookupEnvCalls gets all the calls that were made to LookupEnv. +// Check the length with: +// +// len(mockedSpec.LookupEnvCalls()) +func (mock *SpecMock) LookupEnvCalls() []struct { + S string +} { + var calls []struct { + S string + } + mock.lockLookupEnv.RLock() + calls = mock.calls.LookupEnv + mock.lockLookupEnv.RUnlock() + return calls +} + +// Modify calls ModifyFunc. +func (mock *SpecMock) Modify(specModifier SpecModifier) error { + callInfo := struct { + SpecModifier SpecModifier + }{ + SpecModifier: specModifier, + } + mock.lockModify.Lock() + mock.calls.Modify = append(mock.calls.Modify, callInfo) + mock.lockModify.Unlock() + if mock.ModifyFunc == nil { + var ( + errOut error + ) + return errOut + } + return mock.ModifyFunc(specModifier) +} + +// ModifyCalls gets all the calls that were made to Modify. +// Check the length with: +// +// len(mockedSpec.ModifyCalls()) +func (mock *SpecMock) ModifyCalls() []struct { + SpecModifier SpecModifier +} { + var calls []struct { + SpecModifier SpecModifier + } + mock.lockModify.RLock() + calls = mock.calls.Modify + mock.lockModify.RUnlock() + return calls +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/state.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/state.go new file mode 100644 index 0000000..2bb4e6e --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/internal/oci/state.go @@ -0,0 +1,93 @@ +/** +# Copyright (c) 2022, 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 oci + +import ( + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + + "github.com/opencontainers/runtime-spec/specs-go" +) + +// State stores an OCI container state. This includes the spec path and the environment +type State specs.State + +// LoadContainerState loads the container state from the specified filename. If the filename is empty or '-' the state is loaded from STDIN +func LoadContainerState(filename string) (*State, error) { + if filename == "" || filename == "-" { + return ReadContainerState(os.Stdin) + } + + inputFile, err := os.Open(filename) + if err != nil { + return nil, fmt.Errorf("failed to open file: %v", err) + } + defer inputFile.Close() + + return ReadContainerState(inputFile) +} + +// ReadContainerState reads the container state from the specified reader +func ReadContainerState(reader io.Reader) (*State, error) { + var s State + + d := json.NewDecoder(reader) + if err := d.Decode(&s); err != nil { + return nil, fmt.Errorf("failed to decode container state: %v", err) + } + + return &s, nil +} + +// LoadSpec loads the OCI spec associated with the container state +func (s *State) LoadSpec() (*specs.Spec, error) { + specFilePath := GetSpecFilePath(s.Bundle) + specFile, err := os.Open(specFilePath) + if err != nil { + return nil, fmt.Errorf("failed to open OCI spec file: %v", err) + } + defer specFile.Close() + + spec, err := LoadFrom(specFile) + if err != nil { + return nil, fmt.Errorf("failed to load OCI spec: %v", err) + } + return spec, nil +} + +// GetContainerRoot returns the root for the container from the associated spec. If the spec is not yet loaded, it is +// loaded and cached. +func (s *State) GetContainerRoot() (string, error) { + spec, err := s.LoadSpec() + if err != nil { + return "", err + } + + var containerRoot string + if spec.Root != nil { + containerRoot = spec.Root.Path + } + + if filepath.IsAbs(containerRoot) { + return containerRoot, nil + } + + return filepath.Join(s.Bundle, containerRoot), nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/api.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/api.go new file mode 100644 index 0000000..4f14563 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/api.go @@ -0,0 +1,50 @@ +/** +# 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 nvcdi + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" +) + +const ( + // ModeAuto configures the CDI spec generator to automatically detect the system configuration + ModeAuto = "auto" + // ModeNvml configures the CDI spec generator to use the NVML library. + ModeNvml = "nvml" + // ModeWsl configures the CDI spec generator to generate a WSL spec. + ModeWsl = "wsl" + // ModeManagement configures the CDI spec generator to generate a management spec. + ModeManagement = "management" + // ModeGds configures the CDI spec generator to generate a GDS spec. + ModeGds = "gds" + // ModeMofed configures the CDI spec generator to generate a MOFED spec. + ModeMofed = "mofed" +) + +// Interface defines the API for the nvcdi package +type Interface interface { + GetSpec() (spec.Interface, error) + GetCommonEdits() (*cdi.ContainerEdits, error) + GetAllDeviceSpecs() ([]specs.Device, error) + GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error) + GetGPUDeviceSpecs(int, device.Device) (*specs.Device, error) + GetMIGDeviceEdits(device.Device, device.MigDevice) (*cdi.ContainerEdits, error) + GetMIGDeviceSpecs(int, device.Device, int, device.MigDevice) (*specs.Device, error) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/common-nvml.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/common-nvml.go new file mode 100644 index 0000000..df81fc2 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/common-nvml.go @@ -0,0 +1,64 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + + "github.com/sirupsen/logrus" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// newCommonNVMLDiscoverer returns a discoverer for entities that are not associated with a specific CDI device. +// This includes driver libraries and meta devices, for example. +func newCommonNVMLDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string, nvmllib nvml.Interface) (discover.Discover, error) { + metaDevices := discover.NewDeviceDiscoverer( + logger, + lookup.NewCharDeviceLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + ), + driverRoot, + []string{ + "/dev/nvidia-modeset", + "/dev/nvidia-uvm-tools", + "/dev/nvidia-uvm", + "/dev/nvidiactl", + }, + ) + + graphicsMounts, err := discover.NewGraphicsMountsDiscoverer(logger, driverRoot) + if err != nil { + return nil, fmt.Errorf("error constructing discoverer for graphics mounts: %v", err) + } + + driverFiles, err := NewDriverDiscoverer(logger, driverRoot, nvidiaCTKPath, nvmllib) + if err != nil { + return nil, fmt.Errorf("failed to create discoverer for driver files: %v", err) + } + + d := discover.Merge( + metaDevices, + graphicsMounts, + driverFiles, + ) + + return d, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/device-wsl.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/device-wsl.go new file mode 100644 index 0000000..6acbb4b --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/device-wsl.go @@ -0,0 +1,37 @@ +/** +# 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 nvcdi + +import ( + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/sirupsen/logrus" +) + +const ( + dxgDeviceNode = "/dev/dxg" +) + +// newDXGDeviceDiscoverer returns a Discoverer for DXG devices under WSL2. +func newDXGDeviceDiscoverer(logger *logrus.Logger, driverRoot string) discover.Discover { + deviceNodes := discover.NewCharDeviceDiscoverer( + logger, + []string{dxgDeviceNode}, + driverRoot, + ) + + return deviceNodes +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/driver-nvml.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/driver-nvml.go new file mode 100644 index 0000000..4e5fd53 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/driver-nvml.go @@ -0,0 +1,221 @@ +/** +# 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 nvcdi + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda" + "github.com/sirupsen/logrus" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" + "golang.org/x/sys/unix" +) + +// NewDriverDiscoverer creates a discoverer for the libraries and binaries associated with a driver installation. +// The supplied NVML Library is used to query the expected driver version. +func NewDriverDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string, nvmllib nvml.Interface) (discover.Discover, error) { + if r := nvmllib.Init(); r != nvml.SUCCESS { + return nil, fmt.Errorf("failed to initalize NVML: %v", r) + } + defer nvmllib.Shutdown() + + version, r := nvmllib.SystemGetDriverVersion() + if r != nvml.SUCCESS { + return nil, fmt.Errorf("failed to determine driver version: %v", r) + } + + return newDriverVersionDiscoverer(logger, driverRoot, nvidiaCTKPath, version) +} + +func newDriverVersionDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string, version string) (discover.Discover, error) { + libraries, err := NewDriverLibraryDiscoverer(logger, driverRoot, nvidiaCTKPath, version) + if err != nil { + return nil, fmt.Errorf("failed to create discoverer for driver libraries: %v", err) + } + + ipcs, err := discover.NewIPCDiscoverer(logger, driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to create discoverer for IPC sockets: %v", err) + } + + firmwares, err := NewDriverFirmwareDiscoverer(logger, driverRoot, version) + if err != nil { + return nil, fmt.Errorf("failed to create discoverer for GSP firmware: %v", err) + } + + binaries := NewDriverBinariesDiscoverer(logger, driverRoot) + + d := discover.Merge( + libraries, + ipcs, + firmwares, + binaries, + ) + + return d, nil +} + +// NewDriverLibraryDiscoverer creates a discoverer for the libraries associated with the specified driver version. +func NewDriverLibraryDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string, version string) (discover.Discover, error) { + libraryPaths, err := getVersionLibs(logger, driverRoot, version) + if err != nil { + return nil, fmt.Errorf("failed to get libraries for driver version: %v", err) + } + + libraries := discover.NewMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + ), + driverRoot, + libraryPaths, + ) + + cfg := &discover.Config{ + DriverRoot: driverRoot, + NvidiaCTKPath: nvidiaCTKPath, + } + hooks, _ := discover.NewLDCacheUpdateHook(logger, libraries, cfg) + + d := discover.Merge( + libraries, + hooks, + ) + + return d, nil +} + +func getUTSRelease() (string, error) { + utsname := &unix.Utsname{} + if err := unix.Uname(utsname); err != nil { + return "", err + } + return unix.ByteSliceToString(utsname.Release[:]), nil +} + +func getFirmwareSearchPaths(logger *logrus.Logger) ([]string, error) { + + var firmwarePaths []string + if p := getCustomFirmwareClassPath(logger); p != "" { + logger.Debugf("using custom firmware class path: %s", p) + firmwarePaths = append(firmwarePaths, p) + } + + utsRelease, err := getUTSRelease() + if err != nil { + return nil, fmt.Errorf("failed to get UTS_RELEASE: %v", err) + } + + standardPaths := []string{ + filepath.Join("/lib/firmware/updates/", utsRelease), + filepath.Join("/lib/firmware/updates/"), + filepath.Join("/lib/firmware/", utsRelease), + filepath.Join("/lib/firmware/"), + } + + return append(firmwarePaths, standardPaths...), nil +} + +// getCustomFirmwareClassPath returns the custom firmware class path if it exists. +func getCustomFirmwareClassPath(logger *logrus.Logger) string { + customFirmwareClassPath, err := os.ReadFile("/sys/module/firmware_class/parameters/path") + if err != nil { + logger.Warningf("failed to get custom firmware class path: %v", err) + return "" + } + + return strings.TrimSpace(string(customFirmwareClassPath)) +} + +// NewDriverFirmwareDiscoverer creates a discoverer for GSP firmware associated with the specified driver version. +func NewDriverFirmwareDiscoverer(logger *logrus.Logger, driverRoot string, version string) (discover.Discover, error) { + gspFirmwareSearchPaths, err := getFirmwareSearchPaths(logger) + if err != nil { + return nil, fmt.Errorf("failed to get firmware search paths: %v", err) + } + gspFirmwarePaths := filepath.Join("nvidia", version, "gsp*.bin") + return discover.NewMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithRoot(driverRoot), + lookup.WithSearchPaths(gspFirmwareSearchPaths...), + ), + driverRoot, + []string{gspFirmwarePaths}, + ), nil +} + +// NewDriverBinariesDiscoverer creates a discoverer for GSP firmware associated with the GPU driver. +func NewDriverBinariesDiscoverer(logger *logrus.Logger, driverRoot string) discover.Discover { + return discover.NewMounts( + logger, + lookup.NewExecutableLocator(logger, driverRoot), + driverRoot, + []string{ + "nvidia-smi", /* System management interface */ + "nvidia-debugdump", /* GPU coredump utility */ + "nvidia-persistenced", /* Persistence mode utility */ + "nvidia-cuda-mps-control", /* Multi process service CLI */ + "nvidia-cuda-mps-server", /* Multi process service server */ + }, + ) +} + +// getVersionLibs checks the LDCache for libraries ending in the specified driver version. +// Although the ldcache at the specified driverRoot is queried, the paths are returned relative to this driverRoot. +// This allows the standard mount location logic to be used for resolving the mounts. +func getVersionLibs(logger *logrus.Logger, driverRoot string, version string) ([]string, error) { + logger.Infof("Using driver version %v", version) + + libCudaPaths, err := cuda.New( + cuda.WithLogger(logger), + cuda.WithDriverRoot(driverRoot), + ).Locate("." + version) + if err != nil { + return nil, fmt.Errorf("failed to locate libcuda.so.%v: %v", version, err) + } + libRoot := filepath.Dir(libCudaPaths[0]) + + libraries := lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithSearchPaths(libRoot), + lookup.WithOptional(true), + ) + + libs, err := libraries.Locate("*.so." + version) + if err != nil { + return nil, fmt.Errorf("failed to locate libraries for driver version %v: %v", version, err) + } + + if driverRoot == "/" || driverRoot == "" { + return libs, nil + } + + var relative []string + for _, l := range libs { + relative = append(relative, strings.TrimPrefix(l, driverRoot)) + } + + return relative, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/driver-wsl.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/driver-wsl.go new file mode 100644 index 0000000..9a021e9 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/driver-wsl.go @@ -0,0 +1,140 @@ +/** +# 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 nvcdi + +import ( + "fmt" + "path/filepath" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" + "github.com/sirupsen/logrus" +) + +var requiredDriverStoreFiles = []string{ + "libcuda.so.1.1", /* Core library for cuda support */ + "libcuda_loader.so", /* Core library for cuda support on WSL */ + "libnvidia-ptxjitcompiler.so.1", /* Core library for PTX Jit support */ + "libnvidia-ml.so.1", /* Core library for nvml */ + "libnvidia-ml_loader.so", /* Core library for nvml on WSL */ + "libdxcore.so", /* Core library for dxcore support */ + "nvcubins.bin", /* Binary containing GPU code for cuda */ + "nvidia-smi", /* nvidia-smi binary*/ +} + +// newWSLDriverDiscoverer returns a Discoverer for WSL2 drivers. +func newWSLDriverDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string) (discover.Discover, error) { + err := dxcore.Init() + if err != nil { + return nil, fmt.Errorf("failed to initialize dxcore: %v", err) + } + defer dxcore.Shutdown() + + driverStorePaths := dxcore.GetDriverStorePaths() + if len(driverStorePaths) == 0 { + return nil, fmt.Errorf("no driver store paths found") + } + logger.Infof("Using WSL driver store paths: %v", driverStorePaths) + + return newWSLDriverStoreDiscoverer(logger, driverRoot, nvidiaCTKPath, driverStorePaths) +} + +// newWSLDriverStoreDiscoverer returns a Discoverer for WSL2 drivers in the driver store associated with a dxcore adapter. +func newWSLDriverStoreDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string, driverStorePaths []string) (discover.Discover, error) { + var searchPaths []string + seen := make(map[string]bool) + for _, path := range driverStorePaths { + if seen[path] { + continue + } + searchPaths = append(searchPaths, path) + } + if len(searchPaths) > 1 { + logger.Warnf("Found multiple driver store paths: %v", searchPaths) + } + searchPaths = append(searchPaths, "/usr/lib/wsl/lib") + + libraries := discover.NewMounts( + logger, + lookup.NewFileLocator( + lookup.WithLogger(logger), + lookup.WithSearchPaths( + searchPaths..., + ), + lookup.WithCount(1), + ), + driverRoot, + requiredDriverStoreFiles, + ) + + symlinkHook := nvidiaSMISimlinkHook{ + logger: logger, + mountsFrom: libraries, + nvidiaCTKPath: nvidiaCTKPath, + } + + cfg := &discover.Config{ + DriverRoot: driverRoot, + NvidiaCTKPath: nvidiaCTKPath, + } + ldcacheHook, _ := discover.NewLDCacheUpdateHook(logger, libraries, cfg) + + d := discover.Merge( + libraries, + symlinkHook, + ldcacheHook, + ) + + return d, nil +} + +type nvidiaSMISimlinkHook struct { + discover.None + logger *logrus.Logger + mountsFrom discover.Discover + nvidiaCTKPath string +} + +// Hooks returns a hook that creates a symlink to nvidia-smi in the driver store. +// On WSL2 the driver store location is used unchanged, for this reason we need +// to create a symlink from /usr/bin/nvidia-smi to the nvidia-smi binary in the +// driver store. +func (m nvidiaSMISimlinkHook) Hooks() ([]discover.Hook, error) { + mounts, err := m.mountsFrom.Mounts() + if err != nil { + return nil, fmt.Errorf("failed to discover mounts: %w", err) + } + + var target string + for _, mount := range mounts { + if filepath.Base(mount.Path) == "nvidia-smi" { + target = mount.Path + break + } + } + + if target == "" { + m.logger.Warningf("Failed to find nvidia-smi in mounts: %v", mounts) + return nil, nil + } + link := "/usr/bin/nvidia-smi" + links := []string{fmt.Sprintf("%s::%s", target, link)} + symlinkHook := discover.CreateCreateSymlinkHook(m.nvidiaCTKPath, links) + + return symlinkHook.Hooks() +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/full-gpu-nvml.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/full-gpu-nvml.go new file mode 100644 index 0000000..c588af9 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/full-gpu-nvml.go @@ -0,0 +1,230 @@ +/** +# 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 nvcdi + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/internal/info/drm" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "github.com/sirupsen/logrus" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// GetGPUDeviceSpecs returns the CDI device specs for the full GPU represented by 'device'. +func (l *nvmllib) GetGPUDeviceSpecs(i int, d device.Device) (*specs.Device, error) { + edits, err := l.GetGPUDeviceEdits(d) + if err != nil { + return nil, fmt.Errorf("failed to get edits for device: %v", err) + } + + name, err := l.deviceNamer.GetDeviceName(i, d) + if err != nil { + return nil, fmt.Errorf("failed to get device name: %v", err) + } + + spec := specs.Device{ + Name: name, + ContainerEdits: *edits.ContainerEdits, + } + + return &spec, nil +} + +// GetGPUDeviceEdits returns the CDI edits for the full GPU represented by 'device'. +func (l *nvmllib) GetGPUDeviceEdits(d device.Device) (*cdi.ContainerEdits, error) { + device, err := newFullGPUDiscoverer(l.logger, l.driverRoot, l.nvidiaCTKPath, d) + if err != nil { + return nil, fmt.Errorf("failed to create device discoverer: %v", err) + } + + editsForDevice, err := edits.FromDiscoverer(device) + if err != nil { + return nil, fmt.Errorf("failed to create container edits for device: %v", err) + } + + return editsForDevice, nil +} + +// byPathHookDiscoverer discovers the entities required for injecting by-path DRM device links +type byPathHookDiscoverer struct { + logger *logrus.Logger + driverRoot string + nvidiaCTKPath string + pciBusID string + deviceNodes discover.Discover +} + +var _ discover.Discover = (*byPathHookDiscoverer)(nil) + +// newFullGPUDiscoverer creates a discoverer for the full GPU defined by the specified device. +func newFullGPUDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string, d device.Device) (discover.Discover, error) { + // TODO: The functionality to get device paths should be integrated into the go-nvlib/pkg/device.Device interface. + // This will allow reuse here and in other code where the paths are queried such as the NVIDIA device plugin. + minor, ret := d.GetMinorNumber() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting GPU device minor number: %v", ret) + } + path := fmt.Sprintf("/dev/nvidia%d", minor) + + pciInfo, ret := d.GetPciInfo() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting PCI info for device: %v", ret) + } + pciBusID := getBusID(pciInfo) + + drmDeviceNodes, err := drm.GetDeviceNodesByBusID(pciBusID) + if err != nil { + return nil, fmt.Errorf("failed to determine DRM devices for %v: %v", pciBusID, err) + } + + deviceNodePaths := append([]string{path}, drmDeviceNodes...) + + deviceNodes := discover.NewCharDeviceDiscoverer( + logger, + deviceNodePaths, + driverRoot, + ) + + byPathHooks := &byPathHookDiscoverer{ + logger: logger, + driverRoot: driverRoot, + nvidiaCTKPath: nvidiaCTKPath, + pciBusID: pciBusID, + deviceNodes: deviceNodes, + } + + deviceFolderPermissionHooks := newDeviceFolderPermissionHookDiscoverer( + logger, + driverRoot, + nvidiaCTKPath, + deviceNodes, + ) + + dd := discover.Merge( + deviceNodes, + byPathHooks, + deviceFolderPermissionHooks, + ) + + return dd, nil +} + +// Devices returns the empty list for the by-path hook discoverer +func (d *byPathHookDiscoverer) Devices() ([]discover.Device, error) { + return nil, nil +} + +// Hooks returns the hooks for the GPU device. +// The following hooks are detected: +// 1. A hook to create /dev/dri/by-path symlinks +func (d *byPathHookDiscoverer) Hooks() ([]discover.Hook, error) { + links, err := d.deviceNodeLinks() + if err != nil { + return nil, fmt.Errorf("failed to discover DRA device links: %v", err) + } + if len(links) == 0 { + return nil, nil + } + + var args []string + for _, l := range links { + args = append(args, "--link", l) + } + + hook := discover.CreateNvidiaCTKHook( + d.nvidiaCTKPath, + "create-symlinks", + args..., + ) + + return []discover.Hook{hook}, nil +} + +// Mounts returns an empty slice for a full GPU +func (d *byPathHookDiscoverer) Mounts() ([]discover.Mount, error) { + return nil, nil +} + +func (d *byPathHookDiscoverer) deviceNodeLinks() ([]string, error) { + devices, err := d.deviceNodes.Devices() + if err != nil { + return nil, fmt.Errorf("failed to discover device nodes: %v", err) + } + + if len(devices) == 0 { + return nil, nil + } + + selectedDevices := make(map[string]bool) + for _, d := range devices { + selectedDevices[d.HostPath] = true + } + + candidates := []string{ + fmt.Sprintf("/dev/dri/by-path/pci-%s-card", d.pciBusID), + fmt.Sprintf("/dev/dri/by-path/pci-%s-render", d.pciBusID), + } + + var links []string + for _, c := range candidates { + linkPath := filepath.Join(d.driverRoot, c) + device, err := os.Readlink(linkPath) + if err != nil { + d.logger.Warningf("Failed to evaluate symlink %v; ignoring", linkPath) + continue + } + + deviceNode := device + if !filepath.IsAbs(device) { + deviceNode = filepath.Join(filepath.Dir(linkPath), device) + } + if !selectedDevices[deviceNode] { + d.logger.Debugf("ignoring device symlink %v -> %v since %v is not mounted", linkPath, device, deviceNode) + continue + } + d.logger.Debugf("adding device symlink %v -> %v", linkPath, device) + links = append(links, fmt.Sprintf("%v::%v", device, linkPath)) + } + + return links, nil +} + +// getBusID provides a utility function that returns the string representation of the bus ID. +func getBusID(p nvml.PciInfo) string { + var bytes []byte + for _, b := range p.BusId { + if byte(b) == '\x00' { + break + } + bytes = append(bytes, byte(b)) + } + id := strings.ToLower(string(bytes)) + + if id != "0000" { + id = strings.TrimPrefix(id, "0000") + } + + return id +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/gds.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/gds.go new file mode 100644 index 0000000..2aba8d0 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/gds.go @@ -0,0 +1,82 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" +) + +type gdslib nvcdilib + +var _ Interface = (*gdslib)(nil) + +// GetAllDeviceSpecs returns the device specs for all available devices. +func (l *gdslib) GetAllDeviceSpecs() ([]specs.Device, error) { + discoverer, err := discover.NewGDSDiscoverer(l.logger, l.driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to create GPUDirect Storage discoverer: %v", err) + } + edits, err := edits.FromDiscoverer(discoverer) + if err != nil { + return nil, fmt.Errorf("failed to create container edits for GPUDirect Storage: %v", err) + } + + deviceSpec := specs.Device{ + Name: "all", + ContainerEdits: *edits.ContainerEdits, + } + + return []specs.Device{deviceSpec}, nil +} + +// GetCommonEdits generates a CDI specification that can be used for ANY devices +func (l *gdslib) GetCommonEdits() (*cdi.ContainerEdits, error) { + return edits.FromDiscoverer(discover.None{}) +} + +// GetSpec is unsppported for the gdslib specs. +// gdslib is typically wrapped by a spec that implements GetSpec. +func (l *gdslib) GetSpec() (spec.Interface, error) { + return nil, fmt.Errorf("GetSpec is not supported") +} + +// GetGPUDeviceEdits is unsupported for the gdslib specs +func (l *gdslib) GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetGPUDeviceEdits is not supported") +} + +// GetGPUDeviceSpecs is unsupported for the gdslib specs +func (l *gdslib) GetGPUDeviceSpecs(int, device.Device) (*specs.Device, error) { + return nil, fmt.Errorf("GetGPUDeviceSpecs is not supported") +} + +// GetMIGDeviceEdits is unsupported for the gdslib specs +func (l *gdslib) GetMIGDeviceEdits(device.Device, device.MigDevice) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetMIGDeviceEdits is not supported") +} + +// GetMIGDeviceSpecs is unsupported for the gdslib specs +func (l *gdslib) GetMIGDeviceSpecs(int, device.Device, int, device.MigDevice) (*specs.Device, error) { + return nil, fmt.Errorf("GetMIGDeviceSpecs is not supported") +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib-nvml.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib-nvml.go new file mode 100644 index 0000000..95ccf66 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib-nvml.go @@ -0,0 +1,105 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +type nvmllib nvcdilib + +var _ Interface = (*nvmllib)(nil) + +// GetSpec should not be called for nvmllib +func (l *nvmllib) GetSpec() (spec.Interface, error) { + return nil, fmt.Errorf("Unexpected call to nvmllib.GetSpec()") +} + +// GetAllDeviceSpecs returns the device specs for all available devices. +func (l *nvmllib) GetAllDeviceSpecs() ([]specs.Device, error) { + var deviceSpecs []specs.Device + + if r := l.nvmllib.Init(); r != nvml.SUCCESS { + return nil, fmt.Errorf("failed to initalize NVML: %v", r) + } + defer l.nvmllib.Shutdown() + + gpuDeviceSpecs, err := l.getGPUDeviceSpecs() + if err != nil { + return nil, err + } + deviceSpecs = append(deviceSpecs, gpuDeviceSpecs...) + + migDeviceSpecs, err := l.getMigDeviceSpecs() + if err != nil { + return nil, err + } + deviceSpecs = append(deviceSpecs, migDeviceSpecs...) + + return deviceSpecs, nil +} + +// GetCommonEdits generates a CDI specification that can be used for ANY devices +func (l *nvmllib) GetCommonEdits() (*cdi.ContainerEdits, error) { + common, err := newCommonNVMLDiscoverer(l.logger, l.driverRoot, l.nvidiaCTKPath, l.nvmllib) + if err != nil { + return nil, fmt.Errorf("failed to create discoverer for common entities: %v", err) + } + + return edits.FromDiscoverer(common) +} + +func (l *nvmllib) getGPUDeviceSpecs() ([]specs.Device, error) { + var deviceSpecs []specs.Device + err := l.devicelib.VisitDevices(func(i int, d device.Device) error { + deviceSpec, err := l.GetGPUDeviceSpecs(i, d) + if err != nil { + return err + } + deviceSpecs = append(deviceSpecs, *deviceSpec) + + return nil + }) + if err != nil { + return nil, fmt.Errorf("failed to generate CDI edits for GPU devices: %v", err) + } + return deviceSpecs, err +} + +func (l *nvmllib) getMigDeviceSpecs() ([]specs.Device, error) { + var deviceSpecs []specs.Device + err := l.devicelib.VisitMigDevices(func(i int, d device.Device, j int, mig device.MigDevice) error { + deviceSpec, err := l.GetMIGDeviceSpecs(i, d, j, mig) + if err != nil { + return err + } + deviceSpecs = append(deviceSpecs, *deviceSpec) + + return nil + }) + if err != nil { + return nil, fmt.Errorf("failed to generate CDI edits for GPU devices: %v", err) + } + return deviceSpecs, err +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib-wsl.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib-wsl.go new file mode 100644 index 0000000..937d1d3 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib-wsl.go @@ -0,0 +1,82 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" +) + +type wsllib nvcdilib + +var _ Interface = (*wsllib)(nil) + +// GetSpec should not be called for wsllib +func (l *wsllib) GetSpec() (spec.Interface, error) { + return nil, fmt.Errorf("Unexpected call to wsllib.GetSpec()") +} + +// GetAllDeviceSpecs returns the device specs for all available devices. +func (l *wsllib) GetAllDeviceSpecs() ([]specs.Device, error) { + device := newDXGDeviceDiscoverer(l.logger, l.driverRoot) + deviceEdits, err := edits.FromDiscoverer(device) + if err != nil { + return nil, fmt.Errorf("failed to create container edits for DXG device: %v", err) + } + + deviceSpec := specs.Device{ + Name: "all", + ContainerEdits: *deviceEdits.ContainerEdits, + } + + return []specs.Device{deviceSpec}, nil +} + +// GetCommonEdits generates a CDI specification that can be used for ANY devices +func (l *wsllib) GetCommonEdits() (*cdi.ContainerEdits, error) { + driver, err := newWSLDriverDiscoverer(l.logger, l.driverRoot, l.nvidiaCTKPath) + if err != nil { + return nil, fmt.Errorf("failed to create discoverer for WSL driver: %v", err) + } + + return edits.FromDiscoverer(driver) +} + +// GetGPUDeviceEdits generates a CDI specification that can be used for GPU devices +func (l *wsllib) GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetGPUDeviceEdits is not supported on WSL") +} + +// GetGPUDeviceSpecs returns the CDI device specs for the full GPU represented by 'device'. +func (l *wsllib) GetGPUDeviceSpecs(i int, d device.Device) (*specs.Device, error) { + return nil, fmt.Errorf("GetGPUDeviceSpecs is not supported on WSL") +} + +// GetMIGDeviceEdits generates a CDI specification that can be used for MIG devices +func (l *wsllib) GetMIGDeviceEdits(device.Device, device.MigDevice) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetMIGDeviceEdits is not supported on WSL") +} + +// GetMIGDeviceSpecs returns the CDI device specs for the full MIG represented by 'device'. +func (l *wsllib) GetMIGDeviceSpecs(int, device.Device, int, device.MigDevice) (*specs.Device, error) { + return nil, fmt.Errorf("GetMIGDeviceSpecs is not supported on WSL") +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib.go new file mode 100644 index 0000000..d692b9f --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/lib.go @@ -0,0 +1,175 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/sirupsen/logrus" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +type wrapper struct { + Interface + + vendor string + class string +} + +type nvcdilib struct { + logger *logrus.Logger + nvmllib nvml.Interface + mode string + devicelib device.Interface + deviceNamer DeviceNamer + driverRoot string + nvidiaCTKPath string + + vendor string + class string + + infolib info.Interface +} + +// New creates a new nvcdi library +func New(opts ...Option) (Interface, error) { + l := &nvcdilib{} + for _, opt := range opts { + opt(l) + } + if l.mode == "" { + l.mode = ModeAuto + } + if l.logger == nil { + l.logger = logrus.StandardLogger() + } + if l.deviceNamer == nil { + l.deviceNamer, _ = NewDeviceNamer(DeviceNameStrategyIndex) + } + if l.driverRoot == "" { + l.driverRoot = "/" + } + if l.nvidiaCTKPath == "" { + l.nvidiaCTKPath = "/usr/bin/nvidia-ctk" + } + if l.infolib == nil { + l.infolib = info.New() + } + + var lib Interface + switch l.resolveMode() { + case ModeManagement: + if l.vendor == "" { + l.vendor = "management.nvidia.com" + } + lib = (*managementlib)(l) + case ModeNvml: + if l.nvmllib == nil { + l.nvmllib = nvml.New() + } + if l.devicelib == nil { + l.devicelib = device.New(device.WithNvml(l.nvmllib)) + } + + lib = (*nvmllib)(l) + case ModeWsl: + lib = (*wsllib)(l) + case ModeGds: + if l.class == "" { + l.class = "gds" + } + lib = (*gdslib)(l) + case ModeMofed: + if l.class == "" { + l.class = "mofed" + } + lib = (*mofedlib)(l) + default: + return nil, fmt.Errorf("unknown mode %q", l.mode) + } + + w := wrapper{ + Interface: lib, + vendor: l.vendor, + class: l.class, + } + return &w, nil +} + +// GetSpec combines the device specs and common edits from the wrapped Interface to a single spec.Interface. +func (l *wrapper) GetSpec() (spec.Interface, error) { + deviceSpecs, err := l.GetAllDeviceSpecs() + if err != nil { + return nil, err + } + + edits, err := l.GetCommonEdits() + if err != nil { + return nil, err + } + + return spec.New( + spec.WithDeviceSpecs(deviceSpecs), + spec.WithEdits(*edits.ContainerEdits), + spec.WithVendor(l.vendor), + spec.WithClass(l.class), + ) + +} + +// resolveMode resolves the mode for CDI spec generation based on the current system. +func (l *nvcdilib) resolveMode() (rmode string) { + if l.mode != ModeAuto { + return l.mode + } + defer func() { + l.logger.Infof("Auto-detected mode as %q", rmode) + }() + + isWSL, reason := l.infolib.HasDXCore() + l.logger.Debugf("Is WSL-based system? %v: %v", isWSL, reason) + + if isWSL { + return ModeWsl + } + + return ModeNvml +} + +// getCudaVersion returns the CUDA version of the current system. +func (l *nvcdilib) getCudaVersion() (string, error) { + if hasNVML, reason := l.infolib.HasNvml(); !hasNVML { + return "", fmt.Errorf("nvml not detected: %v", reason) + } + if l.nvmllib == nil { + return "", fmt.Errorf("nvml library not initialized") + } + r := l.nvmllib.Init() + if r != nvml.SUCCESS { + return "", fmt.Errorf("failed to initialize nvml: %v", r) + } + defer l.nvmllib.Shutdown() + + version, r := l.nvmllib.SystemGetDriverVersion() + if r != nvml.SUCCESS { + return "", fmt.Errorf("failed to get driver version: %v", r) + } + return version, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/management.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/management.go new file mode 100644 index 0000000..5627280 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/management.go @@ -0,0 +1,190 @@ +/** +# 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 nvcdi + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda" + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" +) + +type managementlib nvcdilib + +var _ Interface = (*managementlib)(nil) + +// GetAllDeviceSpecs returns all device specs for use in managemnt containers. +// A single device with the name `all` is returned. +func (m *managementlib) GetAllDeviceSpecs() ([]specs.Device, error) { + devices, err := m.newManagementDeviceDiscoverer() + if err != nil { + return nil, fmt.Errorf("failed to create device discoverer: %v", err) + } + + edits, err := edits.FromDiscoverer(devices) + if err != nil { + return nil, fmt.Errorf("failed to create edits from discoverer: %v", err) + } + + if len(edits.DeviceNodes) == 0 { + return nil, fmt.Errorf("no NVIDIA device nodes found") + } + + device := specs.Device{ + Name: "all", + ContainerEdits: *edits.ContainerEdits, + } + return []specs.Device{device}, nil +} + +// GetCommonEdits returns the common edits for use in managementlib containers. +func (m *managementlib) GetCommonEdits() (*cdi.ContainerEdits, error) { + version, err := m.getCudaVersion() + if err != nil { + return nil, fmt.Errorf("failed to get CUDA version: %v", err) + } + + driver, err := newDriverVersionDiscoverer(m.logger, m.driverRoot, m.nvidiaCTKPath, version) + if err != nil { + return nil, fmt.Errorf("failed to create driver library discoverer: %v", err) + } + + edits, err := edits.FromDiscoverer(driver) + if err != nil { + return nil, fmt.Errorf("failed to create edits from discoverer: %v", err) + } + + return edits, nil +} + +// getCudaVersion returns the CUDA version for use in managementlib containers. +func (m *managementlib) getCudaVersion() (string, error) { + version, err := (*nvcdilib)(m).getCudaVersion() + if err == nil { + return version, nil + } + + libCudaPaths, err := cuda.New( + cuda.WithLogger(m.logger), + cuda.WithDriverRoot(m.driverRoot), + ).Locate(".*.*") + if err != nil { + return "", fmt.Errorf("failed to locate libcuda.so: %v", err) + } + + libCudaPath := libCudaPaths[0] + + version = strings.TrimPrefix(filepath.Base(libCudaPath), "libcuda.so.") + + return version, nil +} + +type managementDiscoverer struct { + discover.Discover +} + +// newManagementDeviceDiscoverer returns a discover.Discover that discovers device nodes for use in managementlib containers. +// NVML is not used to query devices and all device nodes are returned. +func (m *managementlib) newManagementDeviceDiscoverer() (discover.Discover, error) { + deviceNodes := discover.NewCharDeviceDiscoverer( + m.logger, + []string{ + "/dev/nvidia*", + "/dev/nvidia-caps/nvidia-cap*", + "/dev/nvidia-modeset", + "/dev/nvidia-uvm-tools", + "/dev/nvidia-uvm", + "/dev/nvidiactl", + }, + m.driverRoot, + ) + + deviceFolderPermissionHooks := newDeviceFolderPermissionHookDiscoverer( + m.logger, + m.driverRoot, + m.nvidiaCTKPath, + deviceNodes, + ) + + d := discover.Merge( + &managementDiscoverer{deviceNodes}, + deviceFolderPermissionHooks, + ) + return d, nil +} + +func (m *managementDiscoverer) Devices() ([]discover.Device, error) { + devices, err := m.Discover.Devices() + if err != nil { + return devices, err + } + + var filteredDevices []discover.Device + for _, device := range devices { + if m.nodeIsBlocked(device.HostPath) { + continue + } + filteredDevices = append(filteredDevices, device) + } + + return filteredDevices, nil +} + +// nodeIsBlocked returns true if the specified device node should be ignored. +func (m managementDiscoverer) nodeIsBlocked(path string) bool { + blockedPrefixes := []string{"nvidia-fs", "nvidia-nvswitch", "nvidia-nvlink"} + nodeName := filepath.Base(path) + for _, prefix := range blockedPrefixes { + if strings.HasPrefix(nodeName, prefix) { + return true + } + } + return false +} + +// GetSpec is unsppported for the managementlib specs. +// managementlib is typically wrapped by a spec that implements GetSpec. +func (m *managementlib) GetSpec() (spec.Interface, error) { + return nil, fmt.Errorf("GetSpec is not supported") +} + +// GetGPUDeviceEdits is unsupported for the managementlib specs +func (m *managementlib) GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetGPUDeviceEdits is not supported") +} + +// GetGPUDeviceSpecs is unsupported for the managementlib specs +func (m *managementlib) GetGPUDeviceSpecs(int, device.Device) (*specs.Device, error) { + return nil, fmt.Errorf("GetGPUDeviceSpecs is not supported") +} + +// GetMIGDeviceEdits is unsupported for the managementlib specs +func (m *managementlib) GetMIGDeviceEdits(device.Device, device.MigDevice) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetMIGDeviceEdits is not supported") +} + +// GetMIGDeviceSpecs is unsupported for the managementlib specs +func (m *managementlib) GetMIGDeviceSpecs(int, device.Device, int, device.MigDevice) (*specs.Device, error) { + return nil, fmt.Errorf("GetMIGDeviceSpecs is not supported") +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/mig-device-nvml.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/mig-device-nvml.go new file mode 100644 index 0000000..7864ff9 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/mig-device-nvml.go @@ -0,0 +1,124 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/internal/nvcaps" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "github.com/sirupsen/logrus" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// GetMIGDeviceSpecs returns the CDI device specs for the full GPU represented by 'device'. +func (l *nvmllib) GetMIGDeviceSpecs(i int, d device.Device, j int, mig device.MigDevice) (*specs.Device, error) { + edits, err := l.GetMIGDeviceEdits(d, mig) + if err != nil { + return nil, fmt.Errorf("failed to get edits for device: %v", err) + } + + name, err := l.deviceNamer.GetMigDeviceName(i, d, j, mig) + if err != nil { + return nil, fmt.Errorf("failed to get device name: %v", err) + } + + spec := specs.Device{ + Name: name, + ContainerEdits: *edits.ContainerEdits, + } + + return &spec, nil +} + +// GetMIGDeviceEdits returns the CDI edits for the MIG device represented by 'mig' on 'parent'. +func (l *nvmllib) GetMIGDeviceEdits(parent device.Device, mig device.MigDevice) (*cdi.ContainerEdits, error) { + gpu, ret := parent.GetMinorNumber() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting GPU minor: %v", ret) + } + + gi, ret := mig.GetGpuInstanceId() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting GPU Instance ID: %v", ret) + } + + ci, ret := mig.GetComputeInstanceId() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting Compute Instance ID: %v", ret) + } + + editsForDevice, err := GetEditsForComputeInstance(l.logger, l.driverRoot, gpu, gi, ci) + if err != nil { + return nil, fmt.Errorf("failed to create container edits for MIG device: %v", err) + } + + return editsForDevice, nil +} + +// GetEditsForComputeInstance returns the CDI edits for a particular compute instance defined by the (gpu, gi, ci) tuple +func GetEditsForComputeInstance(logger *logrus.Logger, driverRoot string, gpu int, gi int, ci int) (*cdi.ContainerEdits, error) { + computeInstance, err := newComputeInstanceDiscoverer(logger, driverRoot, gpu, gi, ci) + if err != nil { + return nil, fmt.Errorf("failed to create discoverer for Compute Instance: %v", err) + } + + editsForDevice, err := edits.FromDiscoverer(computeInstance) + if err != nil { + return nil, fmt.Errorf("failed to create container edits for Compute Instance: %v", err) + } + + return editsForDevice, nil +} + +// newComputeInstanceDiscoverer returns a discoverer for the specified compute instance +func newComputeInstanceDiscoverer(logger *logrus.Logger, driverRoot string, gpu int, gi int, ci int) (discover.Discover, error) { + parentPath := fmt.Sprintf("/dev/nvidia%d", gpu) + + migCaps, err := nvcaps.NewMigCaps() + if err != nil { + return nil, fmt.Errorf("error getting MIG capability device paths: %v", err) + } + + giCap := nvcaps.NewGPUInstanceCap(gpu, gi) + giCapDevicePath, err := migCaps.GetCapDevicePath(giCap) + if err != nil { + return nil, fmt.Errorf("failed to get GI cap device path: %v", err) + } + + ciCap := nvcaps.NewComputeInstanceCap(gpu, gi, ci) + ciCapDevicePath, err := migCaps.GetCapDevicePath(ciCap) + if err != nil { + return nil, fmt.Errorf("failed to get CI cap device path: %v", err) + } + + deviceNodes := discover.NewCharDeviceDiscoverer( + logger, + []string{ + parentPath, + giCapDevicePath, + ciCapDevicePath, + }, + driverRoot, + ) + + return deviceNodes, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/mofed.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/mofed.go new file mode 100644 index 0000000..88c147c --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/mofed.go @@ -0,0 +1,82 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/NVIDIA/nvidia-container-toolkit/internal/edits" + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" +) + +type mofedlib nvcdilib + +var _ Interface = (*mofedlib)(nil) + +// GetAllDeviceSpecs returns the device specs for all available devices. +func (l *mofedlib) GetAllDeviceSpecs() ([]specs.Device, error) { + discoverer, err := discover.NewMOFEDDiscoverer(l.logger, l.driverRoot) + if err != nil { + return nil, fmt.Errorf("failed to create MOFED discoverer: %v", err) + } + edits, err := edits.FromDiscoverer(discoverer) + if err != nil { + return nil, fmt.Errorf("failed to create container edits for MOFED devices: %v", err) + } + + deviceSpec := specs.Device{ + Name: "all", + ContainerEdits: *edits.ContainerEdits, + } + + return []specs.Device{deviceSpec}, nil +} + +// GetCommonEdits generates a CDI specification that can be used for ANY devices +func (l *mofedlib) GetCommonEdits() (*cdi.ContainerEdits, error) { + return edits.FromDiscoverer(discover.None{}) +} + +// GetSpec is unsppported for the mofedlib specs. +// mofedlib is typically wrapped by a spec that implements GetSpec. +func (l *mofedlib) GetSpec() (spec.Interface, error) { + return nil, fmt.Errorf("GetSpec is not supported") +} + +// GetGPUDeviceEdits is unsupported for the mofedlib specs +func (l *mofedlib) GetGPUDeviceEdits(device.Device) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetGPUDeviceEdits is not supported") +} + +// GetGPUDeviceSpecs is unsupported for the mofedlib specs +func (l *mofedlib) GetGPUDeviceSpecs(int, device.Device) (*specs.Device, error) { + return nil, fmt.Errorf("GetGPUDeviceSpecs is not supported") +} + +// GetMIGDeviceEdits is unsupported for the mofedlib specs +func (l *mofedlib) GetMIGDeviceEdits(device.Device, device.MigDevice) (*cdi.ContainerEdits, error) { + return nil, fmt.Errorf("GetMIGDeviceEdits is not supported") +} + +// GetMIGDeviceSpecs is unsupported for the mofedlib specs +func (l *mofedlib) GetMIGDeviceSpecs(int, device.Device, int, device.MigDevice) (*specs.Device, error) { + return nil, fmt.Errorf("GetMIGDeviceSpecs is not supported") +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/namer.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/namer.go new file mode 100644 index 0000000..e7b850d --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/namer.go @@ -0,0 +1,89 @@ +/** +# 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 nvcdi + +import ( + "fmt" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// DeviceNamer is an interface for getting device names +type DeviceNamer interface { + GetDeviceName(int, device.Device) (string, error) + GetMigDeviceName(int, device.Device, int, device.MigDevice) (string, error) +} + +// Supported device naming strategies +const ( + // DeviceNameStrategyIndex generates devices names such as 0 or 1:0 + DeviceNameStrategyIndex = "index" + // DeviceNameStrategyTypeIndex generates devices names such as gpu0 or mig1:0 + DeviceNameStrategyTypeIndex = "type-index" + // DeviceNameStrategyUUID uses the device UUID as the name + DeviceNameStrategyUUID = "uuid" +) + +type deviceNameIndex struct { + gpuPrefix string + migPrefix string +} +type deviceNameUUID struct{} + +// NewDeviceNamer creates a Device Namer based on the supplied strategy. +// This namer can be used to construct the names for MIG and GPU devices when generating the CDI spec. +func NewDeviceNamer(strategy string) (DeviceNamer, error) { + switch strategy { + case DeviceNameStrategyIndex: + return deviceNameIndex{}, nil + case DeviceNameStrategyTypeIndex: + return deviceNameIndex{gpuPrefix: "gpu", migPrefix: "mig"}, nil + case DeviceNameStrategyUUID: + return deviceNameUUID{}, nil + } + + return nil, fmt.Errorf("invalid device name strategy: %v", strategy) +} + +// GetDeviceName returns the name for the specified device based on the naming strategy +func (s deviceNameIndex) GetDeviceName(i int, d device.Device) (string, error) { + return fmt.Sprintf("%s%d", s.gpuPrefix, i), nil +} + +// GetMigDeviceName returns the name for the specified device based on the naming strategy +func (s deviceNameIndex) GetMigDeviceName(i int, d device.Device, j int, mig device.MigDevice) (string, error) { + return fmt.Sprintf("%s%d:%d", s.migPrefix, i, j), nil +} + +// GetDeviceName returns the name for the specified device based on the naming strategy +func (s deviceNameUUID) GetDeviceName(i int, d device.Device) (string, error) { + uuid, ret := d.GetUUID() + if ret != nvml.SUCCESS { + return "", fmt.Errorf("failed to get device UUID: %v", ret) + } + return uuid, nil +} + +// GetMigDeviceName returns the name for the specified device based on the naming strategy +func (s deviceNameUUID) GetMigDeviceName(i int, d device.Device, j int, mig device.MigDevice) (string, error) { + uuid, ret := mig.GetUUID() + if ret != nvml.SUCCESS { + return "", fmt.Errorf("failed to get device UUID: %v", ret) + } + return uuid, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/options.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/options.go new file mode 100644 index 0000000..19aef93 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/options.go @@ -0,0 +1,89 @@ +/** +# 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 nvcdi + +import ( + "github.com/sirupsen/logrus" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// Option is a function that configures the nvcdilib +type Option func(*nvcdilib) + +// WithDeviceLib sets the device library for the library +func WithDeviceLib(devicelib device.Interface) Option { + return func(l *nvcdilib) { + l.devicelib = devicelib + } +} + +// WithDeviceNamer sets the device namer for the library +func WithDeviceNamer(namer DeviceNamer) Option { + return func(l *nvcdilib) { + l.deviceNamer = namer + } +} + +// WithDriverRoot sets the driver root for the library +func WithDriverRoot(root string) Option { + return func(l *nvcdilib) { + l.driverRoot = root + } +} + +// WithLogger sets the logger for the library +func WithLogger(logger *logrus.Logger) Option { + return func(l *nvcdilib) { + l.logger = logger + } +} + +// WithNVIDIACTKPath sets the path to the NVIDIA Container Toolkit CLI path for the library +func WithNVIDIACTKPath(path string) Option { + return func(l *nvcdilib) { + l.nvidiaCTKPath = path + } +} + +// WithNvmlLib sets the nvml library for the library +func WithNvmlLib(nvmllib nvml.Interface) Option { + return func(l *nvcdilib) { + l.nvmllib = nvmllib + } +} + +// WithMode sets the discovery mode for the library +func WithMode(mode string) Option { + return func(l *nvcdilib) { + l.mode = mode + } +} + +// WithVendor sets the vendor for the library +func WithVendor(vendor string) Option { + return func(o *nvcdilib) { + o.vendor = vendor + } +} + +// WithClass sets the class for the library +func WithClass(class string) Option { + return func(o *nvcdilib) { + o.class = class + } +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/api.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/api.go new file mode 100644 index 0000000..a72c6df --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/api.go @@ -0,0 +1,40 @@ +/** +# 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 spec + +import ( + "io" + + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +const ( + // DetectMinimumVersion is a constant that triggers a spec to detect the minimum required version. + DetectMinimumVersion = "DETECT_MINIMUM_VERSION" + + // FormatJSON indicates a JSON output format + FormatJSON = "json" + // FormatYAML indicates a YAML output format + FormatYAML = "yaml" +) + +// Interface is the interface for the spec API +type Interface interface { + io.WriterTo + Save(string) error + Raw() *specs.Spec +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/builder.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/builder.go new file mode 100644 index 0000000..a015813 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/builder.go @@ -0,0 +1,171 @@ +/** +# 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 spec + +import ( + "fmt" + "os" + + "github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform" + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type builder struct { + raw *specs.Spec + version string + vendor string + class string + deviceSpecs []specs.Device + edits specs.ContainerEdits + format string + noSimplify bool + permissions os.FileMode +} + +// newBuilder creates a new spec builder with the supplied options +func newBuilder(opts ...Option) *builder { + s := &builder{} + for _, opt := range opts { + opt(s) + } + if s.raw != nil { + s.noSimplify = true + vendor, class := cdi.ParseQualifier(s.raw.Kind) + s.vendor = vendor + s.class = class + } + + if s.version == "" { + s.version = DetectMinimumVersion + } + if s.vendor == "" { + s.vendor = "nvidia.com" + } + if s.class == "" { + s.class = "gpu" + } + if s.format == "" { + s.format = FormatYAML + } + if s.permissions == 0 { + s.permissions = 0600 + } + return s +} + +// Build builds a CDI spec form the spec builder. +func (o *builder) Build() (*spec, error) { + raw := o.raw + if raw == nil { + raw = &specs.Spec{ + Version: o.version, + Kind: fmt.Sprintf("%s/%s", o.vendor, o.class), + Devices: o.deviceSpecs, + ContainerEdits: o.edits, + } + } + + if raw.Version == DetectMinimumVersion { + minVersion, err := cdi.MinimumRequiredVersion(raw) + if err != nil { + return nil, fmt.Errorf("failed to get minumum required CDI spec version: %v", err) + } + raw.Version = minVersion + } + + if !o.noSimplify { + err := transform.NewSimplifier().Transform(raw) + if err != nil { + return nil, fmt.Errorf("failed to simplify spec: %v", err) + } + } + + s := spec{ + Spec: raw, + format: o.format, + permissions: o.permissions, + } + + return &s, nil +} + +// Option defines a function that can be used to configure the spec builder. +type Option func(*builder) + +// WithDeviceSpecs sets the device specs for the spec builder +func WithDeviceSpecs(deviceSpecs []specs.Device) Option { + return func(o *builder) { + o.deviceSpecs = deviceSpecs + } +} + +// WithEdits sets the container edits for the spec builder +func WithEdits(edits specs.ContainerEdits) Option { + return func(o *builder) { + o.edits = edits + } +} + +// WithVersion sets the version for the spec builder +func WithVersion(version string) Option { + return func(o *builder) { + o.version = version + } +} + +// WithVendor sets the vendor for the spec builder +func WithVendor(vendor string) Option { + return func(o *builder) { + o.vendor = vendor + } +} + +// WithClass sets the class for the spec builder +func WithClass(class string) Option { + return func(o *builder) { + o.class = class + } +} + +// WithFormat sets the output file format +func WithFormat(format string) Option { + return func(o *builder) { + o.format = format + } +} + +// WithNoSimplify sets whether the spec must be simplified +func WithNoSimplify(noSimplify bool) Option { + return func(o *builder) { + o.noSimplify = noSimplify + } +} + +// WithRawSpec sets the raw spec for the spec builder +func WithRawSpec(raw *specs.Spec) Option { + return func(o *builder) { + o.raw = raw + } +} + +// WithPermissions sets the permissions for the generated spec file +func WithPermissions(permissions os.FileMode) Option { + return func(o *builder) { + o.permissions = permissions + } +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/spec.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/spec.go new file mode 100644 index 0000000..999220b --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec/spec.go @@ -0,0 +1,129 @@ +/** +# 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 spec + +import ( + "fmt" + "io" + "os" + "path/filepath" + + "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type spec struct { + *specs.Spec + format string + permissions os.FileMode +} + +var _ Interface = (*spec)(nil) + +// New creates a new spec with the specified options. +func New(opts ...Option) (Interface, error) { + return newBuilder(opts...).Build() +} + +// Save writes the spec to the specified path and overwrites the file if it exists. +func (s *spec) Save(path string) error { + path, err := s.normalizePath(path) + if err != nil { + return fmt.Errorf("failed to normalize path: %w", err) + } + + specDir := filepath.Dir(path) + registry := cdi.GetRegistry( + cdi.WithAutoRefresh(false), + cdi.WithSpecDirs(specDir), + ) + + if err := registry.SpecDB().WriteSpec(s.Raw(), filepath.Base(path)); err != nil { + return fmt.Errorf("failed to write spec: %w", err) + } + + if err := os.Chmod(path, s.permissions); err != nil { + return fmt.Errorf("failed to set permissions on spec file: %w", err) + } + + return nil +} + +// WriteTo writes the spec to the specified writer. +func (s *spec) WriteTo(w io.Writer) (int64, error) { + name, err := cdi.GenerateNameForSpec(s.Raw()) + if err != nil { + return 0, err + } + + path, _ := s.normalizePath(name) + tmpFile, err := os.CreateTemp("", "*"+filepath.Base(path)) + if err != nil { + return 0, err + } + defer os.Remove(tmpFile.Name()) + + if err := s.Save(tmpFile.Name()); err != nil { + return 0, err + } + + err = tmpFile.Close() + if err != nil { + return 0, fmt.Errorf("failed to close temporary file: %w", err) + } + + r, err := os.Open(tmpFile.Name()) + if err != nil { + return 0, fmt.Errorf("failed to open temporary file: %w", err) + } + defer r.Close() + + return io.Copy(w, r) +} + +// Raw returns a pointer to the raw spec. +func (s *spec) Raw() *specs.Spec { + return s.Spec +} + +// normalizePath ensures that the specified path has a supported extension +func (s *spec) normalizePath(path string) (string, error) { + if ext := filepath.Ext(path); ext != ".yaml" && ext != ".json" { + path += s.extension() + } + + if filepath.Clean(filepath.Dir(path)) == "." { + pwd, err := os.Getwd() + if err != nil { + return path, fmt.Errorf("failed to get current working directory: %v", err) + } + path = filepath.Join(pwd, path) + } + + return path, nil +} + +func (s *spec) extension() string { + switch s.format { + case FormatJSON: + return ".json" + case FormatYAML: + return ".yaml" + } + + return ".yaml" +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/api.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/api.go new file mode 100644 index 0000000..9e3e5bd --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/api.go @@ -0,0 +1,24 @@ +/** +# 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 transform + +import "github.com/container-orchestrated-devices/container-device-interface/specs-go" + +// Transformer defines the API for applying arbitrary transforms to a spec in-place +type Transformer interface { + Transform(*specs.Spec) error +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/deduplicate.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/deduplicate.go new file mode 100644 index 0000000..e53ff59 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/deduplicate.go @@ -0,0 +1,151 @@ +/** +# 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 transform + +import ( + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type dedupe struct{} + +var _ Transformer = (*dedupe)(nil) + +// NewDedupe creates a transformer that deduplicates container edits. +func NewDedupe() (Transformer, error) { + return &dedupe{}, nil +} + +// Transform removes duplicate entris from devices and common container edits. +func (d dedupe) Transform(spec *specs.Spec) error { + if spec == nil { + return nil + } + if err := d.transformEdits(&spec.ContainerEdits); err != nil { + return err + } + var updatedDevices []specs.Device + for _, device := range spec.Devices { + if err := d.transformEdits(&device.ContainerEdits); err != nil { + return err + } + updatedDevices = append(updatedDevices, device) + } + spec.Devices = updatedDevices + return nil +} + +func (d dedupe) transformEdits(edits *specs.ContainerEdits) error { + deviceNodes, err := d.deduplicateDeviceNodes(edits.DeviceNodes) + if err != nil { + return err + } + edits.DeviceNodes = deviceNodes + + envs, err := d.deduplicateEnvs(edits.Env) + if err != nil { + return err + } + edits.Env = envs + + hooks, err := d.deduplicateHooks(edits.Hooks) + if err != nil { + return err + } + edits.Hooks = hooks + + mounts, err := d.deduplicateMounts(edits.Mounts) + if err != nil { + return err + } + edits.Mounts = mounts + + return nil +} + +func (d dedupe) deduplicateDeviceNodes(entities []*specs.DeviceNode) ([]*specs.DeviceNode, error) { + seen := make(map[string]bool) + var deviceNodes []*specs.DeviceNode + for _, e := range entities { + if e == nil { + continue + } + id, err := deviceNode(*e).id() + if err != nil { + return nil, err + } + if seen[id] { + continue + } + seen[id] = true + deviceNodes = append(deviceNodes, e) + } + return deviceNodes, nil +} + +func (d dedupe) deduplicateEnvs(entities []string) ([]string, error) { + seen := make(map[string]bool) + var envs []string + for _, e := range entities { + id := e + if seen[id] { + continue + } + seen[id] = true + envs = append(envs, e) + } + return envs, nil +} + +func (d dedupe) deduplicateHooks(entities []*specs.Hook) ([]*specs.Hook, error) { + seen := make(map[string]bool) + var hooks []*specs.Hook + for _, e := range entities { + if e == nil { + continue + } + id, err := hook(*e).id() + if err != nil { + return nil, err + } + if seen[id] { + continue + } + seen[id] = true + hooks = append(hooks, e) + } + return hooks, nil +} + +func (d dedupe) deduplicateMounts(entities []*specs.Mount) ([]*specs.Mount, error) { + seen := make(map[string]bool) + var mounts []*specs.Mount + for _, e := range entities { + if e == nil { + continue + } + id, err := mount(*e).id() + if err != nil { + return nil, err + } + if seen[id] { + continue + } + seen[id] = true + mounts = append(mounts, e) + } + return mounts, nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/edits.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/edits.go new file mode 100644 index 0000000..36fac72 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/edits.go @@ -0,0 +1,166 @@ +/* +* +# 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 transform + +import ( + "encoding/json" + + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type containerEdits specs.ContainerEdits + +// IsEmpty returns true if the edits are empty. +func (e containerEdits) IsEmpty() bool { + // Devices with empty edits are invalid + if len(e.DeviceNodes) > 0 { + return false + } + if len(e.Env) > 0 { + return false + } + if len(e.Hooks) > 0 { + return false + } + if len(e.Mounts) > 0 { + return false + } + + return true +} + +func (e *containerEdits) getEntityIds() ([]string, error) { + if e == nil { + return nil, nil + } + uniqueIDs := make(map[string]bool) + + deviceNodes, err := e.getDeviceNodeIDs() + if err != nil { + return nil, err + } + for k := range deviceNodes { + uniqueIDs[k] = true + } + + envs, err := e.getEnvIDs() + if err != nil { + return nil, err + } + for k := range envs { + uniqueIDs[k] = true + } + + hooks, err := e.getHookIDs() + if err != nil { + return nil, err + } + for k := range hooks { + uniqueIDs[k] = true + } + + mounts, err := e.getMountIDs() + if err != nil { + return nil, err + } + for k := range mounts { + uniqueIDs[k] = true + } + + var ids []string + for k := range uniqueIDs { + ids = append(ids, k) + } + + return ids, nil +} + +func (e *containerEdits) getDeviceNodeIDs() (map[string]bool, error) { + deviceIDs := make(map[string]bool) + for _, entity := range e.DeviceNodes { + id, err := deviceNode(*entity).id() + if err != nil { + return nil, err + } + deviceIDs[id] = true + } + return deviceIDs, nil +} + +func (e *containerEdits) getEnvIDs() (map[string]bool, error) { + envIDs := make(map[string]bool) + for _, entity := range e.Env { + id, err := env(entity).id() + if err != nil { + return nil, err + } + envIDs[id] = true + } + return envIDs, nil +} + +func (e *containerEdits) getHookIDs() (map[string]bool, error) { + hookIDs := make(map[string]bool) + for _, entity := range e.Hooks { + id, err := hook(*entity).id() + if err != nil { + return nil, err + } + hookIDs[id] = true + } + return hookIDs, nil +} + +func (e *containerEdits) getMountIDs() (map[string]bool, error) { + mountIDs := make(map[string]bool) + for _, entity := range e.Mounts { + id, err := mount(*entity).id() + if err != nil { + return nil, err + } + mountIDs[id] = true + } + return mountIDs, nil +} + +type deviceNode specs.DeviceNode + +func (dn deviceNode) id() (string, error) { + b, err := json.Marshal(dn) + return string(b), err +} + +type env string + +func (e env) id() (string, error) { + return string(e), nil +} + +type mount specs.Mount + +func (m mount) id() (string, error) { + b, err := json.Marshal(m) + return string(b), err +} + +type hook specs.Hook + +func (m hook) id() (string, error) { + b, err := json.Marshal(m) + return string(b), err +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/no-op.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/no-op.go new file mode 100644 index 0000000..7985f19 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/no-op.go @@ -0,0 +1,35 @@ +/** +# 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 transform + +import ( + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type noop struct{} + +var _ Transformer = (*noop)(nil) + +// NewNoopTransformer returns a no-op transformer +func NewNoopTransformer() Transformer { + return noop{} +} + +// Transform is a no-op +func (n noop) Transform(spec *specs.Spec) error { + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/remove.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/remove.go new file mode 100644 index 0000000..bf49660 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/remove.go @@ -0,0 +1,105 @@ +/** +# 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 transform + +import ( + "fmt" + + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type remove map[string]bool + +func newRemover(ids ...string) Transformer { + r := make(remove) + for _, id := range ids { + r[id] = true + } + return r +} + +// Transform remove the specified entities from the spec. +func (r remove) Transform(spec *specs.Spec) error { + if spec == nil { + return nil + } + + for _, device := range spec.Devices { + if err := r.transformEdits(&device.ContainerEdits); err != nil { + return fmt.Errorf("failed to remove edits from device %q: %w", device.Name, err) + } + } + + return r.transformEdits(&spec.ContainerEdits) +} + +func (r remove) transformEdits(edits *specs.ContainerEdits) error { + if edits == nil { + return nil + } + + var deviceNodes []*specs.DeviceNode + for _, entity := range edits.DeviceNodes { + id, err := deviceNode(*entity).id() + if err != nil { + return err + } + if r[id] { + continue + } + deviceNodes = append(deviceNodes, entity) + } + edits.DeviceNodes = deviceNodes + + var envs []string + for _, entity := range edits.Env { + id := entity + if r[id] { + continue + } + envs = append(envs, entity) + } + edits.Env = envs + + var hooks []*specs.Hook + for _, entity := range edits.Hooks { + id, err := hook(*entity).id() + if err != nil { + return err + } + if r[id] { + continue + } + hooks = append(hooks, entity) + } + edits.Hooks = hooks + + var mounts []*specs.Mount + for _, entity := range edits.Mounts { + id, err := mount(*entity).id() + if err != nil { + return err + } + if r[id] { + continue + } + mounts = append(mounts, entity) + } + edits.Mounts = mounts + + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/root.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/root.go new file mode 100644 index 0000000..53bcf2a --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/root.go @@ -0,0 +1,113 @@ +/** +# 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 transform + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type rootTransformer struct { + root string + targetRoot string +} + +var _ Transformer = (*rootTransformer)(nil) + +// NewRootTransformer creates a new transformer for modifying +// the root for paths in a CDI spec. If both roots are identical, +// this tranformer is a no-op. +func NewRootTransformer(root string, targetRoot string) Transformer { + if root == targetRoot { + return NewNoopTransformer() + } + + t := rootTransformer{ + root: root, + targetRoot: targetRoot, + } + return t +} + +// Transform replaces the root in a spec with a new root. +// It walks the spec and replaces all host paths that start with root with the target root. +func (t rootTransformer) Transform(spec *specs.Spec) error { + if spec == nil { + return nil + } + + for _, d := range spec.Devices { + if err := t.applyToEdits(&d.ContainerEdits); err != nil { + return fmt.Errorf("failed to apply root transform to device %s: %w", d.Name, err) + } + } + + if err := t.applyToEdits(&spec.ContainerEdits); err != nil { + return fmt.Errorf("failed to apply root transform to spec: %w", err) + } + return nil +} + +func (t rootTransformer) applyToEdits(edits *specs.ContainerEdits) error { + for i, dn := range edits.DeviceNodes { + dn.HostPath = t.transformPath(dn.HostPath) + edits.DeviceNodes[i] = dn + } + + for i, hook := range edits.Hooks { + hook.Path = t.transformPath(hook.Path) + + var args []string + for _, arg := range hook.Args { + if !strings.Contains(arg, "::") { + args = append(args, t.transformPath(arg)) + continue + } + + // For the 'create-symlinks' hook, special care is taken for the + // '--link' flag argument which takes the form ::. + // Both paths, the target and link paths, are transformed. + split := strings.Split(arg, "::") + if len(split) != 2 { + return fmt.Errorf("unexpected number of '::' separators in hook argument") + } + split[0] = t.transformPath(split[0]) + split[1] = t.transformPath(split[1]) + args = append(args, strings.Join(split, "::")) + } + hook.Args = args + edits.Hooks[i] = hook + } + + for i, mount := range edits.Mounts { + mount.HostPath = t.transformPath(mount.HostPath) + edits.Mounts[i] = mount + } + + return nil +} + +func (t rootTransformer) transformPath(path string) string { + if !strings.HasPrefix(path, t.root) { + return path + } + + return filepath.Join(t.targetRoot, strings.TrimPrefix(path, t.root)) +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/simplify.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/simplify.go new file mode 100644 index 0000000..a2162ad --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform/simplify.go @@ -0,0 +1,74 @@ +/** +# 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 transform + +import ( + "fmt" + + "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +type simplify struct{} + +var _ Transformer = (*simplify)(nil) + +// NewSimplifier creates a simplifier transformer. +// This transoformer ensures that entities in the spec are deduplicated and that common edits are removed from device-specific edits. +func NewSimplifier() Transformer { + return &simplify{} +} + +// Transform simplifies the supplied spec. +// Edits that are present in the common edits are removed from device-specific edits. +func (s simplify) Transform(spec *specs.Spec) error { + if spec == nil { + return nil + } + + dedupe := dedupe{} + if err := dedupe.Transform(spec); err != nil { + return err + } + + commonEntityIDs, err := (*containerEdits)(&spec.ContainerEdits).getEntityIds() + if err != nil { + return err + } + + toRemove := newRemover(commonEntityIDs...) + var updatedDevices []specs.Device + for _, device := range spec.Devices { + deviceAsSpec := specs.Spec{ + ContainerEdits: device.ContainerEdits, + } + err := toRemove.Transform(&deviceAsSpec) + if err != nil { + return fmt.Errorf("failed to transform device edits: %w", err) + } + + if !(containerEdits)(deviceAsSpec.ContainerEdits).IsEmpty() { + // Devices with empty edits are invalid. + // We only update the container edits for the device if this would + // result in a valid device. + device.ContainerEdits = deviceAsSpec.ContainerEdits + } + updatedDevices = append(updatedDevices, device) + } + spec.Devices = updatedDevices + + return nil +} diff --git a/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/workarounds-device-folder-permissions.go b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/workarounds-device-folder-permissions.go new file mode 100644 index 0000000..98276b8 --- /dev/null +++ b/vendor/github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/workarounds-device-folder-permissions.go @@ -0,0 +1,118 @@ +/** +# 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 nvcdi + +import ( + "fmt" + "path/filepath" + + "github.com/NVIDIA/nvidia-container-toolkit/internal/discover" + "github.com/sirupsen/logrus" +) + +type deviceFolderPermissions struct { + logger *logrus.Logger + driverRoot string + nvidiaCTKPath string + devices discover.Discover +} + +var _ discover.Discover = (*deviceFolderPermissions)(nil) + +// newDeviceFolderPermissionHookDiscoverer creates a discoverer that can be used to update the permissions for the parent folders of nested device nodes from the specified set of device specs. +// This works around an issue with rootless podman when using crun as a low-level runtime. +// See https://github.com/containers/crun/issues/1047 +// The nested devices that are applicable to the NVIDIA GPU devices are: +// - DRM devices at /dev/dri/* +// - NVIDIA Caps devices at /dev/nvidia-caps/* +func newDeviceFolderPermissionHookDiscoverer(logger *logrus.Logger, driverRoot string, nvidiaCTKPath string, devices discover.Discover) discover.Discover { + d := &deviceFolderPermissions{ + logger: logger, + driverRoot: driverRoot, + nvidiaCTKPath: nvidiaCTKPath, + devices: devices, + } + + return d +} + +// Devices are empty for this discoverer +func (d *deviceFolderPermissions) Devices() ([]discover.Device, error) { + return nil, nil +} + +// Hooks returns a set of hooks that sets the file mode to 755 of parent folders for nested device nodes. +func (d *deviceFolderPermissions) Hooks() ([]discover.Hook, error) { + folders, err := d.getDeviceSubfolders() + if err != nil { + return nil, fmt.Errorf("failed to get device subfolders: %v", err) + } + if len(folders) == 0 { + return nil, nil + } + + args := []string{"--mode", "755"} + for _, folder := range folders { + args = append(args, "--path", folder) + } + + hook := discover.CreateNvidiaCTKHook( + d.nvidiaCTKPath, + "chmod", + args..., + ) + + return []discover.Hook{hook}, nil +} + +func (d *deviceFolderPermissions) getDeviceSubfolders() ([]string, error) { + // For now we only consider the following special case paths + allowedPaths := map[string]bool{ + "/dev/dri": true, + "/dev/nvidia-caps": true, + } + + devices, err := d.devices.Devices() + if err != nil { + return nil, fmt.Errorf("failed to get devices: %v", err) + } + + var folders []string + seen := make(map[string]bool) + for _, device := range devices { + df := filepath.Dir(device.Path) + if seen[df] { + continue + } + // We only consider the special case paths + if !allowedPaths[df] { + continue + } + folders = append(folders, df) + seen[df] = true + if len(folders) == len(allowedPaths) { + break + } + } + + return folders, nil +} + +// Mounts are empty for this discoverer +func (d *deviceFolderPermissions) Mounts() ([]discover.Mount, error) { + return nil, nil +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/LICENSE b/vendor/github.com/container-orchestrated-devices/container-device-interface/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/internal/multierror/multierror.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/internal/multierror/multierror.go new file mode 100644 index 0000000..07aca4a --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/internal/multierror/multierror.go @@ -0,0 +1,82 @@ +/* + Copyright © 2022 The CDI Authors + + 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 multierror + +import ( + "strings" +) + +// New combines several errors into a single error. Parameters that are nil are +// ignored. If no errors are passed in or all parameters are nil, then the +// result is also nil. +func New(errors ...error) error { + // Filter out nil entries. + numErrors := 0 + for _, err := range errors { + if err != nil { + errors[numErrors] = err + numErrors++ + } + } + if numErrors == 0 { + return nil + } + return multiError(errors[0:numErrors]) +} + +// multiError is the underlying implementation used by New. +// +// Beware that a null multiError is not the same as a nil error. +type multiError []error + +// multiError returns all individual error strings concatenated with "\n" +func (e multiError) Error() string { + var builder strings.Builder + for i, err := range e { + if i > 0 { + _, _ = builder.WriteString("\n") + } + _, _ = builder.WriteString(err.Error()) + } + return builder.String() +} + +// Append returns a new multi error all errors concatenated. Errors that are +// multi errors get flattened, nil is ignored. +func Append(err error, errors ...error) error { + var result multiError + if m, ok := err.(multiError); ok { + result = m + } else if err != nil { + result = append(result, err) + } + + for _, e := range errors { + if e == nil { + continue + } + if m, ok := e.(multiError); ok { + result = append(result, m...) + } else { + result = append(result, e) + } + } + if len(result) == 0 { + return nil + } + return result +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/annotations.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/annotations.go new file mode 100644 index 0000000..c512ea0 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/annotations.go @@ -0,0 +1,139 @@ +/* + Copyright © 2021-2022 The CDI Authors + + 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 cdi + +import ( + "errors" + "fmt" + "strings" +) + +const ( + // AnnotationPrefix is the prefix for CDI container annotation keys. + AnnotationPrefix = "cdi.k8s.io/" +) + +// UpdateAnnotations updates annotations with a plugin-specific CDI device +// injection request for the given devices. Upon any error a non-nil error +// is returned and annotations are left intact. By convention plugin should +// be in the format of "vendor.device-type". +func UpdateAnnotations(annotations map[string]string, plugin string, deviceID string, devices []string) (map[string]string, error) { + key, err := AnnotationKey(plugin, deviceID) + if err != nil { + return annotations, fmt.Errorf("CDI annotation failed: %w", err) + } + if _, ok := annotations[key]; ok { + return annotations, fmt.Errorf("CDI annotation failed, key %q used", key) + } + value, err := AnnotationValue(devices) + if err != nil { + return annotations, fmt.Errorf("CDI annotation failed: %w", err) + } + + if annotations == nil { + annotations = make(map[string]string) + } + annotations[key] = value + + return annotations, nil +} + +// ParseAnnotations parses annotations for CDI device injection requests. +// The keys and devices from all such requests are collected into slices +// which are returned as the result. All devices are expected to be fully +// qualified CDI device names. If any device fails this check empty slices +// are returned along with a non-nil error. The annotations are expected +// to be formatted by, or in a compatible fashion to UpdateAnnotations(). +func ParseAnnotations(annotations map[string]string) ([]string, []string, error) { + var ( + keys []string + devices []string + ) + + for key, value := range annotations { + if !strings.HasPrefix(key, AnnotationPrefix) { + continue + } + for _, d := range strings.Split(value, ",") { + if !IsQualifiedName(d) { + return nil, nil, fmt.Errorf("invalid CDI device name %q", d) + } + devices = append(devices, d) + } + keys = append(keys, key) + } + + return keys, devices, nil +} + +// AnnotationKey returns a unique annotation key for an device allocation +// by a K8s device plugin. pluginName should be in the format of +// "vendor.device-type". deviceID is the ID of the device the plugin is +// allocating. It is used to make sure that the generated key is unique +// even if multiple allocations by a single plugin needs to be annotated. +func AnnotationKey(pluginName, deviceID string) (string, error) { + const maxNameLen = 63 + + if pluginName == "" { + return "", errors.New("invalid plugin name, empty") + } + if deviceID == "" { + return "", errors.New("invalid deviceID, empty") + } + + name := pluginName + "_" + strings.ReplaceAll(deviceID, "/", "_") + + if len(name) > maxNameLen { + return "", fmt.Errorf("invalid plugin+deviceID %q, too long", name) + } + + if c := rune(name[0]); !isAlphaNumeric(c) { + return "", fmt.Errorf("invalid name %q, first '%c' should be alphanumeric", + name, c) + } + if len(name) > 2 { + for _, c := range name[1 : len(name)-1] { + switch { + case isAlphaNumeric(c): + case c == '_' || c == '-' || c == '.': + default: + return "", fmt.Errorf("invalid name %q, invalid charcter '%c'", + name, c) + } + } + } + if c := rune(name[len(name)-1]); !isAlphaNumeric(c) { + return "", fmt.Errorf("invalid name %q, last '%c' should be alphanumeric", + name, c) + } + + return AnnotationPrefix + name, nil +} + +// AnnotationValue returns an annotation value for the given devices. +func AnnotationValue(devices []string) (string, error) { + value, sep := "", "" + for _, d := range devices { + if _, _, _, err := ParseQualifiedName(d); err != nil { + return "", err + } + value += sep + d + sep = "," + } + + return value, nil +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache.go new file mode 100644 index 0000000..cb495eb --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache.go @@ -0,0 +1,581 @@ +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "errors" + "fmt" + "io/fs" + "os" + "path/filepath" + "sort" + "strings" + "sync" + + "github.com/container-orchestrated-devices/container-device-interface/internal/multierror" + cdi "github.com/container-orchestrated-devices/container-device-interface/specs-go" + "github.com/fsnotify/fsnotify" + oci "github.com/opencontainers/runtime-spec/specs-go" +) + +// Option is an option to change some aspect of default CDI behavior. +type Option func(*Cache) error + +// Cache stores CDI Specs loaded from Spec directories. +type Cache struct { + sync.Mutex + specDirs []string + specs map[string][]*Spec + devices map[string]*Device + errors map[string][]error + dirErrors map[string]error + + autoRefresh bool + watch *watch +} + +// WithAutoRefresh returns an option to control automatic Cache refresh. +// By default auto-refresh is enabled, the list of Spec directories are +// monitored and the Cache is automatically refreshed whenever a change +// is detected. This option can be used to disable this behavior when a +// manually refreshed mode is preferable. +func WithAutoRefresh(autoRefresh bool) Option { + return func(c *Cache) error { + c.autoRefresh = autoRefresh + return nil + } +} + +// NewCache creates a new CDI Cache. The cache is populated from a set +// of CDI Spec directories. These can be specified using a WithSpecDirs +// option. The default set of directories is exposed in DefaultSpecDirs. +func NewCache(options ...Option) (*Cache, error) { + c := &Cache{ + autoRefresh: true, + watch: &watch{}, + } + + WithSpecDirs(DefaultSpecDirs...)(c) + c.Lock() + defer c.Unlock() + + return c, c.configure(options...) +} + +// Configure applies options to the Cache. Updates and refreshes the +// Cache if options have changed. +func (c *Cache) Configure(options ...Option) error { + if len(options) == 0 { + return nil + } + + c.Lock() + defer c.Unlock() + + return c.configure(options...) +} + +// Configure the Cache. Start/stop CDI Spec directory watch, refresh +// the Cache if necessary. +func (c *Cache) configure(options ...Option) error { + var err error + + for _, o := range options { + if err = o(c); err != nil { + return fmt.Errorf("failed to apply cache options: %w", err) + } + } + + c.dirErrors = make(map[string]error) + + c.watch.stop() + if c.autoRefresh { + c.watch.setup(c.specDirs, c.dirErrors) + c.watch.start(&c.Mutex, c.refresh, c.dirErrors) + } + c.refresh() + + return nil +} + +// Refresh rescans the CDI Spec directories and refreshes the Cache. +// In manual refresh mode the cache is always refreshed. In auto- +// refresh mode the cache is only refreshed if it is out of date. +func (c *Cache) Refresh() error { + c.Lock() + defer c.Unlock() + + // force a refresh in manual mode + if refreshed, err := c.refreshIfRequired(!c.autoRefresh); refreshed { + return err + } + + // collect and return cached errors, much like refresh() does it + var result error + for _, errors := range c.errors { + result = multierror.Append(result, errors...) + } + return result +} + +// Refresh the Cache by rescanning CDI Spec directories and files. +func (c *Cache) refresh() error { + var ( + specs = map[string][]*Spec{} + devices = map[string]*Device{} + conflicts = map[string]struct{}{} + specErrors = map[string][]error{} + result []error + ) + + // collect errors per spec file path and once globally + collectError := func(err error, paths ...string) { + result = append(result, err) + for _, path := range paths { + specErrors[path] = append(specErrors[path], err) + } + } + // resolve conflicts based on device Spec priority (order of precedence) + resolveConflict := func(name string, dev *Device, old *Device) bool { + devSpec, oldSpec := dev.GetSpec(), old.GetSpec() + devPrio, oldPrio := devSpec.GetPriority(), oldSpec.GetPriority() + switch { + case devPrio > oldPrio: + return false + case devPrio == oldPrio: + devPath, oldPath := devSpec.GetPath(), oldSpec.GetPath() + collectError(fmt.Errorf("conflicting device %q (specs %q, %q)", + name, devPath, oldPath), devPath, oldPath) + conflicts[name] = struct{}{} + } + return true + } + + _ = scanSpecDirs(c.specDirs, func(path string, priority int, spec *Spec, err error) error { + path = filepath.Clean(path) + if err != nil { + collectError(fmt.Errorf("failed to load CDI Spec %w", err), path) + return nil + } + + vendor := spec.GetVendor() + specs[vendor] = append(specs[vendor], spec) + + for _, dev := range spec.devices { + qualified := dev.GetQualifiedName() + other, ok := devices[qualified] + if ok { + if resolveConflict(qualified, dev, other) { + continue + } + } + devices[qualified] = dev + } + + return nil + }) + + for conflict := range conflicts { + delete(devices, conflict) + } + + c.specs = specs + c.devices = devices + c.errors = specErrors + + return multierror.New(result...) +} + +// RefreshIfRequired triggers a refresh if necessary. +func (c *Cache) refreshIfRequired(force bool) (bool, error) { + // We need to refresh if + // - it's forced by an explicitly call to Refresh() in manual mode + // - a missing Spec dir appears (added to watch) in auto-refresh mode + if force || (c.autoRefresh && c.watch.update(c.dirErrors)) { + return true, c.refresh() + } + return false, nil +} + +// InjectDevices injects the given qualified devices to an OCI Spec. It +// returns any unresolvable devices and an error if injection fails for +// any of the devices. +func (c *Cache) InjectDevices(ociSpec *oci.Spec, devices ...string) ([]string, error) { + var unresolved []string + + if ociSpec == nil { + return devices, fmt.Errorf("can't inject devices, nil OCI Spec") + } + + c.Lock() + defer c.Unlock() + + c.refreshIfRequired(false) + + edits := &ContainerEdits{} + specs := map[*Spec]struct{}{} + + for _, device := range devices { + d := c.devices[device] + if d == nil { + unresolved = append(unresolved, device) + continue + } + if _, ok := specs[d.GetSpec()]; !ok { + specs[d.GetSpec()] = struct{}{} + edits.Append(d.GetSpec().edits()) + } + edits.Append(d.edits()) + } + + if unresolved != nil { + return unresolved, fmt.Errorf("unresolvable CDI devices %s", + strings.Join(devices, ", ")) + } + + if err := edits.Apply(ociSpec); err != nil { + return nil, fmt.Errorf("failed to inject devices: %w", err) + } + + return nil, nil +} + +// highestPrioritySpecDir returns the Spec directory with highest priority +// and its priority. +func (c *Cache) highestPrioritySpecDir() (string, int) { + if len(c.specDirs) == 0 { + return "", -1 + } + + prio := len(c.specDirs) - 1 + dir := c.specDirs[prio] + + return dir, prio +} + +// WriteSpec writes a Spec file with the given content into the highest +// priority Spec directory. If name has a "json" or "yaml" extension it +// choses the encoding. Otherwise the default YAML encoding is used. +func (c *Cache) WriteSpec(raw *cdi.Spec, name string) error { + var ( + specDir string + path string + prio int + spec *Spec + err error + ) + + specDir, prio = c.highestPrioritySpecDir() + if specDir == "" { + return errors.New("no Spec directories to write to") + } + + path = filepath.Join(specDir, name) + if ext := filepath.Ext(path); ext != ".json" && ext != ".yaml" { + path += defaultSpecExt + } + + spec, err = newSpec(raw, path, prio) + if err != nil { + return err + } + + return spec.write(true) +} + +// RemoveSpec removes a Spec with the given name from the highest +// priority Spec directory. This function can be used to remove a +// Spec previously written by WriteSpec(). If the file exists and +// its removal fails RemoveSpec returns an error. +func (c *Cache) RemoveSpec(name string) error { + var ( + specDir string + path string + err error + ) + + specDir, _ = c.highestPrioritySpecDir() + if specDir == "" { + return errors.New("no Spec directories to remove from") + } + + path = filepath.Join(specDir, name) + if ext := filepath.Ext(path); ext != ".json" && ext != ".yaml" { + path += defaultSpecExt + } + + err = os.Remove(path) + if err != nil && errors.Is(err, fs.ErrNotExist) { + err = nil + } + + return err +} + +// GetDevice returns the cached device for the given qualified name. +func (c *Cache) GetDevice(device string) *Device { + c.Lock() + defer c.Unlock() + + c.refreshIfRequired(false) + + return c.devices[device] +} + +// ListDevices lists all cached devices by qualified name. +func (c *Cache) ListDevices() []string { + var devices []string + + c.Lock() + defer c.Unlock() + + c.refreshIfRequired(false) + + for name := range c.devices { + devices = append(devices, name) + } + sort.Strings(devices) + + return devices +} + +// ListVendors lists all vendors known to the cache. +func (c *Cache) ListVendors() []string { + var vendors []string + + c.Lock() + defer c.Unlock() + + c.refreshIfRequired(false) + + for vendor := range c.specs { + vendors = append(vendors, vendor) + } + sort.Strings(vendors) + + return vendors +} + +// ListClasses lists all device classes known to the cache. +func (c *Cache) ListClasses() []string { + var ( + cmap = map[string]struct{}{} + classes []string + ) + + c.Lock() + defer c.Unlock() + + c.refreshIfRequired(false) + + for _, specs := range c.specs { + for _, spec := range specs { + cmap[spec.GetClass()] = struct{}{} + } + } + for class := range cmap { + classes = append(classes, class) + } + sort.Strings(classes) + + return classes +} + +// GetVendorSpecs returns all specs for the given vendor. +func (c *Cache) GetVendorSpecs(vendor string) []*Spec { + c.Lock() + defer c.Unlock() + + c.refreshIfRequired(false) + + return c.specs[vendor] +} + +// GetSpecErrors returns all errors encountered for the spec during the +// last cache refresh. +func (c *Cache) GetSpecErrors(spec *Spec) []error { + var errors []error + + c.Lock() + defer c.Unlock() + + if errs, ok := c.errors[spec.GetPath()]; ok { + errors = make([]error, len(errs)) + copy(errors, errs) + } + + return errors +} + +// GetErrors returns all errors encountered during the last +// cache refresh. +func (c *Cache) GetErrors() map[string][]error { + c.Lock() + defer c.Unlock() + + errors := map[string][]error{} + for path, errs := range c.errors { + errors[path] = errs + } + for path, err := range c.dirErrors { + errors[path] = []error{err} + } + + return errors +} + +// GetSpecDirectories returns the CDI Spec directories currently in use. +func (c *Cache) GetSpecDirectories() []string { + c.Lock() + defer c.Unlock() + + dirs := make([]string, len(c.specDirs)) + copy(dirs, c.specDirs) + return dirs +} + +// GetSpecDirErrors returns any errors related to configured Spec directories. +func (c *Cache) GetSpecDirErrors() map[string]error { + if c.dirErrors == nil { + return nil + } + + c.Lock() + defer c.Unlock() + + errors := make(map[string]error) + for dir, err := range c.dirErrors { + errors[dir] = err + } + return errors +} + +// Our fsnotify helper wrapper. +type watch struct { + watcher *fsnotify.Watcher + tracked map[string]bool +} + +// Setup monitoring for the given Spec directories. +func (w *watch) setup(dirs []string, dirErrors map[string]error) { + var ( + dir string + err error + ) + w.tracked = make(map[string]bool) + for _, dir = range dirs { + w.tracked[dir] = false + } + + w.watcher, err = fsnotify.NewWatcher() + if err != nil { + for _, dir := range dirs { + dirErrors[dir] = fmt.Errorf("failed to create watcher: %w", err) + } + return + } + + w.update(dirErrors) +} + +// Start watching Spec directories for relevant changes. +func (w *watch) start(m *sync.Mutex, refresh func() error, dirErrors map[string]error) { + go w.watch(w.watcher, m, refresh, dirErrors) +} + +// Stop watching directories. +func (w *watch) stop() { + if w.watcher == nil { + return + } + + w.watcher.Close() + w.tracked = nil +} + +// Watch Spec directory changes, triggering a refresh if necessary. +func (w *watch) watch(fsw *fsnotify.Watcher, m *sync.Mutex, refresh func() error, dirErrors map[string]error) { + watch := fsw + if watch == nil { + return + } + for { + select { + case event, ok := <-watch.Events: + if !ok { + return + } + + if (event.Op & (fsnotify.Rename | fsnotify.Remove | fsnotify.Write)) == 0 { + continue + } + if event.Op == fsnotify.Write { + if ext := filepath.Ext(event.Name); ext != ".json" && ext != ".yaml" { + continue + } + } + + m.Lock() + if event.Op == fsnotify.Remove && w.tracked[event.Name] { + w.update(dirErrors, event.Name) + } else { + w.update(dirErrors) + } + refresh() + m.Unlock() + + case _, ok := <-watch.Errors: + if !ok { + return + } + } + } +} + +// Update watch with pending/missing or removed directories. +func (w *watch) update(dirErrors map[string]error, removed ...string) bool { + var ( + dir string + ok bool + err error + update bool + ) + + for dir, ok = range w.tracked { + if ok { + continue + } + + err = w.watcher.Add(dir) + if err == nil { + w.tracked[dir] = true + delete(dirErrors, dir) + update = true + } else { + w.tracked[dir] = false + dirErrors[dir] = fmt.Errorf("failed to monitor for changes: %w", err) + } + } + + for _, dir = range removed { + w.tracked[dir] = false + dirErrors[dir] = errors.New("directory removed") + update = true + } + + return update +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_unix.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_unix.go new file mode 100644 index 0000000..0ee5fb8 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_unix.go @@ -0,0 +1,26 @@ +//go:build !windows +// +build !windows + +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import "syscall" + +func osSync() { + syscall.Sync() +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_windows.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_windows.go new file mode 100644 index 0000000..c6dabf5 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/cache_test_windows.go @@ -0,0 +1,22 @@ +//go:build windows +// +build windows + +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +func osSync() {} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go new file mode 100644 index 0000000..3e0d24e --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits.go @@ -0,0 +1,332 @@ +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/container-orchestrated-devices/container-device-interface/specs-go" + oci "github.com/opencontainers/runtime-spec/specs-go" + ocigen "github.com/opencontainers/runtime-tools/generate" +) + +const ( + // PrestartHook is the name of the OCI "prestart" hook. + PrestartHook = "prestart" + // CreateRuntimeHook is the name of the OCI "createRuntime" hook. + CreateRuntimeHook = "createRuntime" + // CreateContainerHook is the name of the OCI "createContainer" hook. + CreateContainerHook = "createContainer" + // StartContainerHook is the name of the OCI "startContainer" hook. + StartContainerHook = "startContainer" + // PoststartHook is the name of the OCI "poststart" hook. + PoststartHook = "poststart" + // PoststopHook is the name of the OCI "poststop" hook. + PoststopHook = "poststop" +) + +var ( + // Names of recognized hooks. + validHookNames = map[string]struct{}{ + PrestartHook: {}, + CreateRuntimeHook: {}, + CreateContainerHook: {}, + StartContainerHook: {}, + PoststartHook: {}, + PoststopHook: {}, + } +) + +// ContainerEdits represent updates to be applied to an OCI Spec. +// These updates can be specific to a CDI device, or they can be +// specific to a CDI Spec. In the former case these edits should +// be applied to all OCI Specs where the corresponding CDI device +// is injected. In the latter case, these edits should be applied +// to all OCI Specs where at least one devices from the CDI Spec +// is injected. +type ContainerEdits struct { + *specs.ContainerEdits +} + +// Apply edits to the given OCI Spec. Updates the OCI Spec in place. +// Returns an error if the update fails. +func (e *ContainerEdits) Apply(spec *oci.Spec) error { + if spec == nil { + return errors.New("can't edit nil OCI Spec") + } + if e == nil || e.ContainerEdits == nil { + return nil + } + + specgen := ocigen.NewFromSpec(spec) + if len(e.Env) > 0 { + specgen.AddMultipleProcessEnv(e.Env) + } + + for _, d := range e.DeviceNodes { + dn := DeviceNode{d} + + err := dn.fillMissingInfo() + if err != nil { + return err + } + dev := d.ToOCI() + if dev.UID == nil && spec.Process != nil { + if uid := spec.Process.User.UID; uid > 0 { + dev.UID = &uid + } + } + if dev.GID == nil && spec.Process != nil { + if gid := spec.Process.User.GID; gid > 0 { + dev.GID = &gid + } + } + + specgen.RemoveDevice(dev.Path) + specgen.AddDevice(dev) + + if dev.Type == "b" || dev.Type == "c" { + access := d.Permissions + if access == "" { + access = "rwm" + } + specgen.AddLinuxResourcesDevice(true, dev.Type, &dev.Major, &dev.Minor, access) + } + } + + if len(e.Mounts) > 0 { + for _, m := range e.Mounts { + specgen.RemoveMount(m.ContainerPath) + specgen.AddMount(m.ToOCI()) + } + sortMounts(&specgen) + } + + for _, h := range e.Hooks { + switch h.HookName { + case PrestartHook: + specgen.AddPreStartHook(h.ToOCI()) + case PoststartHook: + specgen.AddPostStartHook(h.ToOCI()) + case PoststopHook: + specgen.AddPostStopHook(h.ToOCI()) + // TODO: Maybe runtime-tools/generate should be updated with these... + case CreateRuntimeHook: + ensureOCIHooks(spec) + spec.Hooks.CreateRuntime = append(spec.Hooks.CreateRuntime, h.ToOCI()) + case CreateContainerHook: + ensureOCIHooks(spec) + spec.Hooks.CreateContainer = append(spec.Hooks.CreateContainer, h.ToOCI()) + case StartContainerHook: + ensureOCIHooks(spec) + spec.Hooks.StartContainer = append(spec.Hooks.StartContainer, h.ToOCI()) + default: + return fmt.Errorf("unknown hook name %q", h.HookName) + } + } + + return nil +} + +// Validate container edits. +func (e *ContainerEdits) Validate() error { + if e == nil || e.ContainerEdits == nil { + return nil + } + + if err := ValidateEnv(e.Env); err != nil { + return fmt.Errorf("invalid container edits: %w", err) + } + for _, d := range e.DeviceNodes { + if err := (&DeviceNode{d}).Validate(); err != nil { + return err + } + } + for _, h := range e.Hooks { + if err := (&Hook{h}).Validate(); err != nil { + return err + } + } + for _, m := range e.Mounts { + if err := (&Mount{m}).Validate(); err != nil { + return err + } + } + + return nil +} + +// Append other edits into this one. If called with a nil receiver, +// allocates and returns newly allocated edits. +func (e *ContainerEdits) Append(o *ContainerEdits) *ContainerEdits { + if o == nil || o.ContainerEdits == nil { + return e + } + if e == nil { + e = &ContainerEdits{} + } + if e.ContainerEdits == nil { + e.ContainerEdits = &specs.ContainerEdits{} + } + + e.Env = append(e.Env, o.Env...) + e.DeviceNodes = append(e.DeviceNodes, o.DeviceNodes...) + e.Hooks = append(e.Hooks, o.Hooks...) + e.Mounts = append(e.Mounts, o.Mounts...) + + return e +} + +// isEmpty returns true if these edits are empty. This is valid in a +// global Spec context but invalid in a Device context. +func (e *ContainerEdits) isEmpty() bool { + if e == nil { + return false + } + return len(e.Env)+len(e.DeviceNodes)+len(e.Hooks)+len(e.Mounts) == 0 +} + +// ValidateEnv validates the given environment variables. +func ValidateEnv(env []string) error { + for _, v := range env { + if strings.IndexByte(v, byte('=')) <= 0 { + return fmt.Errorf("invalid environment variable %q", v) + } + } + return nil +} + +// DeviceNode is a CDI Spec DeviceNode wrapper, used for validating DeviceNodes. +type DeviceNode struct { + *specs.DeviceNode +} + +// Validate a CDI Spec DeviceNode. +func (d *DeviceNode) Validate() error { + validTypes := map[string]struct{}{ + "": {}, + "b": {}, + "c": {}, + "u": {}, + "p": {}, + } + + if d.Path == "" { + return errors.New("invalid (empty) device path") + } + if _, ok := validTypes[d.Type]; !ok { + return fmt.Errorf("device %q: invalid type %q", d.Path, d.Type) + } + for _, bit := range d.Permissions { + if bit != 'r' && bit != 'w' && bit != 'm' { + return fmt.Errorf("device %q: invalid persmissions %q", + d.Path, d.Permissions) + } + } + return nil +} + +// Hook is a CDI Spec Hook wrapper, used for validating hooks. +type Hook struct { + *specs.Hook +} + +// Validate a hook. +func (h *Hook) Validate() error { + if _, ok := validHookNames[h.HookName]; !ok { + return fmt.Errorf("invalid hook name %q", h.HookName) + } + if h.Path == "" { + return fmt.Errorf("invalid hook %q with empty path", h.HookName) + } + if err := ValidateEnv(h.Env); err != nil { + return fmt.Errorf("invalid hook %q: %w", h.HookName, err) + } + return nil +} + +// Mount is a CDI Mount wrapper, used for validating mounts. +type Mount struct { + *specs.Mount +} + +// Validate a mount. +func (m *Mount) Validate() error { + if m.HostPath == "" { + return errors.New("invalid mount, empty host path") + } + if m.ContainerPath == "" { + return errors.New("invalid mount, empty container path") + } + return nil +} + +// Ensure OCI Spec hooks are not nil so we can add hooks. +func ensureOCIHooks(spec *oci.Spec) { + if spec.Hooks == nil { + spec.Hooks = &oci.Hooks{} + } +} + +// sortMounts sorts the mounts in the given OCI Spec. +func sortMounts(specgen *ocigen.Generator) { + mounts := specgen.Mounts() + specgen.ClearMounts() + sort.Sort(orderedMounts(mounts)) + specgen.Config.Mounts = mounts +} + +// orderedMounts defines how to sort an OCI Spec Mount slice. +// This is the almost the same implementation sa used by CRI-O and Docker, +// with a minor tweak for stable sorting order (easier to test): +// +// https://github.com/moby/moby/blob/17.05.x/daemon/volumes.go#L26 +type orderedMounts []oci.Mount + +// Len returns the number of mounts. Used in sorting. +func (m orderedMounts) Len() int { + return len(m) +} + +// Less returns true if the number of parts (a/b/c would be 3 parts) in the +// mount indexed by parameter 1 is less than that of the mount indexed by +// parameter 2. Used in sorting. +func (m orderedMounts) Less(i, j int) bool { + ip, jp := m.parts(i), m.parts(j) + if ip < jp { + return true + } + if jp < ip { + return false + } + return m[i].Destination < m[j].Destination +} + +// Swap swaps two items in an array of mounts. Used in sorting +func (m orderedMounts) Swap(i, j int) { + m[i], m[j] = m[j], m[i] +} + +// parts returns the number of parts in the destination of a mount. Used in sorting. +func (m orderedMounts) parts(i int) int { + return strings.Count(filepath.Clean(m[i].Destination), string(os.PathSeparator)) +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_unix.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_unix.go new file mode 100644 index 0000000..11a4cfe --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_unix.go @@ -0,0 +1,57 @@ +//go:build !windows +// +build !windows + +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "fmt" + + runc "github.com/opencontainers/runc/libcontainer/devices" +) + +// fillMissingInfo fills in missing mandatory attributes from the host device. +func (d *DeviceNode) fillMissingInfo() error { + if d.HostPath == "" { + d.HostPath = d.Path + } + + if d.Type != "" && (d.Major != 0 || d.Type == "p") { + return nil + } + + hostDev, err := runc.DeviceFromPath(d.HostPath, "rwm") + if err != nil { + return fmt.Errorf("failed to stat CDI host device %q: %w", d.HostPath, err) + } + + if d.Type == "" { + d.Type = string(hostDev.Type) + } else { + if d.Type != string(hostDev.Type) { + return fmt.Errorf("CDI device (%q, %q), host type mismatch (%s, %s)", + d.Path, d.HostPath, d.Type, string(hostDev.Type)) + } + } + if d.Major == 0 && d.Type != "p" { + d.Major = hostDev.Major + d.Minor = hostDev.Minor + } + + return nil +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_windows.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_windows.go new file mode 100644 index 0000000..fd91afa --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/container-edits_windows.go @@ -0,0 +1,27 @@ +//go:build windows +// +build windows + +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import "fmt" + +// fillMissingInfo fills in missing mandatory attributes from the host device. +func (d *DeviceNode) fillMissingInfo() error { + return fmt.Errorf("unimplemented") +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/device.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/device.go new file mode 100644 index 0000000..7b16a31 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/device.go @@ -0,0 +1,79 @@ +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "fmt" + + cdi "github.com/container-orchestrated-devices/container-device-interface/specs-go" + oci "github.com/opencontainers/runtime-spec/specs-go" +) + +// Device represents a CDI device of a Spec. +type Device struct { + *cdi.Device + spec *Spec +} + +// Create a new Device, associate it with the given Spec. +func newDevice(spec *Spec, d cdi.Device) (*Device, error) { + dev := &Device{ + Device: &d, + spec: spec, + } + + if err := dev.validate(); err != nil { + return nil, err + } + + return dev, nil +} + +// GetSpec returns the Spec this device is defined in. +func (d *Device) GetSpec() *Spec { + return d.spec +} + +// GetQualifiedName returns the qualified name for this device. +func (d *Device) GetQualifiedName() string { + return QualifiedName(d.spec.GetVendor(), d.spec.GetClass(), d.Name) +} + +// ApplyEdits applies the device-speific container edits to an OCI Spec. +func (d *Device) ApplyEdits(ociSpec *oci.Spec) error { + return d.edits().Apply(ociSpec) +} + +// edits returns the applicable container edits for this spec. +func (d *Device) edits() *ContainerEdits { + return &ContainerEdits{&d.ContainerEdits} +} + +// Validate the device. +func (d *Device) validate() error { + if err := ValidateDeviceName(d.Name); err != nil { + return err + } + edits := d.edits() + if edits.isEmpty() { + return fmt.Errorf("invalid device, empty device edits") + } + if err := edits.Validate(); err != nil { + return fmt.Errorf("invalid device %q: %w", d.Name, err) + } + return nil +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/doc.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/doc.go new file mode 100644 index 0000000..ab063a1 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/doc.go @@ -0,0 +1,272 @@ +// Package cdi has the primary purpose of providing an API for +// interacting with CDI and consuming CDI devices. +// +// For more information about Container Device Interface, please refer to +// https://github.com/container-orchestrated-devices/container-device-interface +// +// Container Device Interface +// +// Container Device Interface, or CDI for short, provides comprehensive +// third party device support for container runtimes. CDI uses vendor +// provided specification files, CDI Specs for short, to describe how a +// container's runtime environment should be modified when one or more +// of the vendor-specific devices is injected into the container. Beyond +// describing the low level platform-specific details of how to gain +// basic access to a device, CDI Specs allow more fine-grained device +// initialization, and the automatic injection of any necessary vendor- +// or device-specific software that might be required for a container +// to use a device or take full advantage of it. +// +// In the CDI device model containers request access to a device using +// fully qualified device names, qualified names for short, consisting of +// a vendor identifier, a device class and a device name or identifier. +// These pieces of information together uniquely identify a device among +// all device vendors, classes and device instances. +// +// This package implements an API for easy consumption of CDI. The API +// implements discovery, loading and caching of CDI Specs and injection +// of CDI devices into containers. This is the most common functionality +// the vast majority of CDI consumers need. The API should be usable both +// by OCI runtime clients and runtime implementations. +// +// CDI Registry +// +// The primary interface to interact with CDI devices is the Registry. It +// is essentially a cache of all Specs and devices discovered in standard +// CDI directories on the host. The registry has two main functionality, +// injecting devices into an OCI Spec and refreshing the cache of CDI +// Specs and devices. +// +// Device Injection +// +// Using the Registry one can inject CDI devices into a container with code +// similar to the following snippet: +// +// import ( +// "fmt" +// "strings" +// +// log "github.com/sirupsen/logrus" +// +// "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" +// oci "github.com/opencontainers/runtime-spec/specs-go" +// ) +// +// func injectCDIDevices(spec *oci.Spec, devices []string) error { +// log.Debug("pristine OCI Spec: %s", dumpSpec(spec)) +// +// unresolved, err := cdi.GetRegistry().InjectDevices(spec, devices) +// if err != nil { +// return fmt.Errorf("CDI device injection failed: %w", err) +// } +// +// log.Debug("CDI-updated OCI Spec: %s", dumpSpec(spec)) +// return nil +// } +// +// Cache Refresh +// +// By default the CDI Spec cache monitors the configured Spec directories +// and automatically refreshes itself when necessary. This behavior can be +// disabled using the WithAutoRefresh(false) option. +// +// Failure to set up monitoring for a Spec directory causes the directory to +// get ignored and an error to be recorded among the Spec directory errors. +// These errors can be queried using the GetSpecDirErrors() function. If the +// error condition is transient, for instance a missing directory which later +// gets created, the corresponding error will be removed once the condition +// is over. +// +// With auto-refresh enabled injecting any CDI devices can be done without +// an explicit call to Refresh(), using a code snippet similar to the +// following: +// +// In a runtime implementation one typically wants to make sure the +// CDI Spec cache is up to date before performing device injection. +// A code snippet similar to the following accmplishes that: +// +// import ( +// "fmt" +// "strings" +// +// log "github.com/sirupsen/logrus" +// +// "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" +// oci "github.com/opencontainers/runtime-spec/specs-go" +// ) +// +// func injectCDIDevices(spec *oci.Spec, devices []string) error { +// registry := cdi.GetRegistry() +// +// if err := registry.Refresh(); err != nil { +// // Note: +// // It is up to the implementation to decide whether +// // to abort injection on errors. A failed Refresh() +// // does not necessarily render the registry unusable. +// // For instance, a parse error in a Spec file for +// // vendor A does not have any effect on devices of +// // vendor B... +// log.Warnf("pre-injection Refresh() failed: %v", err) +// } +// +// log.Debug("pristine OCI Spec: %s", dumpSpec(spec)) +// +// unresolved, err := registry.InjectDevices(spec, devices) +// if err != nil { +// return fmt.Errorf("CDI device injection failed: %w", err) +// } +// +// log.Debug("CDI-updated OCI Spec: %s", dumpSpec(spec)) +// return nil +// } +// +// Generated Spec Files, Multiple Directories, Device Precedence +// +// It is often necessary to generate Spec files dynamically. On some +// systems the available or usable set of CDI devices might change +// dynamically which then needs to be reflected in CDI Specs. For +// some device classes it makes sense to enumerate the available +// devices at every boot and generate Spec file entries for each +// device found. Some CDI devices might need special client- or +// request-specific configuration which can only be fulfilled by +// dynamically generated client-specific entries in transient Spec +// files. +// +// CDI can collect Spec files from multiple directories. Spec files are +// automatically assigned priorities according to which directory they +// were loaded from. The later a directory occurs in the list of CDI +// directories to scan, the higher priority Spec files loaded from that +// directory are assigned to. When two or more Spec files define the +// same device, conflict is resolved by chosing the definition from the +// Spec file with the highest priority. +// +// The default CDI directory configuration is chosen to encourage +// separating dynamically generated CDI Spec files from static ones. +// The default directories are '/etc/cdi' and '/var/run/cdi'. By putting +// dynamically generated Spec files under '/var/run/cdi', those take +// precedence over static ones in '/etc/cdi'. With this scheme, static +// Spec files, typically installed by distro-specific packages, go into +// '/etc/cdi' while all the dynamically generated Spec files, transient +// or other, go into '/var/run/cdi'. +// +// Spec File Generation +// +// CDI offers two functions for writing and removing dynamically generated +// Specs from CDI Spec directories. These functions, WriteSpec() and +// RemoveSpec() implicitly follow the principle of separating dynamic Specs +// from the rest and therefore always write to and remove Specs from the +// last configured directory. +// +// Corresponding functions are also provided for generating names for Spec +// files. These functions follow a simple naming convention to ensure that +// multiple entities generating Spec files simultaneously on the same host +// do not end up using conflicting Spec file names. GenerateSpecName(), +// GenerateNameForSpec(), GenerateTransientSpecName(), and +// GenerateTransientNameForSpec() all generate names which can be passed +// as such to WriteSpec() and subsequently to RemoveSpec(). +// +// Generating a Spec file for a vendor/device class can be done with a +// code snippet similar to the following: +// +// import ( +// "fmt" +// ... +// "github.com/container-orchestrated-devices/container-device-interface/specs-go" +// "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" +// ) +// +// func generateDeviceSpecs() error { +// registry := cdi.GetRegistry() +// spec := &specs.Spec{ +// Version: specs.CurrentVersion, +// Kind: vendor+"/"+class, +// } +// +// for _, dev := range enumerateDevices() { +// spec.Devices = append(spec.Devices, specs.Device{ +// Name: dev.Name, +// ContainerEdits: getContainerEditsForDevice(dev), +// }) +// } +// +// specName, err := cdi.GenerateNameForSpec(spec) +// if err != nil { +// return fmt.Errorf("failed to generate Spec name: %w", err) +// } +// +// return registry.SpecDB().WriteSpec(spec, specName) +// } +// +// Similary, generating and later cleaning up transient Spec files can be +// done with code fragments similar to the following. These transient Spec +// files are temporary Spec files with container-specific parametrization. +// They are typically created before the associated container is created +// and removed once that container is removed. +// +// import ( +// "fmt" +// ... +// "github.com/container-orchestrated-devices/container-device-interface/specs-go" +// "github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" +// ) +// +// func generateTransientSpec(ctr Container) error { +// registry := cdi.GetRegistry() +// devices := getContainerDevs(ctr, vendor, class) +// spec := &specs.Spec{ +// Version: specs.CurrentVersion, +// Kind: vendor+"/"+class, +// } +// +// for _, dev := range devices { +// spec.Devices = append(spec.Devices, specs.Device{ +// // the generated name needs to be unique within the +// // vendor/class domain on the host/node. +// Name: generateUniqueDevName(dev, ctr), +// ContainerEdits: getEditsForContainer(dev), +// }) +// } +// +// // transientID is expected to guarantee that the Spec file name +// // generated using is unique within +// // the host/node. If more than one device is allocated with the +// // same vendor/class domain, either all generated Spec entries +// // should go to a single Spec file (like in this sample snippet), +// // or transientID should be unique for each generated Spec file. +// transientID := getSomeSufficientlyUniqueIDForContainer(ctr) +// specName, err := cdi.GenerateNameForTransientSpec(vendor, class, transientID) +// if err != nil { +// return fmt.Errorf("failed to generate Spec name: %w", err) +// } +// +// return registry.SpecDB().WriteSpec(spec, specName) +// } +// +// func removeTransientSpec(ctr Container) error { +// registry := cdi.GetRegistry() +// transientID := getSomeSufficientlyUniqueIDForContainer(ctr) +// specName := cdi.GenerateNameForTransientSpec(vendor, class, transientID) +// +// return registry.SpecDB().RemoveSpec(specName) +// } +// +// CDI Spec Validation +// +// This package performs both syntactic and semantic validation of CDI +// Spec file data when a Spec file is loaded via the registry or using +// the ReadSpec API function. As part of the semantic verification, the +// Spec file is verified against the CDI Spec JSON validation schema. +// +// If a valid externally provided JSON validation schema is found in +// the filesystem at /etc/cdi/schema/schema.json it is loaded and used +// as the default validation schema. If such a file is not found or +// fails to load, an embedded no-op schema is used. +// +// The used validation schema can also be changed programmatically using +// the SetSchema API convenience function. This function also accepts +// the special "builtin" (BuiltinSchemaName) and "none" (NoneSchemaName) +// schema names which switch the used schema to the in-repo validation +// schema embedded into the binary or the now default no-op schema +// correspondingly. Other names are interpreted as the path to the actual +// validation schema to load and use. +package cdi diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/qualified-device.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/qualified-device.go new file mode 100644 index 0000000..4fe3cfe --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/qualified-device.go @@ -0,0 +1,205 @@ +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "fmt" + "strings" +) + +// QualifiedName returns the qualified name for a device. +// The syntax for a qualified device names is +// "/=". +// A valid vendor name may contain the following runes: +// 'A'-'Z', 'a'-'z', '0'-'9', '.', '-', '_'. +// A valid class name may contain the following runes: +// 'A'-'Z', 'a'-'z', '0'-'9', '-', '_'. +// A valid device name may containe the following runes: +// 'A'-'Z', 'a'-'z', '0'-'9', '-', '_', '.', ':' +func QualifiedName(vendor, class, name string) string { + return vendor + "/" + class + "=" + name +} + +// IsQualifiedName tests if a device name is qualified. +func IsQualifiedName(device string) bool { + _, _, _, err := ParseQualifiedName(device) + return err == nil +} + +// ParseQualifiedName splits a qualified name into device vendor, class, +// and name. If the device fails to parse as a qualified name, or if any +// of the split components fail to pass syntax validation, vendor and +// class are returned as empty, together with the verbatim input as the +// name and an error describing the reason for failure. +func ParseQualifiedName(device string) (string, string, string, error) { + vendor, class, name := ParseDevice(device) + + if vendor == "" { + return "", "", device, fmt.Errorf("unqualified device %q, missing vendor", device) + } + if class == "" { + return "", "", device, fmt.Errorf("unqualified device %q, missing class", device) + } + if name == "" { + return "", "", device, fmt.Errorf("unqualified device %q, missing device name", device) + } + + if err := ValidateVendorName(vendor); err != nil { + return "", "", device, fmt.Errorf("invalid device %q: %w", device, err) + } + if err := ValidateClassName(class); err != nil { + return "", "", device, fmt.Errorf("invalid device %q: %w", device, err) + } + if err := ValidateDeviceName(name); err != nil { + return "", "", device, fmt.Errorf("invalid device %q: %w", device, err) + } + + return vendor, class, name, nil +} + +// ParseDevice tries to split a device name into vendor, class, and name. +// If this fails, for instance in the case of unqualified device names, +// ParseDevice returns an empty vendor and class together with name set +// to the verbatim input. +func ParseDevice(device string) (string, string, string) { + if device == "" || device[0] == '/' { + return "", "", device + } + + parts := strings.SplitN(device, "=", 2) + if len(parts) != 2 || parts[0] == "" || parts[1] == "" { + return "", "", device + } + + name := parts[1] + vendor, class := ParseQualifier(parts[0]) + if vendor == "" { + return "", "", device + } + + return vendor, class, name +} + +// ParseQualifier splits a device qualifier into vendor and class. +// The syntax for a device qualifier is +// "/" +// If parsing fails, an empty vendor and the class set to the +// verbatim input is returned. +func ParseQualifier(kind string) (string, string) { + parts := strings.SplitN(kind, "/", 2) + if len(parts) != 2 || parts[0] == "" || parts[1] == "" { + return "", kind + } + return parts[0], parts[1] +} + +// ValidateVendorName checks the validity of a vendor name. +// A vendor name may contain the following ASCII characters: +// - upper- and lowercase letters ('A'-'Z', 'a'-'z') +// - digits ('0'-'9') +// - underscore, dash, and dot ('_', '-', and '.') +func ValidateVendorName(vendor string) error { + if vendor == "" { + return fmt.Errorf("invalid (empty) vendor name") + } + if !isLetter(rune(vendor[0])) { + return fmt.Errorf("invalid vendor %q, should start with letter", vendor) + } + for _, c := range string(vendor[1 : len(vendor)-1]) { + switch { + case isAlphaNumeric(c): + case c == '_' || c == '-' || c == '.': + default: + return fmt.Errorf("invalid character '%c' in vendor name %q", + c, vendor) + } + } + if !isAlphaNumeric(rune(vendor[len(vendor)-1])) { + return fmt.Errorf("invalid vendor %q, should end with a letter or digit", vendor) + } + + return nil +} + +// ValidateClassName checks the validity of class name. +// A class name may contain the following ASCII characters: +// - upper- and lowercase letters ('A'-'Z', 'a'-'z') +// - digits ('0'-'9') +// - underscore and dash ('_', '-') +func ValidateClassName(class string) error { + if class == "" { + return fmt.Errorf("invalid (empty) device class") + } + if !isLetter(rune(class[0])) { + return fmt.Errorf("invalid class %q, should start with letter", class) + } + for _, c := range string(class[1 : len(class)-1]) { + switch { + case isAlphaNumeric(c): + case c == '_' || c == '-': + default: + return fmt.Errorf("invalid character '%c' in device class %q", + c, class) + } + } + if !isAlphaNumeric(rune(class[len(class)-1])) { + return fmt.Errorf("invalid class %q, should end with a letter or digit", class) + } + return nil +} + +// ValidateDeviceName checks the validity of a device name. +// A device name may contain the following ASCII characters: +// - upper- and lowercase letters ('A'-'Z', 'a'-'z') +// - digits ('0'-'9') +// - underscore, dash, dot, colon ('_', '-', '.', ':') +func ValidateDeviceName(name string) error { + if name == "" { + return fmt.Errorf("invalid (empty) device name") + } + if !isAlphaNumeric(rune(name[0])) { + return fmt.Errorf("invalid class %q, should start with a letter or digit", name) + } + if len(name) == 1 { + return nil + } + for _, c := range string(name[1 : len(name)-1]) { + switch { + case isAlphaNumeric(c): + case c == '_' || c == '-' || c == '.' || c == ':': + default: + return fmt.Errorf("invalid character '%c' in device name %q", + c, name) + } + } + if !isAlphaNumeric(rune(name[len(name)-1])) { + return fmt.Errorf("invalid name %q, should end with a letter or digit", name) + } + return nil +} + +func isLetter(c rune) bool { + return ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') +} + +func isDigit(c rune) bool { + return '0' <= c && c <= '9' +} + +func isAlphaNumeric(c rune) bool { + return isLetter(c) || isDigit(c) +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/registry.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/registry.go new file mode 100644 index 0000000..10fab89 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/registry.go @@ -0,0 +1,152 @@ +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "sync" + + cdi "github.com/container-orchestrated-devices/container-device-interface/specs-go" + oci "github.com/opencontainers/runtime-spec/specs-go" +) + +// +// Registry keeps a cache of all CDI Specs installed or generated on +// the host. Registry is the primary interface clients should use to +// interact with CDI. +// +// The most commonly used Registry functions are for refreshing the +// registry and injecting CDI devices into an OCI Spec. +// +type Registry interface { + RegistryResolver + RegistryRefresher + DeviceDB() RegistryDeviceDB + SpecDB() RegistrySpecDB +} + +// RegistryRefresher is the registry interface for refreshing the +// cache of CDI Specs and devices. +// +// Configure reconfigures the registry with the given options. +// +// Refresh rescans all CDI Spec directories and updates the +// state of the cache to reflect any changes. It returns any +// errors encountered during the refresh. +// +// GetErrors returns all errors encountered for any of the scanned +// Spec files during the last cache refresh. +// +// GetSpecDirectories returns the set up CDI Spec directories +// currently in use. The directories are returned in the scan +// order of Refresh(). +// +// GetSpecDirErrors returns any errors related to the configured +// Spec directories. +type RegistryRefresher interface { + Configure(...Option) error + Refresh() error + GetErrors() map[string][]error + GetSpecDirectories() []string + GetSpecDirErrors() map[string]error +} + +// RegistryResolver is the registry interface for injecting CDI +// devices into an OCI Spec. +// +// InjectDevices takes an OCI Spec and injects into it a set of +// CDI devices given by qualified name. It returns the names of +// any unresolved devices and an error if injection fails. +type RegistryResolver interface { + InjectDevices(spec *oci.Spec, device ...string) (unresolved []string, err error) +} + +// RegistryDeviceDB is the registry interface for querying devices. +// +// GetDevice returns the CDI device for the given qualified name. If +// the device is not GetDevice returns nil. +// +// ListDevices returns a slice with the names of qualified device +// known. The returned slice is sorted. +type RegistryDeviceDB interface { + GetDevice(device string) *Device + ListDevices() []string +} + +// RegistrySpecDB is the registry interface for querying CDI Specs. +// +// ListVendors returns a slice with all vendors known. The returned +// slice is sorted. +// +// ListClasses returns a slice with all classes known. The returned +// slice is sorted. +// +// GetVendorSpecs returns a slice of all Specs for the vendor. +// +// GetSpecErrors returns any errors for the Spec encountered during +// the last cache refresh. +// +// WriteSpec writes the Spec with the given content and name to the +// last Spec directory. +type RegistrySpecDB interface { + ListVendors() []string + ListClasses() []string + GetVendorSpecs(vendor string) []*Spec + GetSpecErrors(*Spec) []error + WriteSpec(raw *cdi.Spec, name string) error + RemoveSpec(name string) error +} + +type registry struct { + *Cache +} + +var _ Registry = ®istry{} + +var ( + reg *registry + initOnce sync.Once +) + +// GetRegistry returns the CDI registry. If any options are given, those +// are applied to the registry. +func GetRegistry(options ...Option) Registry { + var new bool + initOnce.Do(func() { + reg, _ = getRegistry(options...) + new = true + }) + if !new && len(options) > 0 { + reg.Configure(options...) + reg.Refresh() + } + return reg +} + +// DeviceDB returns the registry interface for querying devices. +func (r *registry) DeviceDB() RegistryDeviceDB { + return r +} + +// SpecDB returns the registry interface for querying Specs. +func (r *registry) SpecDB() RegistrySpecDB { + return r +} + +func getRegistry(options ...Option) (*registry, error) { + c, err := NewCache(options...) + return ®istry{c}, err +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec-dirs.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec-dirs.go new file mode 100644 index 0000000..f339349 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec-dirs.go @@ -0,0 +1,114 @@ +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "errors" + "io/fs" + "os" + "path/filepath" +) + +const ( + // DefaultStaticDir is the default directory for static CDI Specs. + DefaultStaticDir = "/etc/cdi" + // DefaultDynamicDir is the default directory for generated CDI Specs + DefaultDynamicDir = "/var/run/cdi" +) + +var ( + // DefaultSpecDirs is the default Spec directory configuration. + // While altering this variable changes the package defaults, + // the preferred way of overriding the default directories is + // to use a WithSpecDirs options. Otherwise the change is only + // effective if it takes place before creating the Registry or + // other Cache instances. + DefaultSpecDirs = []string{DefaultStaticDir, DefaultDynamicDir} + // ErrStopScan can be returned from a ScanSpecFunc to stop the scan. + ErrStopScan = errors.New("stop Spec scan") +) + +// WithSpecDirs returns an option to override the CDI Spec directories. +func WithSpecDirs(dirs ...string) Option { + return func(c *Cache) error { + specDirs := make([]string, len(dirs)) + for i, dir := range dirs { + specDirs[i] = filepath.Clean(dir) + } + c.specDirs = specDirs + return nil + } +} + +// scanSpecFunc is a function for processing CDI Spec files. +type scanSpecFunc func(string, int, *Spec, error) error + +// ScanSpecDirs scans the given directories looking for CDI Spec files, +// which are all files with a '.json' or '.yaml' suffix. For every Spec +// file discovered, ScanSpecDirs loads a Spec from the file then calls +// the scan function passing it the path to the file, the priority (the +// index of the directory in the slice of directories given), the Spec +// itself, and any error encountered while loading the Spec. +// +// Scanning stops once all files have been processed or when the scan +// function returns an error. The result of ScanSpecDirs is the error +// returned by the scan function, if any. The special error ErrStopScan +// can be used to terminate the scan gracefully without ScanSpecDirs +// returning an error. ScanSpecDirs silently skips any subdirectories. +func scanSpecDirs(dirs []string, scanFn scanSpecFunc) error { + var ( + spec *Spec + err error + ) + + for priority, dir := range dirs { + err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + // for initial stat failure Walk calls us with nil info + if info == nil { + if errors.Is(err, fs.ErrNotExist) { + return nil + } + return err + } + // first call from Walk is for dir itself, others we skip + if info.IsDir() { + if path == dir { + return nil + } + return filepath.SkipDir + } + + // ignore obviously non-Spec files + if ext := filepath.Ext(path); ext != ".json" && ext != ".yaml" { + return nil + } + + if err != nil { + return scanFn(path, priority, nil, err) + } + + spec, err = ReadSpec(path, priority) + return scanFn(path, priority, spec, err) + }) + + if err != nil && err != ErrStopScan { + return err + } + } + + return nil +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go new file mode 100644 index 0000000..fe20e6d --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec.go @@ -0,0 +1,347 @@ +/* + Copyright © 2021 The CDI Authors + + 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 cdi + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "sync" + + oci "github.com/opencontainers/runtime-spec/specs-go" + "sigs.k8s.io/yaml" + + cdi "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +const ( + // defaultSpecExt is the file extension for the default encoding. + defaultSpecExt = ".yaml" +) + +var ( + // Externally set CDI Spec validation function. + specValidator func(*cdi.Spec) error + validatorLock sync.RWMutex +) + +// Spec represents a single CDI Spec. It is usually loaded from a +// file and stored in a cache. The Spec has an associated priority. +// This priority is inherited from the associated priority of the +// CDI Spec directory that contains the CDI Spec file and is used +// to resolve conflicts if multiple CDI Spec files contain entries +// for the same fully qualified device. +type Spec struct { + *cdi.Spec + vendor string + class string + path string + priority int + devices map[string]*Device +} + +// ReadSpec reads the given CDI Spec file. The resulting Spec is +// assigned the given priority. If reading or parsing the Spec +// data fails ReadSpec returns a nil Spec and an error. +func ReadSpec(path string, priority int) (*Spec, error) { + data, err := ioutil.ReadFile(path) + switch { + case os.IsNotExist(err): + return nil, err + case err != nil: + return nil, fmt.Errorf("failed to read CDI Spec %q: %w", path, err) + } + + raw, err := ParseSpec(data) + if err != nil { + return nil, fmt.Errorf("failed to parse CDI Spec %q: %w", path, err) + } + if raw == nil { + return nil, fmt.Errorf("failed to parse CDI Spec %q, no Spec data", path) + } + + spec, err := newSpec(raw, path, priority) + if err != nil { + return nil, err + } + + return spec, nil +} + +// newSpec creates a new Spec from the given CDI Spec data. The +// Spec is marked as loaded from the given path with the given +// priority. If Spec data validation fails newSpec returns a nil +// Spec and an error. +func newSpec(raw *cdi.Spec, path string, priority int) (*Spec, error) { + err := validateSpec(raw) + if err != nil { + return nil, err + } + + spec := &Spec{ + Spec: raw, + path: filepath.Clean(path), + priority: priority, + } + + if ext := filepath.Ext(spec.path); ext != ".yaml" && ext != ".json" { + spec.path += defaultSpecExt + } + + spec.vendor, spec.class = ParseQualifier(spec.Kind) + + if spec.devices, err = spec.validate(); err != nil { + return nil, fmt.Errorf("invalid CDI Spec: %w", err) + } + + return spec, nil +} + +// Write the CDI Spec to the file associated with it during instantiation +// by newSpec() or ReadSpec(). +func (s *Spec) write(overwrite bool) error { + var ( + data []byte + dir string + tmp *os.File + err error + ) + + err = validateSpec(s.Spec) + if err != nil { + return err + } + + if filepath.Ext(s.path) == ".yaml" { + data, err = yaml.Marshal(s.Spec) + } else { + data, err = json.Marshal(s.Spec) + } + if err != nil { + return fmt.Errorf("failed to marshal Spec file: %w", err) + } + + dir = filepath.Dir(s.path) + err = os.MkdirAll(dir, 0o755) + if err != nil { + return fmt.Errorf("failed to create Spec dir: %w", err) + } + + tmp, err = os.CreateTemp(dir, "spec.*.tmp") + if err != nil { + return fmt.Errorf("failed to create Spec file: %w", err) + } + _, err = tmp.Write(data) + tmp.Close() + if err != nil { + return fmt.Errorf("failed to write Spec file: %w", err) + } + + err = renameIn(dir, filepath.Base(tmp.Name()), filepath.Base(s.path), overwrite) + + if err != nil { + os.Remove(tmp.Name()) + err = fmt.Errorf("failed to write Spec file: %w", err) + } + + return err +} + +// GetVendor returns the vendor of this Spec. +func (s *Spec) GetVendor() string { + return s.vendor +} + +// GetClass returns the device class of this Spec. +func (s *Spec) GetClass() string { + return s.class +} + +// GetDevice returns the device for the given unqualified name. +func (s *Spec) GetDevice(name string) *Device { + return s.devices[name] +} + +// GetPath returns the filesystem path of this Spec. +func (s *Spec) GetPath() string { + return s.path +} + +// GetPriority returns the priority of this Spec. +func (s *Spec) GetPriority() int { + return s.priority +} + +// ApplyEdits applies the Spec's global-scope container edits to an OCI Spec. +func (s *Spec) ApplyEdits(ociSpec *oci.Spec) error { + return s.edits().Apply(ociSpec) +} + +// edits returns the applicable global container edits for this spec. +func (s *Spec) edits() *ContainerEdits { + return &ContainerEdits{&s.ContainerEdits} +} + +// Validate the Spec. +func (s *Spec) validate() (map[string]*Device, error) { + if err := validateVersion(s.Version); err != nil { + return nil, err + } + + minVersion, err := MinimumRequiredVersion(s.Spec) + if err != nil { + return nil, fmt.Errorf("could not determine minumum required version: %v", err) + } + if newVersion(minVersion).IsGreaterThan(newVersion(s.Version)) { + return nil, fmt.Errorf("the spec version must be at least v%v", minVersion) + } + + if err := ValidateVendorName(s.vendor); err != nil { + return nil, err + } + if err := ValidateClassName(s.class); err != nil { + return nil, err + } + if err := s.edits().Validate(); err != nil { + return nil, err + } + + devices := make(map[string]*Device) + for _, d := range s.Devices { + dev, err := newDevice(s, d) + if err != nil { + return nil, fmt.Errorf("failed add device %q: %w", d.Name, err) + } + if _, conflict := devices[d.Name]; conflict { + return nil, fmt.Errorf("invalid spec, multiple device %q", d.Name) + } + devices[d.Name] = dev + } + + return devices, nil +} + +// validateVersion checks whether the specified spec version is supported. +func validateVersion(version string) error { + if !validSpecVersions.isValidVersion(version) { + return fmt.Errorf("invalid version %q", version) + } + + return nil +} + +// ParseSpec parses CDI Spec data into a raw CDI Spec. +func ParseSpec(data []byte) (*cdi.Spec, error) { + var raw *cdi.Spec + err := yaml.UnmarshalStrict(data, &raw) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal CDI Spec: %w", err) + } + return raw, nil +} + +// SetSpecValidator sets a CDI Spec validator function. This function +// is used for extra CDI Spec content validation whenever a Spec file +// loaded (using ReadSpec() or written (using WriteSpec()). +func SetSpecValidator(fn func(*cdi.Spec) error) { + validatorLock.Lock() + defer validatorLock.Unlock() + specValidator = fn +} + +// validateSpec validates the Spec using the extneral validator. +func validateSpec(raw *cdi.Spec) error { + validatorLock.RLock() + defer validatorLock.RUnlock() + + if specValidator == nil { + return nil + } + err := specValidator(raw) + if err != nil { + return fmt.Errorf("Spec validation failed: %w", err) + } + return nil +} + +// GenerateSpecName generates a vendor+class scoped Spec file name. The +// name can be passed to WriteSpec() to write a Spec file to the file +// system. +// +// vendor and class should match the vendor and class of the CDI Spec. +// The file name is generated without a ".json" or ".yaml" extension. +// The caller can append the desired extension to choose a particular +// encoding. Otherwise WriteSpec() will use its default encoding. +// +// This function always returns the same name for the same vendor/class +// combination. Therefore it cannot be used as such to generate multiple +// Spec file names for a single vendor and class. +func GenerateSpecName(vendor, class string) string { + return vendor + "-" + class +} + +// GenerateTransientSpecName generates a vendor+class scoped transient +// Spec file name. The name can be passed to WriteSpec() to write a Spec +// file to the file system. +// +// Transient Specs are those whose lifecycle is tied to that of some +// external entity, for instance a container. vendor and class should +// match the vendor and class of the CDI Spec. transientID should be +// unique among all CDI users on the same host that might generate +// transient Spec files using the same vendor/class combination. If +// the external entity to which the lifecycle of the tranient Spec +// is tied to has a unique ID of its own, then this is usually a +// good choice for transientID. +// +// The file name is generated without a ".json" or ".yaml" extension. +// The caller can append the desired extension to choose a particular +// encoding. Otherwise WriteSpec() will use its default encoding. +func GenerateTransientSpecName(vendor, class, transientID string) string { + transientID = strings.ReplaceAll(transientID, "/", "_") + return GenerateSpecName(vendor, class) + "_" + transientID +} + +// GenerateNameForSpec generates a name for the given Spec using +// GenerateSpecName with the vendor and class taken from the Spec. +// On success it returns the generated name and a nil error. If +// the Spec does not contain a valid vendor or class, it returns +// an empty name and a non-nil error. +func GenerateNameForSpec(raw *cdi.Spec) (string, error) { + vendor, class := ParseQualifier(raw.Kind) + if vendor == "" { + return "", fmt.Errorf("invalid vendor/class %q in Spec", raw.Kind) + } + + return GenerateSpecName(vendor, class), nil +} + +// GenerateNameForTransientSpec generates a name for the given transient +// Spec using GenerateTransientSpecName with the vendor and class taken +// from the Spec. On success it returns the generated name and a nil error. +// If the Spec does not contain a valid vendor or class, it returns an +// an empty name and a non-nil error. +func GenerateNameForTransientSpec(raw *cdi.Spec, transientID string) (string, error) { + vendor, class := ParseQualifier(raw.Kind) + if vendor == "" { + return "", fmt.Errorf("invalid vendor/class %q in Spec", raw.Kind) + } + + return GenerateTransientSpecName(vendor, class, transientID), nil +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec_linux.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec_linux.go new file mode 100644 index 0000000..9ad2739 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec_linux.go @@ -0,0 +1,48 @@ +/* + Copyright © 2022 The CDI Authors + + 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 cdi + +import ( + "fmt" + "os" + + "golang.org/x/sys/unix" +) + +// Rename src to dst, both relative to the directory dir. If dst already exists +// refuse renaming with an error unless overwrite is explicitly asked for. +func renameIn(dir, src, dst string, overwrite bool) error { + var flags uint + + dirf, err := os.Open(dir) + if err != nil { + return fmt.Errorf("rename failed: %w", err) + } + defer dirf.Close() + + if !overwrite { + flags = unix.RENAME_NOREPLACE + } + + dirFd := int(dirf.Fd()) + err = unix.Renameat2(dirFd, src, dirFd, dst, flags) + if err != nil { + return fmt.Errorf("rename failed: %w", err) + } + + return nil +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec_other.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec_other.go new file mode 100644 index 0000000..285e04e --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/spec_other.go @@ -0,0 +1,39 @@ +//go:build !linux +// +build !linux + +/* + Copyright © 2022 The CDI Authors + + 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 cdi + +import ( + "os" + "path/filepath" +) + +// Rename src to dst, both relative to the directory dir. If dst already exists +// refuse renaming with an error unless overwrite is explicitly asked for. +func renameIn(dir, src, dst string, overwrite bool) error { + src = filepath.Join(dir, src) + dst = filepath.Join(dir, dst) + + _, err := os.Stat(dst) + if err == nil && !overwrite { + return os.ErrExist + } + + return os.Rename(src, dst) +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/version.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/version.go new file mode 100644 index 0000000..08b36a3 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/pkg/cdi/version.go @@ -0,0 +1,160 @@ +/* + Copyright © The CDI Authors + + 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 cdi + +import ( + "strings" + + "golang.org/x/mod/semver" + + cdi "github.com/container-orchestrated-devices/container-device-interface/specs-go" +) + +const ( + // CurrentVersion is the current version of the CDI Spec. + CurrentVersion = cdi.CurrentVersion + + // vCurrent is the current version as a semver-comparable type + vCurrent version = "v" + CurrentVersion + + // These represent the released versions of the CDI specification + v010 version = "v0.1.0" + v020 version = "v0.2.0" + v030 version = "v0.3.0" + v040 version = "v0.4.0" + v050 version = "v0.5.0" + + // vEarliest is the earliest supported version of the CDI specification + vEarliest version = v030 +) + +// validSpecVersions stores a map of spec versions to functions to check the required versions. +// Adding new fields / spec versions requires that a `requiredFunc` be implemented and +// this map be updated. +var validSpecVersions = requiredVersionMap{ + v010: nil, + v020: nil, + v030: nil, + v040: requiresV040, + v050: requiresV050, +} + +// MinimumRequiredVersion determines the minumum spec version for the input spec. +func MinimumRequiredVersion(spec *cdi.Spec) (string, error) { + minVersion := validSpecVersions.requiredVersion(spec) + return minVersion.String(), nil +} + +// version represents a semantic version string +type version string + +// newVersion creates a version that can be used for semantic version comparisons. +func newVersion(v string) version { + return version("v" + strings.TrimPrefix(v, "v")) +} + +// String returns the string representation of the version. +// This trims a leading v if present. +func (v version) String() string { + return strings.TrimPrefix(string(v), "v") +} + +// IsGreaterThan checks with a version is greater than the specified version. +func (v version) IsGreaterThan(o version) bool { + return semver.Compare(string(v), string(o)) > 0 +} + +// IsLatest checks whether the version is the latest supported version +func (v version) IsLatest() bool { + return v == vCurrent +} + +type requiredFunc func(*cdi.Spec) bool + +type requiredVersionMap map[version]requiredFunc + +// isValidVersion checks whether the specified version is valid. +// A version is valid if it is contained in the required version map. +func (r requiredVersionMap) isValidVersion(specVersion string) bool { + _, ok := validSpecVersions[newVersion(specVersion)] + + return ok +} + +// requiredVersion returns the minimum version required for the given spec +func (r requiredVersionMap) requiredVersion(spec *cdi.Spec) version { + minVersion := vEarliest + + for v, isRequired := range validSpecVersions { + if isRequired == nil { + continue + } + if isRequired(spec) && v.IsGreaterThan(minVersion) { + minVersion = v + } + // If we have already detected the latest version then no later version could be detected + if minVersion.IsLatest() { + break + } + } + + return minVersion +} + +// requiresV050 returns true if the spec uses v0.5.0 features +func requiresV050(spec *cdi.Spec) bool { + var edits []*cdi.ContainerEdits + + for _, d := range spec.Devices { + // The v0.5.0 spec allowed device names to start with a digit instead of requiring a letter + if len(d.Name) > 0 && !isLetter(rune(d.Name[0])) { + return true + } + edits = append(edits, &d.ContainerEdits) + } + + edits = append(edits, &spec.ContainerEdits) + for _, e := range edits { + for _, dn := range e.DeviceNodes { + // The HostPath field was added in v0.5.0 + if dn.HostPath != "" { + return true + } + } + } + return false +} + +// requiresV040 returns true if the spec uses v0.4.0 features +func requiresV040(spec *cdi.Spec) bool { + var edits []*cdi.ContainerEdits + + for _, d := range spec.Devices { + edits = append(edits, &d.ContainerEdits) + } + + edits = append(edits, &spec.ContainerEdits) + for _, e := range edits { + for _, m := range e.Mounts { + // The Type field was added in v0.4.0 + if m.Type != "" { + return true + } + } + } + return false +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/specs-go/config.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/specs-go/config.go new file mode 100644 index 0000000..3fa2e81 --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/specs-go/config.go @@ -0,0 +1,59 @@ +package specs + +import "os" + +// CurrentVersion is the current version of the Spec. +const CurrentVersion = "0.5.0" + +// Spec is the base configuration for CDI +type Spec struct { + Version string `json:"cdiVersion"` + Kind string `json:"kind"` + + Devices []Device `json:"devices"` + ContainerEdits ContainerEdits `json:"containerEdits,omitempty"` +} + +// Device is a "Device" a container runtime can add to a container +type Device struct { + Name string `json:"name"` + ContainerEdits ContainerEdits `json:"containerEdits"` +} + +// ContainerEdits are edits a container runtime must make to the OCI spec to expose the device. +type ContainerEdits struct { + Env []string `json:"env,omitempty"` + DeviceNodes []*DeviceNode `json:"deviceNodes,omitempty"` + Hooks []*Hook `json:"hooks,omitempty"` + Mounts []*Mount `json:"mounts,omitempty"` +} + +// DeviceNode represents a device node that needs to be added to the OCI spec. +type DeviceNode struct { + Path string `json:"path"` + HostPath string `json:"hostPath,omitempty"` + Type string `json:"type,omitempty"` + Major int64 `json:"major,omitempty"` + Minor int64 `json:"minor,omitempty"` + FileMode *os.FileMode `json:"fileMode,omitempty"` + Permissions string `json:"permissions,omitempty"` + UID *uint32 `json:"uid,omitempty"` + GID *uint32 `json:"gid,omitempty"` +} + +// Mount represents a mount that needs to be added to the OCI spec. +type Mount struct { + HostPath string `json:"hostPath"` + ContainerPath string `json:"containerPath"` + Options []string `json:"options,omitempty"` + Type string `json:"type,omitempty"` +} + +// Hook represents a hook that needs to be added to the OCI spec. +type Hook struct { + HookName string `json:"hookName"` + Path string `json:"path"` + Args []string `json:"args,omitempty"` + Env []string `json:"env,omitempty"` + Timeout *int `json:"timeout,omitempty"` +} diff --git a/vendor/github.com/container-orchestrated-devices/container-device-interface/specs-go/oci.go b/vendor/github.com/container-orchestrated-devices/container-device-interface/specs-go/oci.go new file mode 100644 index 0000000..14a0f6a --- /dev/null +++ b/vendor/github.com/container-orchestrated-devices/container-device-interface/specs-go/oci.go @@ -0,0 +1,113 @@ +package specs + +import ( + "errors" + "fmt" + + spec "github.com/opencontainers/runtime-spec/specs-go" +) + +// ApplyOCIEditsForDevice applies devices OCI edits, in other words +// it finds the device in the CDI spec and applies the OCI patches that device +// requires to the OCI specification. +func ApplyOCIEditsForDevice(config *spec.Spec, cdi *Spec, dev string) error { + for _, d := range cdi.Devices { + if d.Name != dev { + continue + } + + return ApplyEditsToOCISpec(config, &d.ContainerEdits) + } + + return fmt.Errorf("CDI: device %q not found for spec %q", dev, cdi.Kind) +} + +// ApplyOCIEdits applies the OCI edits the CDI spec declares globablly +func ApplyOCIEdits(config *spec.Spec, cdi *Spec) error { + return ApplyEditsToOCISpec(config, &cdi.ContainerEdits) +} + +// ApplyEditsToOCISpec applies the specified edits to the OCI spec. +func ApplyEditsToOCISpec(config *spec.Spec, edits *ContainerEdits) error { + if config == nil { + return errors.New("spec is nil") + } + if edits == nil { + return nil + } + + if len(edits.Env) > 0 { + if config.Process == nil { + config.Process = &spec.Process{} + } + config.Process.Env = append(config.Process.Env, edits.Env...) + } + + for _, d := range edits.DeviceNodes { + if config.Linux == nil { + config.Linux = &spec.Linux{} + } + config.Linux.Devices = append(config.Linux.Devices, d.ToOCI()) + } + + for _, m := range edits.Mounts { + config.Mounts = append(config.Mounts, m.ToOCI()) + } + + for _, h := range edits.Hooks { + if config.Hooks == nil { + config.Hooks = &spec.Hooks{} + } + switch h.HookName { + case "prestart": + config.Hooks.Prestart = append(config.Hooks.Prestart, h.ToOCI()) + case "createRuntime": + config.Hooks.CreateRuntime = append(config.Hooks.CreateRuntime, h.ToOCI()) + case "createContainer": + config.Hooks.CreateContainer = append(config.Hooks.CreateContainer, h.ToOCI()) + case "startContainer": + config.Hooks.StartContainer = append(config.Hooks.StartContainer, h.ToOCI()) + case "poststart": + config.Hooks.Poststart = append(config.Hooks.Poststart, h.ToOCI()) + case "poststop": + config.Hooks.Poststop = append(config.Hooks.Poststop, h.ToOCI()) + default: + fmt.Printf("CDI: Unknown hook %q\n", h.HookName) + } + } + + return nil +} + +// ToOCI returns the opencontainers runtime Spec Hook for this Hook. +func (h *Hook) ToOCI() spec.Hook { + return spec.Hook{ + Path: h.Path, + Args: h.Args, + Env: h.Env, + Timeout: h.Timeout, + } +} + +// ToOCI returns the opencontainers runtime Spec Mount for this Mount. +func (m *Mount) ToOCI() spec.Mount { + return spec.Mount{ + Source: m.HostPath, + Destination: m.ContainerPath, + Options: m.Options, + Type: m.Type, + } +} + +// ToOCI returns the opencontainers runtime Spec LinuxDevice for this DeviceNode. +func (d *DeviceNode) ToOCI() spec.LinuxDevice { + return spec.LinuxDevice{ + Path: d.Path, + Type: d.Type, + Major: d.Major, + Minor: d.Minor, + FileMode: d.FileMode, + UID: d.UID, + GID: d.GID, + } +} diff --git a/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/fsnotify/fsnotify/.editorconfig new file mode 100644 index 0000000..fad8958 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*.go] +indent_style = tab +indent_size = 4 +insert_final_newline = true + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/vendor/github.com/fsnotify/fsnotify/.gitattributes b/vendor/github.com/fsnotify/fsnotify/.gitattributes new file mode 100644 index 0000000..32f1001 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.gitattributes @@ -0,0 +1 @@ +go.sum linguist-generated diff --git a/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/fsnotify/fsnotify/.gitignore new file mode 100644 index 0000000..4cd0cba --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.gitignore @@ -0,0 +1,6 @@ +# Setup a Global .gitignore for OS and editor generated files: +# https://help.github.com/articles/ignoring-files +# git config --global core.excludesfile ~/.gitignore_global + +.vagrant +*.sublime-project diff --git a/vendor/github.com/fsnotify/fsnotify/.mailmap b/vendor/github.com/fsnotify/fsnotify/.mailmap new file mode 100644 index 0000000..a04f290 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.mailmap @@ -0,0 +1,2 @@ +Chris Howey +Nathan Youngman <4566+nathany@users.noreply.github.com> diff --git a/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/fsnotify/fsnotify/AUTHORS new file mode 100644 index 0000000..6cbabe5 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/AUTHORS @@ -0,0 +1,62 @@ +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# You can update this list using the following command: +# +# $ (head -n10 AUTHORS && git shortlog -se | sed -E 's/^\s+[0-9]+\t//') | tee AUTHORS + +# Please keep the list sorted. + +Aaron L +Adrien Bustany +Alexey Kazakov +Amit Krishnan +Anmol Sethi +Bjørn Erik Pedersen +Brian Goff +Bruno Bigras +Caleb Spare +Case Nelson +Chris Howey +Christoffer Buchholz +Daniel Wagner-Hall +Dave Cheney +Eric Lin +Evan Phoenix +Francisco Souza +Gautam Dey +Hari haran +Ichinose Shogo +Johannes Ebke +John C Barstow +Kelvin Fo +Ken-ichirou MATSUZAWA +Matt Layher +Matthias Stone +Nathan Youngman +Nickolai Zeldovich +Oliver Bristow +Patrick +Paul Hammond +Pawel Knap +Pieter Droogendijk +Pratik Shinde +Pursuit92 +Riku Voipio +Rob Figueiredo +Rodrigo Chiossi +Slawek Ligus +Soge Zhang +Tiffany Jernigan +Tilak Sharma +Tobias Klauser +Tom Payne +Travis Cline +Tudor Golubenco +Vahe Khachikyan +Yukang +bronze1man +debrando +henrikedwards +铁哥 diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md new file mode 100644 index 0000000..cc01c08 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md @@ -0,0 +1,357 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [1.5.4] - 2022-04-25 + +* Windows: add missing defer to `Watcher.WatchList` [#447](https://github.com/fsnotify/fsnotify/pull/447) +* go.mod: use latest x/sys [#444](https://github.com/fsnotify/fsnotify/pull/444) +* Fix compilation for OpenBSD [#443](https://github.com/fsnotify/fsnotify/pull/443) + +## [1.5.3] - 2022-04-22 + +* This version is retracted. An incorrect branch is published accidentally [#445](https://github.com/fsnotify/fsnotify/issues/445) + +## [1.5.2] - 2022-04-21 + +* Add a feature to return the directories and files that are being monitored [#374](https://github.com/fsnotify/fsnotify/pull/374) +* Fix potential crash on windows if `raw.FileNameLength` exceeds `syscall.MAX_PATH` [#361](https://github.com/fsnotify/fsnotify/pull/361) +* Allow build on unsupported GOOS [#424](https://github.com/fsnotify/fsnotify/pull/424) +* Don't set `poller.fd` twice in `newFdPoller` [#406](https://github.com/fsnotify/fsnotify/pull/406) +* fix go vet warnings: call to `(*T).Fatalf` from a non-test goroutine [#416](https://github.com/fsnotify/fsnotify/pull/416) + +## [1.5.1] - 2021-08-24 + +* Revert Add AddRaw to not follow symlinks [#394](https://github.com/fsnotify/fsnotify/pull/394) + +## [1.5.0] - 2021-08-20 + +* Go: Increase minimum required version to Go 1.12 [#381](https://github.com/fsnotify/fsnotify/pull/381) +* Feature: Add AddRaw method which does not follow symlinks when adding a watch [#289](https://github.com/fsnotify/fsnotify/pull/298) +* Windows: Follow symlinks by default like on all other systems [#289](https://github.com/fsnotify/fsnotify/pull/289) +* CI: Use GitHub Actions for CI and cover go 1.12-1.17 + [#378](https://github.com/fsnotify/fsnotify/pull/378) + [#381](https://github.com/fsnotify/fsnotify/pull/381) + [#385](https://github.com/fsnotify/fsnotify/pull/385) +* Go 1.14+: Fix unsafe pointer conversion [#325](https://github.com/fsnotify/fsnotify/pull/325) + +## [1.4.7] - 2018-01-09 + +* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) +* Tests: Fix missing verb on format string (thanks @rchiossi) +* Linux: Fix deadlock in Remove (thanks @aarondl) +* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne) +* Docs: Moved FAQ into the README (thanks @vahe) +* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich) +* Docs: replace references to OS X with macOS + +## [1.4.2] - 2016-10-10 + +* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) + +## [1.4.1] - 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + +## [1.4.0] - 2016-10-01 + +* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) + +## [1.3.1] - 2016-06-28 + +* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) + +## [1.3.0] - 2016-04-19 + +* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) + +## [1.2.10] - 2016-03-02 + +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) + +## [1.2.9] - 2016-01-13 + +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) + +## [1.2.8] - 2015-12-17 + +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) +* inotify: fix race in test +* enable race detection for continuous integration (Linux, Mac, Windows) + +## [1.2.5] - 2015-10-17 + +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) + +## [1.2.1] - 2015-10-14 + +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) + +## [1.2.0] - 2015-02-08 + +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) + +## [1.1.1] - 2015-02-05 + +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) + +## [1.1.0] - 2014-12-12 + +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) + * add low-level functions + * only need to store flags on directories + * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) + * done can be an unbuffered channel + * remove calls to os.NewSyscallError +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) +* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## [1.0.4] - 2014-09-07 + +* kqueue: add dragonfly to the build tags. +* Rename source code files, rearrange code so exported APIs are at the top. +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) + +## [1.0.3] - 2014-08-19 + +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) + +## [1.0.2] - 2014-08-17 + +* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) +* [Fix] Make ./path and path equivalent. (thanks @zhsso) + +## [1.0.0] - 2014-08-15 + +* [API] Remove AddWatch on Windows, use Add. +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) +* Minor updates based on feedback from golint. + +## dev / 2014-07-09 + +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) + +## dev / 2014-07-04 + +* kqueue: fix incorrect mutex used in Close() +* Update example to demonstrate usage of Op. + +## dev / 2014-06-28 + +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) +* Fix for String() method on Event (thanks Alex Brainman) +* Don't build on Plan 9 or Solaris (thanks @4ad) + +## dev / 2014-06-21 + +* Events channel of type Event rather than *Event. +* [internal] use syscall constants directly for inotify and kqueue. +* [internal] kqueue: rename events to kevents and fileEvent to event. + +## dev / 2014-06-19 + +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). +* [internal] remove cookie from Event struct (unused). +* [internal] Event struct has the same definition across every OS. +* [internal] remove internal watch and removeWatch methods. + +## dev / 2014-06-12 + +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). +* [API] Pluralized channel names: Events and Errors. +* [API] Renamed FileEvent struct to Event. +* [API] Op constants replace methods like IsCreate(). + +## dev / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## dev / 2014-05-23 + +* [API] Remove current implementation of WatchFlags. + * current implementation doesn't take advantage of OS for efficiency + * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes + * no tests for the current implementation + * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) + +## [0.9.3] - 2014-12-31 + +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## [0.9.2] - 2014-08-17 + +* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) + +## [0.9.1] - 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## [0.9.0] - 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## [0.8.12] - 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## [0.8.11] - 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond) + +## [0.8.10] - 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## [0.8.9] - 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## [0.8.8] - 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## [0.8.7] - 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## [0.8.6] - 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## [0.8.5] - 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## [0.8.4] - 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## [0.8.3] - 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## [0.8.2] - 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## [0.8.1] - 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## [0.8.0] - 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## [0.7.4] - 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## [0.7.3] - 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## [0.7.2] - 2012-09-01 + +* kqueue: events for created directories + +## [0.7.1] - 2012-07-14 + +* [Fix] for renaming files + +## [0.7.0] - 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## [0.6.0] - 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## [0.5.1] - 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## [0.5.0] - 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## [0.4.0] - 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## [0.3.0] - 2012-02-19 + +* kqueue: add files when watch directory + +## [0.2.0] - 2011-12-30 + +* update to latest Go weekly code + +## [0.1.0] - 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md new file mode 100644 index 0000000..8a64256 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md @@ -0,0 +1,60 @@ +# Contributing + +## Issues + +* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). +* Please indicate the platform you are using fsnotify on. +* A code example to reproduce the problem is appreciated. + +## Pull Requests + +### Contributor License Agreement + +fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). + +Please indicate that you have signed the CLA in your pull request. + +### How fsnotify is Developed + +* Development is done on feature branches. +* Tests are run on BSD, Linux, macOS and Windows. +* Pull requests are reviewed and [applied to master][am] using [hub][]. + * Maintainers may modify or squash commits rather than asking contributors to. +* To issue a new release, the maintainers will: + * Update the CHANGELOG + * Tag a version, which will become available through gopkg.in. + +### How to Fork + +For smooth sailing, always use the original import path. Installing with `go get` makes this easy. + +1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Ensure everything works and the tests pass (see below) +4. Commit your changes (`git commit -am 'Add some feature'`) + +Contribute upstream: + +1. Fork fsnotify on GitHub +2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) +3. Push to the branch (`git push fork my-new-feature`) +4. Create a new Pull Request on GitHub + +This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). + +### Testing + +fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows. + +Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. + +### Maintainers + +Help maintaining fsnotify is welcome. To be a maintainer: + +* Submit a pull request and sign the CLA as above. +* You must be able to run the test suite on Mac, Windows, Linux and BSD. + +All code changes should be internal pull requests. + +Releases are tagged using [Semantic Versioning](http://semver.org/). diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE new file mode 100644 index 0000000..e180c8f --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012-2019 fsnotify Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md new file mode 100644 index 0000000..0731c5e --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/README.md @@ -0,0 +1,120 @@ +# File system notifications for Go + +[![Go Reference](https://pkg.go.dev/badge/github.com/fsnotify/fsnotify.svg)](https://pkg.go.dev/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) [![Maintainers Wanted](https://img.shields.io/badge/maintainers-wanted-red.svg)](https://github.com/fsnotify/fsnotify/issues/413) + +fsnotify utilizes [`golang.org/x/sys`](https://pkg.go.dev/golang.org/x/sys) rather than [`syscall`](https://pkg.go.dev/syscall) from the standard library. + +Cross platform: Windows, Linux, BSD and macOS. + +| Adapter | OS | Status | +| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| inotify | Linux 2.6.27 or later, Android\* | Supported | +| kqueue | BSD, macOS, iOS\* | Supported | +| ReadDirectoryChangesW | Windows | Supported | +| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) | +| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/pull/371) | +| fanotify | Linux 2.6.37+ | [Maybe](https://github.com/fsnotify/fsnotify/issues/114) | +| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) | +| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) | + +\* Android and iOS are untested. + +Please see [the documentation](https://pkg.go.dev/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. + +## API stability + +fsnotify is a fork of [howeyc/fsnotify](https://github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). + +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). + +## Usage + +```go +package main + +import ( + "log" + + "github.com/fsnotify/fsnotify" +) + +func main() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + done := make(chan bool) + go func() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + log.Println("event:", event) + if event.Op&fsnotify.Write == fsnotify.Write { + log.Println("modified file:", event.Name) + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + log.Println("error:", err) + } + } + }() + + err = watcher.Add("/tmp/foo") + if err != nil { + log.Fatal(err) + } + <-done +} +``` + +## Contributing + +Please refer to [CONTRIBUTING][] before opening an issue or pull request. + +## FAQ + +**When a file is moved to another directory is it still being watched?** + +No (it shouldn't be, unless you are watching where it was moved to). + +**When I watch a directory, are all subdirectories watched as well?** + +No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]). + +**Do I have to watch the Error and Event channels in a separate goroutine?** + +As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7]) + +**Why am I receiving multiple events for the same file on OS X?** + +Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]). + +**How many files can be watched at once?** + +There are OS-specific limits as to how many watches can be created: +* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. +* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. + +**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?** + +fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications. + +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#18]: https://github.com/fsnotify/fsnotify/issues/18 +[#11]: https://github.com/fsnotify/fsnotify/issues/11 +[#7]: https://github.com/howeyc/fsnotify/issues/7 + +[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md + +## Related Projects + +* [notify](https://github.com/rjeczalik/notify) +* [fsevents](https://github.com/fsnotify/fsevents) + diff --git a/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/fsnotify/fsnotify/fen.go new file mode 100644 index 0000000..b3ac3d8 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/fen.go @@ -0,0 +1,38 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build solaris +// +build solaris + +package fsnotify + +import ( + "errors" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go new file mode 100644 index 0000000..0f4ee52 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -0,0 +1,69 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !plan9 +// +build !plan9 + +// Package fsnotify provides a platform-independent interface for file system notifications. +package fsnotify + +import ( + "bytes" + "errors" + "fmt" +) + +// Event represents a single file system notification. +type Event struct { + Name string // Relative path to the file or directory. + Op Op // File operation that triggered the event. +} + +// Op describes a set of file operations. +type Op uint32 + +// These are the generalized file operations that can trigger a notification. +const ( + Create Op = 1 << iota + Write + Remove + Rename + Chmod +) + +func (op Op) String() string { + // Use a buffer for efficient string concatenation + var buffer bytes.Buffer + + if op&Create == Create { + buffer.WriteString("|CREATE") + } + if op&Remove == Remove { + buffer.WriteString("|REMOVE") + } + if op&Write == Write { + buffer.WriteString("|WRITE") + } + if op&Rename == Rename { + buffer.WriteString("|RENAME") + } + if op&Chmod == Chmod { + buffer.WriteString("|CHMOD") + } + if buffer.Len() == 0 { + return "" + } + return buffer.String()[1:] // Strip leading pipe +} + +// String returns a string representation of the event in the form +// "file: REMOVE|WRITE|..." +func (e Event) String() string { + return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) +} + +// Common errors that can be reported by a watcher +var ( + ErrEventOverflow = errors.New("fsnotify queue overflow") +) diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go b/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go new file mode 100644 index 0000000..5968855 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify_unsupported.go @@ -0,0 +1,36 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows +// +build !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows + +package fsnotify + +import ( + "fmt" + "runtime" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct{} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, fmt.Errorf("fsnotify not supported on %s", runtime.GOOS) +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/fsnotify/fsnotify/inotify.go new file mode 100644 index 0000000..a6d0e0e --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/inotify.go @@ -0,0 +1,351 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + mu sync.Mutex // Map access + fd int + poller *fdPoller + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + doneResp chan struct{} // Channel to respond to Close +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + // Create inotify fd + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) + if fd == -1 { + return nil, errno + } + // Create epoll + poller, err := newFdPoller(fd) + if err != nil { + unix.Close(fd) + return nil, err + } + w := &Watcher{ + fd: fd, + poller: poller, + watches: make(map[string]*watch), + paths: make(map[int]string), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed() { + return nil + } + + // Send 'close' signal to goroutine, and set the Watcher to closed. + close(w.done) + + // Wake up goroutine + w.poller.wake() + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + name = filepath.Clean(name) + if w.isClosed() { + return errors.New("inotify instance already closed") + } + + const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + var flags uint32 = agnosticEvents + + w.mu.Lock() + defer w.mu.Unlock() + watchEntry := w.watches[name] + if watchEntry != nil { + flags |= watchEntry.flags | unix.IN_MASK_ADD + } + wd, errno := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return errno + } + + if watchEntry == nil { + w.watches[name] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = name + } else { + watchEntry.wd = uint32(wd) + watchEntry.flags = flags + } + + return nil +} + +// Remove stops watching the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + + // Fetch the watch. + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[name] + + // Remove it from inotify. + if !ok { + return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) + } + + // We successfully removed the watch if InotifyRmWatch doesn't return an + // error, we need to clean up our internal state to ensure it matches + // inotify's kernel state. + delete(w.paths, int(watch.wd)) + delete(w.watches, name) + + // inotify_rm_watch will return EINVAL if the file has been deleted; + // the inotify will already have been removed. + // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously + // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE + // so that EINVAL means that the wd is being rm_watch()ed or its file removed + // by another thread and we have not received IN_IGNORE event. + success, errno := unix.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case. + // the only two possible errors are: + // EBADF, which happens when w.fd is not a valid file descriptor of any kind. + // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. + // Watch descriptors are invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. + return errno + } + + return nil +} + +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + n int // Number of bytes read with read() + errno error // Syscall errno + ok bool // For poller.wait + ) + + defer close(w.doneResp) + defer close(w.Errors) + defer close(w.Events) + defer unix.Close(w.fd) + defer w.poller.close() + + for { + // See if we have been closed. + if w.isClosed() { + return + } + + ok, errno = w.poller.wait() + if errno != nil { + select { + case w.Errors <- errno: + case <-w.done: + return + } + continue + } + + if !ok { + continue + } + + n, errno = unix.Read(w.fd, buf[:]) + // If a signal interrupted execution, see if we've been asked to close, and try again. + // http://man7.org/linux/man-pages/man7/signal.7.html : + // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" + if errno == unix.EINTR { + continue + } + + // unix.Read might have been woken up by Close. If so, we're done. + if w.isClosed() { + return + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + // If EOF is received. This should really never happen. + err = io.EOF + } else if n < 0 { + // If an error occurred while reading. + err = errno + } else { + // Read was too short. + err = errors.New("notify: short read in readEvents()") + } + select { + case w.Errors <- err: + case <-w.done: + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + + mask := uint32(raw.Mask) + nameLen := uint32(raw.Len) + + if mask&unix.IN_Q_OVERFLOW != 0 { + select { + case w.Errors <- ErrEventOverflow: + case <-w.done: + return + } + } + + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name, ok := w.paths[int(raw.Wd)] + // IN_DELETE_SELF occurs when the file/directory being watched is removed. + // This is a sign to clean up the maps, otherwise we are no longer in sync + // with the inotify kernel state which has already deleted the watch + // automatically. + if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { + delete(w.paths, int(raw.Wd)) + delete(w.watches, name) + } + w.mu.Unlock() + + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen] + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if !event.ignoreLinux(mask) { + select { + case w.Events <- event: + case <-w.done: + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// Certain types of events can be "ignored" and not sent over the Events +// channel. Such as events marked ignore by the kernel, or MODIFY events +// against files that do not exist. +func (e *Event) ignoreLinux(mask uint32) bool { + // Ignore anything the inotify API says to ignore + if mask&unix.IN_IGNORED == unix.IN_IGNORED { + return true + } + + // If the event is not a DELETE or RENAME, the file must exist. + // Otherwise the event is ignored. + // *Note*: this was put in place because it was seen that a MODIFY + // event was sent after the DELETE. This ignores that MODIFY and + // assumes a DELETE will come or has come if the file doesn't exist. + if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { + _, statErr := os.Lstat(e.Name) + return os.IsNotExist(statErr) + } + return false +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go new file mode 100644 index 0000000..b572a37 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go @@ -0,0 +1,187 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux +// +build linux + +package fsnotify + +import ( + "errors" + + "golang.org/x/sys/unix" +) + +type fdPoller struct { + fd int // File descriptor (as returned by the inotify_init() syscall) + epfd int // Epoll file descriptor + pipe [2]int // Pipe for waking up +} + +func emptyPoller(fd int) *fdPoller { + poller := new(fdPoller) + poller.fd = fd + poller.epfd = -1 + poller.pipe[0] = -1 + poller.pipe[1] = -1 + return poller +} + +// Create a new inotify poller. +// This creates an inotify handler, and an epoll handler. +func newFdPoller(fd int) (*fdPoller, error) { + var errno error + poller := emptyPoller(fd) + defer func() { + if errno != nil { + poller.close() + } + }() + + // Create epoll fd + poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC) + if poller.epfd == -1 { + return nil, errno + } + // Create pipe; pipe[0] is the read end, pipe[1] the write end. + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC) + if errno != nil { + return nil, errno + } + + // Register inotify fd with epoll + event := unix.EpollEvent{ + Fd: int32(poller.fd), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) + if errno != nil { + return nil, errno + } + + // Register pipe fd with epoll + event = unix.EpollEvent{ + Fd: int32(poller.pipe[0]), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) + if errno != nil { + return nil, errno + } + + return poller, nil +} + +// Wait using epoll. +// Returns true if something is ready to be read, +// false if there is not. +func (poller *fdPoller) wait() (bool, error) { + // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. + // I don't know whether epoll_wait returns the number of events returned, + // or the total number of events ready. + // I decided to catch both by making the buffer one larger than the maximum. + events := make([]unix.EpollEvent, 7) + for { + n, errno := unix.EpollWait(poller.epfd, events, -1) + if n == -1 { + if errno == unix.EINTR { + continue + } + return false, errno + } + if n == 0 { + // If there are no events, try again. + continue + } + if n > 6 { + // This should never happen. More events were returned than should be possible. + return false, errors.New("epoll_wait returned more events than I know what to do with") + } + ready := events[:n] + epollhup := false + epollerr := false + epollin := false + for _, event := range ready { + if event.Fd == int32(poller.fd) { + if event.Events&unix.EPOLLHUP != 0 { + // This should not happen, but if it does, treat it as a wakeup. + epollhup = true + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the file descriptor, we should pretend + // something is ready to read, and let unix.Read pick up the error. + epollerr = true + } + if event.Events&unix.EPOLLIN != 0 { + // There is data to read. + epollin = true + } + } + if event.Fd == int32(poller.pipe[0]) { + if event.Events&unix.EPOLLHUP != 0 { + // Write pipe descriptor was closed, by us. This means we're closing down the + // watcher, and we should wake up. + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the pipe file descriptor. + // This is an absolute mystery, and should never ever happen. + return false, errors.New("Error on the pipe descriptor.") + } + if event.Events&unix.EPOLLIN != 0 { + // This is a regular wakeup, so we have to clear the buffer. + err := poller.clearWake() + if err != nil { + return false, err + } + } + } + } + + if epollhup || epollerr || epollin { + return true, nil + } + return false, nil + } +} + +// Close the write end of the poller. +func (poller *fdPoller) wake() error { + buf := make([]byte, 1) + n, errno := unix.Write(poller.pipe[1], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is full, poller will wake. + return nil + } + return errno + } + return nil +} + +func (poller *fdPoller) clearWake() error { + // You have to be woken up a LOT in order to get to 100! + buf := make([]byte, 100) + n, errno := unix.Read(poller.pipe[0], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is empty, someone else cleared our wake. + return nil + } + return errno + } + return nil +} + +// Close all poller file descriptors, but not the one passed to it. +func (poller *fdPoller) close() { + if poller.pipe[1] != -1 { + unix.Close(poller.pipe[1]) + } + if poller.pipe[0] != -1 { + unix.Close(poller.pipe[0]) + } + if poller.epfd != -1 { + unix.Close(poller.epfd) + } +} diff --git a/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/fsnotify/fsnotify/kqueue.go new file mode 100644 index 0000000..6fb8d85 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/kqueue.go @@ -0,0 +1,535 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build freebsd || openbsd || netbsd || dragonfly || darwin +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "time" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + + kq int // File descriptor (as returned by the kqueue() syscall). + + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Map of watched file descriptors (key: path). + externalWatches map[string]bool // Map of watches added by user of the library. + dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. + paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. + fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + kq, err := kqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + watches: make(map[string]int), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]bool), + externalWatches: make(map[string]bool), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + + // copy paths to remove while locked + var pathsToRemove = make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() + // unlock before calling Remove, which also locks + + for _, name := range pathsToRemove { + w.Remove(name) + } + + // send a "quit" message to the reader goroutine + close(w.done) + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + w.mu.Lock() + w.externalWatches[name] = true + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + w.mu.Lock() + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) + } + + const registerRemove = unix.EV_DELETE + if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.paths, watchfd) + delete(w.dirFlags, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if isDir { + var pathsToRemove []string + w.mu.Lock() + for _, path := range w.paths { + wdir, _ := filepath.Split(path.name) + if filepath.Clean(wdir) == name { + if !w.externalWatches[path.name] { + pathsToRemove = append(pathsToRemove, path.name) + } + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.Remove(name) + } + } + + return nil +} + +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for pathname := range w.watches { + entries = append(entries, pathname) + } + + return entries +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// keventWaitTime to block on each read from kevent +var keventWaitTime = durationToTimespec(100 * time.Millisecond) + +// addWatch adds name to the watched file set. +// The flags are interpreted as described in kevent(2). +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + // Make ./name and name equivalent + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", errors.New("kevent instance already closed") + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets. + if fi.Mode()&os.ModeSocket == os.ModeSocket { + return "", nil + } + + // Don't watch named pipes. + if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { + return "", nil + } + + // Follow Symlinks + // Unfortunately, Linux can add bogus symlinks to watch list without + // issue, and Windows can't do symlinks period (AFAIK). To maintain + // consistency, we will act like everything is fine. There will simply + // be no file events for broken symlinks. + // Hence the returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + name, err = filepath.EvalSymlinks(name) + if err != nil { + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[name] + w.mu.Unlock() + + if alreadyWatching { + return name, nil + } + + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + watchfd, err = unix.Open(name, openMode, 0700) + if watchfd == -1 { + return "", err + } + + isDir = fi.IsDir() + } + + const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE + if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + w.watches[name] = watchfd + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, + // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + eventBuffer := make([]unix.Kevent_t, 10) + +loop: + for { + // See if there is a message on the "done" channel + select { + case <-w.done: + break loop + default: + } + + // Get new events + kevents, err := read(w.kq, eventBuffer, &keventWaitTime) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + select { + case w.Errors <- err: + case <-w.done: + break loop + } + continue + } + + // Flush the events we received to the Events channel + for len(kevents) > 0 { + kevent := &kevents[0] + watchfd := int(kevent.Ident) + mask := uint32(kevent.Fflags) + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + event := newEvent(path.name, mask) + + if path.isDir && !(event.Op&Remove == Remove) { + // Double check to make sure the directory exists. This can happen when + // we do a rm -fr on a recursively watched folders and we receive a + // modification event first but the folder has been deleted and later + // receive the delete event + if _, err := os.Lstat(event.Name); os.IsNotExist(err) { + // mark is as delete event + event.Op |= Remove + } + } + + if event.Op&Rename == Rename || event.Op&Remove == Remove { + w.Remove(event.Name) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + // Send the event on the Events channel. + select { + case w.Events <- event: + case <-w.done: + break loop + } + } + + if event.Op&Remove == Remove { + // Look for a file that may have overwritten this. + // For example, mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + // make sure the directory exists before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch from the parent directory. + if _, err := os.Lstat(fileDir); err == nil { + w.sendDirectoryChangeEvents(fileDir) + } + } + } else { + filePath := filepath.Clean(event.Name) + if fileInfo, err := os.Lstat(filePath); err == nil { + w.sendFileCreatedEventIfNew(filePath, fileInfo) + } + } + } + + // Move to next event + kevents = kevents[1:] + } + } + + // cleanup + err := unix.Close(w.kq) + if err != nil { + // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors. + select { + case w.Errors <- err: + default: + } + } + close(w.Events) + close(w.Errors) +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + return e +} + +func newCreateEvent(name string) Event { + return Event{Name: name, Op: Create} +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + } + + return nil +} + +// sendDirectoryEvents searches the directory for newly created files +// and sends them over the event channel. This functionality is to have +// the BSD version of fsnotify match Linux inotify which provides a +// create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + select { + case w.Errors <- err: + case <-w.done: + return + } + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + err := w.sendFileCreatedEventIfNew(filePath, fileInfo) + + if err != nil { + return + } + } +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + // Send create event + select { + case w.Events <- newCreateEvent(filePath): + case <-w.done: + return + } + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { + if fileInfo.IsDir() { + // mimic Linux providing delete events for subdirectories + // but preserve the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// kqueue creates a new kernel event queue and returns a descriptor. +func kqueue() (kq int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, err + } + return kq, nil +} + +// register events with the queue +func register(kq int, fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + + for i, fd := range fds { + // SetKevent converts int to the platform-specific types: + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // register the events + success, err := unix.Kevent(kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +// A timeout of nil blocks indefinitely, while 0 polls the queue. +func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(kq, nil, events, timeout) + if err != nil { + return nil, err + } + return events[0:n], nil +} + +// durationToTimespec prepares a timeout value +func durationToTimespec(d time.Duration) unix.Timespec { + return unix.NsecToTimespec(d.Nanoseconds()) +} diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go new file mode 100644 index 0000000..36cc384 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build freebsd || openbsd || netbsd || dragonfly +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "golang.org/x/sys/unix" + +const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go new file mode 100644 index 0000000..98cd847 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go @@ -0,0 +1,13 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin +// +build darwin + +package fsnotify + +import "golang.org/x/sys/unix" + +// note: this constant is not defined on BSD +const openMode = unix.O_EVTONLY | unix.O_CLOEXEC diff --git a/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/fsnotify/fsnotify/windows.go new file mode 100644 index 0000000..02ce7de --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/windows.go @@ -0,0 +1,586 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build windows +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "reflect" + "runtime" + "sync" + "syscall" + "unsafe" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + isClosed bool // Set to true when Close() is first called + mu sync.Mutex // Map access + port syscall.Handle // Handle to completion port + watches watchMap // Map of watches (key: i-number) + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) + if e != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", e) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, 50), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + if w.isClosed { + return errors.New("watcher already closed") + } + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// WatchList returns the directories and files that are being monitered. +func (w *Watcher) WatchList() []string { + w.mu.Lock() + defer w.mu.Unlock() + + entries := make([]string, 0, len(w.watches)) + for _, entry := range w.watches { + for _, watchEntry := range entry { + entries = append(entries, watchEntry.path) + } + } + + return entries +} + +const ( + // Options for AddWatch + sysFSONESHOT = 0x80000000 + sysFSONLYDIR = 0x1000000 + + // Events + sysFSACCESS = 0x1 + sysFSALLEVENTS = 0xfff + sysFSATTRIB = 0x4 + sysFSCLOSE = 0x18 + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + + // Special events + sysFSIGNORED = 0x8000 + sysFSQOVERFLOW = 0x4000 +) + +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + if mask&sysFSATTRIB == sysFSATTRIB { + e.Op |= Chmod + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle syscall.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov syscall.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [4096]byte +} + +type indexMap map[uint64]*watch +type watchMap map[uint32]indexMap + +func (w *Watcher) wakeupReader() error { + e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if e != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", e) + } + return nil +} + +func getDir(pathname string) (dir string, err error) { + attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) + if e != nil { + return "", os.NewSyscallError("GetFileAttributes", e) + } + if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func getIno(path string) (ino *inode, err error) { + h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), + syscall.FILE_LIST_DIRECTORY, + syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, + nil, syscall.OPEN_EXISTING, + syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) + if e != nil { + return nil, os.NewSyscallError("CreateFile", e) + } + var fi syscall.ByHandleFileInformation + if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { + syscall.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", e) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + if flags&sysFSONLYDIR != 0 && pathname != dir { + return nil + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { + syscall.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", e) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + syscall.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + if err = w.startRead(watchEntry); err != nil { + return err + } + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + if watch == nil { + return fmt.Errorf("can't remove non-existent watch for: %s", pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + if e := syscall.CancelIo(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CancelIo", e) + w.deleteWatch(watch) + } + mask := toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= toWindowsFlags(m) + } + if mask == 0 { + if e := syscall.CloseHandle(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CloseHandle", e) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if e != nil { + err := os.NewSyscallError("ReadDirectoryChanges", e) + if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n, key uint32 + ov *syscall.Overlapped + ) + runtime.LockOSThread() + + for { + e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) + watch := (*watch)(unsafe.Pointer(ov)) + + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + var err error + if e := syscall.CloseHandle(w.port); e != nil { + err = os.NewSyscallError("CloseHandle", e) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch e { + case syscall.ERROR_MORE_DATA: + if watch == nil { + w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case syscall.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case syscall.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.Events <- newEvent("", sysFSQOVERFLOW) + w.Errors <- errors.New("short read in readEvents()") + break + } + + // Point "raw" to the event in the buffer + raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + // TODO: Consider using unsafe.Slice that is available from go1.17 + // https://stackoverflow.com/questions/51187973/how-to-create-an-array-or-a-slice-from-an-array-unsafe-pointer-in-golang + // instead of using a fixed syscall.MAX_PATH buf, we create a buf that is the size of the path name + size := int(raw.FileNameLength / 2) + var buf []uint16 + sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) + sh.Data = uintptr(unsafe.Pointer(&raw.FileName)) + sh.Len = size + sh.Cap = size + name := syscall.UTF16ToString(buf) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case syscall.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case syscall.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + if w.sendEvent(fullname, watch.names[name]&mask) { + if watch.names[name]&sysFSONESHOT != 0 { + delete(watch.names, name) + } + } + } + if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == syscall.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") + break + } + } + + if err := w.startRead(watch); err != nil { + w.Errors <- err + } + } +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + event := newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +func toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSACCESS != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS + } + if mask&sysFSMODIFY != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sysFSATTRIB != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func toFSnotifyFlags(action uint32) uint64 { + switch action { + case syscall.FILE_ACTION_ADDED: + return sysFSCREATE + case syscall.FILE_ACTION_REMOVED: + return sysFSDELETE + case syscall.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/vendor/github.com/opencontainers/runc/LICENSE b/vendor/github.com/opencontainers/runc/LICENSE new file mode 100644 index 0000000..2744858 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2014 Docker, Inc. + + 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. diff --git a/vendor/github.com/opencontainers/runc/NOTICE b/vendor/github.com/opencontainers/runc/NOTICE new file mode 100644 index 0000000..5c97abc --- /dev/null +++ b/vendor/github.com/opencontainers/runc/NOTICE @@ -0,0 +1,17 @@ +runc + +Copyright 2012-2015 Docker, Inc. + +This product includes software developed at Docker, Inc. (http://www.docker.com). + +The following is courtesy of our legal counsel: + + +Use and transfer of Docker may be subject to certain restrictions by the +United States and other governments. +It is your responsibility to ensure that your use and/or transfer does not +violate applicable laws. + +For more information, please see http://www.bis.doc.gov + +See also http://www.apache.org/dev/crypto.html and/or seek legal counsel. diff --git a/vendor/github.com/opencontainers/runc/libcontainer/devices/device.go b/vendor/github.com/opencontainers/runc/libcontainer/devices/device.go new file mode 100644 index 0000000..c2c2b3b --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/devices/device.go @@ -0,0 +1,174 @@ +package devices + +import ( + "fmt" + "os" + "strconv" +) + +const ( + Wildcard = -1 +) + +type Device struct { + Rule + + // Path to the device. + Path string `json:"path"` + + // FileMode permission bits for the device. + FileMode os.FileMode `json:"file_mode"` + + // Uid of the device. + Uid uint32 `json:"uid"` + + // Gid of the device. + Gid uint32 `json:"gid"` +} + +// Permissions is a cgroupv1-style string to represent device access. It +// has to be a string for backward compatibility reasons, hence why it has +// methods to do set operations. +type Permissions string + +const ( + deviceRead uint = (1 << iota) + deviceWrite + deviceMknod +) + +func (p Permissions) toSet() uint { + var set uint + for _, perm := range p { + switch perm { + case 'r': + set |= deviceRead + case 'w': + set |= deviceWrite + case 'm': + set |= deviceMknod + } + } + return set +} + +func fromSet(set uint) Permissions { + var perm string + if set&deviceRead == deviceRead { + perm += "r" + } + if set&deviceWrite == deviceWrite { + perm += "w" + } + if set&deviceMknod == deviceMknod { + perm += "m" + } + return Permissions(perm) +} + +// Union returns the union of the two sets of Permissions. +func (p Permissions) Union(o Permissions) Permissions { + lhs := p.toSet() + rhs := o.toSet() + return fromSet(lhs | rhs) +} + +// Difference returns the set difference of the two sets of Permissions. +// In set notation, A.Difference(B) gives you A\B. +func (p Permissions) Difference(o Permissions) Permissions { + lhs := p.toSet() + rhs := o.toSet() + return fromSet(lhs &^ rhs) +} + +// Intersection computes the intersection of the two sets of Permissions. +func (p Permissions) Intersection(o Permissions) Permissions { + lhs := p.toSet() + rhs := o.toSet() + return fromSet(lhs & rhs) +} + +// IsEmpty returns whether the set of permissions in a Permissions is +// empty. +func (p Permissions) IsEmpty() bool { + return p == Permissions("") +} + +// IsValid returns whether the set of permissions is a subset of valid +// permissions (namely, {r,w,m}). +func (p Permissions) IsValid() bool { + return p == fromSet(p.toSet()) +} + +type Type rune + +const ( + WildcardDevice Type = 'a' + BlockDevice Type = 'b' + CharDevice Type = 'c' // or 'u' + FifoDevice Type = 'p' +) + +func (t Type) IsValid() bool { + switch t { + case WildcardDevice, BlockDevice, CharDevice, FifoDevice: + return true + default: + return false + } +} + +func (t Type) CanMknod() bool { + switch t { + case BlockDevice, CharDevice, FifoDevice: + return true + default: + return false + } +} + +func (t Type) CanCgroup() bool { + switch t { + case WildcardDevice, BlockDevice, CharDevice: + return true + default: + return false + } +} + +type Rule struct { + // Type of device ('c' for char, 'b' for block). If set to 'a', this rule + // acts as a wildcard and all fields other than Allow are ignored. + Type Type `json:"type"` + + // Major is the device's major number. + Major int64 `json:"major"` + + // Minor is the device's minor number. + Minor int64 `json:"minor"` + + // Permissions is the set of permissions that this rule applies to (in the + // cgroupv1 format -- any combination of "rwm"). + Permissions Permissions `json:"permissions"` + + // Allow specifies whether this rule is allowed. + Allow bool `json:"allow"` +} + +func (d *Rule) CgroupString() string { + var ( + major = strconv.FormatInt(d.Major, 10) + minor = strconv.FormatInt(d.Minor, 10) + ) + if d.Major == Wildcard { + major = "*" + } + if d.Minor == Wildcard { + minor = "*" + } + return fmt.Sprintf("%c %s:%s %s", d.Type, major, minor, d.Permissions) +} + +func (d *Rule) Mkdev() (uint64, error) { + return mkDev(d) +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/devices/device_unix.go b/vendor/github.com/opencontainers/runc/libcontainer/devices/device_unix.go new file mode 100644 index 0000000..7d8e9fc --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/devices/device_unix.go @@ -0,0 +1,120 @@ +//go:build !windows +// +build !windows + +package devices + +import ( + "errors" + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +// ErrNotADevice denotes that a file is not a valid linux device. +var ErrNotADevice = errors.New("not a device node") + +// Testing dependencies +var ( + unixLstat = unix.Lstat + osReadDir = os.ReadDir +) + +func mkDev(d *Rule) (uint64, error) { + if d.Major == Wildcard || d.Minor == Wildcard { + return 0, errors.New("cannot mkdev() device with wildcards") + } + return unix.Mkdev(uint32(d.Major), uint32(d.Minor)), nil +} + +// DeviceFromPath takes the path to a device and its cgroup_permissions (which +// cannot be easily queried) to look up the information about a linux device +// and returns that information as a Device struct. +func DeviceFromPath(path, permissions string) (*Device, error) { + var stat unix.Stat_t + err := unixLstat(path, &stat) + if err != nil { + return nil, err + } + + var ( + devType Type + mode = stat.Mode + devNumber = uint64(stat.Rdev) //nolint:unconvert // Rdev is uint32 on e.g. MIPS. + major = unix.Major(devNumber) + minor = unix.Minor(devNumber) + ) + switch mode & unix.S_IFMT { + case unix.S_IFBLK: + devType = BlockDevice + case unix.S_IFCHR: + devType = CharDevice + case unix.S_IFIFO: + devType = FifoDevice + default: + return nil, ErrNotADevice + } + return &Device{ + Rule: Rule{ + Type: devType, + Major: int64(major), + Minor: int64(minor), + Permissions: Permissions(permissions), + }, + Path: path, + FileMode: os.FileMode(mode &^ unix.S_IFMT), + Uid: stat.Uid, + Gid: stat.Gid, + }, nil +} + +// HostDevices returns all devices that can be found under /dev directory. +func HostDevices() ([]*Device, error) { + return GetDevices("/dev") +} + +// GetDevices recursively traverses a directory specified by path +// and returns all devices found there. +func GetDevices(path string) ([]*Device, error) { + files, err := osReadDir(path) + if err != nil { + return nil, err + } + var out []*Device + for _, f := range files { + switch { + case f.IsDir(): + switch f.Name() { + // ".lxc" & ".lxd-mounts" added to address https://github.com/lxc/lxd/issues/2825 + // ".udev" added to address https://github.com/opencontainers/runc/issues/2093 + case "pts", "shm", "fd", "mqueue", ".lxc", ".lxd-mounts", ".udev": + continue + default: + sub, err := GetDevices(filepath.Join(path, f.Name())) + if err != nil { + return nil, err + } + + out = append(out, sub...) + continue + } + case f.Name() == "console": + continue + } + device, err := DeviceFromPath(filepath.Join(path, f.Name()), "rwm") + if err != nil { + if errors.Is(err, ErrNotADevice) { + continue + } + if os.IsNotExist(err) { + continue + } + return nil, err + } + if device.Type == FifoDevice { + continue + } + out = append(out, device) + } + return out, nil +} diff --git a/vendor/github.com/opencontainers/runtime-spec/LICENSE b/vendor/github.com/opencontainers/runtime-spec/LICENSE new file mode 100644 index 0000000..bdc4036 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-spec/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2015 The Linux Foundation. + + 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. diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go new file mode 100644 index 0000000..25f4e6e --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/config.go @@ -0,0 +1,791 @@ +package specs + +import "os" + +// Spec is the base configuration for the container. +type Spec struct { + // Version of the Open Container Initiative Runtime Specification with which the bundle complies. + Version string `json:"ociVersion"` + // Process configures the container process. + Process *Process `json:"process,omitempty"` + // Root configures the container's root filesystem. + Root *Root `json:"root,omitempty"` + // Hostname configures the container's hostname. + Hostname string `json:"hostname,omitempty"` + // Domainname configures the container's domainname. + Domainname string `json:"domainname,omitempty"` + // Mounts configures additional mounts (on top of Root). + Mounts []Mount `json:"mounts,omitempty"` + // Hooks configures callbacks for container lifecycle events. + Hooks *Hooks `json:"hooks,omitempty" platform:"linux,solaris,zos"` + // Annotations contains arbitrary metadata for the container. + Annotations map[string]string `json:"annotations,omitempty"` + + // Linux is platform-specific configuration for Linux based containers. + Linux *Linux `json:"linux,omitempty" platform:"linux"` + // Solaris is platform-specific configuration for Solaris based containers. + Solaris *Solaris `json:"solaris,omitempty" platform:"solaris"` + // Windows is platform-specific configuration for Windows based containers. + Windows *Windows `json:"windows,omitempty" platform:"windows"` + // VM specifies configuration for virtual-machine-based containers. + VM *VM `json:"vm,omitempty" platform:"vm"` + // ZOS is platform-specific configuration for z/OS based containers. + ZOS *ZOS `json:"zos,omitempty" platform:"zos"` +} + +// Process contains information to start a specific application inside the container. +type Process struct { + // Terminal creates an interactive terminal for the container. + Terminal bool `json:"terminal,omitempty"` + // ConsoleSize specifies the size of the console. + ConsoleSize *Box `json:"consoleSize,omitempty"` + // User specifies user information for the process. + User User `json:"user"` + // Args specifies the binary and arguments for the application to execute. + Args []string `json:"args,omitempty"` + // CommandLine specifies the full command line for the application to execute on Windows. + CommandLine string `json:"commandLine,omitempty" platform:"windows"` + // Env populates the process environment for the process. + Env []string `json:"env,omitempty"` + // Cwd is the current working directory for the process and must be + // relative to the container's root. + Cwd string `json:"cwd"` + // Capabilities are Linux capabilities that are kept for the process. + Capabilities *LinuxCapabilities `json:"capabilities,omitempty" platform:"linux"` + // Rlimits specifies rlimit options to apply to the process. + Rlimits []POSIXRlimit `json:"rlimits,omitempty" platform:"linux,solaris,zos"` + // NoNewPrivileges controls whether additional privileges could be gained by processes in the container. + NoNewPrivileges bool `json:"noNewPrivileges,omitempty" platform:"linux"` + // ApparmorProfile specifies the apparmor profile for the container. + ApparmorProfile string `json:"apparmorProfile,omitempty" platform:"linux"` + // Specify an oom_score_adj for the container. + OOMScoreAdj *int `json:"oomScoreAdj,omitempty" platform:"linux"` + // SelinuxLabel specifies the selinux context that the container process is run as. + SelinuxLabel string `json:"selinuxLabel,omitempty" platform:"linux"` +} + +// LinuxCapabilities specifies the list of allowed capabilities that are kept for a process. +// http://man7.org/linux/man-pages/man7/capabilities.7.html +type LinuxCapabilities struct { + // Bounding is the set of capabilities checked by the kernel. + Bounding []string `json:"bounding,omitempty" platform:"linux"` + // Effective is the set of capabilities checked by the kernel. + Effective []string `json:"effective,omitempty" platform:"linux"` + // Inheritable is the capabilities preserved across execve. + Inheritable []string `json:"inheritable,omitempty" platform:"linux"` + // Permitted is the limiting superset for effective capabilities. + Permitted []string `json:"permitted,omitempty" platform:"linux"` + // Ambient is the ambient set of capabilities that are kept. + Ambient []string `json:"ambient,omitempty" platform:"linux"` +} + +// Box specifies dimensions of a rectangle. Used for specifying the size of a console. +type Box struct { + // Height is the vertical dimension of a box. + Height uint `json:"height"` + // Width is the horizontal dimension of a box. + Width uint `json:"width"` +} + +// User specifies specific user (and group) information for the container process. +type User struct { + // UID is the user id. + UID uint32 `json:"uid" platform:"linux,solaris,zos"` + // GID is the group id. + GID uint32 `json:"gid" platform:"linux,solaris,zos"` + // Umask is the umask for the init process. + Umask *uint32 `json:"umask,omitempty" platform:"linux,solaris,zos"` + // AdditionalGids are additional group ids set for the container's process. + AdditionalGids []uint32 `json:"additionalGids,omitempty" platform:"linux,solaris"` + // Username is the user name. + Username string `json:"username,omitempty" platform:"windows"` +} + +// Root contains information about the container's root filesystem on the host. +type Root struct { + // Path is the absolute path to the container's root filesystem. + Path string `json:"path"` + // Readonly makes the root filesystem for the container readonly before the process is executed. + Readonly bool `json:"readonly,omitempty"` +} + +// Mount specifies a mount for a container. +type Mount struct { + // Destination is the absolute path where the mount will be placed in the container. + Destination string `json:"destination"` + // Type specifies the mount kind. + Type string `json:"type,omitempty" platform:"linux,solaris,zos"` + // Source specifies the source path of the mount. + Source string `json:"source,omitempty"` + // Options are fstab style mount options. + Options []string `json:"options,omitempty"` + + // UID/GID mappings used for changing file owners w/o calling chown, fs should support it. + // Every mount point could have its own mapping. + UIDMappings []LinuxIDMapping `json:"uidMappings,omitempty" platform:"linux"` + GIDMappings []LinuxIDMapping `json:"gidMappings,omitempty" platform:"linux"` +} + +// Hook specifies a command that is run at a particular event in the lifecycle of a container +type Hook struct { + Path string `json:"path"` + Args []string `json:"args,omitempty"` + Env []string `json:"env,omitempty"` + Timeout *int `json:"timeout,omitempty"` +} + +// Hooks specifies a command that is run in the container at a particular event in the lifecycle of a container +// Hooks for container setup and teardown +type Hooks struct { + // Prestart is Deprecated. Prestart is a list of hooks to be run before the container process is executed. + // It is called in the Runtime Namespace + Prestart []Hook `json:"prestart,omitempty"` + // CreateRuntime is a list of hooks to be run after the container has been created but before pivot_root or any equivalent operation has been called + // It is called in the Runtime Namespace + CreateRuntime []Hook `json:"createRuntime,omitempty"` + // CreateContainer is a list of hooks to be run after the container has been created but before pivot_root or any equivalent operation has been called + // It is called in the Container Namespace + CreateContainer []Hook `json:"createContainer,omitempty"` + // StartContainer is a list of hooks to be run after the start operation is called but before the container process is started + // It is called in the Container Namespace + StartContainer []Hook `json:"startContainer,omitempty"` + // Poststart is a list of hooks to be run after the container process is started. + // It is called in the Runtime Namespace + Poststart []Hook `json:"poststart,omitempty"` + // Poststop is a list of hooks to be run after the container process exits. + // It is called in the Runtime Namespace + Poststop []Hook `json:"poststop,omitempty"` +} + +// Linux contains platform-specific configuration for Linux based containers. +type Linux struct { + // UIDMapping specifies user mappings for supporting user namespaces. + UIDMappings []LinuxIDMapping `json:"uidMappings,omitempty"` + // GIDMapping specifies group mappings for supporting user namespaces. + GIDMappings []LinuxIDMapping `json:"gidMappings,omitempty"` + // Sysctl are a set of key value pairs that are set for the container on start + Sysctl map[string]string `json:"sysctl,omitempty"` + // Resources contain cgroup information for handling resource constraints + // for the container + Resources *LinuxResources `json:"resources,omitempty"` + // CgroupsPath specifies the path to cgroups that are created and/or joined by the container. + // The path is expected to be relative to the cgroups mountpoint. + // If resources are specified, the cgroups at CgroupsPath will be updated based on resources. + CgroupsPath string `json:"cgroupsPath,omitempty"` + // Namespaces contains the namespaces that are created and/or joined by the container + Namespaces []LinuxNamespace `json:"namespaces,omitempty"` + // Devices are a list of device nodes that are created for the container + Devices []LinuxDevice `json:"devices,omitempty"` + // Seccomp specifies the seccomp security settings for the container. + Seccomp *LinuxSeccomp `json:"seccomp,omitempty"` + // RootfsPropagation is the rootfs mount propagation mode for the container. + RootfsPropagation string `json:"rootfsPropagation,omitempty"` + // MaskedPaths masks over the provided paths inside the container. + MaskedPaths []string `json:"maskedPaths,omitempty"` + // ReadonlyPaths sets the provided paths as RO inside the container. + ReadonlyPaths []string `json:"readonlyPaths,omitempty"` + // MountLabel specifies the selinux context for the mounts in the container. + MountLabel string `json:"mountLabel,omitempty"` + // IntelRdt contains Intel Resource Director Technology (RDT) information for + // handling resource constraints and monitoring metrics (e.g., L3 cache, memory bandwidth) for the container + IntelRdt *LinuxIntelRdt `json:"intelRdt,omitempty"` + // Personality contains configuration for the Linux personality syscall + Personality *LinuxPersonality `json:"personality,omitempty"` + // TimeOffsets specifies the offset for supporting time namespaces. + TimeOffsets map[string]LinuxTimeOffset `json:"timeOffsets,omitempty"` +} + +// LinuxNamespace is the configuration for a Linux namespace +type LinuxNamespace struct { + // Type is the type of namespace + Type LinuxNamespaceType `json:"type"` + // Path is a path to an existing namespace persisted on disk that can be joined + // and is of the same type + Path string `json:"path,omitempty"` +} + +// LinuxNamespaceType is one of the Linux namespaces +type LinuxNamespaceType string + +const ( + // PIDNamespace for isolating process IDs + PIDNamespace LinuxNamespaceType = "pid" + // NetworkNamespace for isolating network devices, stacks, ports, etc + NetworkNamespace LinuxNamespaceType = "network" + // MountNamespace for isolating mount points + MountNamespace LinuxNamespaceType = "mount" + // IPCNamespace for isolating System V IPC, POSIX message queues + IPCNamespace LinuxNamespaceType = "ipc" + // UTSNamespace for isolating hostname and NIS domain name + UTSNamespace LinuxNamespaceType = "uts" + // UserNamespace for isolating user and group IDs + UserNamespace LinuxNamespaceType = "user" + // CgroupNamespace for isolating cgroup hierarchies + CgroupNamespace LinuxNamespaceType = "cgroup" + // TimeNamespace for isolating the clocks + TimeNamespace LinuxNamespaceType = "time" +) + +// LinuxIDMapping specifies UID/GID mappings +type LinuxIDMapping struct { + // ContainerID is the starting UID/GID in the container + ContainerID uint32 `json:"containerID"` + // HostID is the starting UID/GID on the host to be mapped to 'ContainerID' + HostID uint32 `json:"hostID"` + // Size is the number of IDs to be mapped + Size uint32 `json:"size"` +} + +// LinuxTimeOffset specifies the offset for Time Namespace +type LinuxTimeOffset struct { + // Secs is the offset of clock (in secs) in the container + Secs int64 `json:"secs,omitempty"` + // Nanosecs is the additional offset for Secs (in nanosecs) + Nanosecs uint32 `json:"nanosecs,omitempty"` +} + +// POSIXRlimit type and restrictions +type POSIXRlimit struct { + // Type of the rlimit to set + Type string `json:"type"` + // Hard is the hard limit for the specified type + Hard uint64 `json:"hard"` + // Soft is the soft limit for the specified type + Soft uint64 `json:"soft"` +} + +// LinuxHugepageLimit structure corresponds to limiting kernel hugepages. +// Default to reservation limits if supported. Otherwise fallback to page fault limits. +type LinuxHugepageLimit struct { + // Pagesize is the hugepage size. + // Format: "B' (e.g. 64KB, 2MB, 1GB, etc.). + Pagesize string `json:"pageSize"` + // Limit is the limit of "hugepagesize" hugetlb reservations (if supported) or usage. + Limit uint64 `json:"limit"` +} + +// LinuxInterfacePriority for network interfaces +type LinuxInterfacePriority struct { + // Name is the name of the network interface + Name string `json:"name"` + // Priority for the interface + Priority uint32 `json:"priority"` +} + +// LinuxBlockIODevice holds major:minor format supported in blkio cgroup +type LinuxBlockIODevice struct { + // Major is the device's major number. + Major int64 `json:"major"` + // Minor is the device's minor number. + Minor int64 `json:"minor"` +} + +// LinuxWeightDevice struct holds a `major:minor weight` pair for weightDevice +type LinuxWeightDevice struct { + LinuxBlockIODevice + // Weight is the bandwidth rate for the device. + Weight *uint16 `json:"weight,omitempty"` + // LeafWeight is the bandwidth rate for the device while competing with the cgroup's child cgroups, CFQ scheduler only + LeafWeight *uint16 `json:"leafWeight,omitempty"` +} + +// LinuxThrottleDevice struct holds a `major:minor rate_per_second` pair +type LinuxThrottleDevice struct { + LinuxBlockIODevice + // Rate is the IO rate limit per cgroup per device + Rate uint64 `json:"rate"` +} + +// LinuxBlockIO for Linux cgroup 'blkio' resource management +type LinuxBlockIO struct { + // Specifies per cgroup weight + Weight *uint16 `json:"weight,omitempty"` + // Specifies tasks' weight in the given cgroup while competing with the cgroup's child cgroups, CFQ scheduler only + LeafWeight *uint16 `json:"leafWeight,omitempty"` + // Weight per cgroup per device, can override BlkioWeight + WeightDevice []LinuxWeightDevice `json:"weightDevice,omitempty"` + // IO read rate limit per cgroup per device, bytes per second + ThrottleReadBpsDevice []LinuxThrottleDevice `json:"throttleReadBpsDevice,omitempty"` + // IO write rate limit per cgroup per device, bytes per second + ThrottleWriteBpsDevice []LinuxThrottleDevice `json:"throttleWriteBpsDevice,omitempty"` + // IO read rate limit per cgroup per device, IO per second + ThrottleReadIOPSDevice []LinuxThrottleDevice `json:"throttleReadIOPSDevice,omitempty"` + // IO write rate limit per cgroup per device, IO per second + ThrottleWriteIOPSDevice []LinuxThrottleDevice `json:"throttleWriteIOPSDevice,omitempty"` +} + +// LinuxMemory for Linux cgroup 'memory' resource management +type LinuxMemory struct { + // Memory limit (in bytes). + Limit *int64 `json:"limit,omitempty"` + // Memory reservation or soft_limit (in bytes). + Reservation *int64 `json:"reservation,omitempty"` + // Total memory limit (memory + swap). + Swap *int64 `json:"swap,omitempty"` + // Kernel memory limit (in bytes). + Kernel *int64 `json:"kernel,omitempty"` + // Kernel memory limit for tcp (in bytes) + KernelTCP *int64 `json:"kernelTCP,omitempty"` + // How aggressive the kernel will swap memory pages. + Swappiness *uint64 `json:"swappiness,omitempty"` + // DisableOOMKiller disables the OOM killer for out of memory conditions + DisableOOMKiller *bool `json:"disableOOMKiller,omitempty"` + // Enables hierarchical memory accounting + UseHierarchy *bool `json:"useHierarchy,omitempty"` + // CheckBeforeUpdate enables checking if a new memory limit is lower + // than the current usage during update, and if so, rejecting the new + // limit. + CheckBeforeUpdate *bool `json:"checkBeforeUpdate,omitempty"` +} + +// LinuxCPU for Linux cgroup 'cpu' resource management +type LinuxCPU struct { + // CPU shares (relative weight (ratio) vs. other cgroups with cpu shares). + Shares *uint64 `json:"shares,omitempty"` + // CPU hardcap limit (in usecs). Allowed cpu time in a given period. + Quota *int64 `json:"quota,omitempty"` + // CPU hardcap burst limit (in usecs). Allowed accumulated cpu time additionally for burst in a + // given period. + Burst *uint64 `json:"burst,omitempty"` + // CPU period to be used for hardcapping (in usecs). + Period *uint64 `json:"period,omitempty"` + // How much time realtime scheduling may use (in usecs). + RealtimeRuntime *int64 `json:"realtimeRuntime,omitempty"` + // CPU period to be used for realtime scheduling (in usecs). + RealtimePeriod *uint64 `json:"realtimePeriod,omitempty"` + // CPUs to use within the cpuset. Default is to use any CPU available. + Cpus string `json:"cpus,omitempty"` + // List of memory nodes in the cpuset. Default is to use any available memory node. + Mems string `json:"mems,omitempty"` + // cgroups are configured with minimum weight, 0: default behavior, 1: SCHED_IDLE. + Idle *int64 `json:"idle,omitempty"` +} + +// LinuxPids for Linux cgroup 'pids' resource management (Linux 4.3) +type LinuxPids struct { + // Maximum number of PIDs. Default is "no limit". + Limit int64 `json:"limit"` +} + +// LinuxNetwork identification and priority configuration +type LinuxNetwork struct { + // Set class identifier for container's network packets + ClassID *uint32 `json:"classID,omitempty"` + // Set priority of network traffic for container + Priorities []LinuxInterfacePriority `json:"priorities,omitempty"` +} + +// LinuxRdma for Linux cgroup 'rdma' resource management (Linux 4.11) +type LinuxRdma struct { + // Maximum number of HCA handles that can be opened. Default is "no limit". + HcaHandles *uint32 `json:"hcaHandles,omitempty"` + // Maximum number of HCA objects that can be created. Default is "no limit". + HcaObjects *uint32 `json:"hcaObjects,omitempty"` +} + +// LinuxResources has container runtime resource constraints +type LinuxResources struct { + // Devices configures the device allowlist. + Devices []LinuxDeviceCgroup `json:"devices,omitempty"` + // Memory restriction configuration + Memory *LinuxMemory `json:"memory,omitempty"` + // CPU resource restriction configuration + CPU *LinuxCPU `json:"cpu,omitempty"` + // Task resource restriction configuration. + Pids *LinuxPids `json:"pids,omitempty"` + // BlockIO restriction configuration + BlockIO *LinuxBlockIO `json:"blockIO,omitempty"` + // Hugetlb limits (in bytes). Default to reservation limits if supported. + HugepageLimits []LinuxHugepageLimit `json:"hugepageLimits,omitempty"` + // Network restriction configuration + Network *LinuxNetwork `json:"network,omitempty"` + // Rdma resource restriction configuration. + // Limits are a set of key value pairs that define RDMA resource limits, + // where the key is device name and value is resource limits. + Rdma map[string]LinuxRdma `json:"rdma,omitempty"` + // Unified resources. + Unified map[string]string `json:"unified,omitempty"` +} + +// LinuxDevice represents the mknod information for a Linux special device file +type LinuxDevice struct { + // Path to the device. + Path string `json:"path"` + // Device type, block, char, etc. + Type string `json:"type"` + // Major is the device's major number. + Major int64 `json:"major"` + // Minor is the device's minor number. + Minor int64 `json:"minor"` + // FileMode permission bits for the device. + FileMode *os.FileMode `json:"fileMode,omitempty"` + // UID of the device. + UID *uint32 `json:"uid,omitempty"` + // Gid of the device. + GID *uint32 `json:"gid,omitempty"` +} + +// LinuxDeviceCgroup represents a device rule for the devices specified to +// the device controller +type LinuxDeviceCgroup struct { + // Allow or deny + Allow bool `json:"allow"` + // Device type, block, char, etc. + Type string `json:"type,omitempty"` + // Major is the device's major number. + Major *int64 `json:"major,omitempty"` + // Minor is the device's minor number. + Minor *int64 `json:"minor,omitempty"` + // Cgroup access permissions format, rwm. + Access string `json:"access,omitempty"` +} + +// LinuxPersonalityDomain refers to a personality domain. +type LinuxPersonalityDomain string + +// LinuxPersonalityFlag refers to an additional personality flag. None are currently defined. +type LinuxPersonalityFlag string + +// Define domain and flags for Personality +const ( + // PerLinux is the standard Linux personality + PerLinux LinuxPersonalityDomain = "LINUX" + // PerLinux32 sets personality to 32 bit + PerLinux32 LinuxPersonalityDomain = "LINUX32" +) + +// LinuxPersonality represents the Linux personality syscall input +type LinuxPersonality struct { + // Domain for the personality + Domain LinuxPersonalityDomain `json:"domain"` + // Additional flags + Flags []LinuxPersonalityFlag `json:"flags,omitempty"` +} + +// Solaris contains platform-specific configuration for Solaris application containers. +type Solaris struct { + // SMF FMRI which should go "online" before we start the container process. + Milestone string `json:"milestone,omitempty"` + // Maximum set of privileges any process in this container can obtain. + LimitPriv string `json:"limitpriv,omitempty"` + // The maximum amount of shared memory allowed for this container. + MaxShmMemory string `json:"maxShmMemory,omitempty"` + // Specification for automatic creation of network resources for this container. + Anet []SolarisAnet `json:"anet,omitempty"` + // Set limit on the amount of CPU time that can be used by container. + CappedCPU *SolarisCappedCPU `json:"cappedCPU,omitempty"` + // The physical and swap caps on the memory that can be used by this container. + CappedMemory *SolarisCappedMemory `json:"cappedMemory,omitempty"` +} + +// SolarisCappedCPU allows users to set limit on the amount of CPU time that can be used by container. +type SolarisCappedCPU struct { + Ncpus string `json:"ncpus,omitempty"` +} + +// SolarisCappedMemory allows users to set the physical and swap caps on the memory that can be used by this container. +type SolarisCappedMemory struct { + Physical string `json:"physical,omitempty"` + Swap string `json:"swap,omitempty"` +} + +// SolarisAnet provides the specification for automatic creation of network resources for this container. +type SolarisAnet struct { + // Specify a name for the automatically created VNIC datalink. + Linkname string `json:"linkname,omitempty"` + // Specify the link over which the VNIC will be created. + Lowerlink string `json:"lowerLink,omitempty"` + // The set of IP addresses that the container can use. + Allowedaddr string `json:"allowedAddress,omitempty"` + // Specifies whether allowedAddress limitation is to be applied to the VNIC. + Configallowedaddr string `json:"configureAllowedAddress,omitempty"` + // The value of the optional default router. + Defrouter string `json:"defrouter,omitempty"` + // Enable one or more types of link protection. + Linkprotection string `json:"linkProtection,omitempty"` + // Set the VNIC's macAddress + Macaddress string `json:"macAddress,omitempty"` +} + +// Windows defines the runtime configuration for Windows based containers, including Hyper-V containers. +type Windows struct { + // LayerFolders contains a list of absolute paths to directories containing image layers. + LayerFolders []string `json:"layerFolders"` + // Devices are the list of devices to be mapped into the container. + Devices []WindowsDevice `json:"devices,omitempty"` + // Resources contains information for handling resource constraints for the container. + Resources *WindowsResources `json:"resources,omitempty"` + // CredentialSpec contains a JSON object describing a group Managed Service Account (gMSA) specification. + CredentialSpec interface{} `json:"credentialSpec,omitempty"` + // Servicing indicates if the container is being started in a mode to apply a Windows Update servicing operation. + Servicing bool `json:"servicing,omitempty"` + // IgnoreFlushesDuringBoot indicates if the container is being started in a mode where disk writes are not flushed during its boot process. + IgnoreFlushesDuringBoot bool `json:"ignoreFlushesDuringBoot,omitempty"` + // HyperV contains information for running a container with Hyper-V isolation. + HyperV *WindowsHyperV `json:"hyperv,omitempty"` + // Network restriction configuration. + Network *WindowsNetwork `json:"network,omitempty"` +} + +// WindowsDevice represents information about a host device to be mapped into the container. +type WindowsDevice struct { + // Device identifier: interface class GUID, etc. + ID string `json:"id"` + // Device identifier type: "class", etc. + IDType string `json:"idType"` +} + +// WindowsResources has container runtime resource constraints for containers running on Windows. +type WindowsResources struct { + // Memory restriction configuration. + Memory *WindowsMemoryResources `json:"memory,omitempty"` + // CPU resource restriction configuration. + CPU *WindowsCPUResources `json:"cpu,omitempty"` + // Storage restriction configuration. + Storage *WindowsStorageResources `json:"storage,omitempty"` +} + +// WindowsMemoryResources contains memory resource management settings. +type WindowsMemoryResources struct { + // Memory limit in bytes. + Limit *uint64 `json:"limit,omitempty"` +} + +// WindowsCPUResources contains CPU resource management settings. +type WindowsCPUResources struct { + // Count is the number of CPUs available to the container. It represents the + // fraction of the configured processor `count` in a container in relation + // to the processors available in the host. The fraction ultimately + // determines the portion of processor cycles that the threads in a + // container can use during each scheduling interval, as the number of + // cycles per 10,000 cycles. + Count *uint64 `json:"count,omitempty"` + // Shares limits the share of processor time given to the container relative + // to other workloads on the processor. The processor `shares` (`weight` at + // the platform level) is a value between 0 and 10000. + Shares *uint16 `json:"shares,omitempty"` + // Maximum determines the portion of processor cycles that the threads in a + // container can use during each scheduling interval, as the number of + // cycles per 10,000 cycles. Set processor `maximum` to a percentage times + // 100. + Maximum *uint16 `json:"maximum,omitempty"` +} + +// WindowsStorageResources contains storage resource management settings. +type WindowsStorageResources struct { + // Specifies maximum Iops for the system drive. + Iops *uint64 `json:"iops,omitempty"` + // Specifies maximum bytes per second for the system drive. + Bps *uint64 `json:"bps,omitempty"` + // Sandbox size specifies the minimum size of the system drive in bytes. + SandboxSize *uint64 `json:"sandboxSize,omitempty"` +} + +// WindowsNetwork contains network settings for Windows containers. +type WindowsNetwork struct { + // List of HNS endpoints that the container should connect to. + EndpointList []string `json:"endpointList,omitempty"` + // Specifies if unqualified DNS name resolution is allowed. + AllowUnqualifiedDNSQuery bool `json:"allowUnqualifiedDNSQuery,omitempty"` + // Comma separated list of DNS suffixes to use for name resolution. + DNSSearchList []string `json:"DNSSearchList,omitempty"` + // Name (ID) of the container that we will share with the network stack. + NetworkSharedContainerName string `json:"networkSharedContainerName,omitempty"` + // name (ID) of the network namespace that will be used for the container. + NetworkNamespace string `json:"networkNamespace,omitempty"` +} + +// WindowsHyperV contains information for configuring a container to run with Hyper-V isolation. +type WindowsHyperV struct { + // UtilityVMPath is an optional path to the image used for the Utility VM. + UtilityVMPath string `json:"utilityVMPath,omitempty"` +} + +// VM contains information for virtual-machine-based containers. +type VM struct { + // Hypervisor specifies hypervisor-related configuration for virtual-machine-based containers. + Hypervisor VMHypervisor `json:"hypervisor,omitempty"` + // Kernel specifies kernel-related configuration for virtual-machine-based containers. + Kernel VMKernel `json:"kernel"` + // Image specifies guest image related configuration for virtual-machine-based containers. + Image VMImage `json:"image,omitempty"` +} + +// VMHypervisor contains information about the hypervisor to use for a virtual machine. +type VMHypervisor struct { + // Path is the host path to the hypervisor used to manage the virtual machine. + Path string `json:"path"` + // Parameters specifies parameters to pass to the hypervisor. + Parameters []string `json:"parameters,omitempty"` +} + +// VMKernel contains information about the kernel to use for a virtual machine. +type VMKernel struct { + // Path is the host path to the kernel used to boot the virtual machine. + Path string `json:"path"` + // Parameters specifies parameters to pass to the kernel. + Parameters []string `json:"parameters,omitempty"` + // InitRD is the host path to an initial ramdisk to be used by the kernel. + InitRD string `json:"initrd,omitempty"` +} + +// VMImage contains information about the virtual machine root image. +type VMImage struct { + // Path is the host path to the root image that the VM kernel would boot into. + Path string `json:"path"` + // Format is the root image format type (e.g. "qcow2", "raw", "vhd", etc). + Format string `json:"format"` +} + +// LinuxSeccomp represents syscall restrictions +type LinuxSeccomp struct { + DefaultAction LinuxSeccompAction `json:"defaultAction"` + DefaultErrnoRet *uint `json:"defaultErrnoRet,omitempty"` + Architectures []Arch `json:"architectures,omitempty"` + Flags []LinuxSeccompFlag `json:"flags,omitempty"` + ListenerPath string `json:"listenerPath,omitempty"` + ListenerMetadata string `json:"listenerMetadata,omitempty"` + Syscalls []LinuxSyscall `json:"syscalls,omitempty"` +} + +// Arch used for additional architectures +type Arch string + +// LinuxSeccompFlag is a flag to pass to seccomp(2). +type LinuxSeccompFlag string + +const ( + // LinuxSeccompFlagLog is a seccomp flag to request all returned + // actions except SECCOMP_RET_ALLOW to be logged. An administrator may + // override this filter flag by preventing specific actions from being + // logged via the /proc/sys/kernel/seccomp/actions_logged file. (since + // Linux 4.14) + LinuxSeccompFlagLog LinuxSeccompFlag = "SECCOMP_FILTER_FLAG_LOG" + + // LinuxSeccompFlagSpecAllow can be used to disable Speculative Store + // Bypass mitigation. (since Linux 4.17) + LinuxSeccompFlagSpecAllow LinuxSeccompFlag = "SECCOMP_FILTER_FLAG_SPEC_ALLOW" + + // LinuxSeccompFlagWaitKillableRecv can be used to switch to the wait + // killable semantics. (since Linux 5.19) + LinuxSeccompFlagWaitKillableRecv LinuxSeccompFlag = "SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV" +) + +// Additional architectures permitted to be used for system calls +// By default only the native architecture of the kernel is permitted +const ( + ArchX86 Arch = "SCMP_ARCH_X86" + ArchX86_64 Arch = "SCMP_ARCH_X86_64" + ArchX32 Arch = "SCMP_ARCH_X32" + ArchARM Arch = "SCMP_ARCH_ARM" + ArchAARCH64 Arch = "SCMP_ARCH_AARCH64" + ArchMIPS Arch = "SCMP_ARCH_MIPS" + ArchMIPS64 Arch = "SCMP_ARCH_MIPS64" + ArchMIPS64N32 Arch = "SCMP_ARCH_MIPS64N32" + ArchMIPSEL Arch = "SCMP_ARCH_MIPSEL" + ArchMIPSEL64 Arch = "SCMP_ARCH_MIPSEL64" + ArchMIPSEL64N32 Arch = "SCMP_ARCH_MIPSEL64N32" + ArchPPC Arch = "SCMP_ARCH_PPC" + ArchPPC64 Arch = "SCMP_ARCH_PPC64" + ArchPPC64LE Arch = "SCMP_ARCH_PPC64LE" + ArchS390 Arch = "SCMP_ARCH_S390" + ArchS390X Arch = "SCMP_ARCH_S390X" + ArchPARISC Arch = "SCMP_ARCH_PARISC" + ArchPARISC64 Arch = "SCMP_ARCH_PARISC64" + ArchRISCV64 Arch = "SCMP_ARCH_RISCV64" +) + +// LinuxSeccompAction taken upon Seccomp rule match +type LinuxSeccompAction string + +// Define actions for Seccomp rules +const ( + ActKill LinuxSeccompAction = "SCMP_ACT_KILL" + ActKillProcess LinuxSeccompAction = "SCMP_ACT_KILL_PROCESS" + ActKillThread LinuxSeccompAction = "SCMP_ACT_KILL_THREAD" + ActTrap LinuxSeccompAction = "SCMP_ACT_TRAP" + ActErrno LinuxSeccompAction = "SCMP_ACT_ERRNO" + ActTrace LinuxSeccompAction = "SCMP_ACT_TRACE" + ActAllow LinuxSeccompAction = "SCMP_ACT_ALLOW" + ActLog LinuxSeccompAction = "SCMP_ACT_LOG" + ActNotify LinuxSeccompAction = "SCMP_ACT_NOTIFY" +) + +// LinuxSeccompOperator used to match syscall arguments in Seccomp +type LinuxSeccompOperator string + +// Define operators for syscall arguments in Seccomp +const ( + OpNotEqual LinuxSeccompOperator = "SCMP_CMP_NE" + OpLessThan LinuxSeccompOperator = "SCMP_CMP_LT" + OpLessEqual LinuxSeccompOperator = "SCMP_CMP_LE" + OpEqualTo LinuxSeccompOperator = "SCMP_CMP_EQ" + OpGreaterEqual LinuxSeccompOperator = "SCMP_CMP_GE" + OpGreaterThan LinuxSeccompOperator = "SCMP_CMP_GT" + OpMaskedEqual LinuxSeccompOperator = "SCMP_CMP_MASKED_EQ" +) + +// LinuxSeccompArg used for matching specific syscall arguments in Seccomp +type LinuxSeccompArg struct { + Index uint `json:"index"` + Value uint64 `json:"value"` + ValueTwo uint64 `json:"valueTwo,omitempty"` + Op LinuxSeccompOperator `json:"op"` +} + +// LinuxSyscall is used to match a syscall in Seccomp +type LinuxSyscall struct { + Names []string `json:"names"` + Action LinuxSeccompAction `json:"action"` + ErrnoRet *uint `json:"errnoRet,omitempty"` + Args []LinuxSeccompArg `json:"args,omitempty"` +} + +// LinuxIntelRdt has container runtime resource constraints for Intel RDT CAT and MBA +// features and flags enabling Intel RDT CMT and MBM features. +// Intel RDT features are available in Linux 4.14 and newer kernel versions. +type LinuxIntelRdt struct { + // The identity for RDT Class of Service + ClosID string `json:"closID,omitempty"` + // The schema for L3 cache id and capacity bitmask (CBM) + // Format: "L3:=;=;..." + L3CacheSchema string `json:"l3CacheSchema,omitempty"` + + // The schema of memory bandwidth per L3 cache id + // Format: "MB:=bandwidth0;=bandwidth1;..." + // The unit of memory bandwidth is specified in "percentages" by + // default, and in "MBps" if MBA Software Controller is enabled. + MemBwSchema string `json:"memBwSchema,omitempty"` + + // EnableCMT is the flag to indicate if the Intel RDT CMT is enabled. CMT (Cache Monitoring Technology) supports monitoring of + // the last-level cache (LLC) occupancy for the container. + EnableCMT bool `json:"enableCMT,omitempty"` + + // EnableMBM is the flag to indicate if the Intel RDT MBM is enabled. MBM (Memory Bandwidth Monitoring) supports monitoring of + // total and local memory bandwidth for the container. + EnableMBM bool `json:"enableMBM,omitempty"` +} + +// ZOS contains platform-specific configuration for z/OS based containers. +type ZOS struct { + // Devices are a list of device nodes that are created for the container + Devices []ZOSDevice `json:"devices,omitempty"` +} + +// ZOSDevice represents the mknod information for a z/OS special device file +type ZOSDevice struct { + // Path to the device. + Path string `json:"path"` + // Device type, block, char, etc. + Type string `json:"type"` + // Major is the device's major number. + Major int64 `json:"major"` + // Minor is the device's minor number. + Minor int64 `json:"minor"` + // FileMode permission bits for the device. + FileMode *os.FileMode `json:"fileMode,omitempty"` + // UID of the device. + UID *uint32 `json:"uid,omitempty"` + // Gid of the device. + GID *uint32 `json:"gid,omitempty"` +} diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/state.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/state.go new file mode 100644 index 0000000..7c010d4 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/state.go @@ -0,0 +1,56 @@ +package specs + +// ContainerState represents the state of a container. +type ContainerState string + +const ( + // StateCreating indicates that the container is being created + StateCreating ContainerState = "creating" + + // StateCreated indicates that the runtime has finished the create operation + StateCreated ContainerState = "created" + + // StateRunning indicates that the container process has executed the + // user-specified program but has not exited + StateRunning ContainerState = "running" + + // StateStopped indicates that the container process has exited + StateStopped ContainerState = "stopped" +) + +// State holds information about the runtime state of the container. +type State struct { + // Version is the version of the specification that is supported. + Version string `json:"ociVersion"` + // ID is the container ID + ID string `json:"id"` + // Status is the runtime status of the container. + Status ContainerState `json:"status"` + // Pid is the process ID for the container process. + Pid int `json:"pid,omitempty"` + // Bundle is the path to the container's bundle directory. + Bundle string `json:"bundle"` + // Annotations are key values associated with the container. + Annotations map[string]string `json:"annotations,omitempty"` +} + +const ( + // SeccompFdName is the name of the seccomp notify file descriptor. + SeccompFdName string = "seccompFd" +) + +// ContainerProcessState holds information about the state of a container process. +type ContainerProcessState struct { + // Version is the version of the specification that is supported. + Version string `json:"ociVersion"` + // Fds is a string array containing the names of the file descriptors passed. + // The index of the name in this array corresponds to index of the file + // descriptor in the `SCM_RIGHTS` array. + Fds []string `json:"fds"` + // Pid is the process ID as seen by the runtime. + Pid int `json:"pid"` + // Opaque metadata. + Metadata string `json:"metadata,omitempty"` + // State of the container. + State State `json:"state"` +} diff --git a/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go b/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go new file mode 100644 index 0000000..1b81f3c --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-spec/specs-go/version.go @@ -0,0 +1,18 @@ +package specs + +import "fmt" + +const ( + // VersionMajor is for an API incompatible changes + VersionMajor = 1 + // VersionMinor is for functionality in a backwards-compatible manner + VersionMinor = 1 + // VersionPatch is for backwards-compatible bug fixes + VersionPatch = 0 + + // VersionDev indicates development branch. Releases will be empty string. + VersionDev = "-rc.2" +) + +// Version is the specification version that the package types support. +var Version = fmt.Sprintf("%d.%d.%d%s", VersionMajor, VersionMinor, VersionPatch, VersionDev) diff --git a/vendor/github.com/opencontainers/runtime-tools/LICENSE b/vendor/github.com/opencontainers/runtime-tools/LICENSE new file mode 100644 index 0000000..bdc4036 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2015 The Linux Foundation. + + 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. diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/config.go b/vendor/github.com/opencontainers/runtime-tools/generate/config.go new file mode 100644 index 0000000..48f281d --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/config.go @@ -0,0 +1,194 @@ +package generate + +import ( + rspec "github.com/opencontainers/runtime-spec/specs-go" +) + +func (g *Generator) initConfig() { + if g.Config == nil { + g.Config = &rspec.Spec{} + } +} + +func (g *Generator) initConfigProcess() { + g.initConfig() + if g.Config.Process == nil { + g.Config.Process = &rspec.Process{} + } +} + +func (g *Generator) initConfigProcessConsoleSize() { + g.initConfigProcess() + if g.Config.Process.ConsoleSize == nil { + g.Config.Process.ConsoleSize = &rspec.Box{} + } +} + +func (g *Generator) initConfigProcessCapabilities() { + g.initConfigProcess() + if g.Config.Process.Capabilities == nil { + g.Config.Process.Capabilities = &rspec.LinuxCapabilities{} + } +} + +func (g *Generator) initConfigRoot() { + g.initConfig() + if g.Config.Root == nil { + g.Config.Root = &rspec.Root{} + } +} + +func (g *Generator) initConfigAnnotations() { + g.initConfig() + if g.Config.Annotations == nil { + g.Config.Annotations = make(map[string]string) + } +} + +func (g *Generator) initConfigHooks() { + g.initConfig() + if g.Config.Hooks == nil { + g.Config.Hooks = &rspec.Hooks{} + } +} + +func (g *Generator) initConfigLinux() { + g.initConfig() + if g.Config.Linux == nil { + g.Config.Linux = &rspec.Linux{} + } +} + +func (g *Generator) initConfigLinuxIntelRdt() { + g.initConfigLinux() + if g.Config.Linux.IntelRdt == nil { + g.Config.Linux.IntelRdt = &rspec.LinuxIntelRdt{} + } +} + +func (g *Generator) initConfigLinuxSysctl() { + g.initConfigLinux() + if g.Config.Linux.Sysctl == nil { + g.Config.Linux.Sysctl = make(map[string]string) + } +} + +func (g *Generator) initConfigLinuxSeccomp() { + g.initConfigLinux() + if g.Config.Linux.Seccomp == nil { + g.Config.Linux.Seccomp = &rspec.LinuxSeccomp{} + } +} + +func (g *Generator) initConfigLinuxResources() { + g.initConfigLinux() + if g.Config.Linux.Resources == nil { + g.Config.Linux.Resources = &rspec.LinuxResources{} + } +} + +func (g *Generator) initConfigLinuxResourcesBlockIO() { + g.initConfigLinuxResources() + if g.Config.Linux.Resources.BlockIO == nil { + g.Config.Linux.Resources.BlockIO = &rspec.LinuxBlockIO{} + } +} + +// InitConfigLinuxResourcesCPU initializes CPU of Linux resources +func (g *Generator) InitConfigLinuxResourcesCPU() { + g.initConfigLinuxResources() + if g.Config.Linux.Resources.CPU == nil { + g.Config.Linux.Resources.CPU = &rspec.LinuxCPU{} + } +} + +func (g *Generator) initConfigLinuxResourcesMemory() { + g.initConfigLinuxResources() + if g.Config.Linux.Resources.Memory == nil { + g.Config.Linux.Resources.Memory = &rspec.LinuxMemory{} + } +} + +func (g *Generator) initConfigLinuxResourcesNetwork() { + g.initConfigLinuxResources() + if g.Config.Linux.Resources.Network == nil { + g.Config.Linux.Resources.Network = &rspec.LinuxNetwork{} + } +} + +func (g *Generator) initConfigLinuxResourcesPids() { + g.initConfigLinuxResources() + if g.Config.Linux.Resources.Pids == nil { + g.Config.Linux.Resources.Pids = &rspec.LinuxPids{} + } +} + +func (g *Generator) initConfigLinuxResourcesUnified() { + g.initConfigLinuxResources() + if g.Config.Linux.Resources.Unified == nil { + g.Config.Linux.Resources.Unified = map[string]string{} + } +} + +func (g *Generator) initConfigSolaris() { + g.initConfig() + if g.Config.Solaris == nil { + g.Config.Solaris = &rspec.Solaris{} + } +} + +func (g *Generator) initConfigSolarisCappedCPU() { + g.initConfigSolaris() + if g.Config.Solaris.CappedCPU == nil { + g.Config.Solaris.CappedCPU = &rspec.SolarisCappedCPU{} + } +} + +func (g *Generator) initConfigSolarisCappedMemory() { + g.initConfigSolaris() + if g.Config.Solaris.CappedMemory == nil { + g.Config.Solaris.CappedMemory = &rspec.SolarisCappedMemory{} + } +} + +func (g *Generator) initConfigWindows() { + g.initConfig() + if g.Config.Windows == nil { + g.Config.Windows = &rspec.Windows{} + } +} + +func (g *Generator) initConfigWindowsNetwork() { + g.initConfigWindows() + if g.Config.Windows.Network == nil { + g.Config.Windows.Network = &rspec.WindowsNetwork{} + } +} + +func (g *Generator) initConfigWindowsHyperV() { + g.initConfigWindows() + if g.Config.Windows.HyperV == nil { + g.Config.Windows.HyperV = &rspec.WindowsHyperV{} + } +} + +func (g *Generator) initConfigWindowsResources() { + g.initConfigWindows() + if g.Config.Windows.Resources == nil { + g.Config.Windows.Resources = &rspec.WindowsResources{} + } +} + +func (g *Generator) initConfigWindowsResourcesMemory() { + g.initConfigWindowsResources() + if g.Config.Windows.Resources.Memory == nil { + g.Config.Windows.Resources.Memory = &rspec.WindowsMemoryResources{} + } +} + +func (g *Generator) initConfigVM() { + g.initConfig() + if g.Config.VM == nil { + g.Config.VM = &rspec.VM{} + } +} diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/generate.go b/vendor/github.com/opencontainers/runtime-tools/generate/generate.go new file mode 100644 index 0000000..4d66b32 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/generate.go @@ -0,0 +1,1874 @@ +// Package generate implements functions generating container config files. +package generate + +import ( + "encoding/json" + "fmt" + "io" + "os" + "strings" + + rspec "github.com/opencontainers/runtime-spec/specs-go" + "github.com/opencontainers/runtime-tools/generate/seccomp" + capsCheck "github.com/opencontainers/runtime-tools/validate/capabilities" + "github.com/syndtr/gocapability/capability" +) + +var ( + // Namespaces include the names of supported namespaces. + Namespaces = []string{"network", "pid", "mount", "ipc", "uts", "user", "cgroup"} + + // we don't care about order...and this is way faster... + removeFunc = func(s []string, i int) []string { + s[i] = s[len(s)-1] + return s[:len(s)-1] + } +) + +// Generator represents a generator for a container config. +type Generator struct { + Config *rspec.Spec + HostSpecific bool + // This is used to keep a cache of the ENVs added to improve + // performance when adding a huge number of ENV variables + envMap map[string]int +} + +// ExportOptions have toggles for exporting only certain parts of the specification +type ExportOptions struct { + Seccomp bool // seccomp toggles if only seccomp should be exported +} + +// New creates a configuration Generator with the default +// configuration for the target operating system. +func New(os string) (generator Generator, err error) { + if os != "linux" && os != "solaris" && os != "windows" && os != "freebsd" { + return generator, fmt.Errorf("no defaults configured for %s", os) + } + + config := rspec.Spec{ + Version: rspec.Version, + Hostname: "mrsdalloway", + } + + if os == "windows" { + config.Process = &rspec.Process{ + Args: []string{ + "cmd", + }, + Cwd: `C:\`, + } + config.Windows = &rspec.Windows{} + } else { + config.Root = &rspec.Root{ + Path: "rootfs", + Readonly: false, + } + config.Process = &rspec.Process{ + Terminal: false, + Args: []string{ + "sh", + }, + } + } + + if os == "linux" || os == "solaris" || os == "freebsd" { + config.Process.User = rspec.User{} + config.Process.Env = []string{ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "TERM=xterm", + } + config.Process.Cwd = "/" + config.Process.Rlimits = []rspec.POSIXRlimit{ + { + Type: "RLIMIT_NOFILE", + Hard: uint64(1024), + Soft: uint64(1024), + }, + } + } + + if os == "linux" { + config.Process.Capabilities = &rspec.LinuxCapabilities{ + Bounding: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Permitted: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Inheritable: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Effective: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + Ambient: []string{ + "CAP_CHOWN", + "CAP_DAC_OVERRIDE", + "CAP_FSETID", + "CAP_FOWNER", + "CAP_MKNOD", + "CAP_NET_RAW", + "CAP_SETGID", + "CAP_SETUID", + "CAP_SETFCAP", + "CAP_SETPCAP", + "CAP_NET_BIND_SERVICE", + "CAP_SYS_CHROOT", + "CAP_KILL", + "CAP_AUDIT_WRITE", + }, + } + config.Mounts = []rspec.Mount{ + { + Destination: "/proc", + Type: "proc", + Source: "proc", + Options: []string{"nosuid", "noexec", "nodev"}, + }, + { + Destination: "/dev", + Type: "tmpfs", + Source: "tmpfs", + Options: []string{"nosuid", "noexec", "strictatime", "mode=755", "size=65536k"}, + }, + { + Destination: "/dev/pts", + Type: "devpts", + Source: "devpts", + Options: []string{"nosuid", "noexec", "newinstance", "ptmxmode=0666", "mode=0620", "gid=5"}, + }, + { + Destination: "/dev/shm", + Type: "tmpfs", + Source: "shm", + Options: []string{"nosuid", "noexec", "nodev", "mode=1777", "size=65536k"}, + }, + { + Destination: "/dev/mqueue", + Type: "mqueue", + Source: "mqueue", + Options: []string{"nosuid", "noexec", "nodev"}, + }, + { + Destination: "/sys", + Type: "sysfs", + Source: "sysfs", + Options: []string{"nosuid", "noexec", "nodev", "ro"}, + }, + } + config.Linux = &rspec.Linux{ + Resources: &rspec.LinuxResources{ + Devices: []rspec.LinuxDeviceCgroup{ + { + Allow: false, + Access: "rwm", + }, + }, + }, + Namespaces: []rspec.LinuxNamespace{ + { + Type: "pid", + }, + { + Type: "network", + }, + { + Type: "ipc", + }, + { + Type: "uts", + }, + { + Type: "mount", + }, + }, + Seccomp: seccomp.DefaultProfile(&config), + } + } else if os == "freebsd" { + config.Mounts = []rspec.Mount{ + { + Destination: "/dev", + Type: "devfs", + Source: "devfs", + Options: []string{"ruleset=4"}, + }, + { + Destination: "/dev/fd", + Type: "fdescfs", + Source: "fdesc", + Options: []string{}, + }, + } + } + + envCache := map[string]int{} + if config.Process != nil { + envCache = createEnvCacheMap(config.Process.Env) + } + + return Generator{Config: &config, envMap: envCache}, nil +} + +// NewFromSpec creates a configuration Generator from a given +// configuration. +func NewFromSpec(config *rspec.Spec) Generator { + envCache := map[string]int{} + if config != nil && config.Process != nil { + envCache = createEnvCacheMap(config.Process.Env) + } + + return Generator{ + Config: config, + envMap: envCache, + } +} + +// NewFromFile loads the template specified in a file into a +// configuration Generator. +func NewFromFile(path string) (Generator, error) { + cf, err := os.Open(path) + if err != nil { + if os.IsNotExist(err) { + return Generator{}, fmt.Errorf("template configuration at %s not found", path) + } + return Generator{}, err + } + defer cf.Close() + + return NewFromTemplate(cf) +} + +// NewFromTemplate loads the template from io.Reader into a +// configuration Generator. +func NewFromTemplate(r io.Reader) (Generator, error) { + var config rspec.Spec + if err := json.NewDecoder(r).Decode(&config); err != nil { + return Generator{}, err + } + + envCache := map[string]int{} + if config.Process != nil { + envCache = createEnvCacheMap(config.Process.Env) + } + + return Generator{ + Config: &config, + envMap: envCache, + }, nil +} + +// createEnvCacheMap creates a hash map with the ENV variables given by the config +func createEnvCacheMap(env []string) map[string]int { + envMap := make(map[string]int, len(env)) + for i, val := range env { + envMap[val] = i + } + return envMap +} + +// SetSpec sets the configuration in the Generator g. +// +// Deprecated: Replace with: +// +// Use generator.Config = config +func (g *Generator) SetSpec(config *rspec.Spec) { + g.Config = config +} + +// Spec gets the configuration from the Generator g. +// +// Deprecated: Replace with generator.Config. +func (g *Generator) Spec() *rspec.Spec { + return g.Config +} + +// Save writes the configuration into w. +func (g *Generator) Save(w io.Writer, exportOpts ExportOptions) (err error) { + var data []byte + + if g.Config.Linux != nil { + buf, err := json.Marshal(g.Config.Linux) + if err != nil { + return err + } + if string(buf) == "{}" { + g.Config.Linux = nil + } + } + + if exportOpts.Seccomp { + data, err = json.MarshalIndent(g.Config.Linux.Seccomp, "", "\t") + } else { + data, err = json.MarshalIndent(g.Config, "", "\t") + } + if err != nil { + return err + } + + _, err = w.Write(data) + if err != nil { + return err + } + + return nil +} + +// SaveToFile writes the configuration into a file. +func (g *Generator) SaveToFile(path string, exportOpts ExportOptions) error { + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() + return g.Save(f, exportOpts) +} + +// SetVersion sets g.Config.Version. +func (g *Generator) SetVersion(version string) { + g.initConfig() + g.Config.Version = version +} + +// SetRootPath sets g.Config.Root.Path. +func (g *Generator) SetRootPath(path string) { + g.initConfigRoot() + g.Config.Root.Path = path +} + +// SetRootReadonly sets g.Config.Root.Readonly. +func (g *Generator) SetRootReadonly(b bool) { + g.initConfigRoot() + g.Config.Root.Readonly = b +} + +// SetHostname sets g.Config.Hostname. +func (g *Generator) SetHostname(s string) { + g.initConfig() + g.Config.Hostname = s +} + +// SetOCIVersion sets g.Config.Version. +func (g *Generator) SetOCIVersion(s string) { + g.initConfig() + g.Config.Version = s +} + +// ClearAnnotations clears g.Config.Annotations. +func (g *Generator) ClearAnnotations() { + if g.Config == nil { + return + } + g.Config.Annotations = make(map[string]string) +} + +// AddAnnotation adds an annotation into g.Config.Annotations. +func (g *Generator) AddAnnotation(key, value string) { + g.initConfigAnnotations() + g.Config.Annotations[key] = value +} + +// RemoveAnnotation remove an annotation from g.Config.Annotations. +func (g *Generator) RemoveAnnotation(key string) { + if g.Config == nil || g.Config.Annotations == nil { + return + } + delete(g.Config.Annotations, key) +} + +// RemoveHostname removes g.Config.Hostname, setting it to an empty string. +func (g *Generator) RemoveHostname() { + if g.Config == nil { + return + } + g.Config.Hostname = "" +} + +// SetProcessConsoleSize sets g.Config.Process.ConsoleSize. +func (g *Generator) SetProcessConsoleSize(width, height uint) { + g.initConfigProcessConsoleSize() + g.Config.Process.ConsoleSize.Width = width + g.Config.Process.ConsoleSize.Height = height +} + +// SetProcessUID sets g.Config.Process.User.UID. +func (g *Generator) SetProcessUID(uid uint32) { + g.initConfigProcess() + g.Config.Process.User.UID = uid +} + +// SetProcessUsername sets g.Config.Process.User.Username. +func (g *Generator) SetProcessUsername(username string) { + g.initConfigProcess() + g.Config.Process.User.Username = username +} + +// SetProcessUmask sets g.Config.Process.User.Umask. +func (g *Generator) SetProcessUmask(umask uint32) { + g.initConfigProcess() + u := umask + g.Config.Process.User.Umask = &u +} + +// SetProcessGID sets g.Config.Process.User.GID. +func (g *Generator) SetProcessGID(gid uint32) { + g.initConfigProcess() + g.Config.Process.User.GID = gid +} + +// SetProcessCwd sets g.Config.Process.Cwd. +func (g *Generator) SetProcessCwd(cwd string) { + g.initConfigProcess() + g.Config.Process.Cwd = cwd +} + +// SetProcessNoNewPrivileges sets g.Config.Process.NoNewPrivileges. +func (g *Generator) SetProcessNoNewPrivileges(b bool) { + g.initConfigProcess() + g.Config.Process.NoNewPrivileges = b +} + +// SetProcessTerminal sets g.Config.Process.Terminal. +func (g *Generator) SetProcessTerminal(b bool) { + g.initConfigProcess() + g.Config.Process.Terminal = b +} + +// SetProcessApparmorProfile sets g.Config.Process.ApparmorProfile. +func (g *Generator) SetProcessApparmorProfile(prof string) { + g.initConfigProcess() + g.Config.Process.ApparmorProfile = prof +} + +// SetProcessArgs sets g.Config.Process.Args. +func (g *Generator) SetProcessArgs(args []string) { + g.initConfigProcess() + g.Config.Process.Args = args +} + +// ClearProcessEnv clears g.Config.Process.Env. +func (g *Generator) ClearProcessEnv() { + if g.Config == nil || g.Config.Process == nil { + return + } + g.Config.Process.Env = []string{} + // Clear out the env cache map as well + g.envMap = map[string]int{} +} + +// AddProcessEnv adds name=value into g.Config.Process.Env, or replaces an +// existing entry with the given name. +func (g *Generator) AddProcessEnv(name, value string) { + if name == "" { + return + } + + g.initConfigProcess() + g.addEnv(fmt.Sprintf("%s=%s", name, value), name) +} + +// AddMultipleProcessEnv adds multiple name=value into g.Config.Process.Env, or replaces +// existing entries with the given name. +func (g *Generator) AddMultipleProcessEnv(envs []string) { + g.initConfigProcess() + + for _, val := range envs { + split := strings.SplitN(val, "=", 2) + g.addEnv(val, split[0]) + } +} + +// addEnv looks through adds ENV to the Process and checks envMap for +// any duplicates +// This is called by both AddMultipleProcessEnv and AddProcessEnv +func (g *Generator) addEnv(env, key string) { + if idx, ok := g.envMap[key]; ok { + // The ENV exists in the cache, so change its value in g.Config.Process.Env + g.Config.Process.Env[idx] = env + } else { + // else the env doesn't exist, so add it and add it's index to g.envMap + g.Config.Process.Env = append(g.Config.Process.Env, env) + g.envMap[key] = len(g.Config.Process.Env) - 1 + } +} + +// AddProcessRlimits adds rlimit into g.Config.Process.Rlimits. +func (g *Generator) AddProcessRlimits(rType string, rHard uint64, rSoft uint64) { + g.initConfigProcess() + for i, rlimit := range g.Config.Process.Rlimits { + if rlimit.Type == rType { + g.Config.Process.Rlimits[i].Hard = rHard + g.Config.Process.Rlimits[i].Soft = rSoft + return + } + } + + newRlimit := rspec.POSIXRlimit{ + Type: rType, + Hard: rHard, + Soft: rSoft, + } + g.Config.Process.Rlimits = append(g.Config.Process.Rlimits, newRlimit) +} + +// RemoveProcessRlimits removes a rlimit from g.Config.Process.Rlimits. +func (g *Generator) RemoveProcessRlimits(rType string) { + if g.Config == nil || g.Config.Process == nil { + return + } + for i, rlimit := range g.Config.Process.Rlimits { + if rlimit.Type == rType { + g.Config.Process.Rlimits = append(g.Config.Process.Rlimits[:i], g.Config.Process.Rlimits[i+1:]...) + return + } + } +} + +// ClearProcessRlimits clear g.Config.Process.Rlimits. +func (g *Generator) ClearProcessRlimits() { + if g.Config == nil || g.Config.Process == nil { + return + } + g.Config.Process.Rlimits = []rspec.POSIXRlimit{} +} + +// ClearProcessAdditionalGids clear g.Config.Process.AdditionalGids. +func (g *Generator) ClearProcessAdditionalGids() { + if g.Config == nil || g.Config.Process == nil { + return + } + g.Config.Process.User.AdditionalGids = []uint32{} +} + +// AddProcessAdditionalGid adds an additional gid into g.Config.Process.AdditionalGids. +func (g *Generator) AddProcessAdditionalGid(gid uint32) { + g.initConfigProcess() + for _, group := range g.Config.Process.User.AdditionalGids { + if group == gid { + return + } + } + g.Config.Process.User.AdditionalGids = append(g.Config.Process.User.AdditionalGids, gid) +} + +// SetProcessSelinuxLabel sets g.Config.Process.SelinuxLabel. +func (g *Generator) SetProcessSelinuxLabel(label string) { + g.initConfigProcess() + g.Config.Process.SelinuxLabel = label +} + +// SetLinuxCgroupsPath sets g.Config.Linux.CgroupsPath. +func (g *Generator) SetLinuxCgroupsPath(path string) { + g.initConfigLinux() + g.Config.Linux.CgroupsPath = path +} + +// SetLinuxIntelRdtClosID sets g.Config.Linux.IntelRdt.ClosID +func (g *Generator) SetLinuxIntelRdtClosID(clos string) { + g.initConfigLinuxIntelRdt() + g.Config.Linux.IntelRdt.ClosID = clos +} + +// SetLinuxIntelRdtL3CacheSchema sets g.Config.Linux.IntelRdt.L3CacheSchema +func (g *Generator) SetLinuxIntelRdtL3CacheSchema(schema string) { + g.initConfigLinuxIntelRdt() + g.Config.Linux.IntelRdt.L3CacheSchema = schema +} + +// SetLinuxMountLabel sets g.Config.Linux.MountLabel. +func (g *Generator) SetLinuxMountLabel(label string) { + g.initConfigLinux() + g.Config.Linux.MountLabel = label +} + +// SetProcessOOMScoreAdj sets g.Config.Process.OOMScoreAdj. +func (g *Generator) SetProcessOOMScoreAdj(adj int) { + g.initConfigProcess() + g.Config.Process.OOMScoreAdj = &adj +} + +// SetLinuxResourcesBlockIOLeafWeight sets g.Config.Linux.Resources.BlockIO.LeafWeight. +func (g *Generator) SetLinuxResourcesBlockIOLeafWeight(weight uint16) { + g.initConfigLinuxResourcesBlockIO() + g.Config.Linux.Resources.BlockIO.LeafWeight = &weight +} + +// AddLinuxResourcesBlockIOLeafWeightDevice adds or sets g.Config.Linux.Resources.BlockIO.WeightDevice.LeafWeight. +func (g *Generator) AddLinuxResourcesBlockIOLeafWeightDevice(major int64, minor int64, weight uint16) { + g.initConfigLinuxResourcesBlockIO() + for i, weightDevice := range g.Config.Linux.Resources.BlockIO.WeightDevice { + if weightDevice.Major == major && weightDevice.Minor == minor { + g.Config.Linux.Resources.BlockIO.WeightDevice[i].LeafWeight = &weight + return + } + } + weightDevice := new(rspec.LinuxWeightDevice) + weightDevice.Major = major + weightDevice.Minor = minor + weightDevice.LeafWeight = &weight + g.Config.Linux.Resources.BlockIO.WeightDevice = append(g.Config.Linux.Resources.BlockIO.WeightDevice, *weightDevice) +} + +// DropLinuxResourcesBlockIOLeafWeightDevice drops a item form g.Config.Linux.Resources.BlockIO.WeightDevice.LeafWeight +func (g *Generator) DropLinuxResourcesBlockIOLeafWeightDevice(major int64, minor int64) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.BlockIO == nil { + return + } + + for i, weightDevice := range g.Config.Linux.Resources.BlockIO.WeightDevice { + if weightDevice.Major == major && weightDevice.Minor == minor { + if weightDevice.Weight != nil { + newWeightDevice := new(rspec.LinuxWeightDevice) + newWeightDevice.Major = major + newWeightDevice.Minor = minor + newWeightDevice.Weight = weightDevice.Weight + g.Config.Linux.Resources.BlockIO.WeightDevice[i] = *newWeightDevice + } else { + g.Config.Linux.Resources.BlockIO.WeightDevice = append(g.Config.Linux.Resources.BlockIO.WeightDevice[:i], g.Config.Linux.Resources.BlockIO.WeightDevice[i+1:]...) + } + return + } + } +} + +// SetLinuxResourcesBlockIOWeight sets g.Config.Linux.Resources.BlockIO.Weight. +func (g *Generator) SetLinuxResourcesBlockIOWeight(weight uint16) { + g.initConfigLinuxResourcesBlockIO() + g.Config.Linux.Resources.BlockIO.Weight = &weight +} + +// AddLinuxResourcesBlockIOWeightDevice adds or sets g.Config.Linux.Resources.BlockIO.WeightDevice.Weight. +func (g *Generator) AddLinuxResourcesBlockIOWeightDevice(major int64, minor int64, weight uint16) { + g.initConfigLinuxResourcesBlockIO() + for i, weightDevice := range g.Config.Linux.Resources.BlockIO.WeightDevice { + if weightDevice.Major == major && weightDevice.Minor == minor { + g.Config.Linux.Resources.BlockIO.WeightDevice[i].Weight = &weight + return + } + } + weightDevice := new(rspec.LinuxWeightDevice) + weightDevice.Major = major + weightDevice.Minor = minor + weightDevice.Weight = &weight + g.Config.Linux.Resources.BlockIO.WeightDevice = append(g.Config.Linux.Resources.BlockIO.WeightDevice, *weightDevice) +} + +// DropLinuxResourcesBlockIOWeightDevice drops a item form g.Config.Linux.Resources.BlockIO.WeightDevice.Weight +func (g *Generator) DropLinuxResourcesBlockIOWeightDevice(major int64, minor int64) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.BlockIO == nil { + return + } + + for i, weightDevice := range g.Config.Linux.Resources.BlockIO.WeightDevice { + if weightDevice.Major == major && weightDevice.Minor == minor { + if weightDevice.LeafWeight != nil { + newWeightDevice := new(rspec.LinuxWeightDevice) + newWeightDevice.Major = major + newWeightDevice.Minor = minor + newWeightDevice.LeafWeight = weightDevice.LeafWeight + g.Config.Linux.Resources.BlockIO.WeightDevice[i] = *newWeightDevice + } else { + g.Config.Linux.Resources.BlockIO.WeightDevice = append(g.Config.Linux.Resources.BlockIO.WeightDevice[:i], g.Config.Linux.Resources.BlockIO.WeightDevice[i+1:]...) + } + return + } + } +} + +// AddLinuxResourcesBlockIOThrottleReadBpsDevice adds or sets g.Config.Linux.Resources.BlockIO.ThrottleReadBpsDevice. +func (g *Generator) AddLinuxResourcesBlockIOThrottleReadBpsDevice(major int64, minor int64, rate uint64) { + g.initConfigLinuxResourcesBlockIO() + throttleDevices := addOrReplaceBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleReadBpsDevice, major, minor, rate) + g.Config.Linux.Resources.BlockIO.ThrottleReadBpsDevice = throttleDevices +} + +// DropLinuxResourcesBlockIOThrottleReadBpsDevice drops a item from g.Config.Linux.Resources.BlockIO.ThrottleReadBpsDevice. +func (g *Generator) DropLinuxResourcesBlockIOThrottleReadBpsDevice(major int64, minor int64) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.BlockIO == nil { + return + } + + throttleDevices := dropBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleReadBpsDevice, major, minor) + g.Config.Linux.Resources.BlockIO.ThrottleReadBpsDevice = throttleDevices +} + +// AddLinuxResourcesBlockIOThrottleReadIOPSDevice adds or sets g.Config.Linux.Resources.BlockIO.ThrottleReadIOPSDevice. +func (g *Generator) AddLinuxResourcesBlockIOThrottleReadIOPSDevice(major int64, minor int64, rate uint64) { + g.initConfigLinuxResourcesBlockIO() + throttleDevices := addOrReplaceBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleReadIOPSDevice, major, minor, rate) + g.Config.Linux.Resources.BlockIO.ThrottleReadIOPSDevice = throttleDevices +} + +// DropLinuxResourcesBlockIOThrottleReadIOPSDevice drops a item from g.Config.Linux.Resources.BlockIO.ThrottleReadIOPSDevice. +func (g *Generator) DropLinuxResourcesBlockIOThrottleReadIOPSDevice(major int64, minor int64) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.BlockIO == nil { + return + } + + throttleDevices := dropBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleReadIOPSDevice, major, minor) + g.Config.Linux.Resources.BlockIO.ThrottleReadIOPSDevice = throttleDevices +} + +// AddLinuxResourcesBlockIOThrottleWriteBpsDevice adds or sets g.Config.Linux.Resources.BlockIO.ThrottleWriteBpsDevice. +func (g *Generator) AddLinuxResourcesBlockIOThrottleWriteBpsDevice(major int64, minor int64, rate uint64) { + g.initConfigLinuxResourcesBlockIO() + throttleDevices := addOrReplaceBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleWriteBpsDevice, major, minor, rate) + g.Config.Linux.Resources.BlockIO.ThrottleWriteBpsDevice = throttleDevices +} + +// DropLinuxResourcesBlockIOThrottleWriteBpsDevice drops a item from g.Config.Linux.Resources.BlockIO.ThrottleWriteBpsDevice. +func (g *Generator) DropLinuxResourcesBlockIOThrottleWriteBpsDevice(major int64, minor int64) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.BlockIO == nil { + return + } + + throttleDevices := dropBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleWriteBpsDevice, major, minor) + g.Config.Linux.Resources.BlockIO.ThrottleWriteBpsDevice = throttleDevices +} + +// AddLinuxResourcesBlockIOThrottleWriteIOPSDevice adds or sets g.Config.Linux.Resources.BlockIO.ThrottleWriteIOPSDevice. +func (g *Generator) AddLinuxResourcesBlockIOThrottleWriteIOPSDevice(major int64, minor int64, rate uint64) { + g.initConfigLinuxResourcesBlockIO() + throttleDevices := addOrReplaceBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleWriteIOPSDevice, major, minor, rate) + g.Config.Linux.Resources.BlockIO.ThrottleWriteIOPSDevice = throttleDevices +} + +// DropLinuxResourcesBlockIOThrottleWriteIOPSDevice drops a item from g.Config.Linux.Resources.BlockIO.ThrottleWriteIOPSDevice. +func (g *Generator) DropLinuxResourcesBlockIOThrottleWriteIOPSDevice(major int64, minor int64) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.BlockIO == nil { + return + } + + throttleDevices := dropBlockIOThrottleDevice(g.Config.Linux.Resources.BlockIO.ThrottleWriteIOPSDevice, major, minor) + g.Config.Linux.Resources.BlockIO.ThrottleWriteIOPSDevice = throttleDevices +} + +// SetLinuxResourcesCPUShares sets g.Config.Linux.Resources.CPU.Shares. +func (g *Generator) SetLinuxResourcesCPUShares(shares uint64) { + g.InitConfigLinuxResourcesCPU() + g.Config.Linux.Resources.CPU.Shares = &shares +} + +// SetLinuxResourcesCPUQuota sets g.Config.Linux.Resources.CPU.Quota. +func (g *Generator) SetLinuxResourcesCPUQuota(quota int64) { + g.InitConfigLinuxResourcesCPU() + g.Config.Linux.Resources.CPU.Quota = "a +} + +// SetLinuxResourcesCPUPeriod sets g.Config.Linux.Resources.CPU.Period. +func (g *Generator) SetLinuxResourcesCPUPeriod(period uint64) { + g.InitConfigLinuxResourcesCPU() + g.Config.Linux.Resources.CPU.Period = &period +} + +// SetLinuxResourcesCPURealtimeRuntime sets g.Config.Linux.Resources.CPU.RealtimeRuntime. +func (g *Generator) SetLinuxResourcesCPURealtimeRuntime(time int64) { + g.InitConfigLinuxResourcesCPU() + g.Config.Linux.Resources.CPU.RealtimeRuntime = &time +} + +// SetLinuxResourcesCPURealtimePeriod sets g.Config.Linux.Resources.CPU.RealtimePeriod. +func (g *Generator) SetLinuxResourcesCPURealtimePeriod(period uint64) { + g.InitConfigLinuxResourcesCPU() + g.Config.Linux.Resources.CPU.RealtimePeriod = &period +} + +// SetLinuxResourcesCPUCpus sets g.Config.Linux.Resources.CPU.Cpus. +func (g *Generator) SetLinuxResourcesCPUCpus(cpus string) { + g.InitConfigLinuxResourcesCPU() + g.Config.Linux.Resources.CPU.Cpus = cpus +} + +// SetLinuxResourcesCPUMems sets g.Config.Linux.Resources.CPU.Mems. +func (g *Generator) SetLinuxResourcesCPUMems(mems string) { + g.InitConfigLinuxResourcesCPU() + g.Config.Linux.Resources.CPU.Mems = mems +} + +// AddLinuxResourcesHugepageLimit adds or sets g.Config.Linux.Resources.HugepageLimits. +func (g *Generator) AddLinuxResourcesHugepageLimit(pageSize string, limit uint64) { + hugepageLimit := rspec.LinuxHugepageLimit{ + Pagesize: pageSize, + Limit: limit, + } + + g.initConfigLinuxResources() + for i, pageLimit := range g.Config.Linux.Resources.HugepageLimits { + if pageLimit.Pagesize == pageSize { + g.Config.Linux.Resources.HugepageLimits[i].Limit = limit + return + } + } + g.Config.Linux.Resources.HugepageLimits = append(g.Config.Linux.Resources.HugepageLimits, hugepageLimit) +} + +// DropLinuxResourcesHugepageLimit drops a hugepage limit from g.Config.Linux.Resources.HugepageLimits. +func (g *Generator) DropLinuxResourcesHugepageLimit(pageSize string) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil { + return + } + + for i, pageLimit := range g.Config.Linux.Resources.HugepageLimits { + if pageLimit.Pagesize == pageSize { + g.Config.Linux.Resources.HugepageLimits = append(g.Config.Linux.Resources.HugepageLimits[:i], g.Config.Linux.Resources.HugepageLimits[i+1:]...) + return + } + } +} + +// AddLinuxResourcesUnified sets the g.Config.Linux.Resources.Unified +func (g *Generator) SetLinuxResourcesUnified(unified map[string]string) { + g.initConfigLinuxResourcesUnified() + for k, v := range unified { + g.Config.Linux.Resources.Unified[k] = v + } +} + +// AddLinuxResourcesUnified adds or updates the key-value pair from g.Config.Linux.Resources.Unified +func (g *Generator) AddLinuxResourcesUnified(key, val string) { + g.initConfigLinuxResourcesUnified() + g.Config.Linux.Resources.Unified[key] = val +} + +// DropLinuxResourcesUnified drops a key-value pair from g.Config.Linux.Resources.Unified +func (g *Generator) DropLinuxResourcesUnified(key string) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.Unified == nil { + return + } + delete(g.Config.Linux.Resources.Unified, key) +} + +// SetLinuxResourcesMemoryLimit sets g.Config.Linux.Resources.Memory.Limit. +func (g *Generator) SetLinuxResourcesMemoryLimit(limit int64) { + g.initConfigLinuxResourcesMemory() + g.Config.Linux.Resources.Memory.Limit = &limit +} + +// SetLinuxResourcesMemoryReservation sets g.Config.Linux.Resources.Memory.Reservation. +func (g *Generator) SetLinuxResourcesMemoryReservation(reservation int64) { + g.initConfigLinuxResourcesMemory() + g.Config.Linux.Resources.Memory.Reservation = &reservation +} + +// SetLinuxResourcesMemorySwap sets g.Config.Linux.Resources.Memory.Swap. +func (g *Generator) SetLinuxResourcesMemorySwap(swap int64) { + g.initConfigLinuxResourcesMemory() + g.Config.Linux.Resources.Memory.Swap = &swap +} + +// SetLinuxResourcesMemoryKernel sets g.Config.Linux.Resources.Memory.Kernel. +func (g *Generator) SetLinuxResourcesMemoryKernel(kernel int64) { + g.initConfigLinuxResourcesMemory() + g.Config.Linux.Resources.Memory.Kernel = &kernel +} + +// SetLinuxResourcesMemoryKernelTCP sets g.Config.Linux.Resources.Memory.KernelTCP. +func (g *Generator) SetLinuxResourcesMemoryKernelTCP(kernelTCP int64) { + g.initConfigLinuxResourcesMemory() + g.Config.Linux.Resources.Memory.KernelTCP = &kernelTCP +} + +// SetLinuxResourcesMemorySwappiness sets g.Config.Linux.Resources.Memory.Swappiness. +func (g *Generator) SetLinuxResourcesMemorySwappiness(swappiness uint64) { + g.initConfigLinuxResourcesMemory() + g.Config.Linux.Resources.Memory.Swappiness = &swappiness +} + +// SetLinuxResourcesMemoryDisableOOMKiller sets g.Config.Linux.Resources.Memory.DisableOOMKiller. +func (g *Generator) SetLinuxResourcesMemoryDisableOOMKiller(disable bool) { + g.initConfigLinuxResourcesMemory() + g.Config.Linux.Resources.Memory.DisableOOMKiller = &disable +} + +// SetLinuxResourcesNetworkClassID sets g.Config.Linux.Resources.Network.ClassID. +func (g *Generator) SetLinuxResourcesNetworkClassID(classid uint32) { + g.initConfigLinuxResourcesNetwork() + g.Config.Linux.Resources.Network.ClassID = &classid +} + +// AddLinuxResourcesNetworkPriorities adds or sets g.Config.Linux.Resources.Network.Priorities. +func (g *Generator) AddLinuxResourcesNetworkPriorities(name string, prio uint32) { + g.initConfigLinuxResourcesNetwork() + for i, netPriority := range g.Config.Linux.Resources.Network.Priorities { + if netPriority.Name == name { + g.Config.Linux.Resources.Network.Priorities[i].Priority = prio + return + } + } + interfacePrio := new(rspec.LinuxInterfacePriority) + interfacePrio.Name = name + interfacePrio.Priority = prio + g.Config.Linux.Resources.Network.Priorities = append(g.Config.Linux.Resources.Network.Priorities, *interfacePrio) +} + +// DropLinuxResourcesNetworkPriorities drops one item from g.Config.Linux.Resources.Network.Priorities. +func (g *Generator) DropLinuxResourcesNetworkPriorities(name string) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil || g.Config.Linux.Resources.Network == nil { + return + } + + for i, netPriority := range g.Config.Linux.Resources.Network.Priorities { + if netPriority.Name == name { + g.Config.Linux.Resources.Network.Priorities = append(g.Config.Linux.Resources.Network.Priorities[:i], g.Config.Linux.Resources.Network.Priorities[i+1:]...) + return + } + } +} + +// SetLinuxResourcesPidsLimit sets g.Config.Linux.Resources.Pids.Limit. +func (g *Generator) SetLinuxResourcesPidsLimit(limit int64) { + g.initConfigLinuxResourcesPids() + g.Config.Linux.Resources.Pids.Limit = limit +} + +// ClearLinuxSysctl clears g.Config.Linux.Sysctl. +func (g *Generator) ClearLinuxSysctl() { + if g.Config == nil || g.Config.Linux == nil { + return + } + g.Config.Linux.Sysctl = make(map[string]string) +} + +// AddLinuxSysctl adds a new sysctl config into g.Config.Linux.Sysctl. +func (g *Generator) AddLinuxSysctl(key, value string) { + g.initConfigLinuxSysctl() + g.Config.Linux.Sysctl[key] = value +} + +// RemoveLinuxSysctl removes a sysctl config from g.Config.Linux.Sysctl. +func (g *Generator) RemoveLinuxSysctl(key string) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Sysctl == nil { + return + } + delete(g.Config.Linux.Sysctl, key) +} + +// ClearLinuxUIDMappings clear g.Config.Linux.UIDMappings. +func (g *Generator) ClearLinuxUIDMappings() { + if g.Config == nil || g.Config.Linux == nil { + return + } + g.Config.Linux.UIDMappings = []rspec.LinuxIDMapping{} +} + +// AddLinuxUIDMapping adds uidMap into g.Config.Linux.UIDMappings. +func (g *Generator) AddLinuxUIDMapping(hid, cid, size uint32) { + idMapping := rspec.LinuxIDMapping{ + HostID: hid, + ContainerID: cid, + Size: size, + } + + g.initConfigLinux() + g.Config.Linux.UIDMappings = append(g.Config.Linux.UIDMappings, idMapping) +} + +// ClearLinuxGIDMappings clear g.Config.Linux.GIDMappings. +func (g *Generator) ClearLinuxGIDMappings() { + if g.Config == nil || g.Config.Linux == nil { + return + } + g.Config.Linux.GIDMappings = []rspec.LinuxIDMapping{} +} + +// AddLinuxGIDMapping adds gidMap into g.Config.Linux.GIDMappings. +func (g *Generator) AddLinuxGIDMapping(hid, cid, size uint32) { + idMapping := rspec.LinuxIDMapping{ + HostID: hid, + ContainerID: cid, + Size: size, + } + + g.initConfigLinux() + g.Config.Linux.GIDMappings = append(g.Config.Linux.GIDMappings, idMapping) +} + +// SetLinuxRootPropagation sets g.Config.Linux.RootfsPropagation. +func (g *Generator) SetLinuxRootPropagation(rp string) error { + switch rp { + case "": + case "private": + case "rprivate": + case "slave": + case "rslave": + case "shared": + case "rshared": + case "unbindable": + case "runbindable": + default: + return fmt.Errorf("rootfs-propagation %q must be empty or one of (r)private|(r)slave|(r)shared|(r)unbindable", rp) + } + g.initConfigLinux() + g.Config.Linux.RootfsPropagation = rp + return nil +} + +// ClearPreStartHooks clear g.Config.Hooks.Prestart. +func (g *Generator) ClearPreStartHooks() { + if g.Config == nil || g.Config.Hooks == nil { + return + } + g.Config.Hooks.Prestart = []rspec.Hook{} +} + +// AddPreStartHook add a prestart hook into g.Config.Hooks.Prestart. +func (g *Generator) AddPreStartHook(preStartHook rspec.Hook) { + g.initConfigHooks() + g.Config.Hooks.Prestart = append(g.Config.Hooks.Prestart, preStartHook) +} + +// ClearPostStopHooks clear g.Config.Hooks.Poststop. +func (g *Generator) ClearPostStopHooks() { + if g.Config == nil || g.Config.Hooks == nil { + return + } + g.Config.Hooks.Poststop = []rspec.Hook{} +} + +// AddPostStopHook adds a poststop hook into g.Config.Hooks.Poststop. +func (g *Generator) AddPostStopHook(postStopHook rspec.Hook) { + g.initConfigHooks() + g.Config.Hooks.Poststop = append(g.Config.Hooks.Poststop, postStopHook) +} + +// ClearPostStartHooks clear g.Config.Hooks.Poststart. +func (g *Generator) ClearPostStartHooks() { + if g.Config == nil || g.Config.Hooks == nil { + return + } + g.Config.Hooks.Poststart = []rspec.Hook{} +} + +// AddPostStartHook adds a poststart hook into g.Config.Hooks.Poststart. +func (g *Generator) AddPostStartHook(postStartHook rspec.Hook) { + g.initConfigHooks() + g.Config.Hooks.Poststart = append(g.Config.Hooks.Poststart, postStartHook) +} + +// AddMount adds a mount into g.Config.Mounts. +func (g *Generator) AddMount(mnt rspec.Mount) { + g.initConfig() + + g.Config.Mounts = append(g.Config.Mounts, mnt) +} + +// RemoveMount removes a mount point on the dest directory +func (g *Generator) RemoveMount(dest string) { + g.initConfig() + + for index, mount := range g.Config.Mounts { + if mount.Destination == dest { + g.Config.Mounts = append(g.Config.Mounts[:index], g.Config.Mounts[index+1:]...) + return + } + } +} + +// Mounts returns the list of mounts +func (g *Generator) Mounts() []rspec.Mount { + g.initConfig() + + return g.Config.Mounts +} + +// ClearMounts clear g.Config.Mounts +func (g *Generator) ClearMounts() { + if g.Config == nil { + return + } + g.Config.Mounts = []rspec.Mount{} +} + +// SetupPrivileged sets up the privilege-related fields inside g.Config. +func (g *Generator) SetupPrivileged(privileged bool) { + if privileged { // Add all capabilities in privileged mode. + var finalCapList []string + for _, cap := range capability.List() { + if g.HostSpecific && cap > capsCheck.LastCap() { + continue + } + finalCapList = append(finalCapList, fmt.Sprintf("CAP_%s", strings.ToUpper(cap.String()))) + } + g.initConfigLinux() + g.initConfigProcessCapabilities() + g.ClearProcessCapabilities() + g.Config.Process.Capabilities.Bounding = append(g.Config.Process.Capabilities.Bounding, finalCapList...) + g.Config.Process.Capabilities.Effective = append(g.Config.Process.Capabilities.Effective, finalCapList...) + g.Config.Process.Capabilities.Inheritable = append(g.Config.Process.Capabilities.Inheritable, finalCapList...) + g.Config.Process.Capabilities.Permitted = append(g.Config.Process.Capabilities.Permitted, finalCapList...) + g.Config.Process.Capabilities.Ambient = append(g.Config.Process.Capabilities.Ambient, finalCapList...) + g.Config.Process.SelinuxLabel = "" + g.Config.Process.ApparmorProfile = "" + g.Config.Linux.Seccomp = nil + } +} + +// ClearProcessCapabilities clear g.Config.Process.Capabilities. +func (g *Generator) ClearProcessCapabilities() { + if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil { + return + } + g.Config.Process.Capabilities.Bounding = []string{} + g.Config.Process.Capabilities.Effective = []string{} + g.Config.Process.Capabilities.Inheritable = []string{} + g.Config.Process.Capabilities.Permitted = []string{} + g.Config.Process.Capabilities.Ambient = []string{} +} + +// AddProcessCapability adds a process capability into all 5 capability sets. +func (g *Generator) AddProcessCapability(c string) error { + cp := strings.ToUpper(c) + if err := capsCheck.CapValid(cp, g.HostSpecific); err != nil { + return err + } + + g.initConfigProcessCapabilities() + + var foundAmbient, foundBounding, foundEffective, foundInheritable, foundPermitted bool + for _, cap := range g.Config.Process.Capabilities.Ambient { + if strings.ToUpper(cap) == cp { + foundAmbient = true + break + } + } + if !foundAmbient { + g.Config.Process.Capabilities.Ambient = append(g.Config.Process.Capabilities.Ambient, cp) + } + + for _, cap := range g.Config.Process.Capabilities.Bounding { + if strings.ToUpper(cap) == cp { + foundBounding = true + break + } + } + if !foundBounding { + g.Config.Process.Capabilities.Bounding = append(g.Config.Process.Capabilities.Bounding, cp) + } + + for _, cap := range g.Config.Process.Capabilities.Effective { + if strings.ToUpper(cap) == cp { + foundEffective = true + break + } + } + if !foundEffective { + g.Config.Process.Capabilities.Effective = append(g.Config.Process.Capabilities.Effective, cp) + } + + for _, cap := range g.Config.Process.Capabilities.Inheritable { + if strings.ToUpper(cap) == cp { + foundInheritable = true + break + } + } + if !foundInheritable { + g.Config.Process.Capabilities.Inheritable = append(g.Config.Process.Capabilities.Inheritable, cp) + } + + for _, cap := range g.Config.Process.Capabilities.Permitted { + if strings.ToUpper(cap) == cp { + foundPermitted = true + break + } + } + if !foundPermitted { + g.Config.Process.Capabilities.Permitted = append(g.Config.Process.Capabilities.Permitted, cp) + } + + return nil +} + +// AddProcessCapabilityAmbient adds a process capability into g.Config.Process.Capabilities.Ambient. +func (g *Generator) AddProcessCapabilityAmbient(c string) error { + cp := strings.ToUpper(c) + if err := capsCheck.CapValid(cp, g.HostSpecific); err != nil { + return err + } + + g.initConfigProcessCapabilities() + + var foundAmbient bool + for _, cap := range g.Config.Process.Capabilities.Ambient { + if strings.ToUpper(cap) == cp { + foundAmbient = true + break + } + } + + if !foundAmbient { + g.Config.Process.Capabilities.Ambient = append(g.Config.Process.Capabilities.Ambient, cp) + } + + return nil +} + +// AddProcessCapabilityBounding adds a process capability into g.Config.Process.Capabilities.Bounding. +func (g *Generator) AddProcessCapabilityBounding(c string) error { + cp := strings.ToUpper(c) + if err := capsCheck.CapValid(cp, g.HostSpecific); err != nil { + return err + } + + g.initConfigProcessCapabilities() + + var foundBounding bool + for _, cap := range g.Config.Process.Capabilities.Bounding { + if strings.ToUpper(cap) == cp { + foundBounding = true + break + } + } + if !foundBounding { + g.Config.Process.Capabilities.Bounding = append(g.Config.Process.Capabilities.Bounding, cp) + } + + return nil +} + +// AddProcessCapabilityEffective adds a process capability into g.Config.Process.Capabilities.Effective. +func (g *Generator) AddProcessCapabilityEffective(c string) error { + cp := strings.ToUpper(c) + if err := capsCheck.CapValid(cp, g.HostSpecific); err != nil { + return err + } + + g.initConfigProcessCapabilities() + + var foundEffective bool + for _, cap := range g.Config.Process.Capabilities.Effective { + if strings.ToUpper(cap) == cp { + foundEffective = true + break + } + } + if !foundEffective { + g.Config.Process.Capabilities.Effective = append(g.Config.Process.Capabilities.Effective, cp) + } + + return nil +} + +// AddProcessCapabilityInheritable adds a process capability into g.Config.Process.Capabilities.Inheritable. +func (g *Generator) AddProcessCapabilityInheritable(c string) error { + cp := strings.ToUpper(c) + if err := capsCheck.CapValid(cp, g.HostSpecific); err != nil { + return err + } + + g.initConfigProcessCapabilities() + + var foundInheritable bool + for _, cap := range g.Config.Process.Capabilities.Inheritable { + if strings.ToUpper(cap) == cp { + foundInheritable = true + break + } + } + if !foundInheritable { + g.Config.Process.Capabilities.Inheritable = append(g.Config.Process.Capabilities.Inheritable, cp) + } + + return nil +} + +// AddProcessCapabilityPermitted adds a process capability into g.Config.Process.Capabilities.Permitted. +func (g *Generator) AddProcessCapabilityPermitted(c string) error { + cp := strings.ToUpper(c) + if err := capsCheck.CapValid(cp, g.HostSpecific); err != nil { + return err + } + + g.initConfigProcessCapabilities() + + var foundPermitted bool + for _, cap := range g.Config.Process.Capabilities.Permitted { + if strings.ToUpper(cap) == cp { + foundPermitted = true + break + } + } + if !foundPermitted { + g.Config.Process.Capabilities.Permitted = append(g.Config.Process.Capabilities.Permitted, cp) + } + + return nil +} + +// DropProcessCapability drops a process capability from all 5 capability sets. +func (g *Generator) DropProcessCapability(c string) error { + if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil { + return nil + } + + cp := strings.ToUpper(c) + for i, cap := range g.Config.Process.Capabilities.Ambient { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Ambient = removeFunc(g.Config.Process.Capabilities.Ambient, i) + } + } + for i, cap := range g.Config.Process.Capabilities.Bounding { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Bounding = removeFunc(g.Config.Process.Capabilities.Bounding, i) + } + } + for i, cap := range g.Config.Process.Capabilities.Effective { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Effective = removeFunc(g.Config.Process.Capabilities.Effective, i) + } + } + for i, cap := range g.Config.Process.Capabilities.Inheritable { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Inheritable = removeFunc(g.Config.Process.Capabilities.Inheritable, i) + } + } + for i, cap := range g.Config.Process.Capabilities.Permitted { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Permitted = removeFunc(g.Config.Process.Capabilities.Permitted, i) + } + } + + return capsCheck.CapValid(cp, false) +} + +// DropProcessCapabilityAmbient drops a process capability from g.Config.Process.Capabilities.Ambient. +func (g *Generator) DropProcessCapabilityAmbient(c string) error { + if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil { + return nil + } + + cp := strings.ToUpper(c) + for i, cap := range g.Config.Process.Capabilities.Ambient { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Ambient = removeFunc(g.Config.Process.Capabilities.Ambient, i) + } + } + + return capsCheck.CapValid(cp, false) +} + +// DropProcessCapabilityBounding drops a process capability from g.Config.Process.Capabilities.Bounding. +func (g *Generator) DropProcessCapabilityBounding(c string) error { + if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil { + return nil + } + + cp := strings.ToUpper(c) + for i, cap := range g.Config.Process.Capabilities.Bounding { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Bounding = removeFunc(g.Config.Process.Capabilities.Bounding, i) + } + } + + return capsCheck.CapValid(cp, false) +} + +// DropProcessCapabilityEffective drops a process capability from g.Config.Process.Capabilities.Effective. +func (g *Generator) DropProcessCapabilityEffective(c string) error { + if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil { + return nil + } + + cp := strings.ToUpper(c) + for i, cap := range g.Config.Process.Capabilities.Effective { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Effective = removeFunc(g.Config.Process.Capabilities.Effective, i) + } + } + + return capsCheck.CapValid(cp, false) +} + +// DropProcessCapabilityInheritable drops a process capability from g.Config.Process.Capabilities.Inheritable. +func (g *Generator) DropProcessCapabilityInheritable(c string) error { + if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil { + return nil + } + + cp := strings.ToUpper(c) + for i, cap := range g.Config.Process.Capabilities.Inheritable { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Inheritable = removeFunc(g.Config.Process.Capabilities.Inheritable, i) + } + } + + return capsCheck.CapValid(cp, false) +} + +// DropProcessCapabilityPermitted drops a process capability from g.Config.Process.Capabilities.Permitted. +func (g *Generator) DropProcessCapabilityPermitted(c string) error { + if g.Config == nil || g.Config.Process == nil || g.Config.Process.Capabilities == nil { + return nil + } + + cp := strings.ToUpper(c) + for i, cap := range g.Config.Process.Capabilities.Permitted { + if strings.ToUpper(cap) == cp { + g.Config.Process.Capabilities.Permitted = removeFunc(g.Config.Process.Capabilities.Permitted, i) + } + } + + return capsCheck.CapValid(cp, false) +} + +func mapStrToNamespace(ns string, path string) (rspec.LinuxNamespace, error) { + switch ns { + case "network": + return rspec.LinuxNamespace{Type: rspec.NetworkNamespace, Path: path}, nil + case "pid": + return rspec.LinuxNamespace{Type: rspec.PIDNamespace, Path: path}, nil + case "mount": + return rspec.LinuxNamespace{Type: rspec.MountNamespace, Path: path}, nil + case "ipc": + return rspec.LinuxNamespace{Type: rspec.IPCNamespace, Path: path}, nil + case "uts": + return rspec.LinuxNamespace{Type: rspec.UTSNamespace, Path: path}, nil + case "user": + return rspec.LinuxNamespace{Type: rspec.UserNamespace, Path: path}, nil + case "cgroup": + return rspec.LinuxNamespace{Type: rspec.CgroupNamespace, Path: path}, nil + default: + return rspec.LinuxNamespace{}, fmt.Errorf("unrecognized namespace %q", ns) + } +} + +// ClearLinuxNamespaces clear g.Config.Linux.Namespaces. +func (g *Generator) ClearLinuxNamespaces() { + if g.Config == nil || g.Config.Linux == nil { + return + } + g.Config.Linux.Namespaces = []rspec.LinuxNamespace{} +} + +// AddOrReplaceLinuxNamespace adds or replaces a namespace inside +// g.Config.Linux.Namespaces. +func (g *Generator) AddOrReplaceLinuxNamespace(ns string, path string) error { + namespace, err := mapStrToNamespace(ns, path) + if err != nil { + return err + } + + g.initConfigLinux() + for i, ns := range g.Config.Linux.Namespaces { + if ns.Type == namespace.Type { + g.Config.Linux.Namespaces[i] = namespace + return nil + } + } + g.Config.Linux.Namespaces = append(g.Config.Linux.Namespaces, namespace) + return nil +} + +// RemoveLinuxNamespace removes a namespace from g.Config.Linux.Namespaces. +func (g *Generator) RemoveLinuxNamespace(ns string) error { + namespace, err := mapStrToNamespace(ns, "") + if err != nil { + return err + } + + if g.Config == nil || g.Config.Linux == nil { + return nil + } + for i, ns := range g.Config.Linux.Namespaces { + if ns.Type == namespace.Type { + g.Config.Linux.Namespaces = append(g.Config.Linux.Namespaces[:i], g.Config.Linux.Namespaces[i+1:]...) + return nil + } + } + return nil +} + +// AddDevice - add a device into g.Config.Linux.Devices +func (g *Generator) AddDevice(device rspec.LinuxDevice) { + g.initConfigLinux() + + for i, dev := range g.Config.Linux.Devices { + if dev.Path == device.Path { + g.Config.Linux.Devices[i] = device + return + } + } + + g.Config.Linux.Devices = append(g.Config.Linux.Devices, device) +} + +// RemoveDevice remove a device from g.Config.Linux.Devices +func (g *Generator) RemoveDevice(path string) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Devices == nil { + return + } + + for i, device := range g.Config.Linux.Devices { + if device.Path == path { + g.Config.Linux.Devices = append(g.Config.Linux.Devices[:i], g.Config.Linux.Devices[i+1:]...) + return + } + } +} + +// ClearLinuxDevices clears g.Config.Linux.Devices +func (g *Generator) ClearLinuxDevices() { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Devices == nil { + return + } + + g.Config.Linux.Devices = []rspec.LinuxDevice{} +} + +// AddLinuxResourcesDevice - add a device into g.Config.Linux.Resources.Devices +func (g *Generator) AddLinuxResourcesDevice(allow bool, devType string, major, minor *int64, access string) { + g.initConfigLinuxResources() + + device := rspec.LinuxDeviceCgroup{ + Allow: allow, + Type: devType, + Access: access, + Major: major, + Minor: minor, + } + g.Config.Linux.Resources.Devices = append(g.Config.Linux.Resources.Devices, device) +} + +// RemoveLinuxResourcesDevice - remove a device from g.Config.Linux.Resources.Devices +func (g *Generator) RemoveLinuxResourcesDevice(allow bool, devType string, major, minor *int64, access string) { + if g.Config == nil || g.Config.Linux == nil || g.Config.Linux.Resources == nil { + return + } + for i, device := range g.Config.Linux.Resources.Devices { + if device.Allow == allow && + (devType == device.Type || (devType != "" && device.Type != "" && devType == device.Type)) && + (access == device.Access || (access != "" && device.Access != "" && access == device.Access)) && + (major == device.Major || (major != nil && device.Major != nil && *major == *device.Major)) && + (minor == device.Minor || (minor != nil && device.Minor != nil && *minor == *device.Minor)) { + + g.Config.Linux.Resources.Devices = append(g.Config.Linux.Resources.Devices[:i], g.Config.Linux.Resources.Devices[i+1:]...) + return + } + } +} + +// SetSyscallAction adds rules for syscalls with the specified action +func (g *Generator) SetSyscallAction(arguments seccomp.SyscallOpts) error { + g.initConfigLinuxSeccomp() + return seccomp.ParseSyscallFlag(arguments, g.Config.Linux.Seccomp) +} + +// SetDefaultSeccompAction sets the default action for all syscalls not defined +// and then removes any syscall rules with this action already specified. +func (g *Generator) SetDefaultSeccompAction(action string) error { + g.initConfigLinuxSeccomp() + return seccomp.ParseDefaultAction(action, g.Config.Linux.Seccomp) +} + +// SetDefaultSeccompActionForce only sets the default action for all syscalls not defined +func (g *Generator) SetDefaultSeccompActionForce(action string) error { + g.initConfigLinuxSeccomp() + return seccomp.ParseDefaultActionForce(action, g.Config.Linux.Seccomp) +} + +// SetDomainName sets g.Config.Domainname +func (g *Generator) SetDomainName(domain string) { + g.initConfig() + g.Config.Domainname = domain +} + +// SetSeccompArchitecture sets the supported seccomp architectures +func (g *Generator) SetSeccompArchitecture(architecture string) error { + g.initConfigLinuxSeccomp() + return seccomp.ParseArchitectureFlag(architecture, g.Config.Linux.Seccomp) +} + +// RemoveSeccompRule removes rules for any specified syscalls +func (g *Generator) RemoveSeccompRule(arguments string) error { + g.initConfigLinuxSeccomp() + return seccomp.RemoveAction(arguments, g.Config.Linux.Seccomp) +} + +// RemoveAllSeccompRules removes all syscall rules +func (g *Generator) RemoveAllSeccompRules() error { + g.initConfigLinuxSeccomp() + return seccomp.RemoveAllSeccompRules(g.Config.Linux.Seccomp) +} + +// AddLinuxMaskedPaths adds masked paths into g.Config.Linux.MaskedPaths. +func (g *Generator) AddLinuxMaskedPaths(path string) { + g.initConfigLinux() + g.Config.Linux.MaskedPaths = append(g.Config.Linux.MaskedPaths, path) +} + +// AddLinuxReadonlyPaths adds readonly paths into g.Config.Linux.MaskedPaths. +func (g *Generator) AddLinuxReadonlyPaths(path string) { + g.initConfigLinux() + g.Config.Linux.ReadonlyPaths = append(g.Config.Linux.ReadonlyPaths, path) +} + +func addOrReplaceBlockIOThrottleDevice(tmpList []rspec.LinuxThrottleDevice, major int64, minor int64, rate uint64) []rspec.LinuxThrottleDevice { + throttleDevices := tmpList + for i, throttleDevice := range throttleDevices { + if throttleDevice.Major == major && throttleDevice.Minor == minor { + throttleDevices[i].Rate = rate + return throttleDevices + } + } + throttleDevice := new(rspec.LinuxThrottleDevice) + throttleDevice.Major = major + throttleDevice.Minor = minor + throttleDevice.Rate = rate + throttleDevices = append(throttleDevices, *throttleDevice) + + return throttleDevices +} + +func dropBlockIOThrottleDevice(tmpList []rspec.LinuxThrottleDevice, major int64, minor int64) []rspec.LinuxThrottleDevice { + throttleDevices := tmpList + for i, throttleDevice := range throttleDevices { + if throttleDevice.Major == major && throttleDevice.Minor == minor { + throttleDevices = append(throttleDevices[:i], throttleDevices[i+1:]...) + return throttleDevices + } + } + + return throttleDevices +} + +// AddSolarisAnet adds network into g.Config.Solaris.Anet +func (g *Generator) AddSolarisAnet(anet rspec.SolarisAnet) { + g.initConfigSolaris() + g.Config.Solaris.Anet = append(g.Config.Solaris.Anet, anet) +} + +// SetSolarisCappedCPUNcpus sets g.Config.Solaris.CappedCPU.Ncpus +func (g *Generator) SetSolarisCappedCPUNcpus(ncpus string) { + g.initConfigSolarisCappedCPU() + g.Config.Solaris.CappedCPU.Ncpus = ncpus +} + +// SetSolarisCappedMemoryPhysical sets g.Config.Solaris.CappedMemory.Physical +func (g *Generator) SetSolarisCappedMemoryPhysical(physical string) { + g.initConfigSolarisCappedMemory() + g.Config.Solaris.CappedMemory.Physical = physical +} + +// SetSolarisCappedMemorySwap sets g.Config.Solaris.CappedMemory.Swap +func (g *Generator) SetSolarisCappedMemorySwap(swap string) { + g.initConfigSolarisCappedMemory() + g.Config.Solaris.CappedMemory.Swap = swap +} + +// SetSolarisLimitPriv sets g.Config.Solaris.LimitPriv +func (g *Generator) SetSolarisLimitPriv(limitPriv string) { + g.initConfigSolaris() + g.Config.Solaris.LimitPriv = limitPriv +} + +// SetSolarisMaxShmMemory sets g.Config.Solaris.MaxShmMemory +func (g *Generator) SetSolarisMaxShmMemory(memory string) { + g.initConfigSolaris() + g.Config.Solaris.MaxShmMemory = memory +} + +// SetSolarisMilestone sets g.Config.Solaris.Milestone +func (g *Generator) SetSolarisMilestone(milestone string) { + g.initConfigSolaris() + g.Config.Solaris.Milestone = milestone +} + +// SetVMHypervisorPath sets g.Config.VM.Hypervisor.Path +func (g *Generator) SetVMHypervisorPath(path string) error { + if !strings.HasPrefix(path, "/") { + return fmt.Errorf("hypervisorPath %v is not an absolute path", path) + } + g.initConfigVM() + g.Config.VM.Hypervisor.Path = path + return nil +} + +// SetVMHypervisorParameters sets g.Config.VM.Hypervisor.Parameters +func (g *Generator) SetVMHypervisorParameters(parameters []string) { + g.initConfigVM() + g.Config.VM.Hypervisor.Parameters = parameters +} + +// SetVMKernelPath sets g.Config.VM.Kernel.Path +func (g *Generator) SetVMKernelPath(path string) error { + if !strings.HasPrefix(path, "/") { + return fmt.Errorf("kernelPath %v is not an absolute path", path) + } + g.initConfigVM() + g.Config.VM.Kernel.Path = path + return nil +} + +// SetVMKernelParameters sets g.Config.VM.Kernel.Parameters +func (g *Generator) SetVMKernelParameters(parameters []string) { + g.initConfigVM() + g.Config.VM.Kernel.Parameters = parameters +} + +// SetVMKernelInitRD sets g.Config.VM.Kernel.InitRD +func (g *Generator) SetVMKernelInitRD(initrd string) error { + if !strings.HasPrefix(initrd, "/") { + return fmt.Errorf("kernelInitrd %v is not an absolute path", initrd) + } + g.initConfigVM() + g.Config.VM.Kernel.InitRD = initrd + return nil +} + +// SetVMImagePath sets g.Config.VM.Image.Path +func (g *Generator) SetVMImagePath(path string) error { + if !strings.HasPrefix(path, "/") { + return fmt.Errorf("imagePath %v is not an absolute path", path) + } + g.initConfigVM() + g.Config.VM.Image.Path = path + return nil +} + +// SetVMImageFormat sets g.Config.VM.Image.Format +func (g *Generator) SetVMImageFormat(format string) error { + switch format { + case "raw": + case "qcow2": + case "vdi": + case "vmdk": + case "vhd": + default: + return fmt.Errorf("Commonly supported formats are: raw, qcow2, vdi, vmdk, vhd") + } + g.initConfigVM() + g.Config.VM.Image.Format = format + return nil +} + +// SetWindowsHypervUntilityVMPath sets g.Config.Windows.HyperV.UtilityVMPath. +func (g *Generator) SetWindowsHypervUntilityVMPath(path string) { + g.initConfigWindowsHyperV() + g.Config.Windows.HyperV.UtilityVMPath = path +} + +// SetWindowsIgnoreFlushesDuringBoot sets g.Config.Windows.IgnoreFlushesDuringBoot. +func (g *Generator) SetWindowsIgnoreFlushesDuringBoot(ignore bool) { + g.initConfigWindows() + g.Config.Windows.IgnoreFlushesDuringBoot = ignore +} + +// AddWindowsLayerFolders adds layer folders into g.Config.Windows.LayerFolders. +func (g *Generator) AddWindowsLayerFolders(folder string) { + g.initConfigWindows() + g.Config.Windows.LayerFolders = append(g.Config.Windows.LayerFolders, folder) +} + +// AddWindowsDevices adds or sets g.Config.Windwos.Devices +func (g *Generator) AddWindowsDevices(id, idType string) error { + if idType != "class" { + return fmt.Errorf("Invalid idType value: %s. Windows only supports a value of class", idType) + } + device := rspec.WindowsDevice{ + ID: id, + IDType: idType, + } + + g.initConfigWindows() + for i, device := range g.Config.Windows.Devices { + if device.ID == id { + g.Config.Windows.Devices[i].IDType = idType + return nil + } + } + g.Config.Windows.Devices = append(g.Config.Windows.Devices, device) + return nil +} + +// SetWindowsNetwork sets g.Config.Windows.Network. +func (g *Generator) SetWindowsNetwork(network rspec.WindowsNetwork) { + g.initConfigWindows() + g.Config.Windows.Network = &network +} + +// SetWindowsNetworkAllowUnqualifiedDNSQuery sets g.Config.Windows.Network.AllowUnqualifiedDNSQuery +func (g *Generator) SetWindowsNetworkAllowUnqualifiedDNSQuery(setting bool) { + g.initConfigWindowsNetwork() + g.Config.Windows.Network.AllowUnqualifiedDNSQuery = setting +} + +// SetWindowsNetworkNamespace sets g.Config.Windows.Network.NetworkNamespace +func (g *Generator) SetWindowsNetworkNamespace(path string) { + g.initConfigWindowsNetwork() + g.Config.Windows.Network.NetworkNamespace = path +} + +// SetWindowsResourcesCPU sets g.Config.Windows.Resources.CPU. +func (g *Generator) SetWindowsResourcesCPU(cpu rspec.WindowsCPUResources) { + g.initConfigWindowsResources() + g.Config.Windows.Resources.CPU = &cpu +} + +// SetWindowsResourcesMemoryLimit sets g.Config.Windows.Resources.Memory.Limit. +func (g *Generator) SetWindowsResourcesMemoryLimit(limit uint64) { + g.initConfigWindowsResourcesMemory() + g.Config.Windows.Resources.Memory.Limit = &limit +} + +// SetWindowsResourcesStorage sets g.Config.Windows.Resources.Storage. +func (g *Generator) SetWindowsResourcesStorage(storage rspec.WindowsStorageResources) { + g.initConfigWindowsResources() + g.Config.Windows.Resources.Storage = &storage +} + +// SetWindowsServicing sets g.Config.Windows.Servicing. +func (g *Generator) SetWindowsServicing(servicing bool) { + g.initConfigWindows() + g.Config.Windows.Servicing = servicing +} diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/consts.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/consts.go new file mode 100644 index 0000000..f28d8f5 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/consts.go @@ -0,0 +1,7 @@ +package seccomp + +const ( + seccompOverwrite = "overwrite" + seccompAppend = "append" + nothing = "nothing" +) diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_action.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_action.go new file mode 100644 index 0000000..25daf07 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_action.go @@ -0,0 +1,135 @@ +package seccomp + +import ( + "fmt" + "strconv" + "strings" + + rspec "github.com/opencontainers/runtime-spec/specs-go" +) + +// SyscallOpts contain options for parsing syscall rules +type SyscallOpts struct { + Action string + Syscall string + Index string + Value string + ValueTwo string + Operator string +} + +// ParseSyscallFlag takes a SyscallOpts struct and the seccomp configuration +// and sets the new syscall rule accordingly +func ParseSyscallFlag(args SyscallOpts, config *rspec.LinuxSeccomp) error { + var arguments []string + if args.Index != "" && args.Value != "" && args.ValueTwo != "" && args.Operator != "" { + arguments = []string{args.Action, args.Syscall, args.Index, args.Value, + args.ValueTwo, args.Operator} + } else { + arguments = []string{args.Action, args.Syscall} + } + + action, _ := parseAction(arguments[0]) + if action == config.DefaultAction && args.argsAreEmpty() { + // default already set, no need to make changes + return nil + } + + var newSyscall rspec.LinuxSyscall + numOfArgs := len(arguments) + if numOfArgs == 6 || numOfArgs == 2 { + argStruct, err := parseArguments(arguments[1:]) + if err != nil { + return err + } + newSyscall = newSyscallStruct(arguments[1], action, argStruct) + } else { + return fmt.Errorf("incorrect number of arguments to ParseSyscall: %d", numOfArgs) + } + + descison, err := decideCourseOfAction(&newSyscall, config.Syscalls) + if err != nil { + return err + } + delimDescison := strings.Split(descison, ":") + + if delimDescison[0] == seccompAppend { + config.Syscalls = append(config.Syscalls, newSyscall) + } + + if delimDescison[0] == seccompOverwrite { + indexForOverwrite, err := strconv.ParseInt(delimDescison[1], 10, 32) + if err != nil { + return err + } + config.Syscalls[indexForOverwrite] = newSyscall + } + + return nil +} + +var actions = map[string]rspec.LinuxSeccompAction{ + "allow": rspec.ActAllow, + "errno": rspec.ActErrno, + "kill": rspec.ActKill, + "trace": rspec.ActTrace, + "trap": rspec.ActTrap, +} + +// Take passed action, return the SCMP_ACT_ version of it +func parseAction(action string) (rspec.LinuxSeccompAction, error) { + a, ok := actions[action] + if !ok { + return "", fmt.Errorf("unrecognized action: %s", action) + } + return a, nil +} + +// ParseDefaultAction sets the default action of the seccomp configuration +// and then removes any rules that were already specified with this action +func ParseDefaultAction(action string, config *rspec.LinuxSeccomp) error { + if action == "" { + return nil + } + + defaultAction, err := parseAction(action) + if err != nil { + return err + } + config.DefaultAction = defaultAction + err = RemoveAllMatchingRules(config, defaultAction) + if err != nil { + return err + } + return nil +} + +// ParseDefaultActionForce simply sets the default action of the seccomp configuration +func ParseDefaultActionForce(action string, config *rspec.LinuxSeccomp) error { + if action == "" { + return nil + } + + defaultAction, err := parseAction(action) + if err != nil { + return err + } + config.DefaultAction = defaultAction + return nil +} + +func newSyscallStruct(name string, action rspec.LinuxSeccompAction, args []rspec.LinuxSeccompArg) rspec.LinuxSyscall { + syscallStruct := rspec.LinuxSyscall{ + Names: []string{name}, + Action: action, + Args: args, + } + return syscallStruct +} + +func (s SyscallOpts) argsAreEmpty() bool { + return (s.Index == "" && + s.Value == "" && + s.ValueTwo == "" && + s.Operator == "") +} diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_architecture.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_architecture.go new file mode 100644 index 0000000..9b2bdfd --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_architecture.go @@ -0,0 +1,55 @@ +package seccomp + +import ( + "fmt" + + rspec "github.com/opencontainers/runtime-spec/specs-go" +) + +// ParseArchitectureFlag takes the raw string passed with the --arch flag, parses it +// and updates the Seccomp config accordingly +func ParseArchitectureFlag(architectureArg string, config *rspec.LinuxSeccomp) error { + correctedArch, err := parseArch(architectureArg) + if err != nil { + return err + } + + shouldAppend := true + for _, alreadySpecified := range config.Architectures { + if correctedArch == alreadySpecified { + shouldAppend = false + } + } + if shouldAppend { + config.Architectures = append(config.Architectures, correctedArch) + } + return nil +} + +func parseArch(arch string) (rspec.Arch, error) { + arches := map[string]rspec.Arch{ + "x86": rspec.ArchX86, + "amd64": rspec.ArchX86_64, + "x32": rspec.ArchX32, + "arm": rspec.ArchARM, + "arm64": rspec.ArchAARCH64, + "mips": rspec.ArchMIPS, + "mips64": rspec.ArchMIPS64, + "mips64n32": rspec.ArchMIPS64N32, + "mipsel": rspec.ArchMIPSEL, + "mipsel64": rspec.ArchMIPSEL64, + "mipsel64n32": rspec.ArchMIPSEL64N32, + "parisc": rspec.ArchPARISC, + "parisc64": rspec.ArchPARISC64, + "ppc": rspec.ArchPPC, + "ppc64": rspec.ArchPPC64, + "ppc64le": rspec.ArchPPC64LE, + "s390": rspec.ArchS390, + "s390x": rspec.ArchS390X, + } + a, ok := arches[arch] + if !ok { + return "", fmt.Errorf("unrecognized architecture: %s", arch) + } + return a, nil +} diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_arguments.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_arguments.go new file mode 100644 index 0000000..2b4c394 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_arguments.go @@ -0,0 +1,73 @@ +package seccomp + +import ( + "fmt" + "strconv" + + rspec "github.com/opencontainers/runtime-spec/specs-go" +) + +// parseArguments takes a list of arguments (delimArgs). It parses and fills out +// the argument information and returns a slice of arg structs +func parseArguments(delimArgs []string) ([]rspec.LinuxSeccompArg, error) { + nilArgSlice := []rspec.LinuxSeccompArg{} + numberOfArgs := len(delimArgs) + + // No parameters passed with syscall + if numberOfArgs == 1 { + return nilArgSlice, nil + } + + // Correct number of parameters passed with syscall + if numberOfArgs == 5 { + syscallIndex, err := strconv.ParseUint(delimArgs[1], 10, 0) + if err != nil { + return nilArgSlice, err + } + + syscallValue, err := strconv.ParseUint(delimArgs[2], 10, 64) + if err != nil { + return nilArgSlice, err + } + + syscallValueTwo, err := strconv.ParseUint(delimArgs[3], 10, 64) + if err != nil { + return nilArgSlice, err + } + + syscallOp, err := parseOperator(delimArgs[4]) + if err != nil { + return nilArgSlice, err + } + + argStruct := rspec.LinuxSeccompArg{ + Index: uint(syscallIndex), + Value: syscallValue, + ValueTwo: syscallValueTwo, + Op: syscallOp, + } + + argSlice := []rspec.LinuxSeccompArg{} + argSlice = append(argSlice, argStruct) + return argSlice, nil + } + + return nilArgSlice, fmt.Errorf("incorrect number of arguments passed with syscall: %d", numberOfArgs) +} + +func parseOperator(operator string) (rspec.LinuxSeccompOperator, error) { + operators := map[string]rspec.LinuxSeccompOperator{ + "NE": rspec.OpNotEqual, + "LT": rspec.OpLessThan, + "LE": rspec.OpLessEqual, + "EQ": rspec.OpEqualTo, + "GE": rspec.OpGreaterEqual, + "GT": rspec.OpGreaterThan, + "ME": rspec.OpMaskedEqual, + } + o, ok := operators[operator] + if !ok { + return "", fmt.Errorf("unrecognized operator: %s", operator) + } + return o, nil +} diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_remove.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_remove.go new file mode 100644 index 0000000..59537d4 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/parse_remove.go @@ -0,0 +1,52 @@ +package seccomp + +import ( + "fmt" + "reflect" + "strings" + + rspec "github.com/opencontainers/runtime-spec/specs-go" +) + +// RemoveAction takes the argument string that was passed with the --remove flag, +// parses it, and updates the Seccomp config accordingly +func RemoveAction(arguments string, config *rspec.LinuxSeccomp) error { + if config == nil { + return fmt.Errorf("Cannot remove action from nil Seccomp pointer") + } + + syscallsToRemove := strings.Split(arguments, ",") + + for counter, syscallStruct := range config.Syscalls { + if reflect.DeepEqual(syscallsToRemove, syscallStruct.Names) { + config.Syscalls = append(config.Syscalls[:counter], config.Syscalls[counter+1:]...) + } + } + + return nil +} + +// RemoveAllSeccompRules removes all seccomp syscall rules +func RemoveAllSeccompRules(config *rspec.LinuxSeccomp) error { + if config == nil { + return fmt.Errorf("Cannot remove action from nil Seccomp pointer") + } + newSyscallSlice := []rspec.LinuxSyscall{} + config.Syscalls = newSyscallSlice + return nil +} + +// RemoveAllMatchingRules will remove any syscall rules that match the specified action +func RemoveAllMatchingRules(config *rspec.LinuxSeccomp, seccompAction rspec.LinuxSeccompAction) error { + if config == nil { + return fmt.Errorf("Cannot remove action from nil Seccomp pointer") + } + + for _, syscall := range config.Syscalls { + if reflect.DeepEqual(syscall.Action, seccompAction) { + RemoveAction(strings.Join(syscall.Names, ","), config) + } + } + + return nil +} diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default.go new file mode 100644 index 0000000..345a32a --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default.go @@ -0,0 +1,606 @@ +package seccomp + +import ( + "runtime" + + "github.com/opencontainers/runtime-spec/specs-go" + rspec "github.com/opencontainers/runtime-spec/specs-go" +) + +func arches() []rspec.Arch { + native := runtime.GOARCH + + switch native { + case "amd64": + return []rspec.Arch{rspec.ArchX86_64, rspec.ArchX86, rspec.ArchX32} + case "arm64": + return []rspec.Arch{rspec.ArchARM, rspec.ArchAARCH64} + case "mips64": + return []rspec.Arch{rspec.ArchMIPS, rspec.ArchMIPS64, rspec.ArchMIPS64N32} + case "mips64n32": + return []rspec.Arch{rspec.ArchMIPS, rspec.ArchMIPS64, rspec.ArchMIPS64N32} + case "mipsel64": + return []rspec.Arch{rspec.ArchMIPSEL, rspec.ArchMIPSEL64, rspec.ArchMIPSEL64N32} + case "mipsel64n32": + return []rspec.Arch{rspec.ArchMIPSEL, rspec.ArchMIPSEL64, rspec.ArchMIPSEL64N32} + case "s390x": + return []rspec.Arch{rspec.ArchS390, rspec.ArchS390X} + default: + return []rspec.Arch{} + } +} + +// DefaultProfile defines the whitelist for the default seccomp profile. +func DefaultProfile(rs *specs.Spec) *rspec.LinuxSeccomp { + + syscalls := []rspec.LinuxSyscall{ + { + Names: []string{ + "accept", + "accept4", + "access", + "alarm", + "bind", + "brk", + "capget", + "capset", + "chdir", + "chmod", + "chown", + "chown32", + "clock_getres", + "clock_gettime", + "clock_nanosleep", + "close", + "connect", + "copy_file_range", + "creat", + "dup", + "dup2", + "dup3", + "epoll_create", + "epoll_create1", + "epoll_ctl", + "epoll_ctl_old", + "epoll_pwait", + "epoll_wait", + "epoll_wait_old", + "eventfd", + "eventfd2", + "execve", + "execveat", + "exit", + "exit_group", + "faccessat", + "fadvise64", + "fadvise64_64", + "fallocate", + "fanotify_mark", + "fchdir", + "fchmod", + "fchmodat", + "fchown", + "fchown32", + "fchownat", + "fcntl", + "fcntl64", + "fdatasync", + "fgetxattr", + "flistxattr", + "flock", + "fork", + "fremovexattr", + "fsetxattr", + "fstat", + "fstat64", + "fstatat64", + "fstatfs", + "fstatfs64", + "fsync", + "ftruncate", + "ftruncate64", + "futex", + "futimesat", + "getcpu", + "getcwd", + "getdents", + "getdents64", + "getegid", + "getegid32", + "geteuid", + "geteuid32", + "getgid", + "getgid32", + "getgroups", + "getgroups32", + "getitimer", + "getpeername", + "getpgid", + "getpgrp", + "getpid", + "getppid", + "getpriority", + "getrandom", + "getresgid", + "getresgid32", + "getresuid", + "getresuid32", + "getrlimit", + "get_robust_list", + "getrusage", + "getsid", + "getsockname", + "getsockopt", + "get_thread_area", + "gettid", + "gettimeofday", + "getuid", + "getuid32", + "getxattr", + "inotify_add_watch", + "inotify_init", + "inotify_init1", + "inotify_rm_watch", + "io_cancel", + "ioctl", + "io_destroy", + "io_getevents", + "ioprio_get", + "ioprio_set", + "io_setup", + "io_submit", + "ipc", + "kill", + "landlock_add_rule", + "landlock_create_ruleset", + "landlock_restrict_self", + "lchown", + "lchown32", + "lgetxattr", + "link", + "linkat", + "listen", + "listxattr", + "llistxattr", + "_llseek", + "lremovexattr", + "lseek", + "lsetxattr", + "lstat", + "lstat64", + "madvise", + "memfd_create", + "mincore", + "mkdir", + "mkdirat", + "mknod", + "mknodat", + "mlock", + "mlock2", + "mlockall", + "mmap", + "mmap2", + "mprotect", + "mq_getsetattr", + "mq_notify", + "mq_open", + "mq_timedreceive", + "mq_timedsend", + "mq_unlink", + "mremap", + "msgctl", + "msgget", + "msgrcv", + "msgsnd", + "msync", + "munlock", + "munlockall", + "munmap", + "nanosleep", + "newfstatat", + "_newselect", + "open", + "openat", + "pause", + "pipe", + "pipe2", + "poll", + "ppoll", + "prctl", + "pread64", + "preadv", + "prlimit64", + "pselect6", + "pwrite64", + "pwritev", + "read", + "readahead", + "readlink", + "readlinkat", + "readv", + "recv", + "recvfrom", + "recvmmsg", + "recvmsg", + "remap_file_pages", + "removexattr", + "rename", + "renameat", + "renameat2", + "restart_syscall", + "rmdir", + "rt_sigaction", + "rt_sigpending", + "rt_sigprocmask", + "rt_sigqueueinfo", + "rt_sigreturn", + "rt_sigsuspend", + "rt_sigtimedwait", + "rt_tgsigqueueinfo", + "sched_getaffinity", + "sched_getattr", + "sched_getparam", + "sched_get_priority_max", + "sched_get_priority_min", + "sched_getscheduler", + "sched_rr_get_interval", + "sched_setaffinity", + "sched_setattr", + "sched_setparam", + "sched_setscheduler", + "sched_yield", + "seccomp", + "select", + "semctl", + "semget", + "semop", + "semtimedop", + "send", + "sendfile", + "sendfile64", + "sendmmsg", + "sendmsg", + "sendto", + "setfsgid", + "setfsgid32", + "setfsuid", + "setfsuid32", + "setgid", + "setgid32", + "setgroups", + "setgroups32", + "setitimer", + "setpgid", + "setpriority", + "setregid", + "setregid32", + "setresgid", + "setresgid32", + "setresuid", + "setresuid32", + "setreuid", + "setreuid32", + "setrlimit", + "set_robust_list", + "setsid", + "setsockopt", + "set_thread_area", + "set_tid_address", + "setuid", + "setuid32", + "setxattr", + "shmat", + "shmctl", + "shmdt", + "shmget", + "shutdown", + "sigaltstack", + "signalfd", + "signalfd4", + "sigreturn", + "socket", + "socketcall", + "socketpair", + "splice", + "stat", + "stat64", + "statfs", + "statfs64", + "statx", + "symlink", + "symlinkat", + "sync", + "sync_file_range", + "syncfs", + "sysinfo", + "syslog", + "tee", + "tgkill", + "time", + "timer_create", + "timer_delete", + "timerfd_create", + "timerfd_gettime", + "timerfd_settime", + "timer_getoverrun", + "timer_gettime", + "timer_settime", + "times", + "tkill", + "truncate", + "truncate64", + "ugetrlimit", + "umask", + "uname", + "unlink", + "unlinkat", + "utime", + "utimensat", + "utimes", + "vfork", + "vmsplice", + "wait4", + "waitid", + "waitpid", + "write", + "writev", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + { + Names: []string{"personality"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{ + { + Index: 0, + Value: 0x0, + Op: rspec.OpEqualTo, + }, + }, + }, + { + Names: []string{"personality"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{ + { + Index: 0, + Value: 0x0008, + Op: rspec.OpEqualTo, + }, + }, + }, + { + Names: []string{"personality"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{ + { + Index: 0, + Value: 0xffffffff, + Op: rspec.OpEqualTo, + }, + }, + }, + } + var sysCloneFlagsIndex uint + + capSysAdmin := false + caps := make(map[string]bool) + + for _, cap := range rs.Process.Capabilities.Bounding { + caps[cap] = true + } + for _, cap := range rs.Process.Capabilities.Effective { + caps[cap] = true + } + for _, cap := range rs.Process.Capabilities.Inheritable { + caps[cap] = true + } + for _, cap := range rs.Process.Capabilities.Permitted { + caps[cap] = true + } + for _, cap := range rs.Process.Capabilities.Ambient { + caps[cap] = true + } + + for cap := range caps { + switch cap { + case "CAP_DAC_READ_SEARCH": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"open_by_handle_at"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_ADMIN": + capSysAdmin = true + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{ + "bpf", + "clone", + "fanotify_init", + "lookup_dcookie", + "mount", + "name_to_handle_at", + "perf_event_open", + "setdomainname", + "sethostname", + "setns", + "umount", + "umount2", + "unshare", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_BOOT": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"reboot"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_CHROOT": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"chroot"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_MODULE": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{ + "delete_module", + "init_module", + "finit_module", + "query_module", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_PACCT": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"acct"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_PTRACE": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{ + "kcmp", + "process_vm_readv", + "process_vm_writev", + "ptrace", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_RAWIO": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{ + "iopl", + "ioperm", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_TIME": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{ + "settimeofday", + "stime", + "adjtimex", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "CAP_SYS_TTY_CONFIG": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"vhangup"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + } + } + + if !capSysAdmin { + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"clone"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{ + { + Index: sysCloneFlagsIndex, + Value: CloneNewNS | CloneNewUTS | CloneNewIPC | CloneNewUser | CloneNewPID | CloneNewNet | CloneNewCgroup, + ValueTwo: 0, + Op: rspec.OpMaskedEqual, + }, + }, + }, + }...) + + } + + arch := runtime.GOARCH + switch arch { + case "arm", "arm64": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{ + "breakpoint", + "cacheflush", + "set_tls", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "amd64", "x32": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"arch_prctl"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + fallthrough + case "x86": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"modify_ldt"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + case "s390", "s390x": + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{ + "s390_pci_mmio_read", + "s390_pci_mmio_write", + "s390_runtime_instr", + }, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{}, + }, + }...) + /* Flags parameter of the clone syscall is the 2nd on s390 */ + syscalls = append(syscalls, []rspec.LinuxSyscall{ + { + Names: []string{"clone"}, + Action: rspec.ActAllow, + Args: []rspec.LinuxSeccompArg{ + { + Index: 1, + Value: 2080505856, + ValueTwo: 0, + Op: rspec.OpMaskedEqual, + }, + }, + }, + }...) + } + + return &rspec.LinuxSeccomp{ + DefaultAction: rspec.ActErrno, + Architectures: arches(), + Syscalls: syscalls, + } +} diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default_linux.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default_linux.go new file mode 100644 index 0000000..5ca9a6d --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default_linux.go @@ -0,0 +1,17 @@ +//go:build linux +// +build linux + +package seccomp + +import "golang.org/x/sys/unix" + +// System values passed through on linux +const ( + CloneNewIPC = unix.CLONE_NEWIPC + CloneNewNet = unix.CLONE_NEWNET + CloneNewNS = unix.CLONE_NEWNS + CloneNewPID = unix.CLONE_NEWPID + CloneNewUser = unix.CLONE_NEWUSER + CloneNewUTS = unix.CLONE_NEWUTS + CloneNewCgroup = unix.CLONE_NEWCGROUP +) diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default_unsupported.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default_unsupported.go new file mode 100644 index 0000000..b8c1bc2 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/seccomp_default_unsupported.go @@ -0,0 +1,16 @@ +//go:build !linux +// +build !linux + +package seccomp + +// These are copied from linux/amd64 syscall values, as a reference for other +// platforms to have access to +const ( + CloneNewIPC = 0x8000000 + CloneNewNet = 0x40000000 + CloneNewNS = 0x20000 + CloneNewPID = 0x20000000 + CloneNewUser = 0x10000000 + CloneNewUTS = 0x4000000 + CloneNewCgroup = 0x02000000 +) diff --git a/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/syscall_compare.go b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/syscall_compare.go new file mode 100644 index 0000000..5e84653 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/generate/seccomp/syscall_compare.go @@ -0,0 +1,124 @@ +package seccomp + +import ( + "fmt" + "reflect" + "strconv" + "strings" + + rspec "github.com/opencontainers/runtime-spec/specs-go" +) + +// Determine if a new syscall rule should be appended, overwrite an existing rule +// or if no action should be taken at all +func decideCourseOfAction(newSyscall *rspec.LinuxSyscall, syscalls []rspec.LinuxSyscall) (string, error) { + ruleForSyscallAlreadyExists := false + + var sliceOfDeterminedActions []string + for i, syscall := range syscalls { + if sameName(&syscall, newSyscall) { + ruleForSyscallAlreadyExists = true + + if identical(newSyscall, &syscall) { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, nothing) + } + + if sameAction(newSyscall, &syscall) { + if bothHaveArgs(newSyscall, &syscall) { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, seccompAppend) + } + if onlyOneHasArgs(newSyscall, &syscall) { + if firstParamOnlyHasArgs(newSyscall, &syscall) { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, "overwrite:"+strconv.Itoa(i)) + } else { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, nothing) + } + } + } + + if !sameAction(newSyscall, &syscall) { + if bothHaveArgs(newSyscall, &syscall) { + if sameArgs(newSyscall, &syscall) { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, "overwrite:"+strconv.Itoa(i)) + } + if !sameArgs(newSyscall, &syscall) { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, seccompAppend) + } + } + if onlyOneHasArgs(newSyscall, &syscall) { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, seccompAppend) + } + if neitherHasArgs(newSyscall, &syscall) { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, "overwrite:"+strconv.Itoa(i)) + } + } + } + } + + if !ruleForSyscallAlreadyExists { + sliceOfDeterminedActions = append(sliceOfDeterminedActions, seccompAppend) + } + + // Nothing has highest priority + for _, determinedAction := range sliceOfDeterminedActions { + if determinedAction == nothing { + return determinedAction, nil + } + } + + // Overwrite has second highest priority + for _, determinedAction := range sliceOfDeterminedActions { + if strings.Contains(determinedAction, seccompOverwrite) { + return determinedAction, nil + } + } + + // Append has the lowest priority + for _, determinedAction := range sliceOfDeterminedActions { + if determinedAction == seccompAppend { + return determinedAction, nil + } + } + + return "", fmt.Errorf("Trouble determining action: %s", sliceOfDeterminedActions) +} + +func hasArguments(config *rspec.LinuxSyscall) bool { + nilSyscall := new(rspec.LinuxSyscall) + return !sameArgs(nilSyscall, config) +} + +func identical(config1, config2 *rspec.LinuxSyscall) bool { + return reflect.DeepEqual(config1, config2) +} + +func sameName(config1, config2 *rspec.LinuxSyscall) bool { + return reflect.DeepEqual(config1.Names, config2.Names) +} + +func sameAction(config1, config2 *rspec.LinuxSyscall) bool { + return config1.Action == config2.Action +} + +func sameArgs(config1, config2 *rspec.LinuxSyscall) bool { + return reflect.DeepEqual(config1.Args, config2.Args) +} + +func bothHaveArgs(config1, config2 *rspec.LinuxSyscall) bool { + return hasArguments(config1) && hasArguments(config2) +} + +func onlyOneHasArgs(config1, config2 *rspec.LinuxSyscall) bool { + conf1 := hasArguments(config1) + conf2 := hasArguments(config2) + + return (conf1 && !conf2) || (!conf1 && conf2) +} + +func neitherHasArgs(config1, config2 *rspec.LinuxSyscall) bool { + return !hasArguments(config1) && !hasArguments(config2) +} + +func firstParamOnlyHasArgs(config1, config2 *rspec.LinuxSyscall) bool { + return !hasArguments(config1) && hasArguments(config2) +} diff --git a/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate.go b/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate.go new file mode 100644 index 0000000..7fa47b7 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate.go @@ -0,0 +1,31 @@ +package capabilities + +import ( + "fmt" + "strings" + + "github.com/syndtr/gocapability/capability" +) + +// CapValid checks whether a capability is valid +func CapValid(c string, hostSpecific bool) error { + isValid := false + + if !strings.HasPrefix(c, "CAP_") { + return fmt.Errorf("capability %s must start with CAP_", c) + } + for _, cap := range capability.List() { + if c == fmt.Sprintf("CAP_%s", strings.ToUpper(cap.String())) { + if hostSpecific && cap > LastCap() { + return fmt.Errorf("%s is not supported on the current host", c) + } + isValid = true + break + } + } + + if !isValid { + return fmt.Errorf("invalid capability: %s", c) + } + return nil +} diff --git a/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate_linux.go b/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate_linux.go new file mode 100644 index 0000000..f6cb0d5 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate_linux.go @@ -0,0 +1,16 @@ +package capabilities + +import ( + "github.com/syndtr/gocapability/capability" +) + +// LastCap return last cap of system +func LastCap() capability.Cap { + last := capability.CAP_LAST_CAP + // hack for RHEL6 which has no /proc/sys/kernel/cap_last_cap + if last == capability.Cap(63) { + last = capability.CAP_BLOCK_SUSPEND + } + + return last +} diff --git a/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate_unsupported.go b/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate_unsupported.go new file mode 100644 index 0000000..e4aed63 --- /dev/null +++ b/vendor/github.com/opencontainers/runtime-tools/validate/capabilities/validate_unsupported.go @@ -0,0 +1,13 @@ +//go:build !linux +// +build !linux + +package capabilities + +import ( + "github.com/syndtr/gocapability/capability" +) + +// LastCap return last cap of system +func LastCap() capability.Cap { + return capability.Cap(-1) +} diff --git a/vendor/github.com/syndtr/gocapability/LICENSE b/vendor/github.com/syndtr/gocapability/LICENSE new file mode 100644 index 0000000..80dd96d --- /dev/null +++ b/vendor/github.com/syndtr/gocapability/LICENSE @@ -0,0 +1,24 @@ +Copyright 2013 Suryandaru Triandana +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/syndtr/gocapability/capability/capability.go b/vendor/github.com/syndtr/gocapability/capability/capability.go new file mode 100644 index 0000000..61a9077 --- /dev/null +++ b/vendor/github.com/syndtr/gocapability/capability/capability.go @@ -0,0 +1,133 @@ +// Copyright (c) 2013, Suryandaru Triandana +// All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Package capability provides utilities for manipulating POSIX capabilities. +package capability + +type Capabilities interface { + // Get check whether a capability present in the given + // capabilities set. The 'which' value should be one of EFFECTIVE, + // PERMITTED, INHERITABLE, BOUNDING or AMBIENT. + Get(which CapType, what Cap) bool + + // Empty check whether all capability bits of the given capabilities + // set are zero. The 'which' value should be one of EFFECTIVE, + // PERMITTED, INHERITABLE, BOUNDING or AMBIENT. + Empty(which CapType) bool + + // Full check whether all capability bits of the given capabilities + // set are one. The 'which' value should be one of EFFECTIVE, + // PERMITTED, INHERITABLE, BOUNDING or AMBIENT. + Full(which CapType) bool + + // Set sets capabilities of the given capabilities sets. The + // 'which' value should be one or combination (OR'ed) of EFFECTIVE, + // PERMITTED, INHERITABLE, BOUNDING or AMBIENT. + Set(which CapType, caps ...Cap) + + // Unset unsets capabilities of the given capabilities sets. The + // 'which' value should be one or combination (OR'ed) of EFFECTIVE, + // PERMITTED, INHERITABLE, BOUNDING or AMBIENT. + Unset(which CapType, caps ...Cap) + + // Fill sets all bits of the given capabilities kind to one. The + // 'kind' value should be one or combination (OR'ed) of CAPS, + // BOUNDS or AMBS. + Fill(kind CapType) + + // Clear sets all bits of the given capabilities kind to zero. The + // 'kind' value should be one or combination (OR'ed) of CAPS, + // BOUNDS or AMBS. + Clear(kind CapType) + + // String return current capabilities state of the given capabilities + // set as string. The 'which' value should be one of EFFECTIVE, + // PERMITTED, INHERITABLE BOUNDING or AMBIENT + StringCap(which CapType) string + + // String return current capabilities state as string. + String() string + + // Load load actual capabilities value. This will overwrite all + // outstanding changes. + Load() error + + // Apply apply the capabilities settings, so all changes will take + // effect. + Apply(kind CapType) error +} + +// NewPid initializes a new Capabilities object for given pid when +// it is nonzero, or for the current process if pid is 0. +// +// Deprecated: Replace with NewPid2. For example, replace: +// +// c, err := NewPid(0) +// if err != nil { +// return err +// } +// +// with: +// +// c, err := NewPid2(0) +// if err != nil { +// return err +// } +// err = c.Load() +// if err != nil { +// return err +// } +func NewPid(pid int) (Capabilities, error) { + c, err := newPid(pid) + if err != nil { + return c, err + } + err = c.Load() + return c, err +} + +// NewPid2 initializes a new Capabilities object for given pid when +// it is nonzero, or for the current process if pid is 0. This +// does not load the process's current capabilities; to do that you +// must call Load explicitly. +func NewPid2(pid int) (Capabilities, error) { + return newPid(pid) +} + +// NewFile initializes a new Capabilities object for given file path. +// +// Deprecated: Replace with NewFile2. For example, replace: +// +// c, err := NewFile(path) +// if err != nil { +// return err +// } +// +// with: +// +// c, err := NewFile2(path) +// if err != nil { +// return err +// } +// err = c.Load() +// if err != nil { +// return err +// } +func NewFile(path string) (Capabilities, error) { + c, err := newFile(path) + if err != nil { + return c, err + } + err = c.Load() + return c, err +} + +// NewFile2 creates a new initialized Capabilities object for given +// file path. This does not load the process's current capabilities; +// to do that you must call Load explicitly. +func NewFile2(path string) (Capabilities, error) { + return newFile(path) +} diff --git a/vendor/github.com/syndtr/gocapability/capability/capability_linux.go b/vendor/github.com/syndtr/gocapability/capability/capability_linux.go new file mode 100644 index 0000000..1567dc8 --- /dev/null +++ b/vendor/github.com/syndtr/gocapability/capability/capability_linux.go @@ -0,0 +1,642 @@ +// Copyright (c) 2013, Suryandaru Triandana +// All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package capability + +import ( + "bufio" + "errors" + "fmt" + "io" + "os" + "strings" + "syscall" +) + +var errUnknownVers = errors.New("unknown capability version") + +const ( + linuxCapVer1 = 0x19980330 + linuxCapVer2 = 0x20071026 + linuxCapVer3 = 0x20080522 +) + +var ( + capVers uint32 + capLastCap Cap +) + +func init() { + var hdr capHeader + capget(&hdr, nil) + capVers = hdr.version + + if initLastCap() == nil { + CAP_LAST_CAP = capLastCap + if capLastCap > 31 { + capUpperMask = (uint32(1) << (uint(capLastCap) - 31)) - 1 + } else { + capUpperMask = 0 + } + } +} + +func initLastCap() error { + if capLastCap != 0 { + return nil + } + + f, err := os.Open("/proc/sys/kernel/cap_last_cap") + if err != nil { + return err + } + defer f.Close() + + var b []byte = make([]byte, 11) + _, err = f.Read(b) + if err != nil { + return err + } + + fmt.Sscanf(string(b), "%d", &capLastCap) + + return nil +} + +func mkStringCap(c Capabilities, which CapType) (ret string) { + for i, first := Cap(0), true; i <= CAP_LAST_CAP; i++ { + if !c.Get(which, i) { + continue + } + if first { + first = false + } else { + ret += ", " + } + ret += i.String() + } + return +} + +func mkString(c Capabilities, max CapType) (ret string) { + ret = "{" + for i := CapType(1); i <= max; i <<= 1 { + ret += " " + i.String() + "=\"" + if c.Empty(i) { + ret += "empty" + } else if c.Full(i) { + ret += "full" + } else { + ret += c.StringCap(i) + } + ret += "\"" + } + ret += " }" + return +} + +func newPid(pid int) (c Capabilities, err error) { + switch capVers { + case linuxCapVer1: + p := new(capsV1) + p.hdr.version = capVers + p.hdr.pid = int32(pid) + c = p + case linuxCapVer2, linuxCapVer3: + p := new(capsV3) + p.hdr.version = capVers + p.hdr.pid = int32(pid) + c = p + default: + err = errUnknownVers + return + } + return +} + +type capsV1 struct { + hdr capHeader + data capData +} + +func (c *capsV1) Get(which CapType, what Cap) bool { + if what > 32 { + return false + } + + switch which { + case EFFECTIVE: + return (1< 32 { + continue + } + + if which&EFFECTIVE != 0 { + c.data.effective |= 1 << uint(what) + } + if which&PERMITTED != 0 { + c.data.permitted |= 1 << uint(what) + } + if which&INHERITABLE != 0 { + c.data.inheritable |= 1 << uint(what) + } + } +} + +func (c *capsV1) Unset(which CapType, caps ...Cap) { + for _, what := range caps { + if what > 32 { + continue + } + + if which&EFFECTIVE != 0 { + c.data.effective &= ^(1 << uint(what)) + } + if which&PERMITTED != 0 { + c.data.permitted &= ^(1 << uint(what)) + } + if which&INHERITABLE != 0 { + c.data.inheritable &= ^(1 << uint(what)) + } + } +} + +func (c *capsV1) Fill(kind CapType) { + if kind&CAPS == CAPS { + c.data.effective = 0x7fffffff + c.data.permitted = 0x7fffffff + c.data.inheritable = 0 + } +} + +func (c *capsV1) Clear(kind CapType) { + if kind&CAPS == CAPS { + c.data.effective = 0 + c.data.permitted = 0 + c.data.inheritable = 0 + } +} + +func (c *capsV1) StringCap(which CapType) (ret string) { + return mkStringCap(c, which) +} + +func (c *capsV1) String() (ret string) { + return mkString(c, BOUNDING) +} + +func (c *capsV1) Load() (err error) { + return capget(&c.hdr, &c.data) +} + +func (c *capsV1) Apply(kind CapType) error { + if kind&CAPS == CAPS { + return capset(&c.hdr, &c.data) + } + return nil +} + +type capsV3 struct { + hdr capHeader + data [2]capData + bounds [2]uint32 + ambient [2]uint32 +} + +func (c *capsV3) Get(which CapType, what Cap) bool { + var i uint + if what > 31 { + i = uint(what) >> 5 + what %= 32 + } + + switch which { + case EFFECTIVE: + return (1< 31 { + i = uint(what) >> 5 + what %= 32 + } + + if which&EFFECTIVE != 0 { + c.data[i].effective |= 1 << uint(what) + } + if which&PERMITTED != 0 { + c.data[i].permitted |= 1 << uint(what) + } + if which&INHERITABLE != 0 { + c.data[i].inheritable |= 1 << uint(what) + } + if which&BOUNDING != 0 { + c.bounds[i] |= 1 << uint(what) + } + if which&AMBIENT != 0 { + c.ambient[i] |= 1 << uint(what) + } + } +} + +func (c *capsV3) Unset(which CapType, caps ...Cap) { + for _, what := range caps { + var i uint + if what > 31 { + i = uint(what) >> 5 + what %= 32 + } + + if which&EFFECTIVE != 0 { + c.data[i].effective &= ^(1 << uint(what)) + } + if which&PERMITTED != 0 { + c.data[i].permitted &= ^(1 << uint(what)) + } + if which&INHERITABLE != 0 { + c.data[i].inheritable &= ^(1 << uint(what)) + } + if which&BOUNDING != 0 { + c.bounds[i] &= ^(1 << uint(what)) + } + if which&AMBIENT != 0 { + c.ambient[i] &= ^(1 << uint(what)) + } + } +} + +func (c *capsV3) Fill(kind CapType) { + if kind&CAPS == CAPS { + c.data[0].effective = 0xffffffff + c.data[0].permitted = 0xffffffff + c.data[0].inheritable = 0 + c.data[1].effective = 0xffffffff + c.data[1].permitted = 0xffffffff + c.data[1].inheritable = 0 + } + + if kind&BOUNDS == BOUNDS { + c.bounds[0] = 0xffffffff + c.bounds[1] = 0xffffffff + } + if kind&AMBS == AMBS { + c.ambient[0] = 0xffffffff + c.ambient[1] = 0xffffffff + } +} + +func (c *capsV3) Clear(kind CapType) { + if kind&CAPS == CAPS { + c.data[0].effective = 0 + c.data[0].permitted = 0 + c.data[0].inheritable = 0 + c.data[1].effective = 0 + c.data[1].permitted = 0 + c.data[1].inheritable = 0 + } + + if kind&BOUNDS == BOUNDS { + c.bounds[0] = 0 + c.bounds[1] = 0 + } + if kind&AMBS == AMBS { + c.ambient[0] = 0 + c.ambient[1] = 0 + } +} + +func (c *capsV3) StringCap(which CapType) (ret string) { + return mkStringCap(c, which) +} + +func (c *capsV3) String() (ret string) { + return mkString(c, BOUNDING) +} + +func (c *capsV3) Load() (err error) { + err = capget(&c.hdr, &c.data[0]) + if err != nil { + return + } + + var status_path string + + if c.hdr.pid == 0 { + status_path = fmt.Sprintf("/proc/self/status") + } else { + status_path = fmt.Sprintf("/proc/%d/status", c.hdr.pid) + } + + f, err := os.Open(status_path) + if err != nil { + return + } + b := bufio.NewReader(f) + for { + line, e := b.ReadString('\n') + if e != nil { + if e != io.EOF { + err = e + } + break + } + if strings.HasPrefix(line, "CapB") { + fmt.Sscanf(line[4:], "nd: %08x%08x", &c.bounds[1], &c.bounds[0]) + continue + } + if strings.HasPrefix(line, "CapA") { + fmt.Sscanf(line[4:], "mb: %08x%08x", &c.ambient[1], &c.ambient[0]) + continue + } + } + f.Close() + + return +} + +func (c *capsV3) Apply(kind CapType) (err error) { + if kind&BOUNDS == BOUNDS { + var data [2]capData + err = capget(&c.hdr, &data[0]) + if err != nil { + return + } + if (1< 31 { + if c.data.version == 1 { + return false + } + i = uint(what) >> 5 + what %= 32 + } + + switch which { + case EFFECTIVE: + return (1< 31 { + if c.data.version == 1 { + continue + } + i = uint(what) >> 5 + what %= 32 + } + + if which&EFFECTIVE != 0 { + c.data.effective[i] |= 1 << uint(what) + } + if which&PERMITTED != 0 { + c.data.data[i].permitted |= 1 << uint(what) + } + if which&INHERITABLE != 0 { + c.data.data[i].inheritable |= 1 << uint(what) + } + } +} + +func (c *capsFile) Unset(which CapType, caps ...Cap) { + for _, what := range caps { + var i uint + if what > 31 { + if c.data.version == 1 { + continue + } + i = uint(what) >> 5 + what %= 32 + } + + if which&EFFECTIVE != 0 { + c.data.effective[i] &= ^(1 << uint(what)) + } + if which&PERMITTED != 0 { + c.data.data[i].permitted &= ^(1 << uint(what)) + } + if which&INHERITABLE != 0 { + c.data.data[i].inheritable &= ^(1 << uint(what)) + } + } +} + +func (c *capsFile) Fill(kind CapType) { + if kind&CAPS == CAPS { + c.data.effective[0] = 0xffffffff + c.data.data[0].permitted = 0xffffffff + c.data.data[0].inheritable = 0 + if c.data.version == 2 { + c.data.effective[1] = 0xffffffff + c.data.data[1].permitted = 0xffffffff + c.data.data[1].inheritable = 0 + } + } +} + +func (c *capsFile) Clear(kind CapType) { + if kind&CAPS == CAPS { + c.data.effective[0] = 0 + c.data.data[0].permitted = 0 + c.data.data[0].inheritable = 0 + if c.data.version == 2 { + c.data.effective[1] = 0 + c.data.data[1].permitted = 0 + c.data.data[1].inheritable = 0 + } + } +} + +func (c *capsFile) StringCap(which CapType) (ret string) { + return mkStringCap(c, which) +} + +func (c *capsFile) String() (ret string) { + return mkString(c, INHERITABLE) +} + +func (c *capsFile) Load() (err error) { + return getVfsCap(c.path, &c.data) +} + +func (c *capsFile) Apply(kind CapType) (err error) { + if kind&CAPS == CAPS { + return setVfsCap(c.path, &c.data) + } + return +} diff --git a/vendor/github.com/syndtr/gocapability/capability/capability_noop.go b/vendor/github.com/syndtr/gocapability/capability/capability_noop.go new file mode 100644 index 0000000..9bb3070 --- /dev/null +++ b/vendor/github.com/syndtr/gocapability/capability/capability_noop.go @@ -0,0 +1,19 @@ +// Copyright (c) 2013, Suryandaru Triandana +// All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// +build !linux + +package capability + +import "errors" + +func newPid(pid int) (Capabilities, error) { + return nil, errors.New("not supported") +} + +func newFile(path string) (Capabilities, error) { + return nil, errors.New("not supported") +} diff --git a/vendor/github.com/syndtr/gocapability/capability/enum.go b/vendor/github.com/syndtr/gocapability/capability/enum.go new file mode 100644 index 0000000..ad10785 --- /dev/null +++ b/vendor/github.com/syndtr/gocapability/capability/enum.go @@ -0,0 +1,309 @@ +// Copyright (c) 2013, Suryandaru Triandana +// All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package capability + +type CapType uint + +func (c CapType) String() string { + switch c { + case EFFECTIVE: + return "effective" + case PERMITTED: + return "permitted" + case INHERITABLE: + return "inheritable" + case BOUNDING: + return "bounding" + case CAPS: + return "caps" + case AMBIENT: + return "ambient" + } + return "unknown" +} + +const ( + EFFECTIVE CapType = 1 << iota + PERMITTED + INHERITABLE + BOUNDING + AMBIENT + + CAPS = EFFECTIVE | PERMITTED | INHERITABLE + BOUNDS = BOUNDING + AMBS = AMBIENT +) + +//go:generate go run enumgen/gen.go +type Cap int + +// POSIX-draft defined capabilities and Linux extensions. +// +// Defined in https://github.com/torvalds/linux/blob/master/include/uapi/linux/capability.h +const ( + // In a system with the [_POSIX_CHOWN_RESTRICTED] option defined, this + // overrides the restriction of changing file ownership and group + // ownership. + CAP_CHOWN = Cap(0) + + // Override all DAC access, including ACL execute access if + // [_POSIX_ACL] is defined. Excluding DAC access covered by + // CAP_LINUX_IMMUTABLE. + CAP_DAC_OVERRIDE = Cap(1) + + // Overrides all DAC restrictions regarding read and search on files + // and directories, including ACL restrictions if [_POSIX_ACL] is + // defined. Excluding DAC access covered by CAP_LINUX_IMMUTABLE. + CAP_DAC_READ_SEARCH = Cap(2) + + // Overrides all restrictions about allowed operations on files, where + // file owner ID must be equal to the user ID, except where CAP_FSETID + // is applicable. It doesn't override MAC and DAC restrictions. + CAP_FOWNER = Cap(3) + + // Overrides the following restrictions that the effective user ID + // shall match the file owner ID when setting the S_ISUID and S_ISGID + // bits on that file; that the effective group ID (or one of the + // supplementary group IDs) shall match the file owner ID when setting + // the S_ISGID bit on that file; that the S_ISUID and S_ISGID bits are + // cleared on successful return from chown(2) (not implemented). + CAP_FSETID = Cap(4) + + // Overrides the restriction that the real or effective user ID of a + // process sending a signal must match the real or effective user ID + // of the process receiving the signal. + CAP_KILL = Cap(5) + + // Allows setgid(2) manipulation + // Allows setgroups(2) + // Allows forged gids on socket credentials passing. + CAP_SETGID = Cap(6) + + // Allows set*uid(2) manipulation (including fsuid). + // Allows forged pids on socket credentials passing. + CAP_SETUID = Cap(7) + + // Linux-specific capabilities + + // Without VFS support for capabilities: + // Transfer any capability in your permitted set to any pid, + // remove any capability in your permitted set from any pid + // With VFS support for capabilities (neither of above, but) + // Add any capability from current's capability bounding set + // to the current process' inheritable set + // Allow taking bits out of capability bounding set + // Allow modification of the securebits for a process + CAP_SETPCAP = Cap(8) + + // Allow modification of S_IMMUTABLE and S_APPEND file attributes + CAP_LINUX_IMMUTABLE = Cap(9) + + // Allows binding to TCP/UDP sockets below 1024 + // Allows binding to ATM VCIs below 32 + CAP_NET_BIND_SERVICE = Cap(10) + + // Allow broadcasting, listen to multicast + CAP_NET_BROADCAST = Cap(11) + + // Allow interface configuration + // Allow administration of IP firewall, masquerading and accounting + // Allow setting debug option on sockets + // Allow modification of routing tables + // Allow setting arbitrary process / process group ownership on + // sockets + // Allow binding to any address for transparent proxying (also via NET_RAW) + // Allow setting TOS (type of service) + // Allow setting promiscuous mode + // Allow clearing driver statistics + // Allow multicasting + // Allow read/write of device-specific registers + // Allow activation of ATM control sockets + CAP_NET_ADMIN = Cap(12) + + // Allow use of RAW sockets + // Allow use of PACKET sockets + // Allow binding to any address for transparent proxying (also via NET_ADMIN) + CAP_NET_RAW = Cap(13) + + // Allow locking of shared memory segments + // Allow mlock and mlockall (which doesn't really have anything to do + // with IPC) + CAP_IPC_LOCK = Cap(14) + + // Override IPC ownership checks + CAP_IPC_OWNER = Cap(15) + + // Insert and remove kernel modules - modify kernel without limit + CAP_SYS_MODULE = Cap(16) + + // Allow ioperm/iopl access + // Allow sending USB messages to any device via /proc/bus/usb + CAP_SYS_RAWIO = Cap(17) + + // Allow use of chroot() + CAP_SYS_CHROOT = Cap(18) + + // Allow ptrace() of any process + CAP_SYS_PTRACE = Cap(19) + + // Allow configuration of process accounting + CAP_SYS_PACCT = Cap(20) + + // Allow configuration of the secure attention key + // Allow administration of the random device + // Allow examination and configuration of disk quotas + // Allow setting the domainname + // Allow setting the hostname + // Allow calling bdflush() + // Allow mount() and umount(), setting up new smb connection + // Allow some autofs root ioctls + // Allow nfsservctl + // Allow VM86_REQUEST_IRQ + // Allow to read/write pci config on alpha + // Allow irix_prctl on mips (setstacksize) + // Allow flushing all cache on m68k (sys_cacheflush) + // Allow removing semaphores + // Used instead of CAP_CHOWN to "chown" IPC message queues, semaphores + // and shared memory + // Allow locking/unlocking of shared memory segment + // Allow turning swap on/off + // Allow forged pids on socket credentials passing + // Allow setting readahead and flushing buffers on block devices + // Allow setting geometry in floppy driver + // Allow turning DMA on/off in xd driver + // Allow administration of md devices (mostly the above, but some + // extra ioctls) + // Allow tuning the ide driver + // Allow access to the nvram device + // Allow administration of apm_bios, serial and bttv (TV) device + // Allow manufacturer commands in isdn CAPI support driver + // Allow reading non-standardized portions of pci configuration space + // Allow DDI debug ioctl on sbpcd driver + // Allow setting up serial ports + // Allow sending raw qic-117 commands + // Allow enabling/disabling tagged queuing on SCSI controllers and sending + // arbitrary SCSI commands + // Allow setting encryption key on loopback filesystem + // Allow setting zone reclaim policy + // Allow everything under CAP_BPF and CAP_PERFMON for backward compatibility + CAP_SYS_ADMIN = Cap(21) + + // Allow use of reboot() + CAP_SYS_BOOT = Cap(22) + + // Allow raising priority and setting priority on other (different + // UID) processes + // Allow use of FIFO and round-robin (realtime) scheduling on own + // processes and setting the scheduling algorithm used by another + // process. + // Allow setting cpu affinity on other processes + CAP_SYS_NICE = Cap(23) + + // Override resource limits. Set resource limits. + // Override quota limits. + // Override reserved space on ext2 filesystem + // Modify data journaling mode on ext3 filesystem (uses journaling + // resources) + // NOTE: ext2 honors fsuid when checking for resource overrides, so + // you can override using fsuid too + // Override size restrictions on IPC message queues + // Allow more than 64hz interrupts from the real-time clock + // Override max number of consoles on console allocation + // Override max number of keymaps + // Control memory reclaim behavior + CAP_SYS_RESOURCE = Cap(24) + + // Allow manipulation of system clock + // Allow irix_stime on mips + // Allow setting the real-time clock + CAP_SYS_TIME = Cap(25) + + // Allow configuration of tty devices + // Allow vhangup() of tty + CAP_SYS_TTY_CONFIG = Cap(26) + + // Allow the privileged aspects of mknod() + CAP_MKNOD = Cap(27) + + // Allow taking of leases on files + CAP_LEASE = Cap(28) + + CAP_AUDIT_WRITE = Cap(29) + CAP_AUDIT_CONTROL = Cap(30) + CAP_SETFCAP = Cap(31) + + // Override MAC access. + // The base kernel enforces no MAC policy. + // An LSM may enforce a MAC policy, and if it does and it chooses + // to implement capability based overrides of that policy, this is + // the capability it should use to do so. + CAP_MAC_OVERRIDE = Cap(32) + + // Allow MAC configuration or state changes. + // The base kernel requires no MAC configuration. + // An LSM may enforce a MAC policy, and if it does and it chooses + // to implement capability based checks on modifications to that + // policy or the data required to maintain it, this is the + // capability it should use to do so. + CAP_MAC_ADMIN = Cap(33) + + // Allow configuring the kernel's syslog (printk behaviour) + CAP_SYSLOG = Cap(34) + + // Allow triggering something that will wake the system + CAP_WAKE_ALARM = Cap(35) + + // Allow preventing system suspends + CAP_BLOCK_SUSPEND = Cap(36) + + // Allow reading the audit log via multicast netlink socket + CAP_AUDIT_READ = Cap(37) + + // Allow system performance and observability privileged operations + // using perf_events, i915_perf and other kernel subsystems + CAP_PERFMON = Cap(38) + + // CAP_BPF allows the following BPF operations: + // - Creating all types of BPF maps + // - Advanced verifier features + // - Indirect variable access + // - Bounded loops + // - BPF to BPF function calls + // - Scalar precision tracking + // - Larger complexity limits + // - Dead code elimination + // - And potentially other features + // - Loading BPF Type Format (BTF) data + // - Retrieve xlated and JITed code of BPF programs + // - Use bpf_spin_lock() helper + // + // CAP_PERFMON relaxes the verifier checks further: + // - BPF progs can use of pointer-to-integer conversions + // - speculation attack hardening measures are bypassed + // - bpf_probe_read to read arbitrary kernel memory is allowed + // - bpf_trace_printk to print kernel memory is allowed + // + // CAP_SYS_ADMIN is required to use bpf_probe_write_user. + // + // CAP_SYS_ADMIN is required to iterate system wide loaded + // programs, maps, links, BTFs and convert their IDs to file descriptors. + // + // CAP_PERFMON and CAP_BPF are required to load tracing programs. + // CAP_NET_ADMIN and CAP_BPF are required to load networking programs. + CAP_BPF = Cap(39) + + // Allow checkpoint/restore related operations. + // Introduced in kernel 5.9 + CAP_CHECKPOINT_RESTORE = Cap(40) +) + +var ( + // Highest valid capability of the running kernel. + CAP_LAST_CAP = Cap(63) + + capUpperMask = ^uint32(0) +) diff --git a/vendor/github.com/syndtr/gocapability/capability/enum_gen.go b/vendor/github.com/syndtr/gocapability/capability/enum_gen.go new file mode 100644 index 0000000..2ff9bf4 --- /dev/null +++ b/vendor/github.com/syndtr/gocapability/capability/enum_gen.go @@ -0,0 +1,138 @@ +// generated file; DO NOT EDIT - use go generate in directory with source + +package capability + +func (c Cap) String() string { + switch c { + case CAP_CHOWN: + return "chown" + case CAP_DAC_OVERRIDE: + return "dac_override" + case CAP_DAC_READ_SEARCH: + return "dac_read_search" + case CAP_FOWNER: + return "fowner" + case CAP_FSETID: + return "fsetid" + case CAP_KILL: + return "kill" + case CAP_SETGID: + return "setgid" + case CAP_SETUID: + return "setuid" + case CAP_SETPCAP: + return "setpcap" + case CAP_LINUX_IMMUTABLE: + return "linux_immutable" + case CAP_NET_BIND_SERVICE: + return "net_bind_service" + case CAP_NET_BROADCAST: + return "net_broadcast" + case CAP_NET_ADMIN: + return "net_admin" + case CAP_NET_RAW: + return "net_raw" + case CAP_IPC_LOCK: + return "ipc_lock" + case CAP_IPC_OWNER: + return "ipc_owner" + case CAP_SYS_MODULE: + return "sys_module" + case CAP_SYS_RAWIO: + return "sys_rawio" + case CAP_SYS_CHROOT: + return "sys_chroot" + case CAP_SYS_PTRACE: + return "sys_ptrace" + case CAP_SYS_PACCT: + return "sys_pacct" + case CAP_SYS_ADMIN: + return "sys_admin" + case CAP_SYS_BOOT: + return "sys_boot" + case CAP_SYS_NICE: + return "sys_nice" + case CAP_SYS_RESOURCE: + return "sys_resource" + case CAP_SYS_TIME: + return "sys_time" + case CAP_SYS_TTY_CONFIG: + return "sys_tty_config" + case CAP_MKNOD: + return "mknod" + case CAP_LEASE: + return "lease" + case CAP_AUDIT_WRITE: + return "audit_write" + case CAP_AUDIT_CONTROL: + return "audit_control" + case CAP_SETFCAP: + return "setfcap" + case CAP_MAC_OVERRIDE: + return "mac_override" + case CAP_MAC_ADMIN: + return "mac_admin" + case CAP_SYSLOG: + return "syslog" + case CAP_WAKE_ALARM: + return "wake_alarm" + case CAP_BLOCK_SUSPEND: + return "block_suspend" + case CAP_AUDIT_READ: + return "audit_read" + case CAP_PERFMON: + return "perfmon" + case CAP_BPF: + return "bpf" + case CAP_CHECKPOINT_RESTORE: + return "checkpoint_restore" + } + return "unknown" +} + +// List returns list of all supported capabilities +func List() []Cap { + return []Cap{ + CAP_CHOWN, + CAP_DAC_OVERRIDE, + CAP_DAC_READ_SEARCH, + CAP_FOWNER, + CAP_FSETID, + CAP_KILL, + CAP_SETGID, + CAP_SETUID, + CAP_SETPCAP, + CAP_LINUX_IMMUTABLE, + CAP_NET_BIND_SERVICE, + CAP_NET_BROADCAST, + CAP_NET_ADMIN, + CAP_NET_RAW, + CAP_IPC_LOCK, + CAP_IPC_OWNER, + CAP_SYS_MODULE, + CAP_SYS_RAWIO, + CAP_SYS_CHROOT, + CAP_SYS_PTRACE, + CAP_SYS_PACCT, + CAP_SYS_ADMIN, + CAP_SYS_BOOT, + CAP_SYS_NICE, + CAP_SYS_RESOURCE, + CAP_SYS_TIME, + CAP_SYS_TTY_CONFIG, + CAP_MKNOD, + CAP_LEASE, + CAP_AUDIT_WRITE, + CAP_AUDIT_CONTROL, + CAP_SETFCAP, + CAP_MAC_OVERRIDE, + CAP_MAC_ADMIN, + CAP_SYSLOG, + CAP_WAKE_ALARM, + CAP_BLOCK_SUSPEND, + CAP_AUDIT_READ, + CAP_PERFMON, + CAP_BPF, + CAP_CHECKPOINT_RESTORE, + } +} diff --git a/vendor/github.com/syndtr/gocapability/capability/syscall_linux.go b/vendor/github.com/syndtr/gocapability/capability/syscall_linux.go new file mode 100644 index 0000000..3d2bf69 --- /dev/null +++ b/vendor/github.com/syndtr/gocapability/capability/syscall_linux.go @@ -0,0 +1,154 @@ +// Copyright (c) 2013, Suryandaru Triandana +// All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package capability + +import ( + "syscall" + "unsafe" +) + +type capHeader struct { + version uint32 + pid int32 +} + +type capData struct { + effective uint32 + permitted uint32 + inheritable uint32 +} + +func capget(hdr *capHeader, data *capData) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_CAPGET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = e1 + } + return +} + +func capset(hdr *capHeader, data *capData) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_CAPSET, uintptr(unsafe.Pointer(hdr)), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = e1 + } + return +} + +// not yet in syscall +const ( + pr_CAP_AMBIENT = 47 + pr_CAP_AMBIENT_IS_SET = uintptr(1) + pr_CAP_AMBIENT_RAISE = uintptr(2) + pr_CAP_AMBIENT_LOWER = uintptr(3) + pr_CAP_AMBIENT_CLEAR_ALL = uintptr(4) +) + +func prctl(option int, arg2, arg3, arg4, arg5 uintptr) (err error) { + _, _, e1 := syscall.Syscall6(syscall.SYS_PRCTL, uintptr(option), arg2, arg3, arg4, arg5, 0) + if e1 != 0 { + err = e1 + } + return +} + +const ( + vfsXattrName = "security.capability" + + vfsCapVerMask = 0xff000000 + vfsCapVer1 = 0x01000000 + vfsCapVer2 = 0x02000000 + + vfsCapFlagMask = ^vfsCapVerMask + vfsCapFlageffective = 0x000001 + + vfscapDataSizeV1 = 4 * (1 + 2*1) + vfscapDataSizeV2 = 4 * (1 + 2*2) +) + +type vfscapData struct { + magic uint32 + data [2]struct { + permitted uint32 + inheritable uint32 + } + effective [2]uint32 + version int8 +} + +var ( + _vfsXattrName *byte +) + +func init() { + _vfsXattrName, _ = syscall.BytePtrFromString(vfsXattrName) +} + +func getVfsCap(path string, dest *vfscapData) (err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := syscall.Syscall6(syscall.SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_vfsXattrName)), uintptr(unsafe.Pointer(dest)), vfscapDataSizeV2, 0, 0) + if e1 != 0 { + if e1 == syscall.ENODATA { + dest.version = 2 + return + } + err = e1 + } + switch dest.magic & vfsCapVerMask { + case vfsCapVer1: + dest.version = 1 + if r0 != vfscapDataSizeV1 { + return syscall.EINVAL + } + dest.data[1].permitted = 0 + dest.data[1].inheritable = 0 + case vfsCapVer2: + dest.version = 2 + if r0 != vfscapDataSizeV2 { + return syscall.EINVAL + } + default: + return syscall.EINVAL + } + if dest.magic&vfsCapFlageffective != 0 { + dest.effective[0] = dest.data[0].permitted | dest.data[0].inheritable + dest.effective[1] = dest.data[1].permitted | dest.data[1].inheritable + } else { + dest.effective[0] = 0 + dest.effective[1] = 0 + } + return +} + +func setVfsCap(path string, data *vfscapData) (err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(path) + if err != nil { + return + } + var size uintptr + if data.version == 1 { + data.magic = vfsCapVer1 + size = vfscapDataSizeV1 + } else if data.version == 2 { + data.magic = vfsCapVer2 + if data.effective[0] != 0 || data.effective[1] != 0 { + data.magic |= vfsCapFlageffective + } + size = vfscapDataSizeV2 + } else { + return syscall.EINVAL + } + _, _, e1 := syscall.Syscall6(syscall.SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_vfsXattrName)), uintptr(unsafe.Pointer(data)), size, 0, 0) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/LICENSE b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/NOTICE b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/NOTICE new file mode 100644 index 0000000..7676010 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/NOTICE @@ -0,0 +1,4 @@ +The file pkg/pciids/default_pci.ids is distributed under the 3-clause BSD License. +Maintained by Albert Pool, Martin Mares, and other volunteers from +the PCI ID Project at https://pci-ids.ucw.cz/. + diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/api.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/api.go new file mode 100644 index 0000000..1643fcc --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/api.go @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2022, 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 device + +import ( + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// Interface provides the API to the 'device' package +type Interface interface { + GetDevices() ([]Device, error) + GetMigDevices() ([]MigDevice, error) + GetMigProfiles() ([]MigProfile, error) + NewDevice(d nvml.Device) (Device, error) + NewDeviceByUUID(uuid string) (Device, error) + NewMigDevice(d nvml.Device) (MigDevice, error) + NewMigDeviceByUUID(uuid string) (MigDevice, error) + NewMigProfile(giProfileID, ciProfileID, ciEngProfileID int, migMemorySizeMB, deviceMemorySizeBytes uint64) (MigProfile, error) + ParseMigProfile(profile string) (MigProfile, error) + VisitDevices(func(i int, d Device) error) error + VisitMigDevices(func(i int, d Device, j int, m MigDevice) error) error + VisitMigProfiles(func(p MigProfile) error) error +} + +type devicelib struct { + nvml nvml.Interface + skippedDevices map[string]struct{} +} + +var _ Interface = &devicelib{} + +// New creates a new instance of the 'device' interface +func New(opts ...Option) Interface { + d := &devicelib{} + for _, opt := range opts { + opt(d) + } + if d.nvml == nil { + d.nvml = nvml.New() + } + if d.skippedDevices == nil { + WithSkippedDevices( + "DGX Display", + "NVIDIA DGX Display", + )(d) + } + return d +} + +// WithNvml provides an Option to set the NVML library used by the 'device' interface +func WithNvml(nvml nvml.Interface) Option { + return func(d *devicelib) { + d.nvml = nvml + } +} + +// WithSkippedDevices provides an Option to set devices to be skipped by model name +func WithSkippedDevices(names ...string) Option { + return func(d *devicelib) { + if d.skippedDevices == nil { + d.skippedDevices = make(map[string]struct{}) + } + for _, name := range names { + d.skippedDevices[name] = struct{}{} + } + } +} + +// Option defines a function for passing options to the New() call +type Option func(*devicelib) diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/device.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/device.go new file mode 100644 index 0000000..3d549e4 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/device.go @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2022, 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 device + +import ( + "fmt" + + "github.com/NVIDIA/go-nvml/pkg/dl" + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// Device defines the set of extended functions associated with a device.Device +type Device interface { + nvml.Device + GetMigDevices() ([]MigDevice, error) + GetMigProfiles() ([]MigProfile, error) + IsMigCapable() (bool, error) + IsMigEnabled() (bool, error) + VisitMigDevices(func(j int, m MigDevice) error) error + VisitMigProfiles(func(p MigProfile) error) error +} + +type device struct { + nvml.Device + lib *devicelib +} + +var _ Device = &device{} + +// NewDevice builds a new Device from an nvml.Device +func (d *devicelib) NewDevice(dev nvml.Device) (Device, error) { + return d.newDevice(dev) +} + +// NewDeviceByUUID builds a new Device from a UUID +func (d *devicelib) NewDeviceByUUID(uuid string) (Device, error) { + dev, ret := d.nvml.DeviceGetHandleByUUID(uuid) + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting device handle for uuid '%v': %v", uuid, ret) + } + return d.newDevice(dev) +} + +// newDevice creates a device from an nvml.Device +func (d *devicelib) newDevice(dev nvml.Device) (*device, error) { + return &device{dev, d}, nil +} + +// IsMigCapable checks if a device is capable of having MIG paprtitions created on it +func (d *device) IsMigCapable() (bool, error) { + err := nvmlLookupSymbol("nvmlDeviceGetMigMode") + if err != nil { + return false, nil + } + + _, _, ret := nvml.Device(d).GetMigMode() + if ret == nvml.ERROR_NOT_SUPPORTED { + return false, nil + } + if ret != nvml.SUCCESS { + return false, fmt.Errorf("error getting MIG mode: %v", ret) + } + + return true, nil +} + +// IsMigEnabled checks if a device has MIG mode currently enabled on it +func (d *device) IsMigEnabled() (bool, error) { + err := nvmlLookupSymbol("nvmlDeviceGetMigMode") + if err != nil { + return false, nil + } + + mode, _, ret := nvml.Device(d).GetMigMode() + if ret == nvml.ERROR_NOT_SUPPORTED { + return false, nil + } + if ret != nvml.SUCCESS { + return false, fmt.Errorf("error getting MIG mode: %v", ret) + } + + return (mode == nvml.DEVICE_MIG_ENABLE), nil +} + +// VisitMigDevices walks a top-level device and invokes a callback function for each MIG device configured on it +func (d *device) VisitMigDevices(visit func(int, MigDevice) error) error { + count, ret := nvml.Device(d).GetMaxMigDeviceCount() + if ret != nvml.SUCCESS { + return fmt.Errorf("error getting max MIG device count: %v", ret) + } + + for i := 0; i < count; i++ { + device, ret := nvml.Device(d).GetMigDeviceHandleByIndex(i) + if ret == nvml.ERROR_NOT_FOUND { + continue + } + if ret == nvml.ERROR_INVALID_ARGUMENT { + continue + } + if ret != nvml.SUCCESS { + return fmt.Errorf("error getting MIG device handle at index '%v': %v", i, ret) + } + mig, err := d.lib.NewMigDevice(device) + if err != nil { + return fmt.Errorf("error creating new MIG device wrapper: %v", err) + } + err = visit(i, mig) + if err != nil { + return fmt.Errorf("error visiting MIG device: %v", err) + } + } + return nil +} + +// VisitMigProfiles walks a top-level device and invokes a callback function for each unique MIG Profile that can be configured on it +func (d *device) VisitMigProfiles(visit func(MigProfile) error) error { + capable, err := d.IsMigCapable() + if err != nil { + return fmt.Errorf("error checking if GPU is MIG capable: %v", err) + } + + if !capable { + return nil + } + + memory, ret := d.GetMemoryInfo() + if ret != nvml.SUCCESS { + return fmt.Errorf("error getting device memory info: %v", ret) + } + + for i := 0; i < nvml.GPU_INSTANCE_PROFILE_COUNT; i++ { + giProfileInfo, ret := d.GetGpuInstanceProfileInfo(i) + if ret == nvml.ERROR_NOT_SUPPORTED { + continue + } + if ret == nvml.ERROR_INVALID_ARGUMENT { + continue + } + if ret != nvml.SUCCESS { + return fmt.Errorf("error getting GPU Instance profile info: %v", ret) + } + + for j := 0; j < nvml.COMPUTE_INSTANCE_PROFILE_COUNT; j++ { + for k := 0; k < nvml.COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT; k++ { + p, err := d.lib.NewMigProfile(i, j, k, giProfileInfo.MemorySizeMB, memory.Total) + if err != nil { + return fmt.Errorf("error creating MIG profile: %v", err) + } + + err = visit(p) + if err != nil { + return fmt.Errorf("error visiting MIG profile: %v", err) + } + } + } + } + return nil +} + +// GetMigDevices gets the set of MIG devices associated with a top-level device +func (d *device) GetMigDevices() ([]MigDevice, error) { + var migs []MigDevice + err := d.VisitMigDevices(func(j int, m MigDevice) error { + migs = append(migs, m) + return nil + }) + if err != nil { + return nil, err + } + return migs, nil +} + +// GetMigProfiles gets the set of unique MIG profiles associated with a top-level device +func (d *device) GetMigProfiles() ([]MigProfile, error) { + var profiles []MigProfile + err := d.VisitMigProfiles(func(p MigProfile) error { + profiles = append(profiles, p) + return nil + }) + if err != nil { + return nil, err + } + return profiles, nil +} + +// isSkipped checks whether the device should be skipped. +func (d *device) isSkipped() (bool, error) { + name, ret := d.GetName() + if ret != nvml.SUCCESS { + return false, fmt.Errorf("error getting device name: %v", ret) + } + + if _, exists := d.lib.skippedDevices[name]; exists { + return true, nil + } + + return false, nil +} + +// VisitDevices visits each top-level device and invokes a callback function for it +func (d *devicelib) VisitDevices(visit func(int, Device) error) error { + count, ret := d.nvml.DeviceGetCount() + if ret != nvml.SUCCESS { + return fmt.Errorf("error getting device count: %v", ret) + } + + for i := 0; i < count; i++ { + device, ret := d.nvml.DeviceGetHandleByIndex(i) + if ret != nvml.SUCCESS { + return fmt.Errorf("error getting device handle for index '%v': %v", i, ret) + } + dev, err := d.newDevice(device) + if err != nil { + return fmt.Errorf("error creating new device wrapper: %v", err) + } + + isSkipped, err := dev.isSkipped() + if err != nil { + return fmt.Errorf("error checking whether device is skipped: %v", err) + } + if isSkipped { + continue + } + + err = visit(i, dev) + if err != nil { + return fmt.Errorf("error visiting device: %v", err) + } + } + return nil +} + +// VisitMigDevices walks a top-level device and invokes a callback function for each MIG device configured on it +func (d *devicelib) VisitMigDevices(visit func(int, Device, int, MigDevice) error) error { + err := d.VisitDevices(func(i int, dev Device) error { + err := dev.VisitMigDevices(func(j int, mig MigDevice) error { + err := visit(i, dev, j, mig) + if err != nil { + return fmt.Errorf("error visiting MIG device: %v", err) + } + return nil + }) + if err != nil { + return fmt.Errorf("error visiting device: %v", err) + } + return nil + }) + if err != nil { + return fmt.Errorf("error visiting devices: %v", err) + } + return nil +} + +// VisitMigProfiles walks a top-level device and invokes a callback function for each unique MIG profile found on them +func (d *devicelib) VisitMigProfiles(visit func(MigProfile) error) error { + visited := make(map[string]bool) + err := d.VisitDevices(func(i int, dev Device) error { + err := dev.VisitMigProfiles(func(p MigProfile) error { + if visited[p.String()] { + return nil + } + + err := visit(p) + if err != nil { + return fmt.Errorf("error visiting MIG profile: %v", err) + } + + visited[p.String()] = true + return nil + }) + if err != nil { + return fmt.Errorf("error visiting device: %v", err) + } + return nil + }) + if err != nil { + return fmt.Errorf("error visiting devices: %v", err) + } + return nil +} + +// GetDevices gets the set of all top-level devices +func (d *devicelib) GetDevices() ([]Device, error) { + var devs []Device + err := d.VisitDevices(func(i int, dev Device) error { + devs = append(devs, dev) + return nil + }) + if err != nil { + return nil, err + } + return devs, nil +} + +// GetMigDevices gets the set of MIG devices across all top-level devices +func (d *devicelib) GetMigDevices() ([]MigDevice, error) { + var migs []MigDevice + err := d.VisitMigDevices(func(i int, dev Device, j int, m MigDevice) error { + migs = append(migs, m) + return nil + }) + if err != nil { + return nil, err + } + return migs, nil +} + +// GetMigProfiles gets the set of unique MIG profiles across all top-level devices +func (d *devicelib) GetMigProfiles() ([]MigProfile, error) { + var profiles []MigProfile + err := d.VisitMigProfiles(func(p MigProfile) error { + profiles = append(profiles, p) + return nil + }) + if err != nil { + return nil, err + } + return profiles, nil +} + +// nvmlLookupSymbol checks to see if the given symbol is present in the NVML library +func nvmlLookupSymbol(symbol string) error { + lib := dl.New("libnvidia-ml.so.1", dl.RTLD_LAZY|dl.RTLD_GLOBAL) + if lib == nil { + return fmt.Errorf("error instantiating DynamicLibrary for NVML") + } + err := lib.Open() + if err != nil { + return fmt.Errorf("error opening DynamicLibrary for NVML: %v", err) + } + defer lib.Close() + return lib.Lookup(symbol) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/mig_device.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/mig_device.go new file mode 100644 index 0000000..0742a71 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/mig_device.go @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2022, 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 device + +import ( + "fmt" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +// MigDevice defines the set of extended functions associated with a MIG device +type MigDevice interface { + nvml.Device + GetProfile() (MigProfile, error) +} + +type migdevice struct { + nvml.Device + lib *devicelib + profile MigProfile +} + +var _ MigDevice = &migdevice{} + +// NewMigDevice builds a new MigDevice from an nvml.Device +func (d *devicelib) NewMigDevice(handle nvml.Device) (MigDevice, error) { + isMig, ret := handle.IsMigDeviceHandle() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error checking if device is a MIG device: %v", ret) + } + if !isMig { + return nil, fmt.Errorf("not a MIG device") + } + return &migdevice{handle, d, nil}, nil +} + +// NewMigDeviceByUUID builds a new MigDevice from a UUID +func (d *devicelib) NewMigDeviceByUUID(uuid string) (MigDevice, error) { + dev, ret := d.nvml.DeviceGetHandleByUUID(uuid) + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting device handle for uuid '%v': %v", uuid, ret) + } + return d.NewMigDevice(dev) +} + +// GetProfile returns the MIG profile associated with a MIG device +func (m *migdevice) GetProfile() (MigProfile, error) { + if m.profile != nil { + return m.profile, nil + } + + parent, ret := m.Device.GetDeviceHandleFromMigDeviceHandle() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting parent device handle: %v", ret) + } + + parentMemoryInfo, ret := parent.GetMemoryInfo() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting parent memory info: %v", ret) + } + + attributes, ret := m.Device.GetAttributes() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting MIG device attributes: %v", ret) + } + + giID, ret := m.Device.GetGpuInstanceId() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting MIG device GPU Instance ID: %v", ret) + } + + ciID, ret := m.Device.GetComputeInstanceId() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting MIG device Compute Instance ID: %v", ret) + } + + gi, ret := parent.GetGpuInstanceById(giID) + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting GPU Instance: %v", ret) + } + + ci, ret := gi.GetComputeInstanceById(ciID) + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting Compute Instance: %v", ret) + } + + giInfo, ret := gi.GetInfo() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting GPU Instance info: %v", ret) + } + + ciInfo, ret := ci.GetInfo() + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting Compute Instance info: %v", ret) + } + + for i := 0; i < nvml.GPU_INSTANCE_PROFILE_COUNT; i++ { + giProfileInfo, ret := parent.GetGpuInstanceProfileInfo(i) + if ret == nvml.ERROR_NOT_SUPPORTED { + continue + } + if ret == nvml.ERROR_INVALID_ARGUMENT { + continue + } + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting GPU Instance profile info: %v", ret) + } + + if giProfileInfo.Id != giInfo.ProfileId { + continue + } + + for j := 0; j < nvml.COMPUTE_INSTANCE_PROFILE_COUNT; j++ { + for k := 0; k < nvml.COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT; k++ { + ciProfileInfo, ret := gi.GetComputeInstanceProfileInfo(j, k) + if ret == nvml.ERROR_NOT_SUPPORTED { + continue + } + if ret == nvml.ERROR_INVALID_ARGUMENT { + continue + } + if ret != nvml.SUCCESS { + return nil, fmt.Errorf("error getting Compute Instance profile info: %v", ret) + + } + + if ciProfileInfo.Id != ciInfo.ProfileId { + continue + } + + p, err := m.lib.NewMigProfile(i, j, k, attributes.MemorySizeMB, parentMemoryInfo.Total) + if err != nil { + return nil, fmt.Errorf("error creating MIG profile: %v", err) + } + + m.profile = p + return p, nil + } + } + } + + return nil, fmt.Errorf("no matching profile IDs found") +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/mig_profile.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/mig_profile.go new file mode 100644 index 0000000..5aa00e6 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device/mig_profile.go @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2022, 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 device + +import ( + "fmt" + "math" + "strconv" + "strings" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" +) + +const ( + // AttributeMediaExtensions holds the string representation for the media extension MIG profile attribute. + AttributeMediaExtensions = "me" +) + +// MigProfile represents a specific MIG profile. +// Examples include "1g.5gb", "2g.10gb", "1c.2g.10gb", or "1c.1g.5gb+me", etc. +type MigProfile interface { + String() string + GetInfo() MigProfileInfo + Equals(other MigProfile) bool +} + +// MigProfileInfo holds all info associated with a specific MIG profile +type MigProfileInfo struct { + C int + G int + GB int + Attributes []string + GIProfileID int + CIProfileID int + CIEngProfileID int +} + +var _ MigProfile = &MigProfileInfo{} + +// NewProfile constructs a new Profile struct using info from the giProfiles and ciProfiles used to create it. +func (d *devicelib) NewMigProfile(giProfileID, ciProfileID, ciEngProfileID int, migMemorySizeMB, deviceMemorySizeBytes uint64) (MigProfile, error) { + giSlices := 0 + switch giProfileID { + case nvml.GPU_INSTANCE_PROFILE_1_SLICE: + giSlices = 1 + case nvml.GPU_INSTANCE_PROFILE_1_SLICE_REV1: + giSlices = 1 + case nvml.GPU_INSTANCE_PROFILE_2_SLICE: + giSlices = 2 + case nvml.GPU_INSTANCE_PROFILE_3_SLICE: + giSlices = 3 + case nvml.GPU_INSTANCE_PROFILE_4_SLICE: + giSlices = 4 + case nvml.GPU_INSTANCE_PROFILE_6_SLICE: + giSlices = 6 + case nvml.GPU_INSTANCE_PROFILE_7_SLICE: + giSlices = 7 + case nvml.GPU_INSTANCE_PROFILE_8_SLICE: + giSlices = 8 + default: + return nil, fmt.Errorf("invalid GPU Instance Profile ID: %v", giProfileID) + } + + ciSlices := 0 + switch ciProfileID { + case nvml.COMPUTE_INSTANCE_PROFILE_1_SLICE: + ciSlices = 1 + case nvml.COMPUTE_INSTANCE_PROFILE_2_SLICE: + ciSlices = 2 + case nvml.COMPUTE_INSTANCE_PROFILE_3_SLICE: + ciSlices = 3 + case nvml.COMPUTE_INSTANCE_PROFILE_4_SLICE: + ciSlices = 4 + case nvml.COMPUTE_INSTANCE_PROFILE_6_SLICE: + ciSlices = 6 + case nvml.COMPUTE_INSTANCE_PROFILE_7_SLICE: + ciSlices = 7 + case nvml.COMPUTE_INSTANCE_PROFILE_8_SLICE: + ciSlices = 8 + default: + return nil, fmt.Errorf("invalid Compute Instance Profile ID: %v", ciProfileID) + } + + var attrs []string + switch giProfileID { + case nvml.GPU_INSTANCE_PROFILE_1_SLICE_REV1: + attrs = append(attrs, AttributeMediaExtensions) + } + + p := &MigProfileInfo{ + C: ciSlices, + G: giSlices, + GB: int(getMigMemorySizeGB(deviceMemorySizeBytes, migMemorySizeMB)), + Attributes: attrs, + GIProfileID: giProfileID, + CIProfileID: ciProfileID, + CIEngProfileID: ciEngProfileID, + } + + return p, nil +} + +// ParseMigProfile converts a string representation of a MigProfile into an object +func (d *devicelib) ParseMigProfile(profile string) (MigProfile, error) { + var err error + var c, g, gb int + var attrs []string + + if len(profile) == 0 { + return nil, fmt.Errorf("empty Profile string") + } + + split := strings.SplitN(profile, "+", 2) + if len(split) == 2 { + attrs, err = parseMigProfileAttributes(split[1]) + if err != nil { + return nil, fmt.Errorf("error parsing attributes following '+' in Profile string: %v", err) + } + } + + c, g, gb, err = parseMigProfileFields(split[0]) + if err != nil { + return nil, fmt.Errorf("error parsing '.' separated fields in Profile string: %v", err) + } + + p := &MigProfileInfo{ + C: c, + G: g, + GB: gb, + Attributes: attrs, + } + + switch c { + case 1: + p.CIProfileID = nvml.COMPUTE_INSTANCE_PROFILE_1_SLICE + case 2: + p.CIProfileID = nvml.COMPUTE_INSTANCE_PROFILE_2_SLICE + case 3: + p.CIProfileID = nvml.COMPUTE_INSTANCE_PROFILE_3_SLICE + case 4: + p.CIProfileID = nvml.COMPUTE_INSTANCE_PROFILE_4_SLICE + case 6: + p.CIProfileID = nvml.COMPUTE_INSTANCE_PROFILE_6_SLICE + case 7: + p.CIProfileID = nvml.COMPUTE_INSTANCE_PROFILE_7_SLICE + case 8: + p.CIProfileID = nvml.COMPUTE_INSTANCE_PROFILE_8_SLICE + default: + return nil, fmt.Errorf("unknown Compute Instance slice size: %v", c) + } + + switch g { + case 1: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_1_SLICE + case 2: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_2_SLICE + case 3: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_3_SLICE + case 4: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_4_SLICE + case 6: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_6_SLICE + case 7: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_7_SLICE + case 8: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_8_SLICE + default: + return nil, fmt.Errorf("unknown GPU Instance slice size: %v", g) + } + + p.CIEngProfileID = nvml.COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED + + for _, a := range attrs { + switch a { + case AttributeMediaExtensions: + p.GIProfileID = nvml.GPU_INSTANCE_PROFILE_1_SLICE_REV1 + default: + return nil, fmt.Errorf("unknown Profile attribute: %v", a) + } + } + + return p, nil +} + +// String returns the string representation of a Profile +func (p *MigProfileInfo) String() string { + var suffix string + if len(p.Attributes) > 0 { + suffix = "+" + strings.Join(p.Attributes, ",") + } + if p.C == p.G { + return fmt.Sprintf("%dg.%dgb%s", p.G, p.GB, suffix) + } + return fmt.Sprintf("%dc.%dg.%dgb%s", p.C, p.G, p.GB, suffix) +} + +// GetInfo returns detailed info about a Profile +func (p *MigProfileInfo) GetInfo() MigProfileInfo { + return *p +} + +// Equals checks if two Profiles are identical or not +func (p *MigProfileInfo) Equals(other MigProfile) bool { + switch o := other.(type) { + case *MigProfileInfo: + if p.C != o.C { + return false + } + if p.G != o.G { + return false + } + if p.GB != o.GB { + return false + } + if p.GIProfileID != o.GIProfileID { + return false + } + if p.CIProfileID != o.CIProfileID { + return false + } + if p.CIEngProfileID != o.CIEngProfileID { + return false + } + return true + } + return false +} + +func parseMigProfileField(s string, field string) (int, error) { + if strings.TrimSpace(s) != s { + return -1, fmt.Errorf("leading or trailing spaces on '%%d%s'", field) + } + + if !strings.HasSuffix(s, field) { + return -1, fmt.Errorf("missing '%s' from '%%d%s'", field, field) + } + + v, err := strconv.Atoi(strings.TrimSuffix(s, field)) + if err != nil { + return -1, fmt.Errorf("malformed number in '%%d%s'", field) + } + + return v, nil +} + +func parseMigProfileFields(s string) (int, int, int, error) { + var err error + var c, g, gb int + + split := strings.SplitN(s, ".", 3) + if len(split) == 3 { + c, err = parseMigProfileField(split[0], "c") + if err != nil { + return -1, -1, -1, err + } + g, err = parseMigProfileField(split[1], "g") + if err != nil { + return -1, -1, -1, err + } + gb, err = parseMigProfileField(split[2], "gb") + if err != nil { + return -1, -1, -1, err + } + return c, g, gb, err + } + if len(split) == 2 { + g, err = parseMigProfileField(split[0], "g") + if err != nil { + return -1, -1, -1, err + } + gb, err = parseMigProfileField(split[1], "gb") + if err != nil { + return -1, -1, -1, err + } + return g, g, gb, nil + } + + return -1, -1, -1, fmt.Errorf("parsed wrong number of fields, expected 2 or 3") +} + +func parseMigProfileAttributes(s string) ([]string, error) { + attr := strings.Split(s, ",") + if len(attr) == 0 { + return nil, fmt.Errorf("empty attribute list") + } + unique := make(map[string]int) + for _, a := range attr { + if unique[a] > 0 { + return nil, fmt.Errorf("non unique attribute in list") + } + if a == "" { + return nil, fmt.Errorf("empty attribute in list") + } + if strings.TrimSpace(a) != a { + return nil, fmt.Errorf("leading or trailing spaces in attribute") + } + if a[0] >= '0' && a[0] <= '9' { + return nil, fmt.Errorf("attribute begins with a number") + } + for _, c := range a { + if (c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && (c < '0' || c > '9') { + return nil, fmt.Errorf("non alpha-numeric character or digit in attribute") + } + } + unique[a]++ + } + return attr, nil +} + +func getMigMemorySizeGB(totalDeviceMemory, migMemorySizeMB uint64) uint64 { + const fracDenominator = 8 + const oneMB = 1024 * 1024 + const oneGB = 1024 * 1024 * 1024 + fractionalGpuMem := (float64(migMemorySizeMB) * oneMB) / float64(totalDeviceMemory) + fractionalGpuMem = math.Ceil(fractionalGpuMem*fracDenominator) / fracDenominator + totalMemGB := float64((totalDeviceMemory + oneGB - 1) / oneGB) + return uint64(math.Round(fractionalGpuMem * totalMemGB)) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info/info.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info/info.go new file mode 100644 index 0000000..460e852 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info/info.go @@ -0,0 +1,102 @@ +/** +# Copyright (c) 2022, 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 info + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/NVIDIA/go-nvml/pkg/dl" +) + +// Interface provides the API to the info package +type Interface interface { + HasDXCore() (bool, string) + HasNvml() (bool, string) + IsTegraSystem() (bool, string) +} + +type infolib struct { + root string +} + +var _ Interface = &infolib{} + +// HasDXCore returns true if DXCore is detected on the system. +func (i *infolib) HasDXCore() (bool, string) { + const ( + libraryName = "libdxcore.so" + ) + if err := assertHasLibrary(libraryName); err != nil { + return false, fmt.Sprintf("could not load DXCore library: %v", err) + } + + return true, "found DXCore library" +} + +// HasNvml returns true if NVML is detected on the system +func (i *infolib) HasNvml() (bool, string) { + const ( + libraryName = "libnvidia-ml.so.1" + ) + if err := assertHasLibrary(libraryName); err != nil { + return false, fmt.Sprintf("could not load NVML library: %v", err) + } + + return true, "found NVML library" +} + +// IsTegraSystem returns true if the system is detected as a Tegra-based system +func (i *infolib) IsTegraSystem() (bool, string) { + tegraReleaseFile := filepath.Join(i.root, "/etc/nv_tegra_release") + tegraFamilyFile := filepath.Join(i.root, "/sys/devices/soc0/family") + + if info, err := os.Stat(tegraReleaseFile); err == nil && !info.IsDir() { + return true, fmt.Sprintf("%v found", tegraReleaseFile) + } + + if info, err := os.Stat(tegraFamilyFile); err != nil || info.IsDir() { + return false, fmt.Sprintf("%v file not found", tegraFamilyFile) + } + + contents, err := os.ReadFile(tegraFamilyFile) + if err != nil { + return false, fmt.Sprintf("could not read %v", tegraFamilyFile) + } + + if strings.HasPrefix(strings.ToLower(string(contents)), "tegra") { + return true, fmt.Sprintf("%v has 'tegra' prefix", tegraFamilyFile) + } + + return false, fmt.Sprintf("%v has no 'tegra' prefix", tegraFamilyFile) +} + +// assertHasLibrary returns an error if the specified library cannot be loaded +func assertHasLibrary(libraryName string) error { + const ( + libraryLoadFlags = dl.RTLD_LAZY + ) + lib := dl.New(libraryName, libraryLoadFlags) + if err := lib.Open(); err != nil { + return err + } + defer lib.Close() + + return nil +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info/options.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info/options.go new file mode 100644 index 0000000..314efa6 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info/options.go @@ -0,0 +1,39 @@ +/** +# Copyright (c) 2022, 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 info + +// Option defines a function for passing options to the New() call +type Option func(*infolib) + +// New creates a new instance of the 'info' interface +func New(opts ...Option) Interface { + i := &infolib{} + for _, opt := range opts { + opt(i) + } + if i.root == "" { + i.root = "/" + } + return i +} + +// WithRoot provides a Option to set the root of the 'info' interface +func WithRoot(root string) Option { + return func(i *infolib) { + i.root = root + } +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/ci.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/ci.go new file mode 100644 index 0000000..6a9d798 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/ci.go @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022, 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 nvml + +import ( + "github.com/NVIDIA/go-nvml/pkg/nvml" +) + +type nvmlComputeInstance nvml.ComputeInstance + +var _ ComputeInstance = (*nvmlComputeInstance)(nil) + +// GetInfo() returns info about a Compute Instance +func (ci nvmlComputeInstance) GetInfo() (ComputeInstanceInfo, Return) { + i, r := nvml.ComputeInstance(ci).GetInfo() + info := ComputeInstanceInfo{ + Device: nvmlDevice(i.Device), + GpuInstance: nvmlGpuInstance(i.GpuInstance), + Id: i.Id, + ProfileId: i.ProfileId, + Placement: ComputeInstancePlacement(i.Placement), + } + return info, Return(r) +} + +// Destroy() destroys a Compute Instance +func (ci nvmlComputeInstance) Destroy() Return { + r := nvml.ComputeInstance(ci).Destroy() + return Return(r) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/ci_mock.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/ci_mock.go new file mode 100644 index 0000000..e4e75a7 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/ci_mock.go @@ -0,0 +1,104 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package nvml + +import ( + "sync" +) + +// Ensure, that ComputeInstanceMock does implement ComputeInstance. +// If this is not the case, regenerate this file with moq. +var _ ComputeInstance = &ComputeInstanceMock{} + +// ComputeInstanceMock is a mock implementation of ComputeInstance. +// +// func TestSomethingThatUsesComputeInstance(t *testing.T) { +// +// // make and configure a mocked ComputeInstance +// mockedComputeInstance := &ComputeInstanceMock{ +// DestroyFunc: func() Return { +// panic("mock out the Destroy method") +// }, +// GetInfoFunc: func() (ComputeInstanceInfo, Return) { +// panic("mock out the GetInfo method") +// }, +// } +// +// // use mockedComputeInstance in code that requires ComputeInstance +// // and then make assertions. +// +// } +type ComputeInstanceMock struct { + // DestroyFunc mocks the Destroy method. + DestroyFunc func() Return + + // GetInfoFunc mocks the GetInfo method. + GetInfoFunc func() (ComputeInstanceInfo, Return) + + // calls tracks calls to the methods. + calls struct { + // Destroy holds details about calls to the Destroy method. + Destroy []struct { + } + // GetInfo holds details about calls to the GetInfo method. + GetInfo []struct { + } + } + lockDestroy sync.RWMutex + lockGetInfo sync.RWMutex +} + +// Destroy calls DestroyFunc. +func (mock *ComputeInstanceMock) Destroy() Return { + if mock.DestroyFunc == nil { + panic("ComputeInstanceMock.DestroyFunc: method is nil but ComputeInstance.Destroy was just called") + } + callInfo := struct { + }{} + mock.lockDestroy.Lock() + mock.calls.Destroy = append(mock.calls.Destroy, callInfo) + mock.lockDestroy.Unlock() + return mock.DestroyFunc() +} + +// DestroyCalls gets all the calls that were made to Destroy. +// Check the length with: +// +// len(mockedComputeInstance.DestroyCalls()) +func (mock *ComputeInstanceMock) DestroyCalls() []struct { +} { + var calls []struct { + } + mock.lockDestroy.RLock() + calls = mock.calls.Destroy + mock.lockDestroy.RUnlock() + return calls +} + +// GetInfo calls GetInfoFunc. +func (mock *ComputeInstanceMock) GetInfo() (ComputeInstanceInfo, Return) { + if mock.GetInfoFunc == nil { + panic("ComputeInstanceMock.GetInfoFunc: method is nil but ComputeInstance.GetInfo was just called") + } + callInfo := struct { + }{} + mock.lockGetInfo.Lock() + mock.calls.GetInfo = append(mock.calls.GetInfo, callInfo) + mock.lockGetInfo.Unlock() + return mock.GetInfoFunc() +} + +// GetInfoCalls gets all the calls that were made to GetInfo. +// Check the length with: +// +// len(mockedComputeInstance.GetInfoCalls()) +func (mock *ComputeInstanceMock) GetInfoCalls() []struct { +} { + var calls []struct { + } + mock.lockGetInfo.RLock() + calls = mock.calls.GetInfo + mock.lockGetInfo.RUnlock() + return calls +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/consts.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/consts.go new file mode 100644 index 0000000..b353ef9 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/consts.go @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2022, 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 nvml + +import ( + "github.com/NVIDIA/go-nvml/pkg/nvml" +) + +// Return constants +const ( + SUCCESS = Return(nvml.SUCCESS) + ERROR_UNINITIALIZED = Return(nvml.ERROR_UNINITIALIZED) + ERROR_INVALID_ARGUMENT = Return(nvml.ERROR_INVALID_ARGUMENT) + ERROR_NOT_SUPPORTED = Return(nvml.ERROR_NOT_SUPPORTED) + ERROR_NO_PERMISSION = Return(nvml.ERROR_NO_PERMISSION) + ERROR_ALREADY_INITIALIZED = Return(nvml.ERROR_ALREADY_INITIALIZED) + ERROR_NOT_FOUND = Return(nvml.ERROR_NOT_FOUND) + ERROR_INSUFFICIENT_SIZE = Return(nvml.ERROR_INSUFFICIENT_SIZE) + ERROR_INSUFFICIENT_POWER = Return(nvml.ERROR_INSUFFICIENT_POWER) + ERROR_DRIVER_NOT_LOADED = Return(nvml.ERROR_DRIVER_NOT_LOADED) + ERROR_TIMEOUT = Return(nvml.ERROR_TIMEOUT) + ERROR_IRQ_ISSUE = Return(nvml.ERROR_IRQ_ISSUE) + ERROR_LIBRARY_NOT_FOUND = Return(nvml.ERROR_LIBRARY_NOT_FOUND) + ERROR_FUNCTION_NOT_FOUND = Return(nvml.ERROR_FUNCTION_NOT_FOUND) + ERROR_CORRUPTED_INFOROM = Return(nvml.ERROR_CORRUPTED_INFOROM) + ERROR_GPU_IS_LOST = Return(nvml.ERROR_GPU_IS_LOST) + ERROR_RESET_REQUIRED = Return(nvml.ERROR_RESET_REQUIRED) + ERROR_OPERATING_SYSTEM = Return(nvml.ERROR_OPERATING_SYSTEM) + ERROR_LIB_RM_VERSION_MISMATCH = Return(nvml.ERROR_LIB_RM_VERSION_MISMATCH) + ERROR_IN_USE = Return(nvml.ERROR_IN_USE) + ERROR_MEMORY = Return(nvml.ERROR_MEMORY) + ERROR_NO_DATA = Return(nvml.ERROR_NO_DATA) + ERROR_VGPU_ECC_NOT_SUPPORTED = Return(nvml.ERROR_VGPU_ECC_NOT_SUPPORTED) + ERROR_INSUFFICIENT_RESOURCES = Return(nvml.ERROR_INSUFFICIENT_RESOURCES) + ERROR_UNKNOWN = Return(nvml.ERROR_UNKNOWN) +) + +// MIG Mode constants +const ( + DEVICE_MIG_ENABLE = nvml.DEVICE_MIG_ENABLE + DEVICE_MIG_DISABLE = nvml.DEVICE_MIG_DISABLE +) + +// GPU Instance Profiles +const ( + GPU_INSTANCE_PROFILE_1_SLICE = nvml.GPU_INSTANCE_PROFILE_1_SLICE + GPU_INSTANCE_PROFILE_2_SLICE = nvml.GPU_INSTANCE_PROFILE_2_SLICE + GPU_INSTANCE_PROFILE_3_SLICE = nvml.GPU_INSTANCE_PROFILE_3_SLICE + GPU_INSTANCE_PROFILE_4_SLICE = nvml.GPU_INSTANCE_PROFILE_4_SLICE + GPU_INSTANCE_PROFILE_6_SLICE = nvml.GPU_INSTANCE_PROFILE_6_SLICE + GPU_INSTANCE_PROFILE_7_SLICE = nvml.GPU_INSTANCE_PROFILE_7_SLICE + GPU_INSTANCE_PROFILE_8_SLICE = nvml.GPU_INSTANCE_PROFILE_8_SLICE + GPU_INSTANCE_PROFILE_1_SLICE_REV1 = nvml.GPU_INSTANCE_PROFILE_1_SLICE_REV1 + GPU_INSTANCE_PROFILE_COUNT = nvml.GPU_INSTANCE_PROFILE_COUNT +) + +// Compute Instance Profiles +const ( + COMPUTE_INSTANCE_PROFILE_1_SLICE = nvml.COMPUTE_INSTANCE_PROFILE_1_SLICE + COMPUTE_INSTANCE_PROFILE_2_SLICE = nvml.COMPUTE_INSTANCE_PROFILE_2_SLICE + COMPUTE_INSTANCE_PROFILE_3_SLICE = nvml.COMPUTE_INSTANCE_PROFILE_3_SLICE + COMPUTE_INSTANCE_PROFILE_4_SLICE = nvml.COMPUTE_INSTANCE_PROFILE_4_SLICE + COMPUTE_INSTANCE_PROFILE_6_SLICE = nvml.COMPUTE_INSTANCE_PROFILE_6_SLICE + COMPUTE_INSTANCE_PROFILE_7_SLICE = nvml.COMPUTE_INSTANCE_PROFILE_7_SLICE + COMPUTE_INSTANCE_PROFILE_8_SLICE = nvml.COMPUTE_INSTANCE_PROFILE_8_SLICE + COMPUTE_INSTANCE_PROFILE_COUNT = nvml.COMPUTE_INSTANCE_PROFILE_COUNT +) + +// Compute Instance Engine Profiles +const ( + COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED = nvml.COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED + COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT = nvml.COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT +) + +// Event Types +const ( + EventTypeXidCriticalError = nvml.EventTypeXidCriticalError + EventTypeSingleBitEccError = nvml.EventTypeSingleBitEccError + EventTypeDoubleBitEccError = nvml.EventTypeDoubleBitEccError +) diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/device.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/device.go new file mode 100644 index 0000000..faaac25 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/device.go @@ -0,0 +1,168 @@ +/** +# Copyright (c) 2022, 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 nvml + +import "github.com/NVIDIA/go-nvml/pkg/nvml" + +type nvmlDevice nvml.Device + +var _ Device = (*nvmlDevice)(nil) + +// GetIndex returns the index of a Device +func (d nvmlDevice) GetIndex() (int, Return) { + i, r := nvml.Device(d).GetIndex() + return i, Return(r) +} + +// GetPciInfo returns the PCI info of a Device +func (d nvmlDevice) GetPciInfo() (PciInfo, Return) { + p, r := nvml.Device(d).GetPciInfo() + return PciInfo(p), Return(r) +} + +// GetMemoryInfo returns the memory info of a Device +func (d nvmlDevice) GetMemoryInfo() (Memory, Return) { + p, r := nvml.Device(d).GetMemoryInfo() + return Memory(p), Return(r) +} + +// GetUUID returns the UUID of a Device +func (d nvmlDevice) GetUUID() (string, Return) { + u, r := nvml.Device(d).GetUUID() + return u, Return(r) +} + +// GetMinorNumber returns the minor number of a Device +func (d nvmlDevice) GetMinorNumber() (int, Return) { + m, r := nvml.Device(d).GetMinorNumber() + return m, Return(r) +} + +// IsMigDeviceHandle returns whether a Device is a MIG device or not +func (d nvmlDevice) IsMigDeviceHandle() (bool, Return) { + b, r := nvml.Device(d).IsMigDeviceHandle() + return b, Return(r) +} + +// GetDeviceHandleFromMigDeviceHandle returns the parent Device of a MIG device +func (d nvmlDevice) GetDeviceHandleFromMigDeviceHandle() (Device, Return) { + p, r := nvml.Device(d).GetDeviceHandleFromMigDeviceHandle() + return nvmlDevice(p), Return(r) +} + +// SetMigMode sets the MIG mode of a Device +func (d nvmlDevice) SetMigMode(mode int) (Return, Return) { + r1, r2 := nvml.Device(d).SetMigMode(mode) + return Return(r1), Return(r2) +} + +// GetMigMode returns the MIG mode of a Device +func (d nvmlDevice) GetMigMode() (int, int, Return) { + s1, s2, r := nvml.Device(d).GetMigMode() + return s1, s2, Return(r) +} + +// GetGpuInstanceById returns the GPU Instance associated with a particular ID +func (d nvmlDevice) GetGpuInstanceById(id int) (GpuInstance, Return) { + gi, r := nvml.Device(d).GetGpuInstanceById(id) + return nvmlGpuInstance(gi), Return(r) +} + +// GetGpuInstanceProfileInfo returns the profile info of a GPU Instance +func (d nvmlDevice) GetGpuInstanceProfileInfo(profile int) (GpuInstanceProfileInfo, Return) { + p, r := nvml.Device(d).GetGpuInstanceProfileInfo(profile) + return GpuInstanceProfileInfo(p), Return(r) +} + +// GetGpuInstancePossiblePlacements returns the possible placements of a GPU Instance +func (d nvmlDevice) GetGpuInstancePossiblePlacements(info *GpuInstanceProfileInfo) ([]GpuInstancePlacement, Return) { + nvmlPlacements, r := nvml.Device(d).GetGpuInstancePossiblePlacements((*nvml.GpuInstanceProfileInfo)(info)) + var placements []GpuInstancePlacement + for _, p := range nvmlPlacements { + placements = append(placements, GpuInstancePlacement(p)) + } + return placements, Return(r) +} + +// GetGpuInstances returns the set of GPU Instances associated with a Device +func (d nvmlDevice) GetGpuInstances(info *GpuInstanceProfileInfo) ([]GpuInstance, Return) { + nvmlGis, r := nvml.Device(d).GetGpuInstances((*nvml.GpuInstanceProfileInfo)(info)) + var gis []GpuInstance + for _, gi := range nvmlGis { + gis = append(gis, nvmlGpuInstance(gi)) + } + return gis, Return(r) +} + +// CreateGpuInstanceWithPlacement creates a GPU Instance with a specific placement +func (d nvmlDevice) CreateGpuInstanceWithPlacement(info *GpuInstanceProfileInfo, placement *GpuInstancePlacement) (GpuInstance, Return) { + gi, r := nvml.Device(d).CreateGpuInstanceWithPlacement((*nvml.GpuInstanceProfileInfo)(info), (*nvml.GpuInstancePlacement)(placement)) + return nvmlGpuInstance(gi), Return(r) +} + +// GetMaxMigDeviceCount returns the maximum number of MIG devices that can be created on a Device +func (d nvmlDevice) GetMaxMigDeviceCount() (int, Return) { + m, r := nvml.Device(d).GetMaxMigDeviceCount() + return m, Return(r) +} + +// GetMigDeviceHandleByIndex returns the handle to a MIG device given its index +func (d nvmlDevice) GetMigDeviceHandleByIndex(Index int) (Device, Return) { + h, r := nvml.Device(d).GetMigDeviceHandleByIndex(Index) + return nvmlDevice(h), Return(r) +} + +// GetGpuInstanceId returns the GPU Instance ID of a MIG device +func (d nvmlDevice) GetGpuInstanceId() (int, Return) { + gi, r := nvml.Device(d).GetGpuInstanceId() + return gi, Return(r) +} + +// GetComputeInstanceId returns the Compute Instance ID of a MIG device +func (d nvmlDevice) GetComputeInstanceId() (int, Return) { + ci, r := nvml.Device(d).GetComputeInstanceId() + return ci, Return(r) +} + +// GetCudaComputeCapability returns the compute capability major and minor versions for a device +func (d nvmlDevice) GetCudaComputeCapability() (int, int, Return) { + major, minor, r := nvml.Device(d).GetCudaComputeCapability() + return major, minor, Return(r) +} + +// GetAttributes returns the device attributes for a MIG device +func (d nvmlDevice) GetAttributes() (DeviceAttributes, Return) { + a, r := nvml.Device(d).GetAttributes() + return DeviceAttributes(a), Return(r) +} + +// GetName returns the device attributes for a MIG device +func (d nvmlDevice) GetName() (string, Return) { + n, r := nvml.Device(d).GetName() + return n, Return(r) +} + +// RegisterEvents registers the specified event set and type with the device +func (d nvmlDevice) RegisterEvents(EventTypes uint64, Set EventSet) Return { + return Return(nvml.Device(d).RegisterEvents(EventTypes, nvml.EventSet(Set))) +} + +// GetSupportedEventTypes returns the events supported by the device +func (d nvmlDevice) GetSupportedEventTypes() (uint64, Return) { + e, r := nvml.Device(d).GetSupportedEventTypes() + return e, Return(r) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/device_mock.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/device_mock.go new file mode 100644 index 0000000..0093e4e --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/device_mock.go @@ -0,0 +1,949 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package nvml + +import ( + "sync" +) + +// Ensure, that DeviceMock does implement Device. +// If this is not the case, regenerate this file with moq. +var _ Device = &DeviceMock{} + +// DeviceMock is a mock implementation of Device. +// +// func TestSomethingThatUsesDevice(t *testing.T) { +// +// // make and configure a mocked Device +// mockedDevice := &DeviceMock{ +// CreateGpuInstanceWithPlacementFunc: func(gpuInstanceProfileInfo *GpuInstanceProfileInfo, gpuInstancePlacement *GpuInstancePlacement) (GpuInstance, Return) { +// panic("mock out the CreateGpuInstanceWithPlacement method") +// }, +// GetAttributesFunc: func() (DeviceAttributes, Return) { +// panic("mock out the GetAttributes method") +// }, +// GetComputeInstanceIdFunc: func() (int, Return) { +// panic("mock out the GetComputeInstanceId method") +// }, +// GetCudaComputeCapabilityFunc: func() (int, int, Return) { +// panic("mock out the GetCudaComputeCapability method") +// }, +// GetDeviceHandleFromMigDeviceHandleFunc: func() (Device, Return) { +// panic("mock out the GetDeviceHandleFromMigDeviceHandle method") +// }, +// GetGpuInstanceByIdFunc: func(ID int) (GpuInstance, Return) { +// panic("mock out the GetGpuInstanceById method") +// }, +// GetGpuInstanceIdFunc: func() (int, Return) { +// panic("mock out the GetGpuInstanceId method") +// }, +// GetGpuInstancePossiblePlacementsFunc: func(gpuInstanceProfileInfo *GpuInstanceProfileInfo) ([]GpuInstancePlacement, Return) { +// panic("mock out the GetGpuInstancePossiblePlacements method") +// }, +// GetGpuInstanceProfileInfoFunc: func(Profile int) (GpuInstanceProfileInfo, Return) { +// panic("mock out the GetGpuInstanceProfileInfo method") +// }, +// GetGpuInstancesFunc: func(Info *GpuInstanceProfileInfo) ([]GpuInstance, Return) { +// panic("mock out the GetGpuInstances method") +// }, +// GetIndexFunc: func() (int, Return) { +// panic("mock out the GetIndex method") +// }, +// GetMaxMigDeviceCountFunc: func() (int, Return) { +// panic("mock out the GetMaxMigDeviceCount method") +// }, +// GetMemoryInfoFunc: func() (Memory, Return) { +// panic("mock out the GetMemoryInfo method") +// }, +// GetMigDeviceHandleByIndexFunc: func(Index int) (Device, Return) { +// panic("mock out the GetMigDeviceHandleByIndex method") +// }, +// GetMigModeFunc: func() (int, int, Return) { +// panic("mock out the GetMigMode method") +// }, +// GetMinorNumberFunc: func() (int, Return) { +// panic("mock out the GetMinorNumber method") +// }, +// GetNameFunc: func() (string, Return) { +// panic("mock out the GetName method") +// }, +// GetPciInfoFunc: func() (PciInfo, Return) { +// panic("mock out the GetPciInfo method") +// }, +// GetSupportedEventTypesFunc: func() (uint64, Return) { +// panic("mock out the GetSupportedEventTypes method") +// }, +// GetUUIDFunc: func() (string, Return) { +// panic("mock out the GetUUID method") +// }, +// IsMigDeviceHandleFunc: func() (bool, Return) { +// panic("mock out the IsMigDeviceHandle method") +// }, +// RegisterEventsFunc: func(v uint64, eventSet EventSet) Return { +// panic("mock out the RegisterEvents method") +// }, +// SetMigModeFunc: func(Mode int) (Return, Return) { +// panic("mock out the SetMigMode method") +// }, +// } +// +// // use mockedDevice in code that requires Device +// // and then make assertions. +// +// } +type DeviceMock struct { + // CreateGpuInstanceWithPlacementFunc mocks the CreateGpuInstanceWithPlacement method. + CreateGpuInstanceWithPlacementFunc func(gpuInstanceProfileInfo *GpuInstanceProfileInfo, gpuInstancePlacement *GpuInstancePlacement) (GpuInstance, Return) + + // GetAttributesFunc mocks the GetAttributes method. + GetAttributesFunc func() (DeviceAttributes, Return) + + // GetComputeInstanceIdFunc mocks the GetComputeInstanceId method. + GetComputeInstanceIdFunc func() (int, Return) + + // GetCudaComputeCapabilityFunc mocks the GetCudaComputeCapability method. + GetCudaComputeCapabilityFunc func() (int, int, Return) + + // GetDeviceHandleFromMigDeviceHandleFunc mocks the GetDeviceHandleFromMigDeviceHandle method. + GetDeviceHandleFromMigDeviceHandleFunc func() (Device, Return) + + // GetGpuInstanceByIdFunc mocks the GetGpuInstanceById method. + GetGpuInstanceByIdFunc func(ID int) (GpuInstance, Return) + + // GetGpuInstanceIdFunc mocks the GetGpuInstanceId method. + GetGpuInstanceIdFunc func() (int, Return) + + // GetGpuInstancePossiblePlacementsFunc mocks the GetGpuInstancePossiblePlacements method. + GetGpuInstancePossiblePlacementsFunc func(gpuInstanceProfileInfo *GpuInstanceProfileInfo) ([]GpuInstancePlacement, Return) + + // GetGpuInstanceProfileInfoFunc mocks the GetGpuInstanceProfileInfo method. + GetGpuInstanceProfileInfoFunc func(Profile int) (GpuInstanceProfileInfo, Return) + + // GetGpuInstancesFunc mocks the GetGpuInstances method. + GetGpuInstancesFunc func(Info *GpuInstanceProfileInfo) ([]GpuInstance, Return) + + // GetIndexFunc mocks the GetIndex method. + GetIndexFunc func() (int, Return) + + // GetMaxMigDeviceCountFunc mocks the GetMaxMigDeviceCount method. + GetMaxMigDeviceCountFunc func() (int, Return) + + // GetMemoryInfoFunc mocks the GetMemoryInfo method. + GetMemoryInfoFunc func() (Memory, Return) + + // GetMigDeviceHandleByIndexFunc mocks the GetMigDeviceHandleByIndex method. + GetMigDeviceHandleByIndexFunc func(Index int) (Device, Return) + + // GetMigModeFunc mocks the GetMigMode method. + GetMigModeFunc func() (int, int, Return) + + // GetMinorNumberFunc mocks the GetMinorNumber method. + GetMinorNumberFunc func() (int, Return) + + // GetNameFunc mocks the GetName method. + GetNameFunc func() (string, Return) + + // GetPciInfoFunc mocks the GetPciInfo method. + GetPciInfoFunc func() (PciInfo, Return) + + // GetSupportedEventTypesFunc mocks the GetSupportedEventTypes method. + GetSupportedEventTypesFunc func() (uint64, Return) + + // GetUUIDFunc mocks the GetUUID method. + GetUUIDFunc func() (string, Return) + + // IsMigDeviceHandleFunc mocks the IsMigDeviceHandle method. + IsMigDeviceHandleFunc func() (bool, Return) + + // RegisterEventsFunc mocks the RegisterEvents method. + RegisterEventsFunc func(v uint64, eventSet EventSet) Return + + // SetMigModeFunc mocks the SetMigMode method. + SetMigModeFunc func(Mode int) (Return, Return) + + // calls tracks calls to the methods. + calls struct { + // CreateGpuInstanceWithPlacement holds details about calls to the CreateGpuInstanceWithPlacement method. + CreateGpuInstanceWithPlacement []struct { + // GpuInstanceProfileInfo is the gpuInstanceProfileInfo argument value. + GpuInstanceProfileInfo *GpuInstanceProfileInfo + // GpuInstancePlacement is the gpuInstancePlacement argument value. + GpuInstancePlacement *GpuInstancePlacement + } + // GetAttributes holds details about calls to the GetAttributes method. + GetAttributes []struct { + } + // GetComputeInstanceId holds details about calls to the GetComputeInstanceId method. + GetComputeInstanceId []struct { + } + // GetCudaComputeCapability holds details about calls to the GetCudaComputeCapability method. + GetCudaComputeCapability []struct { + } + // GetDeviceHandleFromMigDeviceHandle holds details about calls to the GetDeviceHandleFromMigDeviceHandle method. + GetDeviceHandleFromMigDeviceHandle []struct { + } + // GetGpuInstanceById holds details about calls to the GetGpuInstanceById method. + GetGpuInstanceById []struct { + // ID is the ID argument value. + ID int + } + // GetGpuInstanceId holds details about calls to the GetGpuInstanceId method. + GetGpuInstanceId []struct { + } + // GetGpuInstancePossiblePlacements holds details about calls to the GetGpuInstancePossiblePlacements method. + GetGpuInstancePossiblePlacements []struct { + // GpuInstanceProfileInfo is the gpuInstanceProfileInfo argument value. + GpuInstanceProfileInfo *GpuInstanceProfileInfo + } + // GetGpuInstanceProfileInfo holds details about calls to the GetGpuInstanceProfileInfo method. + GetGpuInstanceProfileInfo []struct { + // Profile is the Profile argument value. + Profile int + } + // GetGpuInstances holds details about calls to the GetGpuInstances method. + GetGpuInstances []struct { + // Info is the Info argument value. + Info *GpuInstanceProfileInfo + } + // GetIndex holds details about calls to the GetIndex method. + GetIndex []struct { + } + // GetMaxMigDeviceCount holds details about calls to the GetMaxMigDeviceCount method. + GetMaxMigDeviceCount []struct { + } + // GetMemoryInfo holds details about calls to the GetMemoryInfo method. + GetMemoryInfo []struct { + } + // GetMigDeviceHandleByIndex holds details about calls to the GetMigDeviceHandleByIndex method. + GetMigDeviceHandleByIndex []struct { + // Index is the Index argument value. + Index int + } + // GetMigMode holds details about calls to the GetMigMode method. + GetMigMode []struct { + } + // GetMinorNumber holds details about calls to the GetMinorNumber method. + GetMinorNumber []struct { + } + // GetName holds details about calls to the GetName method. + GetName []struct { + } + // GetPciInfo holds details about calls to the GetPciInfo method. + GetPciInfo []struct { + } + // GetSupportedEventTypes holds details about calls to the GetSupportedEventTypes method. + GetSupportedEventTypes []struct { + } + // GetUUID holds details about calls to the GetUUID method. + GetUUID []struct { + } + // IsMigDeviceHandle holds details about calls to the IsMigDeviceHandle method. + IsMigDeviceHandle []struct { + } + // RegisterEvents holds details about calls to the RegisterEvents method. + RegisterEvents []struct { + // V is the v argument value. + V uint64 + // EventSet is the eventSet argument value. + EventSet EventSet + } + // SetMigMode holds details about calls to the SetMigMode method. + SetMigMode []struct { + // Mode is the Mode argument value. + Mode int + } + } + lockCreateGpuInstanceWithPlacement sync.RWMutex + lockGetAttributes sync.RWMutex + lockGetComputeInstanceId sync.RWMutex + lockGetCudaComputeCapability sync.RWMutex + lockGetDeviceHandleFromMigDeviceHandle sync.RWMutex + lockGetGpuInstanceById sync.RWMutex + lockGetGpuInstanceId sync.RWMutex + lockGetGpuInstancePossiblePlacements sync.RWMutex + lockGetGpuInstanceProfileInfo sync.RWMutex + lockGetGpuInstances sync.RWMutex + lockGetIndex sync.RWMutex + lockGetMaxMigDeviceCount sync.RWMutex + lockGetMemoryInfo sync.RWMutex + lockGetMigDeviceHandleByIndex sync.RWMutex + lockGetMigMode sync.RWMutex + lockGetMinorNumber sync.RWMutex + lockGetName sync.RWMutex + lockGetPciInfo sync.RWMutex + lockGetSupportedEventTypes sync.RWMutex + lockGetUUID sync.RWMutex + lockIsMigDeviceHandle sync.RWMutex + lockRegisterEvents sync.RWMutex + lockSetMigMode sync.RWMutex +} + +// CreateGpuInstanceWithPlacement calls CreateGpuInstanceWithPlacementFunc. +func (mock *DeviceMock) CreateGpuInstanceWithPlacement(gpuInstanceProfileInfo *GpuInstanceProfileInfo, gpuInstancePlacement *GpuInstancePlacement) (GpuInstance, Return) { + if mock.CreateGpuInstanceWithPlacementFunc == nil { + panic("DeviceMock.CreateGpuInstanceWithPlacementFunc: method is nil but Device.CreateGpuInstanceWithPlacement was just called") + } + callInfo := struct { + GpuInstanceProfileInfo *GpuInstanceProfileInfo + GpuInstancePlacement *GpuInstancePlacement + }{ + GpuInstanceProfileInfo: gpuInstanceProfileInfo, + GpuInstancePlacement: gpuInstancePlacement, + } + mock.lockCreateGpuInstanceWithPlacement.Lock() + mock.calls.CreateGpuInstanceWithPlacement = append(mock.calls.CreateGpuInstanceWithPlacement, callInfo) + mock.lockCreateGpuInstanceWithPlacement.Unlock() + return mock.CreateGpuInstanceWithPlacementFunc(gpuInstanceProfileInfo, gpuInstancePlacement) +} + +// CreateGpuInstanceWithPlacementCalls gets all the calls that were made to CreateGpuInstanceWithPlacement. +// Check the length with: +// +// len(mockedDevice.CreateGpuInstanceWithPlacementCalls()) +func (mock *DeviceMock) CreateGpuInstanceWithPlacementCalls() []struct { + GpuInstanceProfileInfo *GpuInstanceProfileInfo + GpuInstancePlacement *GpuInstancePlacement +} { + var calls []struct { + GpuInstanceProfileInfo *GpuInstanceProfileInfo + GpuInstancePlacement *GpuInstancePlacement + } + mock.lockCreateGpuInstanceWithPlacement.RLock() + calls = mock.calls.CreateGpuInstanceWithPlacement + mock.lockCreateGpuInstanceWithPlacement.RUnlock() + return calls +} + +// GetAttributes calls GetAttributesFunc. +func (mock *DeviceMock) GetAttributes() (DeviceAttributes, Return) { + if mock.GetAttributesFunc == nil { + panic("DeviceMock.GetAttributesFunc: method is nil but Device.GetAttributes was just called") + } + callInfo := struct { + }{} + mock.lockGetAttributes.Lock() + mock.calls.GetAttributes = append(mock.calls.GetAttributes, callInfo) + mock.lockGetAttributes.Unlock() + return mock.GetAttributesFunc() +} + +// GetAttributesCalls gets all the calls that were made to GetAttributes. +// Check the length with: +// +// len(mockedDevice.GetAttributesCalls()) +func (mock *DeviceMock) GetAttributesCalls() []struct { +} { + var calls []struct { + } + mock.lockGetAttributes.RLock() + calls = mock.calls.GetAttributes + mock.lockGetAttributes.RUnlock() + return calls +} + +// GetComputeInstanceId calls GetComputeInstanceIdFunc. +func (mock *DeviceMock) GetComputeInstanceId() (int, Return) { + if mock.GetComputeInstanceIdFunc == nil { + panic("DeviceMock.GetComputeInstanceIdFunc: method is nil but Device.GetComputeInstanceId was just called") + } + callInfo := struct { + }{} + mock.lockGetComputeInstanceId.Lock() + mock.calls.GetComputeInstanceId = append(mock.calls.GetComputeInstanceId, callInfo) + mock.lockGetComputeInstanceId.Unlock() + return mock.GetComputeInstanceIdFunc() +} + +// GetComputeInstanceIdCalls gets all the calls that were made to GetComputeInstanceId. +// Check the length with: +// +// len(mockedDevice.GetComputeInstanceIdCalls()) +func (mock *DeviceMock) GetComputeInstanceIdCalls() []struct { +} { + var calls []struct { + } + mock.lockGetComputeInstanceId.RLock() + calls = mock.calls.GetComputeInstanceId + mock.lockGetComputeInstanceId.RUnlock() + return calls +} + +// GetCudaComputeCapability calls GetCudaComputeCapabilityFunc. +func (mock *DeviceMock) GetCudaComputeCapability() (int, int, Return) { + if mock.GetCudaComputeCapabilityFunc == nil { + panic("DeviceMock.GetCudaComputeCapabilityFunc: method is nil but Device.GetCudaComputeCapability was just called") + } + callInfo := struct { + }{} + mock.lockGetCudaComputeCapability.Lock() + mock.calls.GetCudaComputeCapability = append(mock.calls.GetCudaComputeCapability, callInfo) + mock.lockGetCudaComputeCapability.Unlock() + return mock.GetCudaComputeCapabilityFunc() +} + +// GetCudaComputeCapabilityCalls gets all the calls that were made to GetCudaComputeCapability. +// Check the length with: +// +// len(mockedDevice.GetCudaComputeCapabilityCalls()) +func (mock *DeviceMock) GetCudaComputeCapabilityCalls() []struct { +} { + var calls []struct { + } + mock.lockGetCudaComputeCapability.RLock() + calls = mock.calls.GetCudaComputeCapability + mock.lockGetCudaComputeCapability.RUnlock() + return calls +} + +// GetDeviceHandleFromMigDeviceHandle calls GetDeviceHandleFromMigDeviceHandleFunc. +func (mock *DeviceMock) GetDeviceHandleFromMigDeviceHandle() (Device, Return) { + if mock.GetDeviceHandleFromMigDeviceHandleFunc == nil { + panic("DeviceMock.GetDeviceHandleFromMigDeviceHandleFunc: method is nil but Device.GetDeviceHandleFromMigDeviceHandle was just called") + } + callInfo := struct { + }{} + mock.lockGetDeviceHandleFromMigDeviceHandle.Lock() + mock.calls.GetDeviceHandleFromMigDeviceHandle = append(mock.calls.GetDeviceHandleFromMigDeviceHandle, callInfo) + mock.lockGetDeviceHandleFromMigDeviceHandle.Unlock() + return mock.GetDeviceHandleFromMigDeviceHandleFunc() +} + +// GetDeviceHandleFromMigDeviceHandleCalls gets all the calls that were made to GetDeviceHandleFromMigDeviceHandle. +// Check the length with: +// +// len(mockedDevice.GetDeviceHandleFromMigDeviceHandleCalls()) +func (mock *DeviceMock) GetDeviceHandleFromMigDeviceHandleCalls() []struct { +} { + var calls []struct { + } + mock.lockGetDeviceHandleFromMigDeviceHandle.RLock() + calls = mock.calls.GetDeviceHandleFromMigDeviceHandle + mock.lockGetDeviceHandleFromMigDeviceHandle.RUnlock() + return calls +} + +// GetGpuInstanceById calls GetGpuInstanceByIdFunc. +func (mock *DeviceMock) GetGpuInstanceById(ID int) (GpuInstance, Return) { + if mock.GetGpuInstanceByIdFunc == nil { + panic("DeviceMock.GetGpuInstanceByIdFunc: method is nil but Device.GetGpuInstanceById was just called") + } + callInfo := struct { + ID int + }{ + ID: ID, + } + mock.lockGetGpuInstanceById.Lock() + mock.calls.GetGpuInstanceById = append(mock.calls.GetGpuInstanceById, callInfo) + mock.lockGetGpuInstanceById.Unlock() + return mock.GetGpuInstanceByIdFunc(ID) +} + +// GetGpuInstanceByIdCalls gets all the calls that were made to GetGpuInstanceById. +// Check the length with: +// +// len(mockedDevice.GetGpuInstanceByIdCalls()) +func (mock *DeviceMock) GetGpuInstanceByIdCalls() []struct { + ID int +} { + var calls []struct { + ID int + } + mock.lockGetGpuInstanceById.RLock() + calls = mock.calls.GetGpuInstanceById + mock.lockGetGpuInstanceById.RUnlock() + return calls +} + +// GetGpuInstanceId calls GetGpuInstanceIdFunc. +func (mock *DeviceMock) GetGpuInstanceId() (int, Return) { + if mock.GetGpuInstanceIdFunc == nil { + panic("DeviceMock.GetGpuInstanceIdFunc: method is nil but Device.GetGpuInstanceId was just called") + } + callInfo := struct { + }{} + mock.lockGetGpuInstanceId.Lock() + mock.calls.GetGpuInstanceId = append(mock.calls.GetGpuInstanceId, callInfo) + mock.lockGetGpuInstanceId.Unlock() + return mock.GetGpuInstanceIdFunc() +} + +// GetGpuInstanceIdCalls gets all the calls that were made to GetGpuInstanceId. +// Check the length with: +// +// len(mockedDevice.GetGpuInstanceIdCalls()) +func (mock *DeviceMock) GetGpuInstanceIdCalls() []struct { +} { + var calls []struct { + } + mock.lockGetGpuInstanceId.RLock() + calls = mock.calls.GetGpuInstanceId + mock.lockGetGpuInstanceId.RUnlock() + return calls +} + +// GetGpuInstancePossiblePlacements calls GetGpuInstancePossiblePlacementsFunc. +func (mock *DeviceMock) GetGpuInstancePossiblePlacements(gpuInstanceProfileInfo *GpuInstanceProfileInfo) ([]GpuInstancePlacement, Return) { + if mock.GetGpuInstancePossiblePlacementsFunc == nil { + panic("DeviceMock.GetGpuInstancePossiblePlacementsFunc: method is nil but Device.GetGpuInstancePossiblePlacements was just called") + } + callInfo := struct { + GpuInstanceProfileInfo *GpuInstanceProfileInfo + }{ + GpuInstanceProfileInfo: gpuInstanceProfileInfo, + } + mock.lockGetGpuInstancePossiblePlacements.Lock() + mock.calls.GetGpuInstancePossiblePlacements = append(mock.calls.GetGpuInstancePossiblePlacements, callInfo) + mock.lockGetGpuInstancePossiblePlacements.Unlock() + return mock.GetGpuInstancePossiblePlacementsFunc(gpuInstanceProfileInfo) +} + +// GetGpuInstancePossiblePlacementsCalls gets all the calls that were made to GetGpuInstancePossiblePlacements. +// Check the length with: +// +// len(mockedDevice.GetGpuInstancePossiblePlacementsCalls()) +func (mock *DeviceMock) GetGpuInstancePossiblePlacementsCalls() []struct { + GpuInstanceProfileInfo *GpuInstanceProfileInfo +} { + var calls []struct { + GpuInstanceProfileInfo *GpuInstanceProfileInfo + } + mock.lockGetGpuInstancePossiblePlacements.RLock() + calls = mock.calls.GetGpuInstancePossiblePlacements + mock.lockGetGpuInstancePossiblePlacements.RUnlock() + return calls +} + +// GetGpuInstanceProfileInfo calls GetGpuInstanceProfileInfoFunc. +func (mock *DeviceMock) GetGpuInstanceProfileInfo(Profile int) (GpuInstanceProfileInfo, Return) { + if mock.GetGpuInstanceProfileInfoFunc == nil { + panic("DeviceMock.GetGpuInstanceProfileInfoFunc: method is nil but Device.GetGpuInstanceProfileInfo was just called") + } + callInfo := struct { + Profile int + }{ + Profile: Profile, + } + mock.lockGetGpuInstanceProfileInfo.Lock() + mock.calls.GetGpuInstanceProfileInfo = append(mock.calls.GetGpuInstanceProfileInfo, callInfo) + mock.lockGetGpuInstanceProfileInfo.Unlock() + return mock.GetGpuInstanceProfileInfoFunc(Profile) +} + +// GetGpuInstanceProfileInfoCalls gets all the calls that were made to GetGpuInstanceProfileInfo. +// Check the length with: +// +// len(mockedDevice.GetGpuInstanceProfileInfoCalls()) +func (mock *DeviceMock) GetGpuInstanceProfileInfoCalls() []struct { + Profile int +} { + var calls []struct { + Profile int + } + mock.lockGetGpuInstanceProfileInfo.RLock() + calls = mock.calls.GetGpuInstanceProfileInfo + mock.lockGetGpuInstanceProfileInfo.RUnlock() + return calls +} + +// GetGpuInstances calls GetGpuInstancesFunc. +func (mock *DeviceMock) GetGpuInstances(Info *GpuInstanceProfileInfo) ([]GpuInstance, Return) { + if mock.GetGpuInstancesFunc == nil { + panic("DeviceMock.GetGpuInstancesFunc: method is nil but Device.GetGpuInstances was just called") + } + callInfo := struct { + Info *GpuInstanceProfileInfo + }{ + Info: Info, + } + mock.lockGetGpuInstances.Lock() + mock.calls.GetGpuInstances = append(mock.calls.GetGpuInstances, callInfo) + mock.lockGetGpuInstances.Unlock() + return mock.GetGpuInstancesFunc(Info) +} + +// GetGpuInstancesCalls gets all the calls that were made to GetGpuInstances. +// Check the length with: +// +// len(mockedDevice.GetGpuInstancesCalls()) +func (mock *DeviceMock) GetGpuInstancesCalls() []struct { + Info *GpuInstanceProfileInfo +} { + var calls []struct { + Info *GpuInstanceProfileInfo + } + mock.lockGetGpuInstances.RLock() + calls = mock.calls.GetGpuInstances + mock.lockGetGpuInstances.RUnlock() + return calls +} + +// GetIndex calls GetIndexFunc. +func (mock *DeviceMock) GetIndex() (int, Return) { + if mock.GetIndexFunc == nil { + panic("DeviceMock.GetIndexFunc: method is nil but Device.GetIndex was just called") + } + callInfo := struct { + }{} + mock.lockGetIndex.Lock() + mock.calls.GetIndex = append(mock.calls.GetIndex, callInfo) + mock.lockGetIndex.Unlock() + return mock.GetIndexFunc() +} + +// GetIndexCalls gets all the calls that were made to GetIndex. +// Check the length with: +// +// len(mockedDevice.GetIndexCalls()) +func (mock *DeviceMock) GetIndexCalls() []struct { +} { + var calls []struct { + } + mock.lockGetIndex.RLock() + calls = mock.calls.GetIndex + mock.lockGetIndex.RUnlock() + return calls +} + +// GetMaxMigDeviceCount calls GetMaxMigDeviceCountFunc. +func (mock *DeviceMock) GetMaxMigDeviceCount() (int, Return) { + if mock.GetMaxMigDeviceCountFunc == nil { + panic("DeviceMock.GetMaxMigDeviceCountFunc: method is nil but Device.GetMaxMigDeviceCount was just called") + } + callInfo := struct { + }{} + mock.lockGetMaxMigDeviceCount.Lock() + mock.calls.GetMaxMigDeviceCount = append(mock.calls.GetMaxMigDeviceCount, callInfo) + mock.lockGetMaxMigDeviceCount.Unlock() + return mock.GetMaxMigDeviceCountFunc() +} + +// GetMaxMigDeviceCountCalls gets all the calls that were made to GetMaxMigDeviceCount. +// Check the length with: +// +// len(mockedDevice.GetMaxMigDeviceCountCalls()) +func (mock *DeviceMock) GetMaxMigDeviceCountCalls() []struct { +} { + var calls []struct { + } + mock.lockGetMaxMigDeviceCount.RLock() + calls = mock.calls.GetMaxMigDeviceCount + mock.lockGetMaxMigDeviceCount.RUnlock() + return calls +} + +// GetMemoryInfo calls GetMemoryInfoFunc. +func (mock *DeviceMock) GetMemoryInfo() (Memory, Return) { + if mock.GetMemoryInfoFunc == nil { + panic("DeviceMock.GetMemoryInfoFunc: method is nil but Device.GetMemoryInfo was just called") + } + callInfo := struct { + }{} + mock.lockGetMemoryInfo.Lock() + mock.calls.GetMemoryInfo = append(mock.calls.GetMemoryInfo, callInfo) + mock.lockGetMemoryInfo.Unlock() + return mock.GetMemoryInfoFunc() +} + +// GetMemoryInfoCalls gets all the calls that were made to GetMemoryInfo. +// Check the length with: +// +// len(mockedDevice.GetMemoryInfoCalls()) +func (mock *DeviceMock) GetMemoryInfoCalls() []struct { +} { + var calls []struct { + } + mock.lockGetMemoryInfo.RLock() + calls = mock.calls.GetMemoryInfo + mock.lockGetMemoryInfo.RUnlock() + return calls +} + +// GetMigDeviceHandleByIndex calls GetMigDeviceHandleByIndexFunc. +func (mock *DeviceMock) GetMigDeviceHandleByIndex(Index int) (Device, Return) { + if mock.GetMigDeviceHandleByIndexFunc == nil { + panic("DeviceMock.GetMigDeviceHandleByIndexFunc: method is nil but Device.GetMigDeviceHandleByIndex was just called") + } + callInfo := struct { + Index int + }{ + Index: Index, + } + mock.lockGetMigDeviceHandleByIndex.Lock() + mock.calls.GetMigDeviceHandleByIndex = append(mock.calls.GetMigDeviceHandleByIndex, callInfo) + mock.lockGetMigDeviceHandleByIndex.Unlock() + return mock.GetMigDeviceHandleByIndexFunc(Index) +} + +// GetMigDeviceHandleByIndexCalls gets all the calls that were made to GetMigDeviceHandleByIndex. +// Check the length with: +// +// len(mockedDevice.GetMigDeviceHandleByIndexCalls()) +func (mock *DeviceMock) GetMigDeviceHandleByIndexCalls() []struct { + Index int +} { + var calls []struct { + Index int + } + mock.lockGetMigDeviceHandleByIndex.RLock() + calls = mock.calls.GetMigDeviceHandleByIndex + mock.lockGetMigDeviceHandleByIndex.RUnlock() + return calls +} + +// GetMigMode calls GetMigModeFunc. +func (mock *DeviceMock) GetMigMode() (int, int, Return) { + if mock.GetMigModeFunc == nil { + panic("DeviceMock.GetMigModeFunc: method is nil but Device.GetMigMode was just called") + } + callInfo := struct { + }{} + mock.lockGetMigMode.Lock() + mock.calls.GetMigMode = append(mock.calls.GetMigMode, callInfo) + mock.lockGetMigMode.Unlock() + return mock.GetMigModeFunc() +} + +// GetMigModeCalls gets all the calls that were made to GetMigMode. +// Check the length with: +// +// len(mockedDevice.GetMigModeCalls()) +func (mock *DeviceMock) GetMigModeCalls() []struct { +} { + var calls []struct { + } + mock.lockGetMigMode.RLock() + calls = mock.calls.GetMigMode + mock.lockGetMigMode.RUnlock() + return calls +} + +// GetMinorNumber calls GetMinorNumberFunc. +func (mock *DeviceMock) GetMinorNumber() (int, Return) { + if mock.GetMinorNumberFunc == nil { + panic("DeviceMock.GetMinorNumberFunc: method is nil but Device.GetMinorNumber was just called") + } + callInfo := struct { + }{} + mock.lockGetMinorNumber.Lock() + mock.calls.GetMinorNumber = append(mock.calls.GetMinorNumber, callInfo) + mock.lockGetMinorNumber.Unlock() + return mock.GetMinorNumberFunc() +} + +// GetMinorNumberCalls gets all the calls that were made to GetMinorNumber. +// Check the length with: +// +// len(mockedDevice.GetMinorNumberCalls()) +func (mock *DeviceMock) GetMinorNumberCalls() []struct { +} { + var calls []struct { + } + mock.lockGetMinorNumber.RLock() + calls = mock.calls.GetMinorNumber + mock.lockGetMinorNumber.RUnlock() + return calls +} + +// GetName calls GetNameFunc. +func (mock *DeviceMock) GetName() (string, Return) { + if mock.GetNameFunc == nil { + panic("DeviceMock.GetNameFunc: method is nil but Device.GetName was just called") + } + callInfo := struct { + }{} + mock.lockGetName.Lock() + mock.calls.GetName = append(mock.calls.GetName, callInfo) + mock.lockGetName.Unlock() + return mock.GetNameFunc() +} + +// GetNameCalls gets all the calls that were made to GetName. +// Check the length with: +// +// len(mockedDevice.GetNameCalls()) +func (mock *DeviceMock) GetNameCalls() []struct { +} { + var calls []struct { + } + mock.lockGetName.RLock() + calls = mock.calls.GetName + mock.lockGetName.RUnlock() + return calls +} + +// GetPciInfo calls GetPciInfoFunc. +func (mock *DeviceMock) GetPciInfo() (PciInfo, Return) { + if mock.GetPciInfoFunc == nil { + panic("DeviceMock.GetPciInfoFunc: method is nil but Device.GetPciInfo was just called") + } + callInfo := struct { + }{} + mock.lockGetPciInfo.Lock() + mock.calls.GetPciInfo = append(mock.calls.GetPciInfo, callInfo) + mock.lockGetPciInfo.Unlock() + return mock.GetPciInfoFunc() +} + +// GetPciInfoCalls gets all the calls that were made to GetPciInfo. +// Check the length with: +// +// len(mockedDevice.GetPciInfoCalls()) +func (mock *DeviceMock) GetPciInfoCalls() []struct { +} { + var calls []struct { + } + mock.lockGetPciInfo.RLock() + calls = mock.calls.GetPciInfo + mock.lockGetPciInfo.RUnlock() + return calls +} + +// GetSupportedEventTypes calls GetSupportedEventTypesFunc. +func (mock *DeviceMock) GetSupportedEventTypes() (uint64, Return) { + if mock.GetSupportedEventTypesFunc == nil { + panic("DeviceMock.GetSupportedEventTypesFunc: method is nil but Device.GetSupportedEventTypes was just called") + } + callInfo := struct { + }{} + mock.lockGetSupportedEventTypes.Lock() + mock.calls.GetSupportedEventTypes = append(mock.calls.GetSupportedEventTypes, callInfo) + mock.lockGetSupportedEventTypes.Unlock() + return mock.GetSupportedEventTypesFunc() +} + +// GetSupportedEventTypesCalls gets all the calls that were made to GetSupportedEventTypes. +// Check the length with: +// +// len(mockedDevice.GetSupportedEventTypesCalls()) +func (mock *DeviceMock) GetSupportedEventTypesCalls() []struct { +} { + var calls []struct { + } + mock.lockGetSupportedEventTypes.RLock() + calls = mock.calls.GetSupportedEventTypes + mock.lockGetSupportedEventTypes.RUnlock() + return calls +} + +// GetUUID calls GetUUIDFunc. +func (mock *DeviceMock) GetUUID() (string, Return) { + if mock.GetUUIDFunc == nil { + panic("DeviceMock.GetUUIDFunc: method is nil but Device.GetUUID was just called") + } + callInfo := struct { + }{} + mock.lockGetUUID.Lock() + mock.calls.GetUUID = append(mock.calls.GetUUID, callInfo) + mock.lockGetUUID.Unlock() + return mock.GetUUIDFunc() +} + +// GetUUIDCalls gets all the calls that were made to GetUUID. +// Check the length with: +// +// len(mockedDevice.GetUUIDCalls()) +func (mock *DeviceMock) GetUUIDCalls() []struct { +} { + var calls []struct { + } + mock.lockGetUUID.RLock() + calls = mock.calls.GetUUID + mock.lockGetUUID.RUnlock() + return calls +} + +// IsMigDeviceHandle calls IsMigDeviceHandleFunc. +func (mock *DeviceMock) IsMigDeviceHandle() (bool, Return) { + if mock.IsMigDeviceHandleFunc == nil { + panic("DeviceMock.IsMigDeviceHandleFunc: method is nil but Device.IsMigDeviceHandle was just called") + } + callInfo := struct { + }{} + mock.lockIsMigDeviceHandle.Lock() + mock.calls.IsMigDeviceHandle = append(mock.calls.IsMigDeviceHandle, callInfo) + mock.lockIsMigDeviceHandle.Unlock() + return mock.IsMigDeviceHandleFunc() +} + +// IsMigDeviceHandleCalls gets all the calls that were made to IsMigDeviceHandle. +// Check the length with: +// +// len(mockedDevice.IsMigDeviceHandleCalls()) +func (mock *DeviceMock) IsMigDeviceHandleCalls() []struct { +} { + var calls []struct { + } + mock.lockIsMigDeviceHandle.RLock() + calls = mock.calls.IsMigDeviceHandle + mock.lockIsMigDeviceHandle.RUnlock() + return calls +} + +// RegisterEvents calls RegisterEventsFunc. +func (mock *DeviceMock) RegisterEvents(v uint64, eventSet EventSet) Return { + if mock.RegisterEventsFunc == nil { + panic("DeviceMock.RegisterEventsFunc: method is nil but Device.RegisterEvents was just called") + } + callInfo := struct { + V uint64 + EventSet EventSet + }{ + V: v, + EventSet: eventSet, + } + mock.lockRegisterEvents.Lock() + mock.calls.RegisterEvents = append(mock.calls.RegisterEvents, callInfo) + mock.lockRegisterEvents.Unlock() + return mock.RegisterEventsFunc(v, eventSet) +} + +// RegisterEventsCalls gets all the calls that were made to RegisterEvents. +// Check the length with: +// +// len(mockedDevice.RegisterEventsCalls()) +func (mock *DeviceMock) RegisterEventsCalls() []struct { + V uint64 + EventSet EventSet +} { + var calls []struct { + V uint64 + EventSet EventSet + } + mock.lockRegisterEvents.RLock() + calls = mock.calls.RegisterEvents + mock.lockRegisterEvents.RUnlock() + return calls +} + +// SetMigMode calls SetMigModeFunc. +func (mock *DeviceMock) SetMigMode(Mode int) (Return, Return) { + if mock.SetMigModeFunc == nil { + panic("DeviceMock.SetMigModeFunc: method is nil but Device.SetMigMode was just called") + } + callInfo := struct { + Mode int + }{ + Mode: Mode, + } + mock.lockSetMigMode.Lock() + mock.calls.SetMigMode = append(mock.calls.SetMigMode, callInfo) + mock.lockSetMigMode.Unlock() + return mock.SetMigModeFunc(Mode) +} + +// SetMigModeCalls gets all the calls that were made to SetMigMode. +// Check the length with: +// +// len(mockedDevice.SetMigModeCalls()) +func (mock *DeviceMock) SetMigModeCalls() []struct { + Mode int +} { + var calls []struct { + Mode int + } + mock.lockSetMigMode.RLock() + calls = mock.calls.SetMigMode + mock.lockSetMigMode.RUnlock() + return calls +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/event_set.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/event_set.go new file mode 100644 index 0000000..2e0b9e2 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/event_set.go @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022, 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 nvml + +import ( + "github.com/NVIDIA/go-nvml/pkg/nvml" +) + +// Wait watches for an event with the specified timeout +func (e EventSet) Wait(Timeoutms uint32) (EventData, Return) { + d, r := nvml.EventSet(e).Wait(Timeoutms) + eventData := EventData{ + Device: nvmlDevice(d.Device), + EventType: d.EventType, + EventData: d.EventData, + GpuInstanceId: d.GpuInstanceId, + ComputeInstanceId: d.ComputeInstanceId, + } + return eventData, Return(r) +} + +// Free deletes the event set +func (e EventSet) Free() Return { + return Return(nvml.EventSet(e).Free()) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/gi.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/gi.go new file mode 100644 index 0000000..bc4d373 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/gi.go @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2022, 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 nvml + +import ( + "github.com/NVIDIA/go-nvml/pkg/nvml" +) + +type nvmlGpuInstance nvml.GpuInstance + +var _ GpuInstance = (*nvmlGpuInstance)(nil) + +// GetInfo returns info about a GPU Intsance +func (gi nvmlGpuInstance) GetInfo() (GpuInstanceInfo, Return) { + i, r := nvml.GpuInstance(gi).GetInfo() + info := GpuInstanceInfo{ + Device: nvmlDevice(i.Device), + Id: i.Id, + ProfileId: i.ProfileId, + Placement: GpuInstancePlacement(i.Placement), + } + return info, Return(r) +} + +// GetComputeInstanceById returns the Compute Instance associated with a particular ID. +func (gi nvmlGpuInstance) GetComputeInstanceById(id int) (ComputeInstance, Return) { + ci, r := nvml.GpuInstance(gi).GetComputeInstanceById(id) + return nvmlComputeInstance(ci), Return(r) +} + +// GetComputeInstanceProfileInfo returns info about a given Compute Instance profile +func (gi nvmlGpuInstance) GetComputeInstanceProfileInfo(profile int, engProfile int) (ComputeInstanceProfileInfo, Return) { + p, r := nvml.GpuInstance(gi).GetComputeInstanceProfileInfo(profile, engProfile) + return ComputeInstanceProfileInfo(p), Return(r) +} + +// CreateComputeInstance creates a Compute Instance within the GPU Instance +func (gi nvmlGpuInstance) CreateComputeInstance(info *ComputeInstanceProfileInfo) (ComputeInstance, Return) { + ci, r := nvml.GpuInstance(gi).CreateComputeInstance((*nvml.ComputeInstanceProfileInfo)(info)) + return nvmlComputeInstance(ci), Return(r) +} + +// GetComputeInstances returns the set of Compute Instances associated with a GPU Instance +func (gi nvmlGpuInstance) GetComputeInstances(info *ComputeInstanceProfileInfo) ([]ComputeInstance, Return) { + nvmlCis, r := nvml.GpuInstance(gi).GetComputeInstances((*nvml.ComputeInstanceProfileInfo)(info)) + var cis []ComputeInstance + for _, ci := range nvmlCis { + cis = append(cis, nvmlComputeInstance(ci)) + } + return cis, Return(r) +} + +// Destroy destroys a GPU Instance +func (gi nvmlGpuInstance) Destroy() Return { + r := nvml.GpuInstance(gi).Destroy() + return Return(r) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/gi_mock.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/gi_mock.go new file mode 100644 index 0000000..ac26cb2 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/gi_mock.go @@ -0,0 +1,286 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package nvml + +import ( + "sync" +) + +// Ensure, that GpuInstanceMock does implement GpuInstance. +// If this is not the case, regenerate this file with moq. +var _ GpuInstance = &GpuInstanceMock{} + +// GpuInstanceMock is a mock implementation of GpuInstance. +// +// func TestSomethingThatUsesGpuInstance(t *testing.T) { +// +// // make and configure a mocked GpuInstance +// mockedGpuInstance := &GpuInstanceMock{ +// CreateComputeInstanceFunc: func(Info *ComputeInstanceProfileInfo) (ComputeInstance, Return) { +// panic("mock out the CreateComputeInstance method") +// }, +// DestroyFunc: func() Return { +// panic("mock out the Destroy method") +// }, +// GetComputeInstanceByIdFunc: func(ID int) (ComputeInstance, Return) { +// panic("mock out the GetComputeInstanceById method") +// }, +// GetComputeInstanceProfileInfoFunc: func(Profile int, EngProfile int) (ComputeInstanceProfileInfo, Return) { +// panic("mock out the GetComputeInstanceProfileInfo method") +// }, +// GetComputeInstancesFunc: func(Info *ComputeInstanceProfileInfo) ([]ComputeInstance, Return) { +// panic("mock out the GetComputeInstances method") +// }, +// GetInfoFunc: func() (GpuInstanceInfo, Return) { +// panic("mock out the GetInfo method") +// }, +// } +// +// // use mockedGpuInstance in code that requires GpuInstance +// // and then make assertions. +// +// } +type GpuInstanceMock struct { + // CreateComputeInstanceFunc mocks the CreateComputeInstance method. + CreateComputeInstanceFunc func(Info *ComputeInstanceProfileInfo) (ComputeInstance, Return) + + // DestroyFunc mocks the Destroy method. + DestroyFunc func() Return + + // GetComputeInstanceByIdFunc mocks the GetComputeInstanceById method. + GetComputeInstanceByIdFunc func(ID int) (ComputeInstance, Return) + + // GetComputeInstanceProfileInfoFunc mocks the GetComputeInstanceProfileInfo method. + GetComputeInstanceProfileInfoFunc func(Profile int, EngProfile int) (ComputeInstanceProfileInfo, Return) + + // GetComputeInstancesFunc mocks the GetComputeInstances method. + GetComputeInstancesFunc func(Info *ComputeInstanceProfileInfo) ([]ComputeInstance, Return) + + // GetInfoFunc mocks the GetInfo method. + GetInfoFunc func() (GpuInstanceInfo, Return) + + // calls tracks calls to the methods. + calls struct { + // CreateComputeInstance holds details about calls to the CreateComputeInstance method. + CreateComputeInstance []struct { + // Info is the Info argument value. + Info *ComputeInstanceProfileInfo + } + // Destroy holds details about calls to the Destroy method. + Destroy []struct { + } + // GetComputeInstanceById holds details about calls to the GetComputeInstanceById method. + GetComputeInstanceById []struct { + // ID is the ID argument value. + ID int + } + // GetComputeInstanceProfileInfo holds details about calls to the GetComputeInstanceProfileInfo method. + GetComputeInstanceProfileInfo []struct { + // Profile is the Profile argument value. + Profile int + // EngProfile is the EngProfile argument value. + EngProfile int + } + // GetComputeInstances holds details about calls to the GetComputeInstances method. + GetComputeInstances []struct { + // Info is the Info argument value. + Info *ComputeInstanceProfileInfo + } + // GetInfo holds details about calls to the GetInfo method. + GetInfo []struct { + } + } + lockCreateComputeInstance sync.RWMutex + lockDestroy sync.RWMutex + lockGetComputeInstanceById sync.RWMutex + lockGetComputeInstanceProfileInfo sync.RWMutex + lockGetComputeInstances sync.RWMutex + lockGetInfo sync.RWMutex +} + +// CreateComputeInstance calls CreateComputeInstanceFunc. +func (mock *GpuInstanceMock) CreateComputeInstance(Info *ComputeInstanceProfileInfo) (ComputeInstance, Return) { + if mock.CreateComputeInstanceFunc == nil { + panic("GpuInstanceMock.CreateComputeInstanceFunc: method is nil but GpuInstance.CreateComputeInstance was just called") + } + callInfo := struct { + Info *ComputeInstanceProfileInfo + }{ + Info: Info, + } + mock.lockCreateComputeInstance.Lock() + mock.calls.CreateComputeInstance = append(mock.calls.CreateComputeInstance, callInfo) + mock.lockCreateComputeInstance.Unlock() + return mock.CreateComputeInstanceFunc(Info) +} + +// CreateComputeInstanceCalls gets all the calls that were made to CreateComputeInstance. +// Check the length with: +// +// len(mockedGpuInstance.CreateComputeInstanceCalls()) +func (mock *GpuInstanceMock) CreateComputeInstanceCalls() []struct { + Info *ComputeInstanceProfileInfo +} { + var calls []struct { + Info *ComputeInstanceProfileInfo + } + mock.lockCreateComputeInstance.RLock() + calls = mock.calls.CreateComputeInstance + mock.lockCreateComputeInstance.RUnlock() + return calls +} + +// Destroy calls DestroyFunc. +func (mock *GpuInstanceMock) Destroy() Return { + if mock.DestroyFunc == nil { + panic("GpuInstanceMock.DestroyFunc: method is nil but GpuInstance.Destroy was just called") + } + callInfo := struct { + }{} + mock.lockDestroy.Lock() + mock.calls.Destroy = append(mock.calls.Destroy, callInfo) + mock.lockDestroy.Unlock() + return mock.DestroyFunc() +} + +// DestroyCalls gets all the calls that were made to Destroy. +// Check the length with: +// +// len(mockedGpuInstance.DestroyCalls()) +func (mock *GpuInstanceMock) DestroyCalls() []struct { +} { + var calls []struct { + } + mock.lockDestroy.RLock() + calls = mock.calls.Destroy + mock.lockDestroy.RUnlock() + return calls +} + +// GetComputeInstanceById calls GetComputeInstanceByIdFunc. +func (mock *GpuInstanceMock) GetComputeInstanceById(ID int) (ComputeInstance, Return) { + if mock.GetComputeInstanceByIdFunc == nil { + panic("GpuInstanceMock.GetComputeInstanceByIdFunc: method is nil but GpuInstance.GetComputeInstanceById was just called") + } + callInfo := struct { + ID int + }{ + ID: ID, + } + mock.lockGetComputeInstanceById.Lock() + mock.calls.GetComputeInstanceById = append(mock.calls.GetComputeInstanceById, callInfo) + mock.lockGetComputeInstanceById.Unlock() + return mock.GetComputeInstanceByIdFunc(ID) +} + +// GetComputeInstanceByIdCalls gets all the calls that were made to GetComputeInstanceById. +// Check the length with: +// +// len(mockedGpuInstance.GetComputeInstanceByIdCalls()) +func (mock *GpuInstanceMock) GetComputeInstanceByIdCalls() []struct { + ID int +} { + var calls []struct { + ID int + } + mock.lockGetComputeInstanceById.RLock() + calls = mock.calls.GetComputeInstanceById + mock.lockGetComputeInstanceById.RUnlock() + return calls +} + +// GetComputeInstanceProfileInfo calls GetComputeInstanceProfileInfoFunc. +func (mock *GpuInstanceMock) GetComputeInstanceProfileInfo(Profile int, EngProfile int) (ComputeInstanceProfileInfo, Return) { + if mock.GetComputeInstanceProfileInfoFunc == nil { + panic("GpuInstanceMock.GetComputeInstanceProfileInfoFunc: method is nil but GpuInstance.GetComputeInstanceProfileInfo was just called") + } + callInfo := struct { + Profile int + EngProfile int + }{ + Profile: Profile, + EngProfile: EngProfile, + } + mock.lockGetComputeInstanceProfileInfo.Lock() + mock.calls.GetComputeInstanceProfileInfo = append(mock.calls.GetComputeInstanceProfileInfo, callInfo) + mock.lockGetComputeInstanceProfileInfo.Unlock() + return mock.GetComputeInstanceProfileInfoFunc(Profile, EngProfile) +} + +// GetComputeInstanceProfileInfoCalls gets all the calls that were made to GetComputeInstanceProfileInfo. +// Check the length with: +// +// len(mockedGpuInstance.GetComputeInstanceProfileInfoCalls()) +func (mock *GpuInstanceMock) GetComputeInstanceProfileInfoCalls() []struct { + Profile int + EngProfile int +} { + var calls []struct { + Profile int + EngProfile int + } + mock.lockGetComputeInstanceProfileInfo.RLock() + calls = mock.calls.GetComputeInstanceProfileInfo + mock.lockGetComputeInstanceProfileInfo.RUnlock() + return calls +} + +// GetComputeInstances calls GetComputeInstancesFunc. +func (mock *GpuInstanceMock) GetComputeInstances(Info *ComputeInstanceProfileInfo) ([]ComputeInstance, Return) { + if mock.GetComputeInstancesFunc == nil { + panic("GpuInstanceMock.GetComputeInstancesFunc: method is nil but GpuInstance.GetComputeInstances was just called") + } + callInfo := struct { + Info *ComputeInstanceProfileInfo + }{ + Info: Info, + } + mock.lockGetComputeInstances.Lock() + mock.calls.GetComputeInstances = append(mock.calls.GetComputeInstances, callInfo) + mock.lockGetComputeInstances.Unlock() + return mock.GetComputeInstancesFunc(Info) +} + +// GetComputeInstancesCalls gets all the calls that were made to GetComputeInstances. +// Check the length with: +// +// len(mockedGpuInstance.GetComputeInstancesCalls()) +func (mock *GpuInstanceMock) GetComputeInstancesCalls() []struct { + Info *ComputeInstanceProfileInfo +} { + var calls []struct { + Info *ComputeInstanceProfileInfo + } + mock.lockGetComputeInstances.RLock() + calls = mock.calls.GetComputeInstances + mock.lockGetComputeInstances.RUnlock() + return calls +} + +// GetInfo calls GetInfoFunc. +func (mock *GpuInstanceMock) GetInfo() (GpuInstanceInfo, Return) { + if mock.GetInfoFunc == nil { + panic("GpuInstanceMock.GetInfoFunc: method is nil but GpuInstance.GetInfo was just called") + } + callInfo := struct { + }{} + mock.lockGetInfo.Lock() + mock.calls.GetInfo = append(mock.calls.GetInfo, callInfo) + mock.lockGetInfo.Unlock() + return mock.GetInfoFunc() +} + +// GetInfoCalls gets all the calls that were made to GetInfo. +// Check the length with: +// +// len(mockedGpuInstance.GetInfoCalls()) +func (mock *GpuInstanceMock) GetInfoCalls() []struct { +} { + var calls []struct { + } + mock.lockGetInfo.RLock() + calls = mock.calls.GetInfo + mock.lockGetInfo.RUnlock() + return calls +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/nvml.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/nvml.go new file mode 100644 index 0000000..4e3eaa6 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/nvml.go @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2022, 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 nvml + +import ( + "sync" + + "github.com/NVIDIA/go-nvml/pkg/nvml" +) + +type nvmlLib struct { + sync.Mutex + refcount int +} + +var _ Interface = (*nvmlLib)(nil) + +// New creates a new instance of the NVML Interface +func New() Interface { + return &nvmlLib{} +} + +// Init initializes an NVML Interface +func (n *nvmlLib) Init() Return { + ret := nvml.Init() + if ret != nvml.SUCCESS { + return Return(ret) + } + + n.Lock() + defer n.Unlock() + if n.refcount == 0 { + errorStringFunc = nvml.ErrorString + } + n.refcount++ + + return SUCCESS +} + +// Shutdown shuts down an NVML Interface +func (n *nvmlLib) Shutdown() Return { + ret := nvml.Shutdown() + if ret != nvml.SUCCESS { + return Return(ret) + } + + n.Lock() + defer n.Unlock() + n.refcount-- + if n.refcount == 0 { + errorStringFunc = defaultErrorStringFunc + } + + return SUCCESS +} + +// DeviceGetCount returns the total number of GPU Devices +func (n *nvmlLib) DeviceGetCount() (int, Return) { + c, r := nvml.DeviceGetCount() + return c, Return(r) +} + +// DeviceGetHandleByIndex returns a Device handle given its index +func (n *nvmlLib) DeviceGetHandleByIndex(index int) (Device, Return) { + d, r := nvml.DeviceGetHandleByIndex(index) + return nvmlDevice(d), Return(r) +} + +// DeviceGetHandleByUUID returns a Device handle given its UUID +func (n *nvmlLib) DeviceGetHandleByUUID(uuid string) (Device, Return) { + d, r := nvml.DeviceGetHandleByUUID(uuid) + return nvmlDevice(d), Return(r) +} + +// SystemGetDriverVersion returns the version of the installed NVIDIA driver +func (n *nvmlLib) SystemGetDriverVersion() (string, Return) { + v, r := nvml.SystemGetDriverVersion() + return v, Return(r) +} + +// SystemGetCudaDriverVersion returns the version of CUDA associated with the NVIDIA driver +func (n *nvmlLib) SystemGetCudaDriverVersion() (int, Return) { + v, r := nvml.SystemGetCudaDriverVersion() + return v, Return(r) +} + +// ErrorString returns the error string associated with a given return value +func (n *nvmlLib) ErrorString(ret Return) string { + return nvml.ErrorString(nvml.Return(ret)) +} + +// EventSetCreate creates an event set +func (n *nvmlLib) EventSetCreate() (EventSet, Return) { + e, r := nvml.EventSetCreate() + return EventSet(e), Return(r) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/nvml_mock.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/nvml_mock.go new file mode 100644 index 0000000..5243a1f --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/nvml_mock.go @@ -0,0 +1,384 @@ +// Code generated by moq; DO NOT EDIT. +// github.com/matryer/moq + +package nvml + +import ( + "sync" +) + +// Ensure, that InterfaceMock does implement Interface. +// If this is not the case, regenerate this file with moq. +var _ Interface = &InterfaceMock{} + +// InterfaceMock is a mock implementation of Interface. +// +// func TestSomethingThatUsesInterface(t *testing.T) { +// +// // make and configure a mocked Interface +// mockedInterface := &InterfaceMock{ +// DeviceGetCountFunc: func() (int, Return) { +// panic("mock out the DeviceGetCount method") +// }, +// DeviceGetHandleByIndexFunc: func(Index int) (Device, Return) { +// panic("mock out the DeviceGetHandleByIndex method") +// }, +// DeviceGetHandleByUUIDFunc: func(UUID string) (Device, Return) { +// panic("mock out the DeviceGetHandleByUUID method") +// }, +// ErrorStringFunc: func(r Return) string { +// panic("mock out the ErrorString method") +// }, +// EventSetCreateFunc: func() (EventSet, Return) { +// panic("mock out the EventSetCreate method") +// }, +// InitFunc: func() Return { +// panic("mock out the Init method") +// }, +// ShutdownFunc: func() Return { +// panic("mock out the Shutdown method") +// }, +// SystemGetCudaDriverVersionFunc: func() (int, Return) { +// panic("mock out the SystemGetCudaDriverVersion method") +// }, +// SystemGetDriverVersionFunc: func() (string, Return) { +// panic("mock out the SystemGetDriverVersion method") +// }, +// } +// +// // use mockedInterface in code that requires Interface +// // and then make assertions. +// +// } +type InterfaceMock struct { + // DeviceGetCountFunc mocks the DeviceGetCount method. + DeviceGetCountFunc func() (int, Return) + + // DeviceGetHandleByIndexFunc mocks the DeviceGetHandleByIndex method. + DeviceGetHandleByIndexFunc func(Index int) (Device, Return) + + // DeviceGetHandleByUUIDFunc mocks the DeviceGetHandleByUUID method. + DeviceGetHandleByUUIDFunc func(UUID string) (Device, Return) + + // ErrorStringFunc mocks the ErrorString method. + ErrorStringFunc func(r Return) string + + // EventSetCreateFunc mocks the EventSetCreate method. + EventSetCreateFunc func() (EventSet, Return) + + // InitFunc mocks the Init method. + InitFunc func() Return + + // ShutdownFunc mocks the Shutdown method. + ShutdownFunc func() Return + + // SystemGetCudaDriverVersionFunc mocks the SystemGetCudaDriverVersion method. + SystemGetCudaDriverVersionFunc func() (int, Return) + + // SystemGetDriverVersionFunc mocks the SystemGetDriverVersion method. + SystemGetDriverVersionFunc func() (string, Return) + + // calls tracks calls to the methods. + calls struct { + // DeviceGetCount holds details about calls to the DeviceGetCount method. + DeviceGetCount []struct { + } + // DeviceGetHandleByIndex holds details about calls to the DeviceGetHandleByIndex method. + DeviceGetHandleByIndex []struct { + // Index is the Index argument value. + Index int + } + // DeviceGetHandleByUUID holds details about calls to the DeviceGetHandleByUUID method. + DeviceGetHandleByUUID []struct { + // UUID is the UUID argument value. + UUID string + } + // ErrorString holds details about calls to the ErrorString method. + ErrorString []struct { + // R is the r argument value. + R Return + } + // EventSetCreate holds details about calls to the EventSetCreate method. + EventSetCreate []struct { + } + // Init holds details about calls to the Init method. + Init []struct { + } + // Shutdown holds details about calls to the Shutdown method. + Shutdown []struct { + } + // SystemGetCudaDriverVersion holds details about calls to the SystemGetCudaDriverVersion method. + SystemGetCudaDriverVersion []struct { + } + // SystemGetDriverVersion holds details about calls to the SystemGetDriverVersion method. + SystemGetDriverVersion []struct { + } + } + lockDeviceGetCount sync.RWMutex + lockDeviceGetHandleByIndex sync.RWMutex + lockDeviceGetHandleByUUID sync.RWMutex + lockErrorString sync.RWMutex + lockEventSetCreate sync.RWMutex + lockInit sync.RWMutex + lockShutdown sync.RWMutex + lockSystemGetCudaDriverVersion sync.RWMutex + lockSystemGetDriverVersion sync.RWMutex +} + +// DeviceGetCount calls DeviceGetCountFunc. +func (mock *InterfaceMock) DeviceGetCount() (int, Return) { + if mock.DeviceGetCountFunc == nil { + panic("InterfaceMock.DeviceGetCountFunc: method is nil but Interface.DeviceGetCount was just called") + } + callInfo := struct { + }{} + mock.lockDeviceGetCount.Lock() + mock.calls.DeviceGetCount = append(mock.calls.DeviceGetCount, callInfo) + mock.lockDeviceGetCount.Unlock() + return mock.DeviceGetCountFunc() +} + +// DeviceGetCountCalls gets all the calls that were made to DeviceGetCount. +// Check the length with: +// +// len(mockedInterface.DeviceGetCountCalls()) +func (mock *InterfaceMock) DeviceGetCountCalls() []struct { +} { + var calls []struct { + } + mock.lockDeviceGetCount.RLock() + calls = mock.calls.DeviceGetCount + mock.lockDeviceGetCount.RUnlock() + return calls +} + +// DeviceGetHandleByIndex calls DeviceGetHandleByIndexFunc. +func (mock *InterfaceMock) DeviceGetHandleByIndex(Index int) (Device, Return) { + if mock.DeviceGetHandleByIndexFunc == nil { + panic("InterfaceMock.DeviceGetHandleByIndexFunc: method is nil but Interface.DeviceGetHandleByIndex was just called") + } + callInfo := struct { + Index int + }{ + Index: Index, + } + mock.lockDeviceGetHandleByIndex.Lock() + mock.calls.DeviceGetHandleByIndex = append(mock.calls.DeviceGetHandleByIndex, callInfo) + mock.lockDeviceGetHandleByIndex.Unlock() + return mock.DeviceGetHandleByIndexFunc(Index) +} + +// DeviceGetHandleByIndexCalls gets all the calls that were made to DeviceGetHandleByIndex. +// Check the length with: +// +// len(mockedInterface.DeviceGetHandleByIndexCalls()) +func (mock *InterfaceMock) DeviceGetHandleByIndexCalls() []struct { + Index int +} { + var calls []struct { + Index int + } + mock.lockDeviceGetHandleByIndex.RLock() + calls = mock.calls.DeviceGetHandleByIndex + mock.lockDeviceGetHandleByIndex.RUnlock() + return calls +} + +// DeviceGetHandleByUUID calls DeviceGetHandleByUUIDFunc. +func (mock *InterfaceMock) DeviceGetHandleByUUID(UUID string) (Device, Return) { + if mock.DeviceGetHandleByUUIDFunc == nil { + panic("InterfaceMock.DeviceGetHandleByUUIDFunc: method is nil but Interface.DeviceGetHandleByUUID was just called") + } + callInfo := struct { + UUID string + }{ + UUID: UUID, + } + mock.lockDeviceGetHandleByUUID.Lock() + mock.calls.DeviceGetHandleByUUID = append(mock.calls.DeviceGetHandleByUUID, callInfo) + mock.lockDeviceGetHandleByUUID.Unlock() + return mock.DeviceGetHandleByUUIDFunc(UUID) +} + +// DeviceGetHandleByUUIDCalls gets all the calls that were made to DeviceGetHandleByUUID. +// Check the length with: +// +// len(mockedInterface.DeviceGetHandleByUUIDCalls()) +func (mock *InterfaceMock) DeviceGetHandleByUUIDCalls() []struct { + UUID string +} { + var calls []struct { + UUID string + } + mock.lockDeviceGetHandleByUUID.RLock() + calls = mock.calls.DeviceGetHandleByUUID + mock.lockDeviceGetHandleByUUID.RUnlock() + return calls +} + +// ErrorString calls ErrorStringFunc. +func (mock *InterfaceMock) ErrorString(r Return) string { + if mock.ErrorStringFunc == nil { + panic("InterfaceMock.ErrorStringFunc: method is nil but Interface.ErrorString was just called") + } + callInfo := struct { + R Return + }{ + R: r, + } + mock.lockErrorString.Lock() + mock.calls.ErrorString = append(mock.calls.ErrorString, callInfo) + mock.lockErrorString.Unlock() + return mock.ErrorStringFunc(r) +} + +// ErrorStringCalls gets all the calls that were made to ErrorString. +// Check the length with: +// +// len(mockedInterface.ErrorStringCalls()) +func (mock *InterfaceMock) ErrorStringCalls() []struct { + R Return +} { + var calls []struct { + R Return + } + mock.lockErrorString.RLock() + calls = mock.calls.ErrorString + mock.lockErrorString.RUnlock() + return calls +} + +// EventSetCreate calls EventSetCreateFunc. +func (mock *InterfaceMock) EventSetCreate() (EventSet, Return) { + if mock.EventSetCreateFunc == nil { + panic("InterfaceMock.EventSetCreateFunc: method is nil but Interface.EventSetCreate was just called") + } + callInfo := struct { + }{} + mock.lockEventSetCreate.Lock() + mock.calls.EventSetCreate = append(mock.calls.EventSetCreate, callInfo) + mock.lockEventSetCreate.Unlock() + return mock.EventSetCreateFunc() +} + +// EventSetCreateCalls gets all the calls that were made to EventSetCreate. +// Check the length with: +// +// len(mockedInterface.EventSetCreateCalls()) +func (mock *InterfaceMock) EventSetCreateCalls() []struct { +} { + var calls []struct { + } + mock.lockEventSetCreate.RLock() + calls = mock.calls.EventSetCreate + mock.lockEventSetCreate.RUnlock() + return calls +} + +// Init calls InitFunc. +func (mock *InterfaceMock) Init() Return { + if mock.InitFunc == nil { + panic("InterfaceMock.InitFunc: method is nil but Interface.Init was just called") + } + callInfo := struct { + }{} + mock.lockInit.Lock() + mock.calls.Init = append(mock.calls.Init, callInfo) + mock.lockInit.Unlock() + return mock.InitFunc() +} + +// InitCalls gets all the calls that were made to Init. +// Check the length with: +// +// len(mockedInterface.InitCalls()) +func (mock *InterfaceMock) InitCalls() []struct { +} { + var calls []struct { + } + mock.lockInit.RLock() + calls = mock.calls.Init + mock.lockInit.RUnlock() + return calls +} + +// Shutdown calls ShutdownFunc. +func (mock *InterfaceMock) Shutdown() Return { + if mock.ShutdownFunc == nil { + panic("InterfaceMock.ShutdownFunc: method is nil but Interface.Shutdown was just called") + } + callInfo := struct { + }{} + mock.lockShutdown.Lock() + mock.calls.Shutdown = append(mock.calls.Shutdown, callInfo) + mock.lockShutdown.Unlock() + return mock.ShutdownFunc() +} + +// ShutdownCalls gets all the calls that were made to Shutdown. +// Check the length with: +// +// len(mockedInterface.ShutdownCalls()) +func (mock *InterfaceMock) ShutdownCalls() []struct { +} { + var calls []struct { + } + mock.lockShutdown.RLock() + calls = mock.calls.Shutdown + mock.lockShutdown.RUnlock() + return calls +} + +// SystemGetCudaDriverVersion calls SystemGetCudaDriverVersionFunc. +func (mock *InterfaceMock) SystemGetCudaDriverVersion() (int, Return) { + if mock.SystemGetCudaDriverVersionFunc == nil { + panic("InterfaceMock.SystemGetCudaDriverVersionFunc: method is nil but Interface.SystemGetCudaDriverVersion was just called") + } + callInfo := struct { + }{} + mock.lockSystemGetCudaDriverVersion.Lock() + mock.calls.SystemGetCudaDriverVersion = append(mock.calls.SystemGetCudaDriverVersion, callInfo) + mock.lockSystemGetCudaDriverVersion.Unlock() + return mock.SystemGetCudaDriverVersionFunc() +} + +// SystemGetCudaDriverVersionCalls gets all the calls that were made to SystemGetCudaDriverVersion. +// Check the length with: +// +// len(mockedInterface.SystemGetCudaDriverVersionCalls()) +func (mock *InterfaceMock) SystemGetCudaDriverVersionCalls() []struct { +} { + var calls []struct { + } + mock.lockSystemGetCudaDriverVersion.RLock() + calls = mock.calls.SystemGetCudaDriverVersion + mock.lockSystemGetCudaDriverVersion.RUnlock() + return calls +} + +// SystemGetDriverVersion calls SystemGetDriverVersionFunc. +func (mock *InterfaceMock) SystemGetDriverVersion() (string, Return) { + if mock.SystemGetDriverVersionFunc == nil { + panic("InterfaceMock.SystemGetDriverVersionFunc: method is nil but Interface.SystemGetDriverVersion was just called") + } + callInfo := struct { + }{} + mock.lockSystemGetDriverVersion.Lock() + mock.calls.SystemGetDriverVersion = append(mock.calls.SystemGetDriverVersion, callInfo) + mock.lockSystemGetDriverVersion.Unlock() + return mock.SystemGetDriverVersionFunc() +} + +// SystemGetDriverVersionCalls gets all the calls that were made to SystemGetDriverVersion. +// Check the length with: +// +// len(mockedInterface.SystemGetDriverVersionCalls()) +func (mock *InterfaceMock) SystemGetDriverVersionCalls() []struct { +} { + var calls []struct { + } + mock.lockSystemGetDriverVersion.RLock() + calls = mock.calls.SystemGetDriverVersion + mock.lockSystemGetDriverVersion.RUnlock() + return calls +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/return.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/return.go new file mode 100644 index 0000000..64cc1e1 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/return.go @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2022, 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 nvml + +import ( + "fmt" + + "github.com/NVIDIA/go-nvml/pkg/nvml" +) + +// String returns the string representation of a Return +func (r Return) String() string { + return errorStringFunc(nvml.Return(r)) +} + +// Error returns the string representation of a Return +func (r Return) Error() string { + return errorStringFunc(nvml.Return(r)) +} + +// Assigned to nvml.ErrorString if the system nvml library is in use +var errorStringFunc = defaultErrorStringFunc + +var defaultErrorStringFunc = func(r nvml.Return) string { + switch Return(r) { + case SUCCESS: + return "SUCCESS" + case ERROR_UNINITIALIZED: + return "ERROR_UNINITIALIZED" + case ERROR_INVALID_ARGUMENT: + return "ERROR_INVALID_ARGUMENT" + case ERROR_NOT_SUPPORTED: + return "ERROR_NOT_SUPPORTED" + case ERROR_NO_PERMISSION: + return "ERROR_NO_PERMISSION" + case ERROR_ALREADY_INITIALIZED: + return "ERROR_ALREADY_INITIALIZED" + case ERROR_NOT_FOUND: + return "ERROR_NOT_FOUND" + case ERROR_INSUFFICIENT_SIZE: + return "ERROR_INSUFFICIENT_SIZE" + case ERROR_INSUFFICIENT_POWER: + return "ERROR_INSUFFICIENT_POWER" + case ERROR_DRIVER_NOT_LOADED: + return "ERROR_DRIVER_NOT_LOADED" + case ERROR_TIMEOUT: + return "ERROR_TIMEOUT" + case ERROR_IRQ_ISSUE: + return "ERROR_IRQ_ISSUE" + case ERROR_LIBRARY_NOT_FOUND: + return "ERROR_LIBRARY_NOT_FOUND" + case ERROR_FUNCTION_NOT_FOUND: + return "ERROR_FUNCTION_NOT_FOUND" + case ERROR_CORRUPTED_INFOROM: + return "ERROR_CORRUPTED_INFOROM" + case ERROR_GPU_IS_LOST: + return "ERROR_GPU_IS_LOST" + case ERROR_RESET_REQUIRED: + return "ERROR_RESET_REQUIRED" + case ERROR_OPERATING_SYSTEM: + return "ERROR_OPERATING_SYSTEM" + case ERROR_LIB_RM_VERSION_MISMATCH: + return "ERROR_LIB_RM_VERSION_MISMATCH" + case ERROR_IN_USE: + return "ERROR_IN_USE" + case ERROR_MEMORY: + return "ERROR_MEMORY" + case ERROR_NO_DATA: + return "ERROR_NO_DATA" + case ERROR_VGPU_ECC_NOT_SUPPORTED: + return "ERROR_VGPU_ECC_NOT_SUPPORTED" + case ERROR_INSUFFICIENT_RESOURCES: + return "ERROR_INSUFFICIENT_RESOURCES" + case ERROR_UNKNOWN: + return "ERROR_UNKNOWN" + default: + return fmt.Sprintf("Unknown return value: %d", r) + } +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/types.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/types.go new file mode 100644 index 0000000..b1c97c0 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml/types.go @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2022, 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 nvml + +import ( + "github.com/NVIDIA/go-nvml/pkg/nvml" +) + +// Interface defines the functions implemented by an NVML library +// +//go:generate moq -out nvml_mock.go . Interface +type Interface interface { + DeviceGetCount() (int, Return) + DeviceGetHandleByIndex(Index int) (Device, Return) + DeviceGetHandleByUUID(UUID string) (Device, Return) + ErrorString(r Return) string + EventSetCreate() (EventSet, Return) + Init() Return + Shutdown() Return + SystemGetCudaDriverVersion() (int, Return) + SystemGetDriverVersion() (string, Return) +} + +// Device defines the functions implemented by an NVML device +// +//go:generate moq -out device_mock.go . Device +type Device interface { + CreateGpuInstanceWithPlacement(*GpuInstanceProfileInfo, *GpuInstancePlacement) (GpuInstance, Return) + GetAttributes() (DeviceAttributes, Return) + GetComputeInstanceId() (int, Return) + GetCudaComputeCapability() (int, int, Return) + GetDeviceHandleFromMigDeviceHandle() (Device, Return) + GetGpuInstanceById(ID int) (GpuInstance, Return) + GetGpuInstanceId() (int, Return) + GetGpuInstancePossiblePlacements(*GpuInstanceProfileInfo) ([]GpuInstancePlacement, Return) + GetGpuInstanceProfileInfo(Profile int) (GpuInstanceProfileInfo, Return) + GetGpuInstances(Info *GpuInstanceProfileInfo) ([]GpuInstance, Return) + GetIndex() (int, Return) + GetMaxMigDeviceCount() (int, Return) + GetMemoryInfo() (Memory, Return) + GetMigDeviceHandleByIndex(Index int) (Device, Return) + GetMigMode() (int, int, Return) + GetMinorNumber() (int, Return) + GetName() (string, Return) + GetPciInfo() (PciInfo, Return) + GetSupportedEventTypes() (uint64, Return) + GetUUID() (string, Return) + IsMigDeviceHandle() (bool, Return) + RegisterEvents(uint64, EventSet) Return + SetMigMode(Mode int) (Return, Return) +} + +// GpuInstance defines the functions implemented by a GpuInstance +// +//go:generate moq -out gi_mock.go . GpuInstance +type GpuInstance interface { + CreateComputeInstance(Info *ComputeInstanceProfileInfo) (ComputeInstance, Return) + Destroy() Return + GetComputeInstanceById(ID int) (ComputeInstance, Return) + GetComputeInstanceProfileInfo(Profile int, EngProfile int) (ComputeInstanceProfileInfo, Return) + GetComputeInstances(Info *ComputeInstanceProfileInfo) ([]ComputeInstance, Return) + GetInfo() (GpuInstanceInfo, Return) +} + +// ComputeInstance defines the functions implemented by a ComputeInstance +// +//go:generate moq -out ci_mock.go . ComputeInstance +type ComputeInstance interface { + Destroy() Return + GetInfo() (ComputeInstanceInfo, Return) +} + +// GpuInstanceInfo holds info about a GPU Instance +type GpuInstanceInfo struct { + Device Device + Id uint32 + ProfileId uint32 + Placement GpuInstancePlacement +} + +// ComputeInstanceInfo holds info about a Compute Instance +type ComputeInstanceInfo struct { + Device Device + GpuInstance GpuInstance + Id uint32 + ProfileId uint32 + Placement ComputeInstancePlacement +} + +// EventData defines NVML event Data +type EventData struct { + Device Device + EventType uint64 + EventData uint64 + GpuInstanceId uint32 + ComputeInstanceId uint32 +} + +// EventSet defines NVML event Data +type EventSet nvml.EventSet + +// Return defines an NVML return type +type Return nvml.Return + +// Memory holds info about GPU device memory +type Memory nvml.Memory + +// PciInfo holds info about the PCI connections of a GPU dvice +type PciInfo nvml.PciInfo + +// GpuInstanceProfileInfo holds info about a GPU Instance Profile +type GpuInstanceProfileInfo nvml.GpuInstanceProfileInfo + +// GpuInstancePlacement holds placement info about a GPU Instance +type GpuInstancePlacement nvml.GpuInstancePlacement + +// ComputeInstanceProfileInfo holds info about a Compute Instance Profile +type ComputeInstanceProfileInfo nvml.ComputeInstanceProfileInfo + +// ComputeInstancePlacement holds placement info about a Compute Instance +type ComputeInstancePlacement nvml.ComputeInstancePlacement + +// DeviceAttributes stores information about MIG devices +type DeviceAttributes nvml.DeviceAttributes diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/bytes.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/bytes.go new file mode 100644 index 0000000..7788a1f --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/bytes.go @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2021, 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 bytes + +import ( + "encoding/binary" + "unsafe" +) + +// Raw returns just the bytes without any assumptions about layout +type Raw interface { + Raw() *[]byte +} + +// Reader used to read various data sizes in the byte array +type Reader interface { + Read8(pos int) uint8 + Read16(pos int) uint16 + Read32(pos int) uint32 + Read64(pos int) uint64 + Len() int +} + +// Writer used to write various sizes of data in the byte array +type Writer interface { + Write8(pos int, value uint8) + Write16(pos int, value uint16) + Write32(pos int, value uint32) + Write64(pos int, value uint64) + Len() int +} + +// Bytes object for manipulating arbitrary byte arrays +type Bytes interface { + Raw + Reader + Writer + Slice(offset int, size int) Bytes + LittleEndian() Bytes + BigEndian() Bytes +} + +var nativeByteOrder binary.ByteOrder + +func init() { + buf := [2]byte{} + *(*uint16)(unsafe.Pointer(&buf[0])) = uint16(0x00FF) + + switch buf { + case [2]byte{0xFF, 0x00}: + nativeByteOrder = binary.LittleEndian + case [2]byte{0x00, 0xFF}: + nativeByteOrder = binary.BigEndian + default: + panic("Unable to infer byte order") + } +} + +// New raw bytearray +func New(data *[]byte) Bytes { + return (*native)(data) +} + +// NewLittleEndian little endian ordering of bytes +func NewLittleEndian(data *[]byte) Bytes { + if nativeByteOrder == binary.LittleEndian { + return (*native)(data) + } + + return (*swapbo)(data) +} + +// NewBigEndian big endian ordering of bytes +func NewBigEndian(data *[]byte) Bytes { + if nativeByteOrder == binary.BigEndian { + return (*native)(data) + } + + return (*swapbo)(data) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/native.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/native.go new file mode 100644 index 0000000..3c79e68 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/native.go @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021, 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 bytes + +import ( + "unsafe" +) + +type native []byte + +var _ Bytes = (*native)(nil) + +func (b *native) Read8(pos int) uint8 { + return (*b)[pos] +} + +func (b *native) Read16(pos int) uint16 { + return *(*uint16)(unsafe.Pointer(&((*b)[pos]))) +} + +func (b *native) Read32(pos int) uint32 { + return *(*uint32)(unsafe.Pointer(&((*b)[pos]))) +} + +func (b *native) Read64(pos int) uint64 { + return *(*uint64)(unsafe.Pointer(&((*b)[pos]))) +} + +func (b *native) Write8(pos int, value uint8) { + (*b)[pos] = value +} + +func (b *native) Write16(pos int, value uint16) { + *(*uint16)(unsafe.Pointer(&((*b)[pos]))) = value +} + +func (b *native) Write32(pos int, value uint32) { + *(*uint32)(unsafe.Pointer(&((*b)[pos]))) = value +} + +func (b *native) Write64(pos int, value uint64) { + *(*uint64)(unsafe.Pointer(&((*b)[pos]))) = value +} + +func (b *native) Slice(offset int, size int) Bytes { + nb := (*b)[offset : offset+size] + return &nb +} + +func (b *native) LittleEndian() Bytes { + return NewLittleEndian((*[]byte)(b)) +} + +func (b *native) BigEndian() Bytes { + return NewBigEndian((*[]byte)(b)) +} + +func (b *native) Raw() *[]byte { + return (*[]byte)(b) +} + +func (b *native) Len() int { + return len(*b) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/swapbo.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/swapbo.go new file mode 100644 index 0000000..278c67d --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes/swapbo.go @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2021, 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 bytes + +import ( + "unsafe" +) + +type swapbo []byte + +var _ Bytes = (*swapbo)(nil) + +func (b *swapbo) Read8(pos int) uint8 { + return (*b)[pos] +} + +func (b *swapbo) Read16(pos int) uint16 { + buf := [2]byte{} + buf[0] = (*b)[pos+1] + buf[1] = (*b)[pos+0] + return *(*uint16)(unsafe.Pointer(&buf[0])) +} + +func (b *swapbo) Read32(pos int) uint32 { + buf := [4]byte{} + buf[0] = (*b)[pos+3] + buf[1] = (*b)[pos+2] + buf[2] = (*b)[pos+1] + buf[3] = (*b)[pos+0] + return *(*uint32)(unsafe.Pointer(&buf[0])) +} + +func (b *swapbo) Read64(pos int) uint64 { + buf := [8]byte{} + buf[0] = (*b)[pos+7] + buf[1] = (*b)[pos+6] + buf[2] = (*b)[pos+5] + buf[3] = (*b)[pos+4] + buf[4] = (*b)[pos+3] + buf[5] = (*b)[pos+2] + buf[6] = (*b)[pos+1] + buf[7] = (*b)[pos+0] + return *(*uint64)(unsafe.Pointer(&buf[0])) +} + +func (b *swapbo) Write8(pos int, value uint8) { + (*b)[pos] = value +} + +func (b *swapbo) Write16(pos int, value uint16) { + buf := [2]byte{} + *(*uint16)(unsafe.Pointer(&buf[0])) = value + (*b)[pos+0] = buf[1] + (*b)[pos+1] = buf[0] +} + +func (b *swapbo) Write32(pos int, value uint32) { + buf := [4]byte{} + *(*uint32)(unsafe.Pointer(&buf[0])) = value + (*b)[pos+0] = buf[3] + (*b)[pos+1] = buf[2] + (*b)[pos+2] = buf[1] + (*b)[pos+3] = buf[0] +} + +func (b *swapbo) Write64(pos int, value uint64) { + buf := [8]byte{} + *(*uint64)(unsafe.Pointer(&buf[0])) = value + (*b)[pos+0] = buf[7] + (*b)[pos+1] = buf[6] + (*b)[pos+2] = buf[5] + (*b)[pos+3] = buf[4] + (*b)[pos+4] = buf[3] + (*b)[pos+5] = buf[2] + (*b)[pos+6] = buf[1] + (*b)[pos+7] = buf[0] +} + +func (b *swapbo) Slice(offset int, size int) Bytes { + nb := (*b)[offset : offset+size] + return &nb +} + +func (b *swapbo) LittleEndian() Bytes { + return NewLittleEndian((*[]byte)(b)) +} + +func (b *swapbo) BigEndian() Bytes { + return NewBigEndian((*[]byte)(b)) +} + +func (b *swapbo) Raw() *[]byte { + return (*[]byte)(b) +} + +func (b *swapbo) Len() int { + return len(*b) +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/config.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/config.go new file mode 100644 index 0000000..0971df4 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/config.go @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2021, 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" + "os" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes" +) + +const ( + // PCICfgSpaceStandardSize represents the size in bytes of the standard config space + PCICfgSpaceStandardSize = 256 + // PCICfgSpaceExtendedSize represents the size in bytes of the extended config space + PCICfgSpaceExtendedSize = 4096 + // PCICapabilityListPointer represents offset for the capability list pointer + PCICapabilityListPointer = 0x34 + // PCIStatusCapabilityList represents the status register bit which indicates capability list support + PCIStatusCapabilityList = 0x10 + // PCIStatusBytePosition represents the position of the status register + PCIStatusBytePosition = 0x06 +) + +// ConfigSpace PCI configuration space (standard extended) file path +type ConfigSpace struct { + Path string +} + +// ConfigSpaceIO Interface for reading and writing raw and preconfigured values +type ConfigSpaceIO interface { + bytes.Bytes + GetVendorID() uint16 + GetDeviceID() uint16 + GetPCICapabilities() (*PCICapabilities, error) +} + +type configSpaceIO struct { + bytes.Bytes +} + +// PCIStandardCapability standard PCI config space +type PCIStandardCapability struct { + bytes.Bytes +} + +// PCIExtendedCapability extended PCI config space +type PCIExtendedCapability struct { + bytes.Bytes + Version uint8 +} + +// PCICapabilities combines the standard and extended config space +type PCICapabilities struct { + Standard map[uint8]*PCIStandardCapability + Extended map[uint16]*PCIExtendedCapability +} + +func (cs *ConfigSpace) Read() (ConfigSpaceIO, error) { + config, err := os.ReadFile(cs.Path) + if err != nil { + return nil, fmt.Errorf("failed to open file: %v", err) + } + return &configSpaceIO{bytes.New(&config)}, nil +} + +func (cs *configSpaceIO) GetVendorID() uint16 { + return cs.Read16(0) +} + +func (cs *configSpaceIO) GetDeviceID() uint16 { + return cs.Read16(2) +} + +func (cs *configSpaceIO) GetPCICapabilities() (*PCICapabilities, error) { + caps := &PCICapabilities{ + make(map[uint8]*PCIStandardCapability), + make(map[uint16]*PCIExtendedCapability), + } + + support := cs.Read8(PCIStatusBytePosition) & PCIStatusCapabilityList + if support == 0 { + return nil, fmt.Errorf("pci device does not support capability list") + } + + soffset := cs.Read8(PCICapabilityListPointer) + if int(soffset) >= cs.Len() { + return nil, fmt.Errorf("capability list pointer out of bounds") + } + + for soffset != 0 { + if soffset == 0xff { + return nil, fmt.Errorf("config space broken") + } + if int(soffset) >= PCICfgSpaceStandardSize { + return nil, fmt.Errorf("standard capability list pointer out of bounds") + } + data := cs.Read32(int(soffset)) + id := uint8(data & 0xff) + caps.Standard[id] = &PCIStandardCapability{ + cs.Slice(int(soffset), cs.Len()-int(soffset)), + } + soffset = uint8((data >> 8) & 0xff) + } + + if cs.Len() <= PCICfgSpaceStandardSize { + return caps, nil + } + + eoffset := uint16(PCICfgSpaceStandardSize) + for eoffset != 0 { + if eoffset == 0xffff { + return nil, fmt.Errorf("config space broken") + } + if int(eoffset) >= PCICfgSpaceExtendedSize { + return nil, fmt.Errorf("extended capability list pointer out of bounds") + } + + // |31 20|19 16|15 0| + // |--------------------|------|-------------------------| + // | Next Cap Offset |Vers. |PCI Express Ext. Cap ID | + data := cs.Read32(int(eoffset)) + id := uint16(data & 0xffff) + version := uint8((data >> 16) & 0xf) + caps.Extended[id] = &PCIExtendedCapability{ + cs.Slice(int(eoffset), cs.Len()-int(eoffset)), + version, + } + eoffset = uint16((data >> 20) & 0xfff) + } + + return caps, nil +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mlxpci.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mlxpci.go new file mode 100644 index 0000000..62937d7 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mlxpci.go @@ -0,0 +1,105 @@ +/* + * 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 +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio/mmio.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio/mmio.go new file mode 100644 index 0000000..602486e --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio/mmio.go @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2021, 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 mmio + +import ( + "fmt" + "os" + "syscall" + "unsafe" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes" +) + +// Mmio memory map a region +type Mmio interface { + bytes.Raw + bytes.Reader + bytes.Writer + Sync() error + Close() error + Slice(offset int, size int) Mmio + LittleEndian() Mmio + BigEndian() Mmio +} + +type mmio struct { + bytes.Bytes +} + +func open(path string, offset int, size int, flags int) (Mmio, error) { + var mmapFlags int + switch flags { + case os.O_RDONLY: + mmapFlags = syscall.PROT_READ + case os.O_RDWR: + mmapFlags = syscall.PROT_READ | syscall.PROT_WRITE + default: + return nil, fmt.Errorf("invalid flags: %v", flags) + } + + file, err := os.OpenFile(path, flags, 0) + if err != nil { + return nil, fmt.Errorf("failed to open file: %v", err) + } + defer file.Close() + + fi, err := file.Stat() + if err != nil { + return nil, fmt.Errorf("failed to get file info: %v", err) + } + + if size > int(fi.Size()) { + return nil, fmt.Errorf("requested size larger than file size") + } + + if size < 0 { + size = int(fi.Size()) + } + + mmap, err := syscall.Mmap( + int(file.Fd()), + int64(offset), + size, + mmapFlags, + syscall.MAP_SHARED) + if err != nil { + return nil, fmt.Errorf("failed to mmap file: %v", err) + } + + return &mmio{bytes.New(&mmap)}, nil +} + +// OpenRO open region readonly +func OpenRO(path string, offset int, size int) (Mmio, error) { + return open(path, offset, size, os.O_RDONLY) +} + +// OpenRW open region read write +func OpenRW(path string, offset int, size int) (Mmio, error) { + return open(path, offset, size, os.O_RDWR) +} + +func (m *mmio) Slice(offset int, size int) Mmio { + return &mmio{m.Bytes.Slice(offset, size)} +} + +func (m *mmio) LittleEndian() Mmio { + return &mmio{m.Bytes.LittleEndian()} +} + +func (m *mmio) BigEndian() Mmio { + return &mmio{m.Bytes.BigEndian()} +} + +func (m *mmio) Close() error { + err := syscall.Munmap(*m.Bytes.Raw()) + if err != nil { + return fmt.Errorf("failed to munmap file: %v", err) + } + return nil +} + +func (m *mmio) Sync() error { + _, _, errno := syscall.Syscall( + syscall.SYS_MSYNC, + uintptr(unsafe.Pointer(&(*m.Bytes.Raw())[0])), + uintptr(m.Len()), + uintptr(syscall.MS_SYNC|syscall.MS_INVALIDATE)) + if errno != 0 { + return fmt.Errorf("failed to msync file: %v", errno) + } + return nil +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio/mock.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio/mock.go new file mode 100644 index 0000000..42a86b1 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio/mock.go @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021, 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 mmio + +import ( + "fmt" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes" +) + +type mockMmio struct { + mmio + source *[]byte + offset int + rw bool +} + +func mockOpen(source *[]byte, offset int, size int, rw bool) (Mmio, error) { + if size < 0 { + size = len(*source) - offset + } + if (offset + size) > len(*source) { + return nil, fmt.Errorf("offset+size out of range") + } + + data := append([]byte{}, (*source)[offset:offset+size]...) + + m := &mockMmio{} + m.Bytes = bytes.New(&data).LittleEndian() + m.source = source + m.offset = offset + m.rw = rw + + return m, nil +} + +// MockOpenRO open read only +func MockOpenRO(source *[]byte, offset int, size int) (Mmio, error) { + return mockOpen(source, offset, size, false) +} + +// MockOpenRW open read write +func MockOpenRW(source *[]byte, offset int, size int) (Mmio, error) { + return mockOpen(source, offset, size, true) +} + +func (m *mockMmio) Close() error { + m = &mockMmio{} + return nil +} + +func (m *mockMmio) Sync() error { + if !m.rw { + return fmt.Errorf("opened read-only") + } + for i := range *m.Bytes.Raw() { + (*m.source)[m.offset+i] = (*m.Bytes.Raw())[i] + } + return nil +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mock.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mock.go new file mode 100644 index 0000000..0f3df3a --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mock.go @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2021, 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" + "os" + "path/filepath" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes" +) + +// MockNvpci mock pci device +type MockNvpci struct { + *nvpci +} + +var _ Interface = (*MockNvpci)(nil) + +// NewMockNvpci create new mock PCI and remove old devices +func NewMockNvpci() (mock *MockNvpci, rerr error) { + rootDir, err := os.MkdirTemp(os.TempDir(), "") + if err != nil { + return nil, err + } + defer func() { + if rerr != nil { + os.RemoveAll(rootDir) + } + }() + + mock = &MockNvpci{ + NewFrom(rootDir).(*nvpci), + } + + return mock, nil +} + +// Cleanup remove the mocked PCI devices root folder +func (m *MockNvpci) Cleanup() { + os.RemoveAll(m.pciDevicesRoot) +} + +// AddMockA100 Create an A100 like GPU mock device +func (m *MockNvpci) AddMockA100(address string, numaNode int) error { + deviceDir := filepath.Join(m.pciDevicesRoot, address) + err := os.MkdirAll(deviceDir, 0755) + if err != nil { + return err + } + + vendor, err := os.Create(filepath.Join(deviceDir, "vendor")) + if err != nil { + return err + } + _, err = vendor.WriteString(fmt.Sprintf("0x%x", PCINvidiaVendorID)) + if err != nil { + return err + } + + class, err := os.Create(filepath.Join(deviceDir, "class")) + if err != nil { + return err + } + _, err = class.WriteString(fmt.Sprintf("0x%x", PCI3dControllerClass)) + if err != nil { + return err + } + + device, err := os.Create(filepath.Join(deviceDir, "device")) + if err != nil { + return err + } + _, err = device.WriteString("0x20bf") + if err != nil { + return err + } + + _, err = os.Create(filepath.Join(deviceDir, "nvidia")) + if err != nil { + return err + } + err = os.Symlink(filepath.Join(deviceDir, "nvidia"), filepath.Join(deviceDir, "driver")) + if err != nil { + return err + } + + _, err = os.Create(filepath.Join(deviceDir, "20")) + if err != nil { + return err + } + err = os.Symlink(filepath.Join(deviceDir, "20"), filepath.Join(deviceDir, "iommu_group")) + if err != nil { + return err + } + + numa, err := os.Create(filepath.Join(deviceDir, "numa_node")) + if err != nil { + return err + } + _, err = numa.WriteString(fmt.Sprintf("%v", numaNode)) + if err != nil { + return err + } + + config, err := os.Create(filepath.Join(deviceDir, "config")) + if err != nil { + return err + } + _data := make([]byte, PCICfgSpaceStandardSize) + data := bytes.New(&_data) + data.Write16(0, PCINvidiaVendorID) + data.Write16(2, uint16(0x20bf)) + data.Write8(PCIStatusBytePosition, PCIStatusCapabilityList) + _, err = config.Write(*data.Raw()) + if err != nil { + return err + } + + bar0 := []uint64{0x00000000c2000000, 0x00000000c2ffffff, 0x0000000000040200} + resource, err := os.Create(filepath.Join(deviceDir, "resource")) + if err != nil { + return err + } + _, err = resource.WriteString(fmt.Sprintf("0x%x 0x%x 0x%x", bar0[0], bar0[1], bar0[2])) + if err != nil { + return err + } + + pmcID := uint32(0x170000a1) + resource0, err := os.Create(filepath.Join(deviceDir, "resource0")) + if err != nil { + return err + } + _data = make([]byte, bar0[1]-bar0[0]+1) + data = bytes.New(&_data).LittleEndian() + data.Write32(0, pmcID) + _, err = resource0.Write(*data.Raw()) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/nvpci.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/nvpci.go new file mode 100644 index 0000000..e6b23b6 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/nvpci.go @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2021, 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" + "os" + "path" + "path/filepath" + "sort" + "strconv" + "strings" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids" +) + +const ( + // PCIDevicesRoot represents base path for all pci devices under sysfs + PCIDevicesRoot = "/sys/bus/pci/devices" + // PCINvidiaVendorID represents PCI vendor id for NVIDIA + PCINvidiaVendorID uint16 = 0x10de + // PCIVgaControllerClass represents the PCI class for VGA Controllers + PCIVgaControllerClass uint32 = 0x030000 + // PCI3dControllerClass represents the PCI class for 3D Graphics accellerators + PCI3dControllerClass uint32 = 0x030200 + // PCINvSwitchClass represents the PCI class for NVSwitches + PCINvSwitchClass uint32 = 0x068000 +) + +// Interface allows us to get a list of all NVIDIA PCI devices +type Interface interface { + GetAllDevices() ([]*NvidiaPCIDevice, error) + Get3DControllers() ([]*NvidiaPCIDevice, error) + GetVGAControllers() ([]*NvidiaPCIDevice, error) + GetNVSwitches() ([]*NvidiaPCIDevice, error) + GetGPUs() ([]*NvidiaPCIDevice, error) + GetGPUByIndex(int) (*NvidiaPCIDevice, error) + GetGPUByPciBusID(string) (*NvidiaPCIDevice, error) + GetNetworkControllers() ([]*NvidiaPCIDevice, error) + GetPciBridges() ([]*NvidiaPCIDevice, error) + GetDPUs() ([]*NvidiaPCIDevice, error) +} + +// MemoryResources a more human readable handle +type MemoryResources map[int]*MemoryResource + +// ResourceInterface exposes some higher level functions of resources +type ResourceInterface interface { + GetTotalAddressableMemory(bool) (uint64, uint64) +} + +type nvpci struct { + pciDevicesRoot string +} + +var _ Interface = (*nvpci)(nil) +var _ ResourceInterface = (*MemoryResources)(nil) + +// NvidiaPCIDevice represents a PCI device for an NVIDIA product +type NvidiaPCIDevice struct { + Path string + Address string + Vendor uint16 + Class uint32 + ClassName string + Device uint16 + DeviceName string + Driver string + IommuGroup int + NumaNode int + Config *ConfigSpace + Resources MemoryResources + IsVF bool +} + +// IsVGAController if class == 0x300 +func (d *NvidiaPCIDevice) IsVGAController() bool { + return d.Class == PCIVgaControllerClass +} + +// Is3DController if class == 0x302 +func (d *NvidiaPCIDevice) Is3DController() bool { + return d.Class == PCI3dControllerClass +} + +// IsNVSwitch if class == 0x068 +func (d *NvidiaPCIDevice) IsNVSwitch() bool { + return d.Class == PCINvSwitchClass +} + +// IsGPU either VGA for older cards or 3D for newer +func (d *NvidiaPCIDevice) IsGPU() bool { + return d.IsVGAController() || d.Is3DController() +} + +// IsResetAvailable some devices can be reset without rebooting, +// check if applicable +func (d *NvidiaPCIDevice) IsResetAvailable() bool { + _, err := os.Stat(path.Join(d.Path, "reset")) + return err == nil +} + +// Reset perform a reset to apply a new configuration at HW level +func (d *NvidiaPCIDevice) Reset() error { + err := os.WriteFile(path.Join(d.Path, "reset"), []byte("1"), 0) + if err != nil { + return fmt.Errorf("unable to write to reset file: %v", err) + } + return nil +} + +// New interface that allows us to get a list of all NVIDIA PCI devices +func New() Interface { + return NewFrom(PCIDevicesRoot) +} + +// NewFrom interface allows us to get a list of all NVIDIA PCI devices at a specific root directory +func NewFrom(root string) Interface { + return &nvpci{ + pciDevicesRoot: root, + } +} + +// GetAllDevices returns all Nvidia PCI devices on the system +func (p *nvpci) GetAllDevices() ([]*NvidiaPCIDevice, error) { + deviceDirs, err := os.ReadDir(p.pciDevicesRoot) + if err != nil { + return nil, fmt.Errorf("unable to read PCI bus devices: %v", err) + } + + var nvdevices []*NvidiaPCIDevice + for _, deviceDir := range deviceDirs { + deviceAddress := deviceDir.Name() + nvdevice, err := p.GetGPUByPciBusID(deviceAddress) + if err != nil { + return nil, fmt.Errorf("error constructing NVIDIA PCI device %s: %v", deviceAddress, err) + } + if nvdevice == nil { + continue + } + nvdevices = append(nvdevices, nvdevice) + } + + addressToID := func(address string) uint64 { + address = strings.ReplaceAll(address, ":", "") + address = strings.ReplaceAll(address, ".", "") + id, _ := strconv.ParseUint(address, 16, 64) + return id + } + + sort.Slice(nvdevices, func(i, j int) bool { + return addressToID(nvdevices[i].Address) < addressToID(nvdevices[j].Address) + }) + + return nvdevices, nil +} + +// GetGPUByPciBusID constructs an NvidiaPCIDevice for the specified address (PCI Bus ID) +func (p *nvpci) GetGPUByPciBusID(address string) (*NvidiaPCIDevice, error) { + devicePath := filepath.Join(p.pciDevicesRoot, address) + + vendor, err := os.ReadFile(path.Join(devicePath, "vendor")) + if err != nil { + return nil, fmt.Errorf("unable to read PCI device vendor id for %s: %v", address, err) + } + vendorStr := strings.TrimSpace(string(vendor)) + vendorID, err := strconv.ParseUint(vendorStr, 0, 16) + if err != nil { + return nil, fmt.Errorf("unable to convert vendor string to uint16: %v", vendorStr) + } + + if uint16(vendorID) != PCINvidiaVendorID && uint16(vendorID) != PCIMellanoxVendorID { + return nil, nil + } + + class, err := os.ReadFile(path.Join(devicePath, "class")) + if err != nil { + return nil, fmt.Errorf("unable to read PCI device class for %s: %v", address, err) + } + classStr := strings.TrimSpace(string(class)) + classID, err := strconv.ParseUint(classStr, 0, 32) + if err != nil { + return nil, fmt.Errorf("unable to convert class string to uint32: %v", classStr) + } + + device, err := os.ReadFile(path.Join(devicePath, "device")) + if err != nil { + return nil, fmt.Errorf("unable to read PCI device id for %s: %v", address, err) + } + deviceStr := strings.TrimSpace(string(device)) + deviceID, err := strconv.ParseUint(deviceStr, 0, 16) + if err != nil { + return nil, fmt.Errorf("unable to convert device string to uint16: %v", deviceStr) + } + + driver, err := filepath.EvalSymlinks(path.Join(devicePath, "driver")) + if err == nil { + driver = filepath.Base(driver) + } else if os.IsNotExist(err) { + driver = "" + } else { + return nil, fmt.Errorf("unable to detect driver for %s: %v", address, err) + } + + var iommuGroup int64 + iommu, err := filepath.EvalSymlinks(path.Join(devicePath, "iommu_group")) + if err == nil { + iommuGroupStr := strings.TrimSpace(filepath.Base(iommu)) + iommuGroup, err = strconv.ParseInt(iommuGroupStr, 0, 64) + if err != nil { + return nil, fmt.Errorf("unable to convert iommu_group string to int64: %v", iommuGroupStr) + } + } else if os.IsNotExist(err) { + iommuGroup = -1 + } else { + return nil, fmt.Errorf("unable to detect iommu_group for %s: %v", address, err) + } + + // device is a virtual function (VF) if "physfn" symlink exists + var isVF bool + _, err = filepath.EvalSymlinks(path.Join(devicePath, "physfn")) + if err == nil { + isVF = true + } + if err != nil && !os.IsNotExist(err) { + return nil, fmt.Errorf("unable to resolve %s: %v", path.Join(devicePath, "physfn"), err) + } + + numa, err := os.ReadFile(path.Join(devicePath, "numa_node")) + if err != nil { + return nil, fmt.Errorf("unable to read PCI NUMA node for %s: %v", address, err) + } + numaStr := strings.TrimSpace(string(numa)) + numaNode, err := strconv.ParseInt(numaStr, 0, 64) + if err != nil { + return nil, fmt.Errorf("unable to convert NUMA node string to int64: %v", numaNode) + } + + config := &ConfigSpace{ + Path: path.Join(devicePath, "config"), + } + + resource, err := os.ReadFile(path.Join(devicePath, "resource")) + if err != nil { + return nil, fmt.Errorf("unable to read PCI resource file for %s: %v", address, err) + } + + resources := make(map[int]*MemoryResource) + for i, line := range strings.Split(strings.TrimSpace(string(resource)), "\n") { + values := strings.Split(line, " ") + if len(values) != 3 { + return nil, fmt.Errorf("more than 3 entries in line '%d' of resource file", i) + } + + start, _ := strconv.ParseUint(values[0], 0, 64) + end, _ := strconv.ParseUint(values[1], 0, 64) + flags, _ := strconv.ParseUint(values[2], 0, 64) + + if (end - start) != 0 { + resources[i] = &MemoryResource{ + uintptr(start), + uintptr(end), + flags, + fmt.Sprintf("%s/resource%d", devicePath, i), + } + } + } + + pciDB := pciids.NewDB() + + nvdevice := &NvidiaPCIDevice{ + Path: devicePath, + Address: address, + Vendor: uint16(vendorID), + Class: uint32(classID), + Device: uint16(deviceID), + Driver: driver, + IommuGroup: int(iommuGroup), + NumaNode: int(numaNode), + Config: config, + Resources: resources, + IsVF: isVF, + DeviceName: pciDB.GetDeviceName(uint16(vendorID), uint16(deviceID)), + ClassName: pciDB.GetClassName(uint32(classID)), + } + + return nvdevice, nil +} + +// Get3DControllers returns all NVIDIA 3D Controller PCI devices on the system +func (p *nvpci) Get3DControllers() ([]*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.Is3DController() { + filtered = append(filtered, d) + } + } + + return filtered, nil +} + +// GetVGAControllers returns all NVIDIA VGA Controller PCI devices on the system +func (p *nvpci) GetVGAControllers() ([]*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.IsVGAController() { + filtered = append(filtered, d) + } + } + + return filtered, nil +} + +// GetNVSwitches returns all NVIDIA NVSwitch PCI devices on the system +func (p *nvpci) GetNVSwitches() ([]*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.IsNVSwitch() { + filtered = append(filtered, d) + } + } + + return filtered, nil +} + +// GetGPUs returns all NVIDIA GPU devices on the system +func (p *nvpci) GetGPUs() ([]*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.IsGPU() && !d.IsVF { + filtered = append(filtered, d) + } + } + + return filtered, nil +} + +// GetGPUByIndex returns an NVIDIA GPU device at a particular index +func (p *nvpci) GetGPUByIndex(i int) (*NvidiaPCIDevice, error) { + gpus, err := p.GetGPUs() + if err != nil { + return nil, fmt.Errorf("error getting all gpus: %v", err) + } + + if i < 0 || i >= len(gpus) { + return nil, fmt.Errorf("invalid index '%d'", i) + } + + return gpus[i], nil +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/resources.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/resources.go new file mode 100644 index 0000000..02a0430 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/resources.go @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2021, 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" + "sort" + + "gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio" +) + +const ( + pmcEndianRegister = 0x4 + pmcLittleEndian = 0x0 + pmcBigEndian = 0x01000001 +) + +// MemoryResource represents a mmio region +type MemoryResource struct { + Start uintptr + End uintptr + Flags uint64 + Path string +} + +// OpenRW read write mmio region +func (mr *MemoryResource) OpenRW() (mmio.Mmio, error) { + rw, err := mmio.OpenRW(mr.Path, 0, int(mr.End-mr.Start+1)) + if err != nil { + return nil, fmt.Errorf("failed to open file for mmio: %v", err) + } + switch rw.Read32(pmcEndianRegister) { + case pmcBigEndian: + return rw.BigEndian(), nil + case pmcLittleEndian: + return rw.LittleEndian(), nil + } + return nil, fmt.Errorf("unknown endianness for mmio: %v", err) +} + +// OpenRO read only mmio region +func (mr *MemoryResource) OpenRO() (mmio.Mmio, error) { + ro, err := mmio.OpenRO(mr.Path, 0, int(mr.End-mr.Start+1)) + if err != nil { + return nil, fmt.Errorf("failed to open file for mmio: %v", err) + } + switch ro.Read32(pmcEndianRegister) { + case pmcBigEndian: + return ro.BigEndian(), nil + case pmcLittleEndian: + return ro.LittleEndian(), nil + } + return nil, fmt.Errorf("unknown endianness for mmio: %v", err) +} + +// From Bit Twiddling Hacks, great resource for all low level bit manipulations +func calcNextPowerOf2(n uint64) uint64 { + n-- + n |= n >> 1 + n |= n >> 2 + n |= n >> 4 + n |= n >> 8 + n |= n >> 16 + n |= n >> 32 + n++ + + return n +} + +// GetTotalAddressableMemory will accumulate the 32bit and 64bit memory windows +// of each BAR and round the value if needed to the next power of 2; first +// return value is the accumulated 32bit addresable memory size the second one +// is the accumulated 64bit addressable memory size in bytes. These values are +// needed to configure virtualized environments. +func (mrs MemoryResources) GetTotalAddressableMemory(roundUp bool) (uint64, uint64) { + const pciIOVNumBAR = 6 + const pciBaseAddressMemTypeMask = 0x06 + const pciBaseAddressMemType32 = 0x00 /* 32 bit address */ + const pciBaseAddressMemType64 = 0x04 /* 64 bit address */ + + // We need to sort the resources so the first 6 entries are the BARs + // How a map is represented in memory is not guaranteed, it is not an + // array. Keys do not have an order. + keys := make([]int, 0, len(mrs)) + for k := range mrs { + keys = append(keys, k) + } + sort.Ints(keys) + + numBAR := 0 + memSize32bit := uint64(0) + memSize64bit := uint64(0) + + for _, key := range keys { + // The PCIe spec only defines 5 BARs per device, we're + // discarding everything after the 5th entry of the resources + // file, see lspci.c + if key >= pciIOVNumBAR || numBAR == pciIOVNumBAR { + break + } + numBAR = numBAR + 1 + + region := mrs[key] + + flags := region.Flags & pciBaseAddressMemTypeMask + memType32bit := flags == pciBaseAddressMemType32 + memType64bit := flags == pciBaseAddressMemType64 + + memSize := (region.End - region.Start) + 1 + + if memType32bit { + memSize32bit = memSize32bit + uint64(memSize) + } + if memType64bit { + memSize64bit = memSize64bit + uint64(memSize) + } + + } + + if roundUp { + memSize32bit = calcNextPowerOf2(memSize32bit) + memSize64bit = calcNextPowerOf2(memSize64bit) + } + + return memSize32bit, memSize64bit +} diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids/default_pci.ids b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids/default_pci.ids new file mode 100644 index 0000000..ba1be0b --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids/default_pci.ids @@ -0,0 +1,35261 @@ +# +# List of PCI ID's +# +# Version: 2022.05.18 +# Date: 2022-05-18 03:15:02 +# +# Maintained by Albert Pool, Martin Mares, and other volunteers from +# the PCI ID Project at https://pci-ids.ucw.cz/. +# +# New data are always welcome, especially if they are accurate. If you have +# anything to contribute, please follow the instructions at the web site. +# +# This file can be distributed under either the GNU General Public License +# (version 2 or higher) or the 3-clause BSD License. +# +# The database is a compilation of factual data, and as such the copyright +# only covers the aggregation and formatting. The copyright is held by +# Martin Mares and Albert Pool. +# + +# Vendors, devices and subsystems. Please keep sorted. + +# Syntax: +# vendor vendor_name +# device device_name <-- single tab +# subvendor subdevice subsystem_name <-- two tabs + +0001 SafeNet (wrong ID) +0010 Allied Telesis, Inc (Wrong ID) +# This is a relabelled RTL-8139 + 8139 AT-2500TX V3 Ethernet +0014 Loongson Technology LLC + 7a00 Hyper Transport Bridge Controller + 7a02 APB (Advanced Peripheral Bus) Controller + 7a03 Gigabit Ethernet Controller + 7a04 OTG USB Controller + 7a05 Vivante GPU (Graphics Processing Unit) + 7a06 DC (Display Controller) + 7a07 HDA (High Definition Audio) Controller + 7a08 SATA AHCI Controller + 7a09 PCI-to-PCI Bridge + 7a0b SPI Controller + 7a0c LPC Controller + 7a0f DMA (Direct Memory Access) Controller +# Found on some boards with two sockets + 7a10 Hyper Transport Bridge Controller + 7a14 EHCI USB Controller + 7a15 Vivante GPU (Graphics Processing Unit) + 7a19 PCI-to-PCI Bridge + 7a24 OHCI USB Controller + 7a29 PCI-to-PCI Bridge +001c PEAK-System Technik GmbH + 0001 PCAN-PCI CAN-Bus controller + 001c 0004 2 Channel CAN Bus SJC1000 + 001c 0005 2 Channel CAN Bus SJC1000 (Optically Isolated) +003d Lockheed Martin-Marietta Corp +# Real TJN ID is e159, but they got it wrong several times --mj +0059 Tiger Jet Network Inc. (Wrong ID) +0070 Hauppauge computer works Inc. + 7801 WinTV HVR-1800 MCE +0071 Nebula Electronics Ltd. +0095 Silicon Image, Inc. (Wrong ID) + 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD +# Wrong ID used in subsystem ID of the TELES.S0/PCI 2.x ISDN adapter +00a7 Teles AG (Wrong ID) +0100 nCipher Security +0123 General Dynamics +0128 Dell (wrong ID) +# 018a is not LevelOne but there is a board misprogrammed +018a LevelOne + 0106 FPC-0106TX misprogrammed [RTL81xx] +01de Oxide Computer Company + 0000 Propolis NVMe Controller + 0001 Propolis xHCI Controller +# probably misprogrammed Intel Atom C2338 on Dell 0K8Y0N board +0200 Dell (wrong ID) +# 021b is not Compaq but there is a board misprogrammed +021b Compaq Computer Corporation + 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking] +0270 Hauppauge computer works Inc. (Wrong ID) +0291 Davicom Semiconductor, Inc. (Wrong ID) +# SpeedStream is Efficient Networks, Inc, a Siemens Company +02ac SpeedStream + 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx] +02e0 XFX Pine Group Inc. (Wrong ID) +0303 Hewlett-Packard Company (Wrong ID) +0308 ZyXEL Communications Corporation (Wrong ID) +0315 SK-Electronics Co., Ltd. +0357 TTTech Computertechnik AG (Wrong ID) + 000a TTP-Monitoring Card V2.0 +0432 SCM Microsystems, Inc. + 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet] +0497 Dell Inc. (wrong ID) +0675 Dynalink + 1700 IS64PH ISDN Adapter + 1702 IS64PH ISDN Adapter + 1703 ISDN Adapter (PCI Bus, DV, W) + 1704 ISDN Adapter (PCI Bus, D, C) +0721 Sapphire, Inc. +0731 Jingjia Microelectronics Co Ltd + 7200 JM7200 Series GPU + 0731 7201 JM7201 + 0731 7202 JM7202 + 0731 7208 JM7200 + 0731 7212 JM7200 + 0731 7214 JM7500 + 0731 7215 JM7200 + 9100 JM9100 + 0731 9101 JM9100 + 0731 9102 JM9100-I + 910a JH910 + 0731 910a JH910 + 0731 910b JH910-I + 0731 910c JH910-M + 9200 JM9200 + 920a JH920 + 0731 920a JH920 + 0731 920b JH920-I + 0731 920c JH920-M + 920b JH920-I + 920c JH920-M + 9210 JM9210 + 0731 9210 JM9210 + 0731 9211 JM9210-I + 9211 JM9210-I + 9230 JM9230 + 0731 9230 JM9230 + 0731 9231 JM9230-I + 9231 JM9231-I + 9250 JM9250 + 0731 9250 JM9250 + 930a JH930-I + 0731 930a JH930-I + 0731 930b JH930-M + 930b JH930-M +0777 Ubiquiti Networks, Inc. +0795 Wired Inc. + 6663 Butane II (MPEG2 encoder board) + 6666 MediaPress (MPEG2 encoder board) +07d1 D-Link System Inc +0824 T1042 [Freescale] +0925 VIA Technologies, Inc. (Wrong ID) +0a89 BREA Technologies Inc +0b0b Rhino Equipment Corp. + 0105 R1T1 + 0205 R4FXO + 0206 RCB4FXO 4-channel FXO analog telephony card + 0305 R4T1 + 0405 R8FXX + 0406 RCB8FXX 8-channel modular analog telephony card + 0505 R24FXX + 0506 RCB24FXS 24-Channel FXS analog telephony card + 0605 R2T1 + 0705 R24FXS + 0706 RCB24FXO 24-Channel FXO analog telephony card + 0905 R1T3 Single T3 Digital Telephony Card + 0906 RCB24FXX 24-channel modular analog telephony card + 0a06 RCB672FXX 672-channel modular analog telephony card +0ccd Preferred Networks, Inc. +0e11 Compaq Computer Corporation + 0001 PCI to EISA Bridge + 0002 PCI to ISA Bridge + 0046 Smart Array 64xx + 0e11 4091 Smart Array 6i + 0e11 409a Smart Array 641 + 0e11 409b Smart Array 642 + 0e11 409c Smart Array 6400 + 0e11 409d Smart Array 6400 EM + 0049 NC7132 Gigabit Upgrade Module + 004a NC6136 Gigabit Server Adapter + 005a Remote Insight II board - Lights-Out + 007c NC7770 1000BaseTX + 007d NC6770 1000BaseTX + 0085 NC7780 1000BaseTX + 00b1 Remote Insight II board - PCI device + 00bb NC7760 + 00ca NC7771 + 00cb NC7781 + 00cf NC7772 + 00d0 NC7782 + 00d1 NC7783 + 00e3 NC7761 + 0508 Netelligent 4/16 Token Ring + 1000 Triflex/Pentium Bridge, Model 1000 + 2000 Triflex/Pentium Bridge, Model 2000 + 3032 QVision 1280/p + 3033 QVision 1280/p + 3034 QVision 1280/p + 4000 4000 [Triflex] + 4040 Integrated Array + 4048 Compaq Raid LC2 + 4050 Smart Array 4200 + 4051 Smart Array 4250ES + 4058 Smart Array 431 + 4070 Smart Array 5300 + 4080 Smart Array 5i + 4082 Smart Array 532 + 4083 Smart Array 5312 + 4091 Smart Array 6i + 409a Smart Array 641 + 409b Smart Array 642 + 409c Smart Array 6400 + 409d Smart Array 6400 EM + 6010 HotPlug PCI Bridge 6010 + 7020 USB Controller + a0ec Fibre Channel Host Controller + a0f0 Advanced System Management Controller + 0e11 b0f3 ProLiant DL360 + a0f3 Triflex PCI to ISA Bridge + a0f7 PCI Hotplug Controller + 8086 002a PCI Hotplug Controller A + 8086 002b PCI Hotplug Controller B + a0f8 ZFMicro Chipset USB + a0fc FibreChannel HBA Tachyon + ae10 Smart-2/P RAID Controller + 0e11 4030 Smart-2/P Array Controller + 0e11 4031 Smart-2SL Array Controller + 0e11 4032 Smart Array 3200 Controller + 0e11 4033 Smart Array 3100ES Controller + 0e11 4034 Smart Array 221 Controller + ae29 MIS-L + ae2a MPC + ae2b MIS-E + ae31 System Management Controller + ae32 Netelligent 10/100 TX PCI UTP + ae33 Triflex Dual EIDE Controller + ae34 Netelligent 10 T PCI UTP + ae35 Integrated NetFlex-3/P + ae40 Netelligent Dual 10/100 TX PCI UTP + ae43 Netelligent Integrated 10/100 TX UTP + ae69 CETUS-L + ae6c Northstar + ae6d NorthStar CPU to PCI Bridge + b011 Netelligent 10/100 TX Embedded UTP + b012 Netelligent 10 T/2 PCI UTP/Coax + b01e NC3120 Fast Ethernet NIC + b01f NC3122 Fast Ethernet NIC + b02f NC1120 Ethernet NIC + b030 Netelligent 10/100 TX UTP + b04a 10/100 TX PCI Intel WOL UTP Controller + b060 Smart Array 5300 Controller + b0c6 NC3161 Fast Ethernet NIC + b0c7 NC3160 Fast Ethernet NIC + b0d7 NC3121 Fast Ethernet NIC + b0dd NC3131 Fast Ethernet NIC + b0de NC3132 Fast Ethernet Module + b0df NC6132 Gigabit Module + b0e0 NC6133 Gigabit Module + b0e1 NC3133 Fast Ethernet Module + b123 NC6134 Gigabit NIC + b134 NC3163 Fast Ethernet NIC + b13c NC3162 Fast Ethernet NIC + b144 NC3123 Fast Ethernet NIC + b163 NC3134 Fast Ethernet NIC + b164 NC3165 Fast Ethernet Upgrade Module + b178 Smart Array 5i/532 + 0e11 4080 Smart Array 5i + 0e11 4082 Smart Array 532 + 0e11 4083 Smart Array 5312 + b1a4 NC7131 Gigabit Server Adapter + b200 Memory Hot-Plug Controller + b203 Integrated Lights Out Controller + b204 Integrated Lights Out Processor + c000 Remote Insight Lights-Out Edition + f130 NetFlex-3/P ThunderLAN 1.0 + f150 NetFlex-3/P ThunderLAN 2.3 +0e55 HaSoTec GmbH +0eac SHF Communication Technologies AG + 0008 Ethernet Powerlink Managing Node 01 +0f62 Acrox Technologies Co., Ltd. +1000 Broadcom / LSI + 0001 53c810 + 1000 1000 LSI53C810AE PCI to SCSI I/O Processor + 0002 53c820 + 0003 53c825 + 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide) + 0004 53c815 + 0005 53c810AP + 0006 53c860 + 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor + 000a 53c1510 + 0e11 b143 Integrated Dual Channel Wide Ultra2 SCSI Controller + 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode) + 000b 53C896/897 + 0e11 6004 EOB003 Series SCSI host adapter + 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller + 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter + 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter + 13e9 1000 6221L-4U (Dual U2W SCSI, dual 10/100TX, graphics) + 000c 53c895 + 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter + 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter + 1de1 3906 DC-390U2B SCSI adapter + 1de1 3907 DC-390U2W + 000d 53c885 + 000f 53c875 + 0e11 7004 Embedded Ultra Wide SCSI Controller + 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller + 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter + 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter + 1092 8760 FirePort 40 Dual SCSI Controller + 1775 10d0 V5D Single Board Computer Wide Ultra SCSI + 1775 10d1 V5D Single Board Computer Ultra SCSI + 1de1 3904 DC390F/U Ultra Wide SCSI Adapter + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1050 CT7 mainboard + 0010 53C1510 + 0e11 4040 Integrated Smart Array Controller + 0e11 4048 RAID LC2 Controller + 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode) + 0012 53c895a + 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller + 0013 53c875a + 1000 1000 LSI53C875A PCI to Ultra SCSI Controller + 0014 MegaRAID Tri-Mode SAS3516 + 1000 9460 MegaRAID 9460-16i + 1000 9480 MegaRAID 9480-8i8e + 1000 9481 MegaRAID 9480-8e + 1028 1f3a PERC H745 Adapter + 1028 1f3b PERC H745 Front + 1028 1fd4 PERC H745P MX + 1137 020e UCSC-RAID-M5 12G Modular RAID Controller + 1d49 0602 ThinkSystem RAID 930-16i 4GB Flash PCIe 12Gb Adapter + 1d49 0604 ThinkSystem RAID 930-8e 4GB Flash PCIe 12Gb Adapter + 1d49 0607 ThinkSystem RAID 930-16i 8GB Flash PCIe 12Gb Adapter + 8086 352d Integrated RAID Module RMSP3AD160F + 8086 9460 RAID Controller RSP3TD160F + 8086 9480 RAID Controller RSP3MD088F + 0015 MegaRAID Tri-Mode SAS3416 + 1000 9441 MegaRAID 9440-16i + 1028 1f3c PERC H345 Adapter + 1028 1f3d PERC H345 Front + 1d49 0503 ThinkSystem RAID 530-16i PCIe 12Gb Adapter + 0016 MegaRAID Tri-Mode SAS3508 + 1000 9461 MegaRAID 9460-8i + 1000 9462 MegaRAID 9460-4i + 1000 9463 MegaRAID 9365-28i + 1000 9464 MegaRAID 9365-24i + 1028 1fc9 PERC H840 Adapter + 1028 1fcb PERC H740P Adapter + 1028 1fcd PERC H740P Mini + 1028 1fcf PERC H740P Mini + 1d49 0601 ThinkSystem RAID 930-8i 2GB Flash PCIe 12Gb Adapter + 1d49 0603 ThinkSystem RAID 930-24i 4GB Flash PCIe 12Gb Adapter + 8086 352e Integrated RAID Module RMSP3CD080F + 8086 352f Integrated RAID Module RMSP3HD080E + 8086 9461 RAID Controller RSP3DD080F + 0017 MegaRAID Tri-Mode SAS3408 + 1000 9440 MegaRAID 9440-8i + 1000 9442 MegaRAID 9440-4i + 1d49 0500 ThinkSystem RAID 530-8i PCIe 12Gb Adapter + 1d49 0502 ThinkSystem RAID 530-8i Dense Adapter + 8086 3528 Integrated RAID RMSP3LD060 + 8086 3529 Integrated RAID RMSP3LD060 + 8086 9441 RAID Controller RSP3WD080E + 001b MegaRAID Tri-Mode SAS3504 + 1d49 0605 ThinkSystem RAID 930-4i 2GB Flash Flex Adapter + 001c MegaRAID Tri-Mode SAS3404 + 1d49 0501 ThinkSystem RAID 530-4i Flex Adapter + 0020 53c1010 Ultra3 SCSI Adapter + 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller + 107b 1040 Server Onboard 53C1010-33 + 1de1 1020 DC-390U3W + 0021 53c1010 66MHz Ultra3 SCSI Adapter + 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller + 1000 1010 Asus TR-DLS onboard 53C1010-66 + 103c 1300 Ultra160 SCSI [AB306A] + 103c 1310 Ultra160 SCSI [A9918A] + 103c 1330 Ultra160 SCSI [A7059A] + 103c 1340 Ultra160 SCSI [A7060A] + 124b 1070 PMC-USCSI3 + 4c53 1080 CT8 mainboard + 4c53 1300 P017 mezzanine (32-bit PMC) + 4c53 1310 P017 mezzanine (64-bit PMC) + 002f MegaRAID SAS 2208 IOV [Thunderbolt] + 1028 1f39 SPERC8-e + 1028 1f3e SPERC 8 + 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI + 0e11 00da ProLiant ML 350 + 1028 0123 LSI Logic 1020/1030 + 1028 014a LSI Logic 1020/1030 + 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4) + 1028 0183 LSI Logic 1020/1030 + 1028 018a PERC 4/IM + 1028 1010 LSI U320 SCSI Controller + 103c 12c5 Ultra320 SCSI [A7173A] + 103c 1323 Core I/O LAN/SCSI Combo [AB314A] + 103c 3108 Single Channel Ultra320 SCSI HBA G2 + 103c 322a SC11Xe Ultra320 Single Channel PCIe x4 SCSI Host Bus Adapter (412911-B21) + 124b 1170 PMC-USCSI320 +# VMware's emulation of this device. Was missing from the list. + 15ad 1976 LSI Logic Parallel SCSI Controller + 1734 1052 PRIMERGY BX/RX/TX S2 series onboard SCSI(IME) + 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI + 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI + 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller + 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI + 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI + 1000 0033 MegaRAID SCSI 320-2XR + 1000 0066 MegaRAID SCSI 320-2XRWS + 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI + 0050 SAS1064 PCI-X Fusion-MPT SAS + 1028 1f04 SAS 5/E + 1028 1f09 SAS 5i/R + 0052 MegaRAID SAS-3 3216/3224 [Cutlass] + 0053 MegaRAID SAS-3 3216/3224 [Cutlass] + 1000 9350 MegaRAID SAS 9341-16i + 1000 9351 MegaRAID SAS 9341-24i + 0054 SAS1068 PCI-X Fusion-MPT SAS + 1028 1f04 SAS 5/E Adapter Controller + 1028 1f05 SAS 5/i Adapter Controller + 1028 1f06 SAS 5/i Integrated Controller + 1028 1f07 SAS 5/iR Integrated RAID Controller + 1028 1f08 SAS 5/iR Integrated RAID Controller + 1028 1f09 SAS 5/iR Adapter RAID Controller + 15ad 1976 SAS Controller + 0055 SAS1068 PCI-X Fusion-MPT SAS + 1033 8336 SAS1068 + 0056 SAS1064ET PCI-Express Fusion-MPT SAS + 1014 03bb ServeRAID BR10il SAS/SATA Controller v2 + 8086 34dc AXX4SASMOD RAID Controller + 0057 M1064E MegaRAID SAS + 8086 346c Embedded Software RAID Technology II (ESTRII) + 0058 SAS1068E PCI-Express Fusion-MPT SAS + 1000 3140 SAS3081E-R 8-Port SAS/SATA Host Bus Adapter + 1028 021d SAS 6/iR Integrated Workstations RAID Controller + 1028 1f0e SAS 6/iR Adapter RAID Controller + 1028 1f0f SAS 6/iR Integrated Blades RAID Controller + 1028 1f10 SAS 6/iR Integrated RAID Controller + 103c 3229 SC44Ge Host Bus Adapter + 0059 MegaRAID SAS 8208ELP/8208ELP + 005a SAS1066E PCI-Express Fusion-MPT SAS + 005b MegaRAID SAS 2208 [Thunderbolt] + 1000 9265 MegaRAID SAS 9265-8i + 1000 9266 MegaRAID SAS 9266-8i + 1000 9267 MegaRAID SAS 9267-8i + 1000 9268 MegaRAID SAS 9265CV-8i / 9270CV-8i + 1000 9269 MegaRAID SAS 9266-4i + 1000 9270 MegaRAID SAS 9270-8i + 1000 9271 MegaRAID SAS 9271-8i + 1000 9272 MegaRAID SAS 9272-8i + 1000 9273 MegaRAID SAS 9270CV-8i + 1000 9274 MegaRAID SAS 9270-4i + 1000 9275 MegaRAID SAS 9271-8iCC + 1000 9276 MegaRAID SAS 9271-4i + 1000 9285 MegaRAID SAS 9285-8e + 1000 9288 MegaRAID SAS 9285CV-8e + 1000 9290 MegaRAID SAS 9286-8e + 1000 9291 MegaRAID SAS 9286CV-8e + 1000 9295 MegaRAID SAS 9286CV-8eCC + 1014 040b ServeRAID M5110 SAS/SATA Controller + 1014 040c ServeRAID M5120 SAS/SATA Controller + 1014 0412 ServeRAID M5110e SAS/SATA Controller + 1028 1f2d PERC H810 Adapter + 1028 1f30 PERC H710 Embedded + 1028 1f31 PERC H710P Adapter + 1028 1f33 PERC H710P Mini (for blades) + 1028 1f34 PERC H710P Mini (for monolithics) + 1028 1f35 PERC H710 Adapter + 1028 1f37 PERC H710 Mini (for blades) + 1028 1f38 PERC H710 Mini (for monolithics) + 15d9 0690 LSI MegaRAID ROMB + 8086 3510 RMS25PB080 RAID Controller + 8086 3511 RMS25PB040 RAID Controller + 8086 3512 RMT3PB080 RAID Controller + 8086 3513 Integrated RAID Module RMS25CB080 + 8086 3514 RMS25CB040 RAID Controller + 8086 351c RMS25PB080N RAID Controller + 8086 351d RMS25CB080N RAID Controller + 8086 9265 RS25DB080 RAID Controller + 8086 9268 RS25AB080 RAID Controller + 8086 9285 RS25NB008 RAID Controller + 8086 9288 RS25SB008 RAID Controller + 005c SAS1064A PCI-X Fusion-MPT SAS + 005d MegaRAID SAS-3 3108 [Invader] + 1000 9361 MegaRAID SAS 9361-8i + 1000 9363 MegaRAID SAS 9361-4i + 1000 9364 MegaRAID SAS 9364-8i + 1000 936a MegaRAID SAS 9364-8i + 1000 9380 MegaRAID SAS 9380-8e + 1028 1f41 PERC H830 Adapter + 1028 1f42 PERC H730P Adapter + 1028 1f43 PERC H730 Adapter + 1028 1f47 PERC H730P Mini + 1028 1f48 PERC H730P Mini (for blades) + 1028 1f49 PERC H730 Mini + 1028 1f4a PERC H730 Mini (for blades) + 1028 1f4d PERC FD33xS + 1028 1f4f PERC H730P Slim + 1028 1f54 PERC FD33xD + 1028 1fd1 PERC H730P MX + 17aa 1052 ThinkServer RAID 720i + 17aa 1053 ThinkServer RAID 720ix + 1bd4 0014 12G SAS3108 2G + 1bd4 0015 12G SAS3108 4G + 1d49 0600 ThinkSystem RAID 730-8i 1GB Cache PCIe 12Gb Adapter + 1d49 0608 ThinkSystem RAID 730-8i 2GB Flash PCIe 12Gb Adapter + 1d49 0609 ThinkSystem RAID 730-8i 4GB Flash PCIe 12Gb Adapter + 8086 351e RMS3CC080 RAID Controller + 8086 351f RMS3CC040 RAID Controller + 8086 9360 RS3DC080 RAID Controller + 8086 9362 RS3DC040 RAID Controller + 8086 9380 RS3SC008 RAID Controller + 8086 9381 RS3MC044 RAID Controller + 005e SAS1066 PCI-X Fusion-MPT SAS + 005f MegaRAID SAS-3 3008 [Fury] + 1028 1f44 PERC H330 Adapter + 1028 1f4b PERC H330 Mini + 1028 1f4c PERC H330 Mini (for blades) + 1028 1f4d PERC H330 Embedded (for monolithic) + 1054 306a SAS 3004 iMR ROMB + 1734 1211 PRAID CP400i [D3307-A12] + 1d49 04db ServeRAID M1210 SAS/SATA Controller + 1d49 0504 ThinkSystem RAID 520-8i PCIe 12Gb Adapter + 0060 MegaRAID SAS 1078 + 1000 1006 MegaRAID SAS 8888ELP + 1000 100a MegaRAID SAS 8708ELP + 1000 100e MegaRAID SAS 8884E + 1000 100f MegaRAID SAS 8708E + 1000 1010 MegaRAID SATA 350-8ELP + 1000 1011 MegaRAID SATA 350-4ELP + 1000 1012 MegaRAID SAS 8704ELP + 1000 1016 MegaRAID SAS 8880EM2 + 1014 0363 MegaRAID SAS PCI Express ROMB + 1014 0364 SystemX MegaRAID SAS 8808E + 1014 0365 SystemX MegaRAID SAS 8884E + 1014 0379 SystemX MegaRAID SAS 8880EM2 + 1028 1f0a PERC 6/E Adapter RAID Controller + 1028 1f0b PERC 6/i Adapter RAID Controller + 1028 1f0c PERC 6/i Integrated RAID Controller + 1028 1f0d PERC 6/i Integrated RAID Controller + 1028 1f11 CERC 6/i Integrated RAID Controller + 1033 835a MegaRAID SAS PCI Express ROMB + 1043 824d MegaRAID SAS PCI Express ROMB + 1170 002f MegaRAID SAS PCI Express ROMB + 1170 0036 MegaRAID SAS PCI Express ROMB + 15d9 c080 MegaRAID SAS PCI Express ROMB + 17aa 6b7c MegaRAID SAS PCI Express ROMB + 18a1 0003 LSI MegaRAID SAS PCI Express ROMB + 8086 1006 RAID Controller SRCSAS28EP + 8086 100a RAID Controller SRCSAS28EV + 8086 1010 RAID Controller SRCSATA28E + 8086 34cc Integrated RAID Controller SROMBSAS28E + 8086 34cd Integrated RAID Controller SROMBSAS28E + 8086 3505 Integrated RAID Controller SROMBSASMP2 + 0062 SAS1078 PCI-Express Fusion-MPT SAS + 1000 0062 SAS1078 PCI-Express Fusion-MPT SAS + 0064 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor] + 1000 3030 9200-16e 6Gb/s SAS/SATA PCIe x8 External HBA + 1000 30c0 SAS 9201-16i + 1000 30d0 9201-16e 6Gb/s SAS/SATA PCIe x8 External HBA + 0065 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor] + 006e SAS2308 PCI-Express Fusion-MPT SAS-2 + 0070 SAS2004 PCI-Express Fusion-MPT SAS-2 [Spitfire] + 1000 3010 SAS9211-4i + 1014 040e ServeRAID H1110 + 0071 MR SAS HBA 2004 + 0072 SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] + 1000 3040 9210-8i + 1000 3080 9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA] + 1000 30b0 9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA] + 1014 03ca IBM 6Gb SAS HBA [9212-4i4e] + 1028 1f1c 6Gbps SAS HBA Adapter + 1028 1f1d PERC H200 Adapter + 1028 1f1e PERC H200 Integrated + 1028 1f1f PERC H200 Modular + 1028 1f20 PERC H200 Embedded + 1028 1f22 PERC H200 Internal Tape Adapter +# Fujitsu D2607 SAS2008 HBA controller + 1734 1177 HBA Ctrl SAS 6G 0/1 [D2607] + 1bd4 000d 6G SAS2008IT + 1bd4 000e 6G SAS2008IR + 1bd4 000f 6G SAS2008IT SA5248 + 1bd4 0010 6G SAS2008IR SA5248 + 8086 350f RMS2LL040 RAID Controller + 8086 3700 SSD 910 Series + 0073 MegaRAID SAS 2008 [Falcon] + 1000 9240 MegaRAID SAS 9240-8i + 1000 9241 MegaRAID SAS 9240-4i + 1000 92a0 MegaRAID SAS 9220-8i + 1014 03b1 ServeRAID M1015 SAS/SATA Controller + 1014 040d ServeRAID M1115 SAS/SATA Controller + 1028 1f4e PERC H310 Adapter + 1028 1f4f PERC H310 Integrated + 1028 1f50 PERC H310 Mini Blades + 1028 1f51 PERC H310 Mini Monolithics + 1028 1f52 PERC H310 Embedded1 + 1028 1f53 PERC H310 Embedded2 + 1028 1f54 PERC H310 Reserved + 1028 1f78 PERC H310 + 1054 3035 LSI MegaRAID SAS 9240-8i + 1137 0072 2004 iMR ROMB + 1137 0073 2008 ROMB + 1137 00b0 UCSC RAID SAS 2008M-8i + 1137 00b1 UCSC RAID SAS 2008M-8i + 1137 00c2 UCS E-Series Double Wide + 1137 00c3 UCS E-Series Single Wide + 15d9 0400 Supermicro SMC2008-iMR + 1734 1177 RAID Ctrl SAS 6G 0/1 (D2607) + 17aa 1051 ThinkServer RAID 510i + 8086 350d RMS2AF040 RAID Controller + 8086 9240 RAID Controller RS2WC080 + 8086 9241 RAID Controller RS2WC040 + 0074 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator] + 0076 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator] + 0077 SAS2108 PCI-Express Fusion-MPT SAS-2 [Liberator] + 0079 MegaRAID SAS 2108 [Liberator] + 1000 9251 MegaRAID SAS 9260-4ix + 1000 9256 MegaRAID SAS 9260-8ix + 1000 9260 MegaRAID SAS 9260-4i + 1000 9261 MegaRAID SAS 9260-8i + 1000 9262 MegaRAID SAS 9262-8i + 1000 9263 MegaRAID SAS 9261-8i + 1000 9264 MegaRAID SAS 9264-8i + 1000 9267 MegaRAID SAS 9260CV-4i + 1000 9268 MegaRAID SAS 9260CV-8i + 1000 9275 MegaRAID SAS 9280-8ex + 1000 9276 MR9260-16i + 1000 9280 MegaRAID SAS 9280-8e + 1000 9281 MegaRAID SAS 9281-8E + 1000 9282 MegaRAID SAS 9280-4i4e + 1000 9290 MegaRAID SAS 9280DE-24i4e + 1014 03b2 ServeRAID M5015 SAS/SATA Controller + 1014 03b3 ServeRAID M5025 SAS/SATA Controller + 1028 1f15 PERC H800 Adapter + 1028 1f16 PERC H700 Adapter + 1028 1f17 PERC H700 Integrated + 1028 1f18 PERC H700 Modular + 1028 1f1a PERC H800 Proto Adapter + 1028 1f1b PERC H700 Integrated + 1043 8480 PIKE-2108 16PD + 1734 1176 RAID Ctrl SAS 6G 5/6 512MB (D2616) + 1734 1177 RAID Ctrl SAS 6G 0/1 (D2607) + 8086 350b RMS2MH080 RAID Controller + 8086 9256 MegaRAID SAS 9260DE-8i RS2BL080DE + 8086 9260 RAID Controller RS2BL040 + 8086 9261 RAID Controller RS2BL080 + 8086 9264 RAID Controller RT3WB080 Warm Beach (Caster Lite) + 8086 9267 RAID Controller RS2VB040 + 8086 9268 RAID Controller RS2VB080 + 8086 9275 RAID Controller RS2PI008DE + 8086 9276 RAID Controller RS2WG160 + 8086 9280 RAID Controller RS2PI008 + 8086 9282 RAID Controller RS2MB044 + 8086 9290 RAID Controller RS2SG244 + 007c MegaRAID SAS 1078DE + 1014 0395 ServeRAID-AR10is SAS/SATA Controller + 007e SSS6200 PCI-Express Flash SSD + 1000 0504 Nytro NWD-BLP4-800 + 1000 0507 Nytro NWD-BLP4-1600 + 1000 0581 Nytro NWD-BLP4-400 + 1000 100d Nytro NWD-BFH6-1200 + 1000 100e Nytro NWD-BFH8-1600 + 1000 107e Nytro NWD-BFH8-3200 + 1000 1310 Nytro XP6302-8B1536 + 1000 1311 Nytro XP6302-8B2048 + 1000 1314 Nytro XP6302-8B4096 + 1000 150c Nytro XP6210-4A2048 + 1000 150f Nytro XP6210-4B2048 + 1000 160b Nytro XP6209-4A1024 + 1000 1613 Nytro XP6209-4B2048 + 108e 050a Nytro ELP4x200_4d_n + 108e 0581 Nytro ELP4x100_4d_n + 0080 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0081 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0082 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0083 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0084 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0085 SAS2208 PCI-Express Fusion-MPT SAS-2 + 0086 SAS2308 PCI-Express Fusion-MPT SAS-2 + 15d9 0690 Onboard MegaRAID SAS2208 [Thunderbolt] + 15d9 0691 Onboard SAS2308 PCI-Express Fusion-MPT SAS-2 + 0087 SAS2308 PCI-Express Fusion-MPT SAS-2 + 1000 3020 9207-8i SAS2.1 HBA + 1000 3030 SAS9207-4i4e + 1000 3040 9207-8e SAS2.1 HBA + 1000 3050 SAS9217-8i + 1000 3060 SAS9217-4i4e + 1014 0472 N2125 External Host Bus Adapter + 1014 047a N2115 Internal Host Bus Adapter + 1590 0041 H220i + 1590 0042 H221 / 9207-8e + 1590 0044 H220i + 1bd4 0009 6G SAS2308IR + 1bd4 000a 6G SAS2308IT + 8086 3000 RS25GB008 RAID Controller + 8086 3060 RS25FB044 RAID Controller + 8086 3516 RMS25JB080 RAID Controller + 8086 3517 RMS25JB040 RAID Controller + 8086 3518 RMS25KB080 RAID Controller + 8086 3519 RMS25KB040 RAID Controller + 8086 351a RMS25LB040 RAID Controller + 8086 351b RMS25LB080 RAID Controller + 008f 53c875J + 1092 8000 FirePort 40 SCSI Controller + 1092 8760 FirePort 40 Dual SCSI Host Adapter + 0090 SAS3108 PCI-Express Fusion-MPT SAS-3 + 0091 SAS3108 PCI-Express Fusion-MPT SAS-3 + 0094 SAS3108 PCI-Express Fusion-MPT SAS-3 + 0095 SAS3108 PCI-Express Fusion-MPT SAS-3 + 0096 SAS3004 PCI-Express Fusion-MPT SAS-3 + 0097 SAS3008 PCI-Express Fusion-MPT SAS-3 + 1000 3090 SAS9311-8i + 1000 30a0 SAS9300-8e + 1000 30e0 SAS9300-8i + 1000 3130 SAS 9300-16i + 1028 1f45 HBA330 Adapter + 1028 1f46 12Gbps HBA + 1028 1f53 HBA330 Mini + 1028 1fd2 HBA330 MX + 1028 1fd3 HBA330 MMZ +# Supermicro AOC-S3008L-L8e uses 0808 for their SAS3008 SAS controller + 15d9 0808 AOC-S3008L-L8e + 1bd4 0008 12G SAS3008IMR Onboard + 1bd4 000b 12G SAS3008IR + 1bd4 000c 12G SAS3008IT + 1bd4 0011 Inspur 12Gb 8i-3008 IT SAS HBA + 1bd4 0012 12Gb SAS3008IR UDM + 1bd4 001f 12G SAS3008IR Onboard + 1bd4 0020 12G SAS3008IT Onboard + 1bd4 0026 12G SAS3008IT RACK + 1bd4 0027 12G SAS3008IMR RACK + 1bd4 0028 12G SAS3008IR RACK + 00a5 Fusion-MPT 24GSAS/PCIe SAS40xx + 1000 4600 MegaRAID 9670W-16i Tri-Mode Storage Adapter + 1000 4610 MegaRAID 9670-24i Tri-Mode Storage Adapter + 1000 4620 MegaRAID 9660-16i Tri-Mode Storage Adapter + 1000 4630 MegaRAID 9660-8i8e Tri-Mode Storage Adapter + 1000 4640 eHBA 9600W-16i Tri-Mode Storage Adapter + 1000 4650 eHBA 9600W-16e Tri-Mode Storage Adapter + 1000 4660 eHBA 9600-24i Tri-Mode Storage Adapter + 1000 4670 eHBA 9600-16i Tri-Mode Storage Adapter + 1000 4680 eHBA 9600-16e Tri-Mode Storage Adapter + 1000 4690 MegaRAID 9620-16i Tri-Mode Storage Adapter + 1000 46a0 MegaRAID 9660-24i Tri-Mode Storage Adapter + 1000 46c0 eHBA 9680W-16e Tri-Mode Storage Adapter + 1000 46d0 eHBA 9600-8i8e Tri-Mode Storage Adapter + 1028 2114 PERC H965i Adapter + 1028 2115 PERC H965i Front + 1028 2117 PERC H965i MX + 1028 213a PERC H965e Adapter + 1028 213b PERC H765i Adapter + 1028 213c PERC H765i Front + 1028 213d PERC H765N Front + 1028 213e PERC H765i MX + 1028 213f PERC H365i Adapter + 1028 2140 PERC H365i Front + 1028 2141 PERC H365i MX + 1028 2142 HBA465e Adapter + 1028 2209 HBA465i Adapter + 1028 220a HBA465i Front + 00ab SAS3516 Fusion-MPT Tri-Mode RAID On Chip (ROC) +# 8 Internal and 8 External port channel 9400 HBA + 1000 3040 HBA 9400-8i8e + 8086 3530 Integrated RAID Module RMSP3JD160J + 00ac SAS3416 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) +# Channel 16 internal port HBA + 1000 3000 HBA 9400-16i +# Channel 16 external port HBA + 1000 3020 HBA 9400-16e + 1028 1fe3 HBA345 Adapter + 1028 1fe4 HBA345 Front + 1d49 0201 ThinkSystem 430-16i SAS/SATA 12Gb HBA + 1d49 0203 ThinkSystem 430-16e SAS/SATA 12Gb HBA + 8086 3000 RAID Controller RSP3QD160J + 8086 3020 RAID Controller RSP3GD016J + 00ae SAS3508 Fusion-MPT Tri-Mode RAID On Chip (ROC) + 00af SAS3408 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) + 1000 3010 HBA 9400-8i +# 9400 Channel 8 external port HBA + 1000 3030 HBA 9400-8e + 1d49 0200 ThinkSystem 430-8i SAS/SATA 12Gb HBA + 1d49 0202 ThinkSystem 430-8e SAS/SATA 12Gb HBA + 1d49 0204 ThinkSystem 430-8i SAS/SATA 12Gb Dense HBA + 00b2 PCIe Switch management endpoint + 1d49 0003 ThinkSystem 1611-8P PCIe Gen4 NVMe Switch Adapter + 00be SAS3504 Fusion-MPT Tri-Mode RAID On Chip (ROC) + 00bf SAS3404 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) + 00c0 SAS3324 PCI-Express Fusion-MPT SAS-3 + 00c1 SAS3324 PCI-Express Fusion-MPT SAS-3 + 00c2 SAS3324 PCI-Express Fusion-MPT SAS-3 + 00c3 SAS3324 PCI-Express Fusion-MPT SAS-3 + 00c4 SAS3224 PCI-Express Fusion-MPT SAS-3 +# SAS 9305 16 internal port HBA + 1000 3190 SAS9305-16i +# SAS 9305 24 internal port HBA + 1000 31a0 SAS9305-24i + 1170 0002 SAS3224 PCI Express to 12Gb HBA MEZZ CARD + 00c5 SAS3316 PCI-Express Fusion-MPT SAS-3 + 00c6 SAS3316 PCI-Express Fusion-MPT SAS-3 + 00c7 SAS3316 PCI-Express Fusion-MPT SAS-3 + 00c8 SAS3316 PCI-Express Fusion-MPT SAS-3 + 00c9 SAS3216 PCI-Express Fusion-MPT SAS-3 +# 9305 16 external port SAS HBA + 1000 3180 SAS9305-16e + 00ce MegaRAID SAS-3 3316 [Intruder] + 1000 9371 MegaRAID SAS 9361-16i + 1000 9390 MegaRAID SAS 9380-8i8e + 00cf MegaRAID SAS-3 3324 [Intruder] + 1000 9370 MegaRAID SAS 9361-24i + 00d0 SAS3716 Fusion-MPT Tri-Mode RAID Controller Chip (ROC) +# 9405W 16 internal port channel HBA + 1000 3050 HBA 9405W-16i +# 9405W 8 internal and 8 external port channel HBA + 1000 3070 HBA 9405W-8i8e + 00d1 SAS3616 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) +# 9405W 16 external port Channel HBA + 1000 3080 HBA 9405W-16e +# 9405W 16 internal port Channel HBA + 1000 3090 HBA 9405W-16i + 00d3 MegaRAID Tri-Mode SAS3716W + 00e0 Fusion-MPT 12GSAS/PCIe Unsupported SAS39xx + 00e1 Fusion-MPT 12GSAS/PCIe SAS39xx + 00e2 Fusion-MPT 12GSAS/PCIe Secure SAS39xx + 00e3 Fusion-MPT 12GSAS/PCIe Unsupported SAS39xx + 00e4 Fusion-MPT 12GSAS/PCIe Unsupported SAS38xx +# Invalid part + 1028 200b HBA355i Adapter Invalid +# Invalid part + 1028 200c HBA355i Front Invalid +# Invalid part + 1028 200d HBA355e Adapter Invalid +# Invalid part + 1028 200e HBA350i MX Invalid +# Soft Secure + 00e5 Fusion-MPT 12GSAS/PCIe SAS38xx +# Soft Secure + 1028 200b HBA355i Adapter +# Soft Secure + 1028 200c HBA355i Front +# Soft Secure + 1028 200d HBA355e Adapter +# Soft Secure + 1028 200e HBA350i MX + 1d49 0205 ThinkSystem 440-16i SAS/SATA PCIe Gen4 12Gb Internal HBA + 1d49 0206 ThinkSystem 440-16e SAS/SATA PCIe Gen4 12Gb HBA + 00e6 Fusion-MPT 12GSAS/PCIe Secure SAS38xx + 1000 4050 9500-16i Tri-Mode HBA + 1000 4060 9500-8i Tri-Mode HBA + 1000 4070 9500-16e Tri-Mode HBA + 1000 4080 9500-8e Tri-Mode HBA + 1028 200b HBA355i Adapter + 1028 200c HBA355i Front + 1028 200d HBA355e Adapter + 1028 200e HBA350i MX + 1028 2170 HBA350i MM + 1028 2175 HBA350i Adapter + 1028 2197 HBA350i MM LP + 1d49 0205 ThinkSystem 440-16i SAS/SATA PCIe Gen4 12Gb Internal HBA + 1d49 0206 ThinkSystem 440-16e SAS/SATA PCIe Gen4 12Gb HBA + 1d49 0207 ThinkSystem 440-8i SAS/SATA PCIe Gen4 12Gb HBA + 1d49 0208 ThinkSystem 440-16i SAS/SATA PCIe Gen4 12Gb HBA + 1d49 0209 ThinkSystem 440-8e SAS/SATA PCIe Gen4 12Gb HBA + 8086 4050 Storage Controller RS3P4QF160J + 8086 4070 Storage Controller RS3P4GF016J + 00e7 Fusion-MPT 12GSAS/PCIe Unsupported SAS38xx +# Tampered part + 1028 200b HBA355i Adapter Tampered +# Tampered part + 1028 200c HBA355i Front Tampered +# Tampered part + 1028 200d HBA355e Adapter Tampered +# Tampered part + 1028 200e HBA350i MX Tampered + 02b0 Virtual Endpoint on PCIe Switch + 1d49 0001 ThinkSystem 1610-4P NVMe Switch Adapter + 1d49 0002 ThinkSystem 810-4P NVMe Switch Adapter + 02b1 Virtual Endpoint on PCIe Switch (9749) + 1d49 0004 ThinkSystem 1610-8P NVMe Switch Adapter + 0407 MegaRAID + 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller + 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller + 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller + 1028 0531 PowerEdge Expandable RAID Controller 4/QC + 1028 0533 PowerEdge Expandable RAID Controller 4/QC + 8086 0530 MegaRAID Intel RAID Controller SRCZCRX + 8086 0532 MegaRAID Intel RAID Controller SRCU42X + 0408 MegaRAID + 1000 0001 MegaRAID SCSI 320-1E RAID Controller + 1000 0002 MegaRAID SCSI 320-2E RAID Controller + 1025 004d MegaRAID ACER ROMB-2E RAID Controller + 1028 0001 PowerEdge RAID Controller PERC4e/SC + 1028 0002 PowerEdge RAID Controller PERC4e/DC + 1028 0012 PowerEdge RAID Controller RAC4 + 1028 0015 PowerEdge RAID Controller PERC5 + 1028 1f03 PowerEdge RAID Controller PERC5 + 1734 1065 FSC MegaRAID PCI Express ROMB + 8086 0002 MegaRAID Intel RAID Controller SRCU42E + 8086 3449 MegaRAID Intel RAID Controller SROMBU + 0409 MegaRAID + 1000 3004 MegaRAID SATA 300-4X RAID Controller + 1000 3008 MegaRAID SATA 300-8X RAID Controller + 8086 3008 MegaRAID RAID Controller SRCS28X + 8086 3431 MegaRAID RAID Controller Alief SROMBU42E + 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E + 0411 MegaRAID SAS 1068 + 1000 1001 MegaRAID SAS 8408E + 1000 1002 MegaRAID SAS 8480E + 1000 1003 MegaRAID SAS 8344ELP + 1000 1004 MegaRAID SAS 8308ELP + 1000 1008 MegaRAID SAS 84016E + 1000 100c MegaRAID SATA 300-12E + 1000 100d MegaRAID SATA 300-16E + 1000 2004 MegaRAID SATA 300-8ELP + 1000 2005 MegaRAID SATA 300-4ELP + 1033 8287 MegaRAID SAS PCI Express ROMB + 1054 3016 MegaRAID SAS RoMB Server + 1734 1081 MegaRAID SAS PCI Express ROMB + 1734 10a3 MegaRAID SAS PCI Express ROMB + 8086 1001 RAID Controller SRCSAS18E + 8086 1003 RAID Controller SRCSAS144E + 8086 3500 SROMBSAS18E RAID Controller + 8086 3501 SROMBSAS18E RAID Controller + 8086 3504 SROMBSAS18E RAID Controller + 0413 MegaRAID SAS 1068 [Verde ZCR] + 1000 1005 MegaRAID SAS 8300XLP + 0621 FC909 Fibre Channel Adapter + 0622 FC929 Fibre Channel Adapter + 1000 1020 44929 O Dual Fibre Channel card + 0623 FC929 LAN + 0624 FC919 Fibre Channel Adapter + 0625 FC919 LAN + 0626 FC929X Fibre Channel Adapter + 1000 1010 7202-XP-LC Dual Fibre Channel card + 0627 FC929X LAN + 0628 FC919X Fibre Channel Adapter + 0629 FC919X LAN + 0640 FC949X Fibre Channel Adapter + 0642 FC939X Fibre Channel Adapter + 0646 FC949ES Fibre Channel Adapter + 0701 83C885 NT50 DigitalScape Fast Ethernet + 0702 Yellowfin G-NIC gigabit ethernet + 1318 0000 PEI100X + 0804 SA2010 + 0805 SA2010ZC + 0806 SA2020 + 0807 SA2020ZC + 0901 61C102 + 1000 63C815 + 10e0 MegaRAID 12GSAS/PCIe Unsupported SAS39xx + 1028 1ae0 PERC H755 Adapter - Invalid Device + 1028 1ae1 PERC H755 Front - Invalid Device + 1028 1ae2 PERC H755N Front - Invalid Device + 1028 1ae3 PERC H755 MX - Invalid Device + 10e1 MegaRAID 12GSAS/PCIe SAS39xx + 1028 1ae0 PERC H755 Adapter + 1028 1ae1 PERC H755 Front + 1028 1ae2 PERC H755N Front + 1028 1ae3 PERC H755 MX + 1d49 060a ThinkSystem RAID 940-8i 4GB Flash PCIe Gen4 12Gb Adapter + 1d49 060b ThinkSystem RAID 940-8i 8GB Flash PCIe Gen4 12Gb Adapter + 1d49 060c ThinkSystem RAID 940-16i 8GB Flash PCIe Gen4 12Gb Adapter + 1d49 060d ThinkSystem RAID 940-16i 8GB Flash PCIe Gen4 12Gb Internal Adapter + 1d49 060e ThinkSystem RAID 940-32i 8GB Flash PCIe Gen4 12Gb Adapter + 1d49 060f ThinkSystem RAID 940-8e 4GB Flash PCIe Gen4 12Gb Adapter + 10e2 MegaRAID 12GSAS/PCIe Secure SAS39xx +# 9560 16 internal port RAID controller + 1000 4000 MegaRAID 9560-16i +# 9561 16 internal port RAID controller + 1000 4002 MegaRAID 9561-16i +# 9560 8 internal port RAID controller + 1000 4010 MegaRAID 9560-8i +# 9580 8 internal & 8 external port RAID controller + 1000 4020 MegaRAID 9580-8i8e +# MegaRAID 9562-16i 9562 16 internal port RAID controller + 1000 40b0 MegaRAID 9562-16i + 1028 1ae0 PERC H755 Adapter + 1028 1ae1 PERC H755 Front + 1028 1ae2 PERC H755N Front + 1028 1ae3 PERC H755 MX + 1028 2171 PERC H750 Mini + 1028 2176 PERC H750 Adapter + 1d49 060a ThinkSystem RAID 940-8i 4GB Flash PCIe Gen4 12Gb Adapter + 1d49 060b ThinkSystem RAID 940-8i 8GB Flash PCIe Gen4 12Gb Adapter + 1d49 060c ThinkSystem RAID 940-16i 8GB Flash PCIe Gen4 12Gb Adapter + 1d49 060d ThinkSystem RAID 940-16i 8GB Flash PCIe Gen4 12Gb Internal Adapter + 1d49 060e ThinkSystem RAID 940-32i 8GB Flash PCIe Gen4 12Gb Adapter + 1d49 060f ThinkSystem RAID 940-8e 4GB Flash PCIe Gen4 12Gb Adapter + 1d49 0610 ThinkSystem RAID 940-16i 4GB Flash PCIe Gen4 12Gb Adapter + 8086 4000 RAID Controller RS3P4TF160F + 8086 4020 RAID Controller RS3P4MF088F + 10e3 MegaRAID 12GSAS/PCIe Unsupported SAS39xx + 1028 1ae0 PERC H755 Adapter - Tampered Device + 1028 1ae1 PERC H755 Front - Tampered Device + 1028 1ae2 PERC H755N Front - Tampered Device + 1028 1ae3 PERC H755 MX - Tampered Device + 10e4 MegaRAID 12GSAS/PCIe Unsupported SAS38xx + 10e5 MegaRAID 12GSAS/PCIe SAS38xx + 10e6 MegaRAID 12GSAS/PCIe Secure SAS38xx + 1028 2172 PERC H355 Adapter + 1028 2173 PERC H355 Front + 1028 2174 PERC H350 Mini + 1028 2177 PERC H350 Adapter + 1028 2199 PERC H350 Mini LP + 1d49 0505 ThinkSystem RAID 540-8i PCIe Gen4 12Gb Adapter + 1d49 0506 ThinkSystem RAID 540-16i PCIe Gen4 12Gb Adapter + 10e7 MegaRAID 12GSAS/PCIe Unsupported SAS38xx + 1960 MegaRAID + 1000 0518 MegaRAID 518 SCSI 320-2 Controller + 1000 0520 MegaRAID 520 SCSI 320-1 Controller + 1000 0522 MegaRAID 522 i4 133 RAID Controller + 1000 0523 MegaRAID SATA 150-6 RAID Controller + 1000 4523 MegaRAID SATA 150-4 RAID Controller + 1000 a520 MegaRAID ZCR SCSI 320-0 Controller + 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller + 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller + 1028 0531 PowerEdge Expandable RAID Controller 4/QC + 1028 0533 PowerEdge Expandable RAID Controller 4/QC + 8086 0520 MegaRAID RAID Controller SRCU41L + 8086 0523 MegaRAID RAID Controller SRCS16 + 3050 SAS2008 PCI-Express Fusion-MPT SAS-2 + 6001 DX1 Multiformat Broadcast HD/SD Encoder/Decoder + c010 PEX88048 50 lane, 50 port, PCI Express Gen 4.0 ExpressFabric Platform + c012 PEX880xx PCIe Gen 4 Switch + 1d49 0003 ThinkSystem 1611-8P PCIe Gen4 NVMe Switch Adapter + c030 PEX890xx PCIe Gen 5 Switch +1001 Kolter Electronic + 0010 PCI 1616 Measurement card with 32 digital I/O lines + 0011 OPTO-PCI Opto-Isolated digital I/O board + 0012 PCI-AD/DA Analogue I/O board + 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs + 0014 PCI-Counter/Timer Counter Timer board + 0015 PCI-DAC416 Analogue output board + 0016 PCI-MFB Analogue I/O board + 0017 PROTO-3 PCI Prototyping board + 9100 INI-9100/9100W SCSI Host +# nee ATI Technologies, Inc. +1002 Advanced Micro Devices, Inc. [AMD/ATI] + 1304 Kaveri + 1305 Kaveri + 1306 Kaveri + 1307 Kaveri + 1308 Kaveri HDMI/DP Audio Controller + 17aa 3988 Z50-75 + 1309 Kaveri [Radeon R6/R7 Graphics] + 17aa 3830 Z50-75 + 130a Kaveri [Radeon R6 Graphics] + 130b Kaveri [Radeon R4 Graphics] + 130c Kaveri [Radeon R7 Graphics] + 130d Kaveri [Radeon R6 Graphics] + 130e Kaveri [Radeon R5 Graphics] + 130f Kaveri [Radeon R7 Graphics] + 1310 Kaveri + 1311 Kaveri + 1312 Kaveri + 1313 Kaveri [Radeon R7 Graphics] + 1314 Wrestler HDMI Audio + 174b 1001 PURE Fusion Mini + 1315 Kaveri [Radeon R5 Graphics] + 1316 Kaveri [Radeon R5 Graphics] + 1317 Kaveri + 1318 Kaveri [Radeon R5 Graphics] + 131b Kaveri [Radeon R4 Graphics] + 131c Kaveri [Radeon R7 Graphics] + 131d Kaveri [Radeon R6 Graphics] + 13e9 Ariel + 13fe Cyan Skillfish [BC-250] + 1478 Navi 10 XL Upstream Port of PCI Express Switch + 1479 Navi 10 XL Downstream Port of PCI Express Switch + 1506 Mendocino + 154c Kryptos [Radeon RX 350] + 1462 7c28 MS-7C28 Motherboard + 154e Garfield + 1551 Arlene + 1552 Pooky + 1561 Anubis + 15bf Phoenix + 15d8 Picasso/Raven 2 [Radeon Vega Series / Radeon Vega Mobile Series] + 103c 8615 Pavilion Laptop 15-cw1xxx + 17aa 3181 ThinkCentre M75n IoT + 17aa 5124 ThinkPad E595 + ea50 cc10 RXi2-BP + 15dd Raven Ridge [Radeon Vega Series / Radeon Vega Mobile Series] + 103c 83c6 Radeon Vega 8 Mobile + 1043 876b PRIME Motherboard + 1458 d000 Radeon RX Vega 11 + ea50 cc10 RXi2-BP + 15de Raven/Raven2/Fenghuang HDMI/DP Audio Controller + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME B450M-A Motherboard + 17aa 5124 ThinkPad E595 + ea50 cc10 RXi2-BP + 15df Raven/Raven2/Fenghuang/Renoir Cryptographic Coprocessor + 103c 8615 Pavilion Laptop 15-cw1xxx + ea50 ce19 mCOM10-L1900 + 15e7 Barcelo + 15ff Fenghuang [Zhongshan Subor Z+] + 1607 Arden + 1636 Renoir + 1637 Renoir Radeon High Definition Audio Controller + 1638 Cezanne +# Used in the Steam Deck + 163f VanGogh [AMD Custom GPU 0405] + 1640 Rembrandt Radeon High Definition Audio Controller + 164c Lucienne + 164d Rembrandt + 164f Phoenix + 1681 Rembrandt [Radeon 680M] + 1714 BeaverCreek HDMI Audio [Radeon HD 6500D and 6400G-6600G series] + 103c 168b ProBook 4535s + 3150 RV380/M24 [Mobility Radeon X600] + 103c 0934 nx8220 + 3151 RV380 GL [FireMV 2400] + 3152 RV370/M22 [Mobility Radeon X300] + 3154 RV380/M24 GL [Mobility FireGL V3200] + 3155 RV380 GL [FireMV 2400] + 3171 RV380 GL [FireMV 2400] (Secondary) + 3e50 RV380 [Radeon X550/X600] + 3e54 RV380 GL [FireGL V3200] + 3e70 RV380 [Radeon X550/X600] (Secondary) + 4136 RS100 [Mobility IGP 320M] + 4137 RS200 [Radeon IGP 340] + 4144 R300 [Radeon 9500] + 4146 R300 [Radeon 9700 PRO] + 4147 R300 GL [FireGL Z1] + 4148 R350 [Radeon 9800/9800 SE] + 4150 RV350 [Radeon 9550/9600/X1050 Series] + 1002 0002 R9600 Pro primary (Asus OEM for HP) + 1002 0003 R9600 Pro secondary (Asus OEM for HP) + 1002 4722 All-in-Wonder 2006 AGP Edition + 1458 4024 GV-R96128D + 148c 2064 R96A-C3N + 148c 2066 R96A-C3N + 174b 7c19 Atlantis Radeon 9600 Pro + 174b 7c29 GC-R9600PRO + 17ee 2002 Radeon 9600 256Mb Primary + 18bc 0101 GC-R9600PRO (Primary) + 4151 RV350 [Radeon 9600 Series] + 1043 c004 A9600SE + 174b 7c37 Radeon 9600SE 128M DDR V/D/VO + 4152 RV360 [Radeon 9600/X1050 Series] + 1002 0002 Radeon 9600XT + 1002 4772 All-in-Wonder 9600 XT + 1043 c002 Radeon 9600 XT TVD + 1043 c01a A9600XT/TD + 1462 9510 RX9600XT (MS-8951) + 174b 7c29 Radeon 9600XT + 1787 4002 Radeon 9600 XT + 4153 RV350 [Radeon 9550] + 1043 010c A9550GE/TD + 1462 932c RX9550SE-TD128 (MS-8932) + 4154 RV350 GL [FireGL T2] + 4155 RV350 [Radeon 9600] + 4157 RV350 GL [FireGL T2] + 4158 68800AX [Graphics Ultra Pro PCI] + 4164 R300 [Radeon 9500 PRO] (Secondary) + 4165 R300 [Radeon 9700 PRO] (Secondary) + 4166 R300 [Radeon 9700 PRO] (Secondary) + 4168 RV350 [Radeon 9800 SE] (Secondary) + 4170 RV350 [Radeon 9550/9600/X1050 Series] (Secondary) + 1002 0003 R9600 Pro secondary (Asus OEM for HP) + 1002 4723 All-in-Wonder 2006 AGP Edition (Secondary) + 1458 4025 GV-R96128D (Secondary) + 148c 2067 R96A-C3N (Secondary) + 174b 7c28 GC-R9600PRO (Secondary) + 17ee 2003 Radeon 9600 256Mb (Secondary) + 18bc 0100 GC-R9600PRO (Secondary) + 4171 RV350 [Radeon 9600] (Secondary) + 1043 c005 A9600SE (Secondary) + 174b 7c36 Radeon 9600SE 128M DDR V/D/VO (secondary) + 4172 RV350 [Radeon 9600/X1050 Series] (Secondary) + 1002 0003 Radeon 9600XT (Secondary) + 1002 4773 All-in-Wonder 9600 XT (Secondary) + 1043 c003 A9600XT (Secondary) + 1043 c01b A9600XT/TD (Secondary) + 174b 7c28 Radeon 9600XT (Secondary) + 1787 4003 Radeon 9600 XT (Secondary) + 4173 RV350 [Radeon 9550] (Secondary) + 1043 010d A9550GE/TD (Secondary) + 4242 R200 [All-In-Wonder Radeon 8500 DV] + 1002 02aa Radeon 8500 AIW DV Edition + 4243 R200 PCI Bridge [All-in-Wonder Radeon 8500DV] + 4336 RS100 [Radeon IGP 320M] + 1002 4336 Pavilion ze4300 ATI Radeon Mobility U1 (IGP 320 M) + 103c 0024 Pavilion ze4400 builtin Video + 161f 2029 eMachines M5312 builtin Video + 4337 RS200M [Radeon IGP 330M/340M/345M/350M] + 1014 053a ThinkPad R40e + 103c 0850 Radeon IGP 345M + 4341 SB200 AC97 Audio Controller + 4342 SB200 PCI to PCI Bridge + 4345 SB200 EHCI USB Controller + 4346 Crayola 6 [XENOS Parent Die (XBOX 360)] + 4347 SB200 OHCI USB Controller #1 + 4348 SB200 OHCI USB Controller #2 + 4349 SB200 IDE Controller + 434c SB200 PCI to LPC Bridge + 434d SB200 AC97 Modem Controller + 4353 SB200 SMBus Controller + 4354 215CT [Mach64 CT PCI] + 4358 Mach64 CX [Graphics Xpression] + 4361 SB300 AC'97 Audio Controller + 4362 SB300 PCI to PCI Bridge + 4363 SB300 SMBus Controller + 4365 SB300 USB Controller (EHCI) + 4367 SB300 USB Controller (EHCI) + 4368 SB300 USB Controller (EHCI) + 4369 SB300 IDE Controller + 436c SB300 PCI to LPC Bridge + 436d SB300 AC97 Modem Controller + 436e SB300 Serial ATA Controller + 4370 IXP SB400 AC'97 Audio Controller + 1025 0079 Aspire 5024WLMMi + 1025 0091 Aspire 5032WXMi + 103c 2a05 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 105b 0c81 Realtek ALC 653 + 107b 0300 MX6421 + 1462 0131 MS-1013 Notebook + 4371 IXP SB4x0 PCI-PCI Bridge + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4372 IXP SB4x0 SMBus Controller + 1025 0080 Aspire 5024WLMMi + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 1462 7217 Aspire L250 + 4373 IXP SB4x0 USB2 Host Controller + 1025 0080 Aspire 5024WLMMi + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4374 IXP SB4x0 USB Host Controller + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4375 IXP SB4x0 USB Host Controller + 1025 0080 Aspire 5024WLMMi + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4376 IXP SB4x0 IDE Controller + 1025 0080 Aspire 5024WLMMi + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 1462 7217 Aspire L250 + 4377 IXP SB4x0 PCI-ISA Bridge + 1025 0080 Aspire 5024WLMi + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 1462 7217 Aspire L250 + 4378 IXP SB400 AC'97 Modem Controller + 1025 0080 Aspire 5024WLMMi + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 4379 IXP SB4x0 Serial ATA Controller + 1462 7141 Aspire L250 + 437a IXP SB400 Serial ATA Controller + 1002 4379 4379 Serial ATA Controller + 1002 437a 437A Serial ATA Controller + 1462 7141 Aspire L250 + 14f1 8800 Leadtek WinFast TV2000XP Expert + 437b IXP SB4x0 High Definition Audio Controller + 1002 437b IXP SB4x0 High Definition Audio Controller + 10cf 1326 Fujitsu Lifebook A3040 + 1734 10b8 Realtek High Definition Audio + 4380 SB600 Non-Raid-5 SATA + 103c 2813 DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1458 b003 GA-MA790FX-DS5 (rev. 1.0) + 1458 b005 Gigabyte GA-MA69G-S3H Motherboard + 1462 7327 K9AG Neo2 + 17f2 5999 KI690-AM2 Motherboard + 4381 SB600 SATA Controller (RAID 5 mode) + 4382 SB600 AC97 Audio + 4383 SBx00 Azalia (Intel HDA) + 1019 2120 A785GM-M + 103c 1611 Pavilion dm1z-3000 + 103c 280a DC5750 Microtower + 1043 8230 M3A78-EH Motherboard + 1043 836c M4A785TD Motherboard + 1043 8410 M4A89GTD PRO/USB3 Motherboard + 1043 841b M5A88-V EVO + 1043 8445 M5A78L LE + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1179 ff50 Satellite P305D-S8995E + 1458 a022 GA-MA770-DS3rev2.0 Motherboard + 1458 a102 GA-880GMA-USB3 + 1462 7596 760GM-E51(MS-7596) Motherboard + 17f2 5000 KI690-AM2 Motherboard + 4384 SBx00 PCI to PCI Bridge + 4385 SBx00 SMBus Controller + 1019 2120 A785GM-M + 103c 1611 Pavilion DM1Z-3000 + 103c 280a DC5750 Microtower + 1043 82ef M3A78-EH Motherboard + 1043 8389 M4A785TD Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1179 ff50 Satellite P305D-S8995E + 1458 4385 GA-MA770-DS3rev2.0 Motherboard + 1462 7368 K9AG Neo2 + 1462 7596 760GM-E51(MS-7596) Motherboard + 15d9 a811 H8DGU + 174b 1001 PURE Fusion Mini + 17f2 5000 KI690-AM2 Motherboard + 4386 SB600 USB Controller (EHCI) + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 4387 SB600 USB (OHCI0) + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 4388 SB600 USB (OHCI1) + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 4389 SB600 USB (OHCI2) + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438a SB600 USB (OHCI3) + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438b SB600 USB (OHCI4) + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438c SB600 IDE + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1458 5002 Gigabyte GA-MA69G-S3H Motherboard + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438d SB600 PCI to LPC Bridge + 103c 280a DC5750 Microtower + 1179 ff50 Satellite P305D-S8995E + 1462 7368 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 438e SB600 AC97 Modem + 4390 SB7x0/SB8x0/SB9x0 SATA Controller [IDE mode] + 1043 82ef M3A78-EH Motherboard + 1043 8389 M4A785TD Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1458 b002 GA-MA770-DS3rev2.0 Motherboard + 1462 7596 760GM-E51(MS-7596) Motherboard + 1849 4390 Motherboard (one of many) + 4391 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] + 103c 1609 ProLiant MicroServer N36L + 103c 1611 Pavilion DM1Z-3000 + 1043 82ef M3A78-EH Motherboard + 1043 8443 M5A88-V EVO + 1043 84dd M5A99X EVO (R1.0) SB950 + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1458 b002 GA-880GMA-USB3 + 174b 1001 PURE Fusion Mini + 4392 SB7x0/SB8x0/SB9x0 SATA Controller [Non-RAID5 mode] + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 4393 SB7x0/SB8x0/SB9x0 SATA Controller [RAID5 mode] + 4394 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] + 4395 SB8x0/SB9x0 SATA Controller [Storage mode] + 4396 SB7x0/SB8x0/SB9x0 USB EHCI Controller + 1019 2120 A785GM-M + 103c 1609 ProLiant MicroServer N36L + 103c 1611 Pavilion DM1Z-3000 + 1043 82ef M3A78-EH Motherboard + 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1458 5004 GA-880GMA-USB3 + 1462 7596 760GM-E51(MS-7596) Motherboard + 15d9 a811 H8DGU + 174b 1001 PURE Fusion Mini + 4397 SB7x0/SB8x0/SB9x0 USB OHCI0 Controller + 1019 2120 A785GM-M + 103c 1609 ProLiant MicroServer N36L + 103c 1611 Pavilion DM1Z-3000 + 1043 82ef M3A78-EH Motherboard + 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1458 5004 GA-880GMA-USB3 + 1462 7596 760GM-E51(MS-7596) Motherboard + 15d9 a811 H8DGU + 174b 1001 PURE Fusion Mini + 4398 SB7x0 USB OHCI1 Controller + 1019 2120 A785GM-M + 1043 82ef M3A78-EH Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1462 7596 760GM-E51(MS-7596) Motherboard + 15d9 a811 H8DGU + 4399 SB7x0/SB8x0/SB9x0 USB OHCI2 Controller + 1019 2120 A785GM-M + 1043 82ef M3A78-EH Motherboard + 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1458 5004 GA-880GMA-USB3 + 1462 7596 760GM-E51(MS-7596) Motherboard + 174b 1001 PURE Fusion Mini + 439c SB7x0/SB8x0/SB9x0 IDE Controller + 1002 4392 MSI MS-7713 motherboard + 1019 2120 A785GM-M + 103c 1609 ProLiant MicroServer N36L + 1043 82ef M3A78-EH Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1462 7596 760GM-E51(MS-7596) Motherboard + 439d SB7x0/SB8x0/SB9x0 LPC host controller + 1019 2120 A785GM-M + 103c 1609 ProLiant MicroServer N36L + 103c 1611 Pavilion DM1Z-3000 + 1043 82ef M3A78-EH Motherboard + 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 + 1462 7596 760GM-E51(MS-7596) Motherboard + 174b 1001 PURE Fusion Mini + 43a0 SB700/SB800/SB900 PCI to PCI bridge (PCIE port 0) + 43a1 SB700/SB800/SB900 PCI to PCI bridge (PCIE port 1) + 43a2 SB900 PCI to PCI bridge (PCIE port 2) + 43a3 SB900 PCI to PCI bridge (PCIE port 3) + 4437 RS250 [Mobility Radeon 7000 IGP] + 4554 210888ET [Mach64 ET] + 4630 XENOS Parent Die (XBOX 360) + 4631 XENOS Daughter Die (XBOX 360) + 4654 Mach64 VT + 4742 Rage 3 [3D Rage PRO AGP 2X] + 1002 0040 Rage Pro Turbo AGP 2X + 1002 0044 Rage Pro Turbo AGP 2X + 1002 0061 Rage Pro AIW AGP 2X + 1002 0062 Rage Pro AIW AGP 2X + 1002 0063 Rage Pro AIW AGP 2X + 1002 0080 Rage Pro Turbo AGP 2X + 1002 0084 Rage Pro Turbo AGP 2X + 1002 4742 Rage Pro Turbo AGP 2X + 1002 8001 Rage Pro Turbo AGP 2X + 1028 0082 Rage Pro Turbo AGP 2X + 1028 4082 Optiplex GX1 Onboard Display Adapter + 1028 8082 Rage Pro Turbo AGP 2X + 1028 c082 Rage Pro Turbo AGP 2X + 8086 4152 Xpert 98D AGP 2X + 8086 464a Rage Pro Turbo AGP 2X + 4744 Rage 3 [3D Rage PRO AGP 1X] + 1002 4744 Rage Pro Turbo AGP + 8086 4d55 Rage 3D Pro AGP 1X [Intel MU440EX] + 4749 3D Rage PRO PCI + 1002 0061 Rage Pro AIW + 1002 0062 Rage Pro AIW + 474d Rage XL AGP 2X + 1002 0004 Xpert 98 RXL AGP 2X + 1002 0008 Xpert 98 RXL AGP 2X + 1002 0080 Rage XL AGP 2X + 1002 0084 Xpert 98 AGP 2X + 1002 474d Rage XL AGP + 1033 806a Rage XL AGP + 474e Rage XC AGP + 1002 474e Rage XC AGP + 474f Rage XL + 1002 0008 Rage XL + 1002 474f Rage XL + 4750 3D Rage Pro PCI + 1002 0040 Rage Pro Turbo + 1002 0044 Rage Pro Turbo + 1002 0080 Rage Pro Turbo + 1002 0084 Rage Pro Turbo + 1002 4750 Rage Pro Turbo + 4752 Rage 3 [Rage XL PCI] + 0e11 001e Proliant Rage XL + 1002 0008 Rage XL + 1002 4752 Proliant Rage XL + 1002 8008 Rage XL + 1014 0240 eServer xSeries server mainboard + 1028 00ce PowerEdge 1400 + 1028 00d1 PowerEdge 2550 + 1028 00d9 PowerEdge 2500 + 1028 0134 PowerEdge 600SC + 1028 014a PowerEdge 1750 + 1028 0165 PowerEdge 750 + 103c 10e1 NetServer Rage XL + 103c 3208 ProLiant DL140 G2 + 107b 6400 6400 Server + 1734 007a PRIMERGY RX/TX series onboard VGA + 1734 1073 Primergy Econel 200 D2020 mainboard + 8086 3411 SDS2 Mainboard + 8086 3427 S875WP1-E mainboard + 8086 5744 S845WD1-E mainboard + 4753 Rage XC + 1002 4753 Rage XC + 4754 Mach64 GT/GT-B [3D Rage I/II] + 4755 Mach64 GT-B [3D Rage II+ DVD] + 4756 Rage 2 [3D Rage IIC PCI] + 1002 4756 Rage IIC + 4757 Rage 2 [3D Rage IIC AGP] + 1002 4757 Rage IIC AGP + 1028 0089 Rage 3D IIC + 1028 008e PowerEdge 1300 onboard video + 1028 4082 Rage 3D IIC + 1028 8082 Rage 3D IIC + 1028 c082 Rage 3D IIC + 4758 Mach64 GX [WinTurbo] + 4759 Rage 3 [3D Rage IIC PCI] + 475a 3D Rage IIC AGP + 1002 0084 Rage 3D Pro AGP 2x XPERT 98 + 1002 0087 Rage 3D IIC + 1002 475a Rage IIC AGP + 4845 Xilleon 220 HBIU for HDTV2 + 4846 Xilleon 220 IDE for HDTV2 + 4847 Xilleon 220 USB for HDTV2 + 4848 Xilleon 220 DAIO-0 for HDTV2 + 4849 Xilleon 220 DAIO-1 for HDTV2 + 484a Xilleon 220 LPC for HDTV2 + 4850 Xilleon 215 HBIU for X215 + 4851 Xilleon 215 IDE for X215 + 4852 Xilleon 215 USB for X215 + 4853 Xilleon 215 DAIO-0 for X215 + 4854 Xilleon 215 DAIO-1 for X215 + 4855 Xilleon 225 HBIU for X225 + 4856 Xilleon 225 IDE for X225 + 4857 Xilleon 225 USB for X225 + 4858 Xilleon 225 DAIO-0 for X225 + 4859 Xilleon 225 DAIO-1 for X225 + 4860 Xilleon 210 HBIU for X210 + 4861 Xilleon 210 IDE for X210 + 4862 Xilleon 210 USB for X210 + 4863 Xilleon 210 DAIO-0 for X210 + 4864 Xilleon 210 DAIO-1 for X210 + 4865 Xilleon 226 HBIU for X226 + 4866 Xilleon 226 IDE for X226 + 4867 Xilleon 226 USB for X226 + 4868 Xilleon 226 DAIO-0 for X226 + 4869 Xilleon 226 DAIO-1 for X226 + 486a Xilleon 240S HBIU for X240S + 486b Xilleon 240H HBIU for X240H + 486c Xilleon 240S USB for X240S + 486d Xilleon 240H USB for X240H + 486e Xilleon 250 USB 1.1 for X250 + 486f Xilleon 260 USB 1.1 for X260 + 4870 Xilleon 250 HBIU for X250 + 4871 Xilleon 250 IDE for X250 + 4872 Xilleon 234/235 HBIU for X234/X235 + 4873 Xilleon 244/245 HBIU for X244/X245 + 4874 Xilleon 234/235 USB 1.1 for X234/X235 + 4875 Xilleon 260 HBIU for X260 + 4876 Xilleon 260 IDE for X260 + 4877 Xilleon 244/245 USB 1.1 for X244/X245 + 4878 Xilleon 270 HBIU for X270 + 487b Xilleon 242 HBIU for X242 + 487d Xilleon 242 USB 1.1 for X242 + 4880 Xilleon 254 HBIU for X254 + 4881 Xilleon 254 USB 1.1 for X254 + 4882 Xilleon 255 HBIU for X255 + 4883 Xilleon 255 USB 1.1 for X255 + 4884 Xilleon 243 HBIU for X243 + 4885 Xilleon 243 USB 1.1 for X243 + 4886 Xilleon 233 HBIU for X233 + 4887 Xilleon 233 USB 1.1 for X233 + 4888 Xilleon 143 HBIU for X143 + 4889 Xilleon 143 HBIU for X143L + 488a Xilleon 143 HBIU for X143S + 4966 RV250 [Radeon 9000 Series] + 10f1 0002 RV250 If [Tachyon G9000 PRO] + 148c 2039 RV250 If [Radeon 9000 Pro "Evil Commando"] + 1509 9a00 RV250 If [Radeon 9000 "AT009"] + 1681 0040 RV250 If [3D prophet 9000] + 174b 7176 Radeon 9000 Pro + 174b 7192 RV250 If [Radeon 9000 "Atlantis"] + 17af 2005 RV250 If [Excalibur Radeon 9000 Pro] + 17af 2006 RV250 If [Excalibur Radeon 9000] + 496e RV250 [Radeon 9000] (Secondary) + 4a49 R420 [Radeon X800 PRO/GTO AGP] + 174b 2620 R420 [Radeon X800 GTO AGP] + 4a4a R420 [Radeon X800 GT AGP] + 4a4b R420 [Radeon X800 AGP Series] + 4a4d R420 GL [FireGL X3-256] + 4a4e RV420/M18 [Mobility Radeon 9800] + 4a4f R420 [Radeon X850 AGP] + 4a50 R420 [Radeon X800 XT Platinum Edition AGP] + 4a54 R420 [Radeon X800 VE AGP] + 1002 4422 All-In-Wonder X800 VE AGP + 4a69 R420 [Radeon X800 PRO/GTO] (Secondary) + 4a6a R420 [Radeon X800] (Secondary) + 4a6b R420 [Radeon X800 XT AGP] (Secondary) + 4a70 R420 [Radeon X800 XT Platinum Edition AGP] (Secondary) + 4a74 R420 [Radeon X800 VE] (Secondary) + 4b49 R481 [Radeon X850 XT AGP] + 4b4b R481 [Radeon X850 PRO AGP] + 4b4c R481 [Radeon X850 XT Platinum Edition AGP] + 4b69 R481 [Radeon X850 XT AGP] (Secondary) + 4b6b R481 [Radeon X850 PRO AGP] (Secondary) + 4b6c R481 [Radeon X850 XT Platinum Edition AGP] (Secondary) + 4c42 Mach64 LT [3D Rage LT PRO AGP] + 0e11 b0e7 Rage LT Pro (Compaq Presario 5240) + 0e11 b0e8 Rage 3D LT Pro + 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750) + 1002 0040 Rage LT Pro AGP 2X + 1002 0044 Rage LT Pro AGP 2X + 1002 4c42 Rage LT Pro AGP 2X + 1002 8001 Rage LT Pro AGP 2X + 1028 0085 Rage 3D LT Pro + 4c46 Rage Mobility 128 AGP 2X/Mobility M3 + 1002 0155 IBM Thinkpad A22p + 1014 0155 Thinkpad A22p + 1028 00b1 Latitude C600 + 4c47 3D Rage IIC PCI / Mobility Radeon 7500/7500C + 4c49 3D Rage LT PRO PCI + 1002 0004 Rage LT Pro + 1002 0040 Rage LT Pro + 1002 0044 Rage LT Pro + 1002 4c49 Rage LT Pro + 4c4d Rage Mobility AGP 2x Series + 0e11 b111 Armada M700 + 0e11 b160 Armada E500 + 1002 0084 Xpert 98 AGP 2X (Mobility) + 1014 0154 ThinkPad A20m/A21m + 1028 00aa Latitude CPt + 1028 00bb Latitude CPx + 1179 ff00 Satellite 1715XCDS laptop + 13bd 1019 PC-AR10 + 4c50 Rage 3 LT [3D Rage LT PRO PCI] + 1002 4c50 Rage LT Pro + 4c52 M1 [Rage Mobility-M1 PCI] + 1033 8112 Versa Note VXi + 4c54 264LT [Mach64 LT] + 4c57 RV200/M7 [Mobility Radeon 7500] + 1014 0517 ThinkPad T30 + 1014 0530 ThinkPad T4x Series + 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100) + 1028 012a Latitude C640 + 1043 1622 Mobility Radeon M7 (L3C/S) + 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4 + 4c58 RV200/M7 GL [Mobility FireGL 7800] + 4c59 RV100/M6 [Rage/Radeon Mobility Series] + 0e11 b111 Evo N600c + 1014 0235 ThinkPad A30/A30p (2652/2653) + 1014 0239 ThinkPad X22/X23/X24 + 103c 0025 XE4500 Notebook + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 104d 8140 PCG-Z1SP laptop + 1509 1930 Medion MD9703 + 4c66 RV250/M9 GL [Mobility FireGL 9000/Radeon 9000] + 1014 054d ThinkPad T41 + 4c6e RV250/M9 [Mobility Radeon 9000] (Secondary) + 4d46 Rage Mobility 128 AGP 4X/Mobility M4 + 4d52 Theater 550 PRO PCI [ATI TV Wonder 550] + 4d53 Theater 550 PRO PCIe + 4e44 R300 [Radeon 9700/9700 PRO] + 1002 515e Radeon ES1000 + 1002 5965 Radeon ES1000 + 4e45 R300 [Radeon 9500 PRO/9700] + 1002 0002 Radeon R300 NE [Radeon 9500 Pro] + 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] + 4e46 R300 [Radeon 9600 TX] + 4e47 R300 GL [FireGL X1] + 4e48 R350 [Radeon 9800 Series] + 4e49 R350 [Radeon 9800] + 4e4a R360 [Radeon 9800 XXL/XT] + 1002 4e4a R360 [Radeon 9800 XT] + 4e4b R350 GL [FireGL X2 AGP Pro] + 4e50 RV350/M10 / RV360/M11 [Mobility Radeon 9600 (PRO) / 9700] + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: ATI RV360/M11 [Mobility Radeon 9700] + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 144d c00c P35 notebook + 1462 0311 MSI M510A + 1734 1055 Amilo M1420W + 4e51 RV350 [Radeon 9550/9600/X1050 Series] + 4e52 RV350/M10 [Mobility Radeon 9500/9700 SE] + 144d c00c P35 notebook + 4e54 RV350/M10 GL [Mobility FireGL T2] + 4e56 RV360/M12 [Mobility Radeon 9550] + 4e64 R300 [Radeon 9700 PRO] (Secondary) + 4e65 R300 [Radeon 9500 PRO] (Secondary) + 1002 0003 Radeon R300 NE [Radeon 9500 Pro] + 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary) + 4e66 RV350 [Radeon 9600] (Secondary) + 4e67 R300 GL [FireGL X1] (Secondary) + 4e68 R350 [Radeon 9800 PRO] (Secondary) + 4e69 R350 [Radeon 9800] (Secondary) + 4e6a RV350 [Radeon 9800 XT] (Secondary) + 1002 4e6a R360 [Radeon 9800 XT] (Secondary) + 1002 4e71 M10 NQ [Radeon Mobility 9600] + 4e71 RV350/M10 [Mobility Radeon 9600] (Secondary) + 4f72 RV250 [Radeon 9000 Series] + 4f73 RV250 [Radeon 9000 Series] (Secondary) + 5044 All-In-Wonder 128 PCI + 1002 0028 Rage 128 AIW + 1002 0029 Rage 128 AIW + 5046 Rage 4 [Rage 128 PRO AGP 4X] + 1002 0004 Rage Fury Pro + 1002 0008 Rage Fury Pro/Xpert 2000 Pro + 1002 0014 Rage Fury Pro + 1002 0018 Rage Fury Pro/Xpert 2000 Pro + 1002 0028 Rage 128 Pro AIW AGP + 1002 002a Rage 128 Pro AIW AGP + 1002 0048 Rage Fury Pro + 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device) + 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!) + 5050 Rage 4 [Rage 128 PRO PCI / Xpert 128 PCI] + 1002 0008 Xpert 128 + 5052 Rage 4 [Rage 128 PRO AGP 4X] + 5144 R100 [Radeon 7200 / All-In-Wonder Radeon] + 1002 0008 Radeon 7000/Radeon VE + 1002 0009 Radeon 7000/Radeon + 1002 000a Radeon 7000/Radeon + 1002 001a Radeon 7000/Radeon + 1002 0029 Radeon AIW + 1002 0038 Radeon 7000/Radeon + 1002 0039 Radeon 7000/Radeon + 1002 008a Radeon 7000/Radeon + 1002 00ba Radeon 7000/Radeon + 1002 0139 Radeon 7000/Radeon + 1002 028a Radeon 7000/Radeon + 1002 02aa Radeon AIW + 1002 053a Radeon 7000/Radeon + 5148 R200 GL [FireGL 8800] + 1002 010a FireGL 8800 64Mb + 1002 0152 FireGL 8800 128Mb + 1002 0162 FireGL 8700 32Mb + 1002 0172 FireGL 8700 64Mb + 514c R200 [Radeon 8500/8500 LE] + 1002 003a Radeon R200 QL [Radeon 8500 LE] + 1002 013a Radeon 8500 + 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition] + 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb] + 174b 7149 Radeon 8500 LE + 1787 0f08 Radeon R200 QL [PowerMagic Radeon 8500] + 514d R200 [Radeon 9100] + 5157 RV200 [Radeon 7500/7500 LE] + 1002 013a Radeon 7500 + 1002 0f2b ALL-IN-WONDER VE PCI + 1002 103a Dell Optiplex GX260 + 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR] + 148c 2024 RV200 QW [Radeon 7500LE Dual Display] + 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition] + 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display] + 174b 7146 RV200 QW [Radeon 7500 LE] + 174b 7147 Radeon 7500 LE + 174b 7161 Radeon RV200 QW [Radeon 7500 LE] + 17af 0202 RV200 QW [Excalibur Radeon 7500LE] + 5159 RV100 [Radeon 7000 / Radeon VE] + 1002 000a Radeon 7000/Radeon VE + 1002 000b Radeon 7000 + 1002 0038 Radeon 7000/Radeon VE + 1002 003a Radeon 7000/Radeon VE + 1002 00ba Radeon 7000/Radeon VE + 1002 013a Radeon 7000/Radeon VE + 1002 0908 XVR-100 (supplied by Sun) +# The IBM card doubles as an ATI PCI video adapter + 1014 029a Remote Supervisor Adapter II (RSA2) + 1014 02c8 eServer xSeries server mainboard + 1028 016c PowerEdge 1850 Embedded Radeon 7000/VE + 1028 016d PowerEdge 2850 Embedded Radeon 7000-M + 1028 0170 PowerEdge 6850 Embedded Radeon 7000/VE + 1028 019a PowerEdge SC1425 + 103c 1292 Radeon 7000 + 1043 c00a A7000/T/64M + 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series] + 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition] + 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display] + 148c 2081 RV6DE + 174b 0280 Radeon RV100 QY [Radeon 7000/VE] + 174b 7112 Radeon VE 7000 + 174b 7c28 Radeon VE 7000 DDR + 1787 0202 RV100 QY [Excalibur Radeon 7000] + 17ee 1001 Radeon 7000 64MB DDR + DVI + 515e ES1000 + 1028 01bb PowerEdge 1955 Embedded ATI ES1000 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 1028 01f0 PowerEdge R900 Embedded ATI ES1000 + 1028 0205 PowerEdge 2970 Embedded ATI ES1000 + 1028 020b PowerEdge T605 Embedded ATI ES1000 + 1028 020f PowerEdge R300 Embedded ATI ES1000 + 1028 0210 PowerEdge T300 Embedded ATI ES1000 + 1028 0221 PowerEdge R805 Embedded ATI ES1000 + 1028 0223 PowerEdge R905 Embedded ATI ES1000 + 1028 0225 PowerEdge T105 Embedded ATI ES1000 + 1028 023c PowerEdge R200 Embedded ATI ES1000 + 103c 1304 Integrity iLO2 Advanced KVM VGA [AD307A] + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 5245 Rage 128 GL PCI + 1002 0008 Xpert 128 + 1002 0028 Rage 128 AIW + 1002 0029 Rage 128 AIW + 1002 0068 Rage 128 AIW + 5246 Rage 128 (Rage 4) series + 1002 0004 Magnum/Xpert 128/Xpert 99 + 1002 0008 Rage 128 AGP 2x + 1002 0028 Rage 128 AIW AGP + 1002 0044 Rage Fury/Xpert 128/Xpert 2000 + 1002 0068 Rage 128 AIW AGP + 1002 0448 Rage Fury + 524b Rage 128 VR PCI + 524c Rage 128 VR AGP + 1002 0008 Xpert 99/Xpert 2000 + 1002 0088 Xpert 99 + 534d Rage 128 4X AGP 4x + 1002 0008 Xpert 99/Xpert 2000 + 1002 0018 Xpert 2000 + 5354 Mach 64 VT + 1002 5654 Mach 64 reference + 5446 Rage 128 PRO Ultra AGP 4x + 1002 0004 Rage Fury Pro + 1002 0008 Rage Fury Pro/Xpert 2000 Pro + 1002 0018 Rage Fury Pro/Xpert 2000 Pro + 1002 0028 Rage 128 AIW Pro AGP + 1002 0029 Rage 128 AIW + 1002 002a Rage 128 AIW Pro AGP + 1002 002b Rage 128 AIW + 1002 0048 Xpert 2000 Pro + 5452 Rage 128 PRO Ultra4XL VR-R AGP + 1002 001c Rage 128 Pro 4XL + 103c 1279 Rage 128 Pro 4XL + 5460 RV370/M22 [Mobility Radeon X300] + 1775 1100 CR11/VR11 Single Board Computer + 5461 RV370/M22 [Mobility Radeon X300] + 5462 RV380/M24C [Mobility Radeon X600 SE] + 5464 RV370/M22 GL [Mobility FireGL V3100] + 5549 R423 [Radeon X800 GTO] + 554a R423 [Radeon X800 XT Platinum Edition] + 554b R423 [Radeon X800 GT/SE] + 1002 0302 Radeon X800 SE + 554d R480 [Radeon X800 GTO2/XL] + 1002 0322 All-In-Wonder X800 XL + 1458 2124 GV-R80L256V-B (AGP) + 554e R430 [All-In-Wonder X800 GT] + 554f R430 [Radeon X800] + 5550 R423 GL [FireGL V7100] + 5551 R423 GL [FireGL V5100] + 5569 R423 [Radeon X800 PRO] (Secondary) + 556b R423 [Radeon X800 GT] (Secondary) + 556d R480 [Radeon X800 GTO2/XL] (Secondary) + 1458 2125 GV-R80L256V-B (AGP) + 556f R430 [Radeon X800] (Secondary) + 5571 R423 GL [FireGL V5100] (Secondary) + 564b RV410/M26 GL [Mobility FireGL V5000] + 564f RV410/M26 [Mobility Radeon X700 XL] + 5652 RV410/M26 [Mobility Radeon X700] + 5653 RV410/M26 [Mobility Radeon X700] + 1025 0080 Aspire 5024WLMi + 103c 0940 Compaq NW8240 Mobile Workstation + 5654 Mach64 VT [Video Xpression] + 1002 5654 Mach64VT Reference + 5655 264VT3 [Mach64 VT3] + 5656 Mach64 VT4 [Video Xpression+] + 5657 RV410 [Radeon X550 XTX / X700] + 5830 RS300 Host Bridge + 5831 RS300 Host Bridge + 5832 RS300 Host Bridge + 5833 RS300 Host Bridge + 5834 RS300 [Radeon 9100 IGP] + 5835 RS300M [Mobility Radeon 9100 IGP] + 5838 RS300 AGP Bridge + 5854 RS480 [Radeon Xpress 200 Series] (Secondary) + 5874 RS480 [Radeon Xpress 1150] (Secondary) + 5940 RV280 [Radeon 9200 PRO] (Secondary) + 17af 2021 Excalibur Radeon 9250 (Secondary) + 5941 RV280 [Radeon 9200] (Secondary) + 1458 4019 Radeon 9200 + 174b 7c12 Radeon 9200 + 17af 200d Excalibur Radeon 9200 + 18bc 0050 GC-R9200-C3 (Secondary) + 5944 RV280 [Radeon 9200 SE PCI] + 5950 RS480/RS482/RS485 Host Bridge + 1025 0080 Aspire 5024WLMMi + 103c 280a DC5750 Microtower + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 1462 7217 Aspire L250 + 5951 RX480/RX482 Host Bridge + 5952 RD580 Host Bridge + 5954 RS480 [Radeon Xpress 200 Series] + 1002 5954 RV370 [Radeon Xpress 200G Series] + 5955 RS480M [Mobility Radeon Xpress 200] + 1002 5955 RS480 0x5955 [Radeon XPRESS 200M 5955 (PCIE)] + 103c 308b MX6125 + 1462 0131 MS-1013 Notebook + 5956 RD790 Host Bridge + 5957 RX780/RX790 Host Bridge + 1849 5957 A770CrossFire Motherboard + 5958 RD780 Host Bridge + 5960 RV280 [Radeon 9200 PRO / 9250] + 17af 2020 Excalibur Radeon 9250 + 5961 RV280 [Radeon 9200] + 1002 2f72 All-in-Wonder 9200 Series + 1019 4c30 Radeon 9200 VIVO + 12ab 5961 YUAN SMARTVGA Radeon 9200 + 1458 4018 Radeon 9200 + 174b 7c13 Radeon 9200 + 17af 200c Excalibur Radeon 9200 + 18bc 0050 Radeon 9200 Game Buster + 18bc 0051 GC-R9200-C3 + 18bc 0053 Radeon 9200 Game Buster VIVO + 5962 RV280 [Radeon 9200] + 5964 RV280 [Radeon 9200 SE] + 1002 5964 Radeon 9200 SE, 64-bit 128MB DDR, 200/166MHz + 1043 c006 Radeon 9200 SE / TD / 128M + 1458 4018 R92S128T (Radeon 9200 SE 128MB) + 1458 4032 Radeon 9200 SE 128MB + 147b 6191 R9200SE-DT + 148c 2073 CN-AG92E + 174b 7c13 Radeon 9200 SE + 1787 5964 Excalibur 9200SE VIVO 128M + 17af 2012 Radeon 9200 SE Excalibur + 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster + 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] + 5965 RV280 GL [FireMV 2200 PCI] + 5974 RS482/RS485 [Radeon Xpress 1100/1150] + 103c 280a DC5750 Microtower + 1462 7141 Aspire L250 + 5975 RS482M [Mobility Radeon Xpress 200] + 5978 RX780/RD790 PCI to PCI bridge (external gfx0 port A) + 1849 5957 A770CrossFire Motherboard + 5979 RD790 PCI to PCI bridge (external gfx0 port B) + 597a RD790 PCI to PCI bridge (PCI express gpp port A) + 597b RX780/RD790 PCI to PCI bridge (PCI express gpp port B) + 597c RD790 PCI to PCI bridge (PCI express gpp port C) + 597d RX780/RD790 PCI to PCI bridge (PCI express gpp port D) + 597e RD790 PCI to PCI bridge (PCI express gpp port E) + 1849 5957 A770CrossFire Motherboard + 597f RD790 PCI to PCI bridge (PCI express gpp port F) + 1849 5957 A770CrossFire Motherboard + 5980 RD790 PCI to PCI bridge (external gfx1 port A) + 5981 RD790 PCI to PCI bridge (external gfx1 port B) + 5982 RD790 PCI to PCI bridge (NB-SB link) + 5a10 RD890 Northbridge only dual slot (2x16) PCI-e GFX Hydra part + 5a11 RD890 Northbridge only single slot PCI-e GFX Hydra part + 5a12 RD890 Northbridge only dual slot (2x8) PCI-e GFX Hydra part + 15d9 a811 H8DGU + 5a13 RD890S/SR5650 Host Bridge + 5a14 RD9x0/RX980 Host Bridge + 5a15 RD890 PCI to PCI bridge (PCI express gpp port A) + 5a16 RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GFX port 0) + 5a17 RD890/RD9x0 PCI to PCI bridge (PCI Express GFX port 1) + 5a18 RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GPP Port 0) + 15d9 a811 H8DGU + 5a19 RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GPP Port 1) + 5a1a RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GPP Port 2) + 5a1b RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GPP Port 3) + 5a1c RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GPP Port 4) + 5a1d RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GPP Port 5) + 5a1e RD890/RD9x0/RX980 PCI to PCI bridge (PCI Express GPP2 Port 0) + 5a1f RD890/RD990 PCI to PCI bridge (PCI Express GFX2 port 0) + 15d9 a811 H8DGU + 5a20 RD890/RD990 PCI to PCI bridge (PCI Express GFX2 port 1) + 5a23 RD890S/RD990 I/O Memory Management Unit (IOMMU) + 5a31 RC410 Host Bridge + 5a33 RS400 Host Bridge + 5a34 RS4xx PCI Express Port [ext gfx] + 5a36 RC4xx/RS4xx PCI Express Port 1 + 5a37 RC4xx/RS4xx PCI Express Port 2 + 5a38 RC4xx/RS4xx PCI Express Port 3 + 5a39 RC4xx/RS4xx PCI Express Port 4 + 5a3f RC4xx/RS4xx PCI Bridge [int gfx] + 1462 7217 Aspire L250 + 5a41 RS400 [Radeon Xpress 200] + 5a42 RS400M [Radeon Xpress 200M] + 5a61 RC410 [Radeon Xpress 200/1100] + 5a62 RC410M [Mobility Radeon Xpress 200M] + 5b60 RV370 [Radeon X300] + 1043 002a Extreme AX300SE-X + 1043 032e Extreme AX300/TD + 1458 2102 GV-RX30S128D (X300SE) + 1462 0400 RX300SE-TD128E (MS-8940 REV:200) + 1462 0402 RX300SE-TD128E (MS-8940) + 174b 0500 Radeon X300 (PCIE) + 196d 1086 X300SE HM + 5b62 RV370 [Radeon X600/X600 SE] + 5b63 RV370 [Radeon X300/X550/X1050 Series] + 5b64 RV370 GL [FireGL V3100] + 5b65 RV370 GL [FireMV 2200] + 5b66 RV370X + 5b70 RV370 [Radeon X300 SE] +# RX300SE-TD128E + 1462 0403 Radeon X300 SE 128MB DDR + 174b 0501 Radeon X300 SE + 196d 1087 Radeon X300 SE HyperMemory + 5b72 RV380 [Radeon X300/X550/X1050 Series] (Secondary) + 5b73 RV370 [Radeon X300/X550/X1050 Series] (Secondary) + 5b74 RV370 GL [FireGL V3100] (Secondary) + 5b75 RV370 GL [FireMV 2200] (Secondary) + 5c61 RV280/M9+ [Mobility Radeon 9200 AGP] + 5c63 RV280/M9+ [Mobility Radeon 9200 AGP] + 1002 5c63 Apple iBook G4 2004 + 144d c00c P30 notebook + 5d44 RV280 [Radeon 9200 SE] (Secondary) + 1458 4019 R92S128T (Radeon 9200 SE 128MB Secondary) + 1458 4032 Radeon 9200 SE 128MB + 147b 6190 R9200SE-DT (Secondary) + 174b 7c12 Radeon 9200 SE (Secondary) + 1787 5965 Excalibur 9200SE VIVO 128M (Secondary) + 17af 2013 Radeon 9200 SE Excalibur (Secondary) + 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary) + 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] + 5d45 RV280 GL [FireMV 2200 PCI] (Secondary) + 5d48 R423/M28 [Mobility Radeon X800 XT] + 5d49 R423/M28 GL [Mobility FireGL V5100] + 5d4a R423/M28 [Mobility Radeon X800] + 5d4d R480 [Radeon X850 XT Platinum Edition] + 5d4e R480 [Radeon X850 SE] + 5d4f R480 [Radeon X800 GTO] + 5d50 R480 GL [FireGL V7200] + 5d52 R480 [Radeon X850 XT] + 1002 0b12 PowerColor X850XT PCIe (Primary) + 5d57 R423 [Radeon X800 XT] + 5d6d R480 [Radeon X850 XT Platinum Edition] (Secondary) + 5d6f R480 [Radeon X800 GTO] (Secondary) + 5d72 R480 [Radeon X850 XT] (Secondary) + 1002 0b13 PowerColor X850XT PCIe (Secondary) + 5d77 R423 [Radeon X800 XT] (Secondary) + 5e48 RV410 GL [FireGL V5000] + 5e49 RV410 [Radeon X700 Series] + 5e4a RV410 [Radeon X700 XT] + 5e4b RV410 [Radeon X700 PRO] + 5e4c RV410 [Radeon X700 SE] + 5e4d RV410 [Radeon X700] + 148c 2116 Bravo X700 + 5e4f RV410 [Radeon X700] + 1569 1e4f Radeon X550 XT + 5e6b RV410 [Radeon X700 PRO] (Secondary) + 5e6d RV410 [Radeon X700] (Secondary) + 148c 2117 Bravo X700 (Secondary) + 5f57 R423 [Radeon X800 XT] + 6600 Mars [Radeon HD 8670A/8670M/8750M / R7 M370] + 103c 1952 ProBook 455 G1 + 6601 Mars [Radeon HD 8730M] + 103c 2100 FirePro M4100 + 6604 Opal XT [Radeon R7 M265/M365X/M465] + 1025 0776 Aspire V5 Radeon R7 M265 + 103c 8006 FirePro M4170 + 103c 814f Litho XT [Radeon R7 M365X] + 103c 82aa Litho XT [Radeon R7 M465] + 17aa 3643 Radeon R7 A360 + 6605 Opal PRO [Radeon R7 M260X] + 103c 2259 FirePro M4150 + 6606 Mars XTX [Radeon HD 8790M] + 1028 0684 FirePro W4170M + 6607 Mars LE [Radeon HD 8530M / R5 M240] + 6608 Oland GL [FirePro W2100] + 13cc 3d28 MXRT-2600 + 6609 Oland GL [FirePro W2100 / Barco MXRT 2600] + 6610 Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] + 1019 0030 Radeon HD 8670 + 1028 0081 Radeon R7 350X OEM + 1028 0083 Radeon R5 340X OEM + 1028 2120 Radeon R7 250 + 1028 2322 Radeon R7 250 + 1462 2910 Radeon HD 8670 + 1462 2911 Radeon HD 8670 + 148c 7350 Radeon R7 350 + 1642 3c81 Radeon HD 8670 + 1642 3c91 Radeon HD 8670 + 1642 3f09 Radeon R7 350 + 6611 Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] + 1028 1001 Radeon R5 430 OEM (1024 MByte) + 1028 1002 Radeon R5 430 OEM (2048 MByte) +# The 'AMD Radeon R5 430' instead of 240/340 is NOT a typo! It's actually correct. + 1028 1711 R5 430 OEM (2048 MByte) + 1028 210b Radeon R5 240 OEM +# OEM-card for Dell; verified through AMD's own drivers (*.inf) and a TPU BIOS in database + 1028 2121 Radeon HD 8570 OEM +# OEM-card from Fujitsu; verified through AMD's own drivers (*.inf) + 10cf 1889 Radeon HD 8570 OEM + 1642 1869 Radeon 520 OEM + 174b 4248 Radeon R7 240 OEM + 174b a240 Radeon R7 240 OEM + 174b d340 Radeon R7 340 OEM + 1b0a 90d3 Radeon R7 240 OEM + 6613 Oland PRO [Radeon R7 240/340 / Radeon 520] + 148c 7340 Radeon R7 340 + 1682 7240 R7 240 2048 MB + 1dcf 3000 Oland PRO [Radeon R7 240/340 / Radeon 520] + 6631 Oland + 6640 Saturn XT [FirePro M6100] + 106b 014b Tropo XT [Radeon R9 M380 Mac Edition] + 6641 Saturn PRO [Radeon HD 8930M] + 6646 Bonaire XT [Radeon R9 M280X] + 6647 Saturn PRO/XT [Radeon R9 M270X/M280X] + 1043 223d N551ZU laptop Radeon R9 M280X + 6649 Bonaire [FirePro W5100] + 1002 0b0c FirePro W4300 + 103c 0b0c Bonaire [FirePro W4300] + 103c 230c FirePro W5100 + 13cc 3d2a MXRT-5600 + 664d Bonaire [FirePro W5100 / Barco MXRT-5600] + 6650 Bonaire + 6651 Bonaire + 6658 Bonaire XTX [Radeon R7 260X/360] + 1043 048f R7260X-DC2OC-2GD5 + 1043 04d3 AMD Radeon R7 260X +# GV-R726XOC-1GD + 1458 227b Radeon R7 260X + 148c 0907 Radeon R7 360 + 1682 0907 Radeon R7 360 + 1682 7360 Radeon R7 360 + 665c Bonaire XT [Radeon HD 7790/8770 / R7 360 / R9 260/360 OEM] + 1043 0452 Radeon HD 7790 DirectCU II OC +# R7790-1GD5/OC + 1462 2930 Radeon HD 7790 OC + 1462 2932 Radeon HD 8770 + 1462 2934 Radeon R9 260 OEM + 1462 2938 Radeon R9 360 OEM + 148c 0907 Radeon R7 360 + 148c 9260 Radeon R9 260 OEM + 148c 9360 Radeon R9 360 OEM + 1682 0907 Radeon R7 360 +# FX-779A-CDB4 / FX-779A-CDBC + 1682 3310 Radeon HD 7790 Black Edition 2 GB +# 100356OCL / 11210-01-20G + 174b e253 Radeon HD 7790 Dual-X OC + 1787 2329 Radeon HD 7790 TurboDuo + 665d Bonaire [Radeon R7 200 Series] + 665f Tobago PRO [Radeon R7 360 / R9 360 OEM] + 1028 0b04 Radeon R9 360 OEM + 1462 2938 Radeon R9 360 OEM + 1462 3271 Radeon R9 360 OEM + 1682 7360 Radeon R7 360 + 6660 Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430 / Radeon 520 Mobile] + 1028 05ea Radeon HD 8670M + 1028 06bf Radeon R5 M335 + 103c 1970 Radeon HD 8670M + 103c 80be Radeon R5 M330 + 103c 8136 Radeon R5 M330 + 103c 8329 Radeon R7 M520 + 17aa 3633 Radeon R5 A330 + 17aa 3804 Radeon R5 M330 + 17aa 3809 Radeon R5 M330 + 17aa 381a Radeon R5 M430 + 17aa 390c Radeon R5 M330 + 6663 Sun PRO [Radeon HD 8570A/8570M] + 1025 0846 Radeon HD 8570A + 17aa 3805 Radeon HD 8570M + 6664 Jet XT [Radeon R5 M240] + 6665 Jet PRO [Radeon R5 M230 / R7 M260DX / Radeon 520 Mobile] + 17aa 1309 Z50-75 Radeon R7 M260DX + 17aa 368f Radeon R5 A230 + 6667 Jet ULT [Radeon R5 M230] + 666f Sun LE [Radeon HD 8550M / R5 M230] + 66a0 Vega 20 [Radeon Instinct] + 66a1 Vega 20 [Radeon Pro VII/Radeon Instinct MI50 32GB] + 66a2 Vega 20 + 66a3 Vega 20 [Radeon Pro Vega II/Radeon Pro Vega II Duo] + 66a7 Vega 20 [Radeon Pro Vega 20] + 66af Vega 20 [Radeon VII] + 6704 Cayman PRO GL [FirePro V7900] + 6707 Cayman LE GL [FirePro V5900] + 6718 Cayman XT [Radeon HD 6970] + 6719 Cayman PRO [Radeon HD 6950] + 671c Antilles [Radeon HD 6990] + 671d Antilles [Radeon HD 6990] + 671f Cayman CE [Radeon HD 6930] + 6720 Blackcomb [Radeon HD 6970M/6990M] + 1028 048f Radeon HD 6990M + 1028 0490 Alienware M17x R3 Radeon HD 6970M + 1028 04a4 FirePro M8900 + 1028 04ba Radeon HD 6990M + 1028 053f FirePro M8900 + 106b 0b00 Radeon HD 6970M + 1558 5102 Radeon HD 6970M + 1558 5104 Radeon HD 6990M + 1558 7201 Radeon HD 6990M + 174b e188 Radeon HD 6970M + 6738 Barts XT [Radeon HD 6870] +# HD-687A-ZDFC + 1682 3103 Radeon HD 8670 + 1787 201a Barts XT [Radeon HD 6870 X2] + 1787 201b Barts XT [Radeon HD 6870 X2] + 6739 Barts PRO [Radeon HD 6850] + 1043 03b4 EAH6850 [Radeon HD 6850] + 673e Barts LE [Radeon HD 6790] + 148c 7720 Radeon HD 7720 OEM + 6740 Whistler [Radeon HD 6730M/6770M/7690M XT] + 1019 238c Radeon HD 6730M + 1019 238e Radeon HD 6730M + 1019 2391 Radeon HD 6730M + 1019 2392 Radeon HD 6770M + 1028 04a3 Precision M4600 + 1028 053e FirePro M5950 + 103c 1630 FirePro M5950 + 103c 1631 FirePro M5950 + 103c 164b Radeon HD 6730M + 103c 164e Radeon HD 6730M + 103c 1657 Radeon HD 6770M + 103c 1658 Radeon HD 6770M + 103c 165a Radeon HD 6770M + 103c 165b Radeon HD 6770M + 103c 1688 Radeon HD 6770M + 103c 1689 Radeon HD 6770M + 103c 168a Radeon HD 6770M + 103c 185e Radeon HD 7690M XT + 103c 3388 Radeon HD 6770M + 103c 3389 Radeon HD 6770M + 103c 3582 Radeon HD 6770M + 103c 366c Radeon HD 6730M + 1043 1d02 Radeon HD 6730M + 1043 1d12 Radeon HD 6730M + 104d 9084 Radeon HD 6730M + 104d 9085 Radeon HD 6730M + 144d b074 Radeon HD 6730M + 144d b077 Radeon HD 6730M + 144d b084 Radeon HD 6730M + 144d b088 Radeon HD 6730M + 17aa 3982 Radeon HD 6730M + 6741 Whistler [Radeon HD 6630M/6650M/6750M/7670M/7690M] + 1019 238e Radeon HD 6650M + 1019 238f Radeon HD 6650M + 1025 0379 Radeon HD 6650M + 1025 037b Radeon HD 6650M + 1025 037e Radeon HD 6650M + 1025 0382 Radeon HD 6650M + 1025 0384 Radeon HD 6650M + 1025 0385 Radeon HD 6650M + 1025 0386 Radeon HD 6650M + 1025 0387 Radeon HD 6650M + 1025 0388 Radeon HD 6650M + 1025 0442 Radeon HD 6650M + 1025 0451 Radeon HD 6650M + 1025 0489 Radeon HD 6650M + 1025 048b Radeon HD 6650M + 1025 048c Radeon HD 6650M + 1025 050a Radeon HD 6650M + 1025 050b Radeon HD 6650M + 1025 050c Radeon HD 6650M + 1025 050e Radeon HD 6650M + 1025 050f Radeon HD 6650M + 1025 0513 Radeon HD 6650M + 1025 0514 Radeon HD 6650M + 1025 0515 Radeon HD 6650M + 1025 0516 Radeon HD 6650M + 1025 051e Radeon HD 6650M + 1025 051f Radeon HD 6650M + 1025 0520 Radeon HD 6650M + 1025 0521 Radeon HD 6650M + 1025 052a Radeon HD 6650M + 1025 0555 Radeon HD 6650M + 1025 0556 Radeon HD 6650M + 1025 055d Radeon HD 6650M + 1025 055e Radeon HD 6650M + 1025 056d Radeon HD 6650M + 1025 059a Radeon HD 6650M + 1025 059b Radeon HD 6650M + 1025 059e Radeon HD 6650M + 1025 059f Radeon HD 6650M + 1025 0600 Radeon HD 6650M + 1025 0605 Radeon HD 6650M + 1025 0606 Radeon HD 6650M + 1025 0619 Radeon HD 6650M + 1028 04c1 Radeon HD 6630M + 1028 04c5 Radeon HD 6630M + 1028 04cd Radeon HD 6630M + 1028 04d7 Radeon HD 6630M + 1028 04d9 Radeon HD 6630M + 1028 052d Radeon HD 6630M + 103c 1617 Radeon HD 6650M + 103c 1646 Radeon HD 6750M + 103c 1647 Radeon HD 6650M + 103c 164b Radeon HD 6650M + 103c 164e Radeon HD 6650M + 103c 1688 Radeon HD 6750M + 103c 1689 Radeon HD 6750M + 103c 168a Radeon HD 6750M + 103c 1860 Radeon HD 7690M + 103c 3385 Radeon HD 6630M + 103c 3560 Radeon HD 6750M + 103c 358d Radeon HD 6750M + 103c 3590 Radeon HD 6750M + 103c 3593 Radeon HD 6750M + 103c 366c Radeon HD 6650M + 1043 1cd2 Radeon HD 6650M + 1043 2121 Radeon HD 6650M + 1043 2122 Radeon HD 6650M + 1043 2123 Radeon HD 6650M + 1043 2125 Radeon HD 7670M + 1043 2127 Radeon HD 7670M + 104d 907b Radeon HD 6630M + 104d 9080 Radeon HD 6630M + 104d 9081 Radeon HD 6630M + 106b 00e2 MacBookPro8,2 [Core i7, 15", Late 2011] + 1179 fd63 Radeon HD 6630M + 1179 fd65 Radeon HD 6630M + 144d c093 Radeon HD 6650M + 144d c0ac Radeon HD 6650M + 144d c0b3 Radeon HD 6750M + 144d c539 Radeon HD 6630M + 144d c609 Radeon HD 6630M + 152d 0914 Radeon HD 6650M + 17aa 21e1 Radeon HD 6630M + 17aa 3970 Radeon HD 6650M + 17aa 3976 Radeon HD 6650M + 1854 0907 Radeon HD 6650M + 6742 Whistler LE [Radeon HD 6610M/7610M] + 1002 6570 Turks [Radeon HD 6570] + 1019 2393 Radeon HD 6610M + 1043 1d82 K53SK Laptop Radeon HD 7610M + 1179 fb22 Radeon HD 7610M + 1179 fb23 Radeon HD 7610M + 1179 fb27 Radeon HD 7610M + 1179 fb2a Radeon HD 7610M + 1179 fb2c Radeon HD 7610M + 1179 fb30 Radeon HD 7610M + 1179 fb31 Radeon HD 7610M + 1179 fb32 Radeon HD 7610M + 1179 fb38 Radeon HD 7610M + 1179 fb39 Radeon HD 7610M + 1179 fb3a Radeon HD 7610M + 1179 fb3b Radeon HD 7610M + 1179 fb40 Radeon HD 7610M + 1179 fb41 Radeon HD 7610M + 1179 fb47 Radeon HD 7610M + 1179 fb48 Radeon HD 7610M + 1179 fb49 Radeon HD 7610M + 1179 fb51 Radeon HD 7610M + 1179 fb52 Radeon HD 7610M + 1179 fb53 Radeon HD 7610M + 1179 fb56 Radeon HD 7610M + 1179 fb81 Radeon HD 7610M + 1179 fb82 Radeon HD 7610M + 1179 fb83 Radeon HD 7610M + 1179 fc56 Radeon HD 7610M + 1179 fcd4 Radeon HD 7610M + 1179 fcee Radeon HD 7610M + 1458 6570 Turks [Radeon HD 6570] + 1462 6570 Turks [Radeon HD 6570] + 148c 6570 Turks [Radeon HD 6570] + 1682 6570 Turks [Radeon HD 6570] + 174b 5570 Turks [Radeon HD 5570] + 174b 6570 Turks [Radeon HD 6570] + 174b 7570 Turks [Radeon HD 7570] + 174b 8510 Turks [Radeon HD 8510] + 174b 8570 Turks [Radeon HD 8570] + 1787 6570 Turks [Radeon HD 6570] + 17af 6570 Turks [Radeon HD 6570] + 8086 2111 Radeon HD 6625M + 6743 Whistler [Radeon E6760] + 6749 Turks GL [FirePro V4900] + 15c3 2b06 MED-X4900 (EIZO) + 674a Turks GL [FirePro V3900] + 13cc 3d22 MXRT-2500 + 15c3 0106 MED-X3900 + 6750 Onega [Radeon HD 6650A/7650A] + 1462 2670 Radeon HD 6670A + 17aa 3079 Radeon HD 7650A + 17aa 307a Radeon HD 6650A + 17aa 3087 Radeon HD 7650A + 17aa 3618 Radeon HD 6650A + 17aa 3623 Radeon HD 6650A + 17aa 3627 Radeon HD 6650A + 6751 Turks [Radeon HD 7650A/7670A] + 1028 0548 Radeon HD 7650A + 1462 2671 Radeon HD 7670A + 1462 2672 Radeon HD 7670A + 1462 2680 Radeon HD 7650A + 1462 2681 Radeon HD 7650A + 17aa 3087 Radeon HD 7650A + 6758 Turks XT [Radeon HD 6670/7670] + 1028 0b0e Radeon HD 6670 + 103c 6882 Radeon HD 6670 + 1462 250a Radeon HD 7670 + 148c 7670 Radeon HD 7670 + 1545 7670 Radeon HD 7670 + 1682 3300 Radeon HD 7670 + 174b 7670 Radeon HD 7670 + 174b e181 Radeon HD 6670 + 1787 2309 Radeon HD 6670 + 6759 Turks PRO [Radeon HD 6570/7570/8550 / R5 230] + 103c 3130 Radeon HD 6570 + 1043 0403 Radeon HD 6570 + 1462 2500 Radeon HD 6570 + 1462 2509 Radeon HD 7570 + 148c 7570 Radeon HD 7570 + 1642 3a67 Radeon HD 6570 + 1682 3280 Radeon HD 7570 + 1682 3530 Radeon HD 8550 + 1682 5230 Radeon R5 230 series + 1682 6450 Radeon HD 6450 series + 174b 7570 Radeon HD 7570 + 174b 8550 Radeon HD8550 OEM + 174b 8570 Radeon HD8550 OEM + 174b e142 Radeon HD 6570 + 174b e181 Radeon HD 6570 + 1787 a230 Radeon R5 230 series + 1787 a450 Radeon HD 6450 series + 1b0a 908f Radeon HD 6570 + 1b0a 9090 Radeon HD 6570 + 1b0a 9091 Radeon HD 6570 + 1b0a 9092 Radeon HD 6570 + 1b0a 909e Radeon HD 6570 + 1b0a 90b5 Radeon HD 7570 + 1b0a 90b6 Radeon HD 7570 + 675b Turks [Radeon HD 7600 Series] + 675d Turks PRO [Radeon HD 7570] + 675f Turks LE [Radeon HD 5570/6510/7510/8510] + 148c 6510 Radeon HD 6510 + 148c 6530 Radeon HD 6530 + 148c 7510 Radeon HD 7510 + 1545 7570 Radeon HD 7570 + 174b 6510 Radeon HD 6510 + 174b 7510 Radeon HD 7510 + 174b 8510 Radeon HD 8510 + 1787 2012 Radeon HD 5570 2GB GDDR3 + 1787 2314 Radeon HD 5570 1GB DDR2/GDDR3 + 6760 Seymour [Radeon HD 6400M/7400M Series] + 1002 0124 Radeon HD 6470M + 1002 0134 Radeon HD 6470M + 1019 238b Radeon HD 6470M + 1019 238e Radeon HD 6470M + 1019 2390 Radeon HD 6470M + 1019 9985 Radeon HD 6470M + 1028 04c1 Radeon HD 6470M + 1028 04c3 Radeon HD 6470M + 1028 04ca Radeon HD 6470M + 1028 04cb Radeon HD 6470M + 1028 04cc Vostro 3350 + 1028 04d1 Radeon HD 6470M + 1028 04d3 Radeon HD 6470M + 1028 04d7 Radeon HD 6470M + 1028 0502 Radeon HD 6470M + 1028 0503 Radeon HD 6470M + 1028 0506 Radeon HD 6470M + 1028 0507 Radeon HD 6470M + 1028 0514 Radeon HD 6470M + 1028 051c Radeon HD 6450M + 1028 051d Radeon HD 6450M + 103c 161a Radeon HD 6470M + 103c 161b Radeon HD 6470M + 103c 161e Radeon HD 6470M + 103c 161f Radeon HD 6470M + 103c 1622 Radeon HD 6450M + 103c 1623 Radeon HD 6450M + 103c 164a Radeon HD 6470M + 103c 164d Radeon HD 6470M + 103c 1651 Radeon HD 6470M + 103c 1656 Radeon HD 6490M + 103c 1658 Radeon HD 6490M + 103c 1659 Radeon HD 6490M + 103c 165b Radeon HD 6490M + 103c 165d Radeon HD 6470M + 103c 165f Radeon HD 6470M + 103c 1661 Radeon HD 6470M + 103c 1663 Radeon HD 6470M + 103c 1665 Radeon HD 6470M + 103c 1667 Radeon HD 6470M + 103c 1669 Radeon HD 6470M + 103c 166b Radeon HD 6470M + 103c 166c Radeon HD 6470M + 103c 166e Radeon HD 6470M + 103c 1670 Radeon HD 6470M + 103c 1672 Radeon HD 6470M + 103c 167a Radeon HD 6470M + 103c 167b Radeon HD 6470M + 103c 167d Radeon HD 6490M + 103c 167f Radeon HD 6490M + 103c 168c Radeon HD 6470M + 103c 168f Radeon HD 6470M + 103c 1694 Radeon HD 6470M + 103c 1696 Radeon HD 6470M + 103c 1698 Radeon HD 6470M + 103c 169a Radeon HD 6470M + 103c 169c Radeon HD 6490M + 103c 1855 Radeon HD 7450M + 103c 1859 Radeon HD 7450M + 103c 185c Radeon HD 7450M + 103c 185d Radeon HD 7470M + 103c 185f Radeon HD 7470M + 103c 1863 Radeon HD 7450M + 103c 355c Radeon HD 6490M + 103c 355f Radeon HD 6490M + 103c 3563 Radeon HD 6470M + 103c 3565 Radeon HD 6470M + 103c 3567 Radeon HD 6470M + 103c 3569 Radeon HD 6470M + 103c 3581 Radeon HD 6490M + 103c 3584 Radeon HD 6470M + 103c 358c Radeon HD 6490M + 103c 358f Radeon HD 6490M + 103c 3592 Radeon HD 6490M + 103c 3596 Radeon HD 6490M + 103c 366b Radeon HD 6470M + 103c 3671 FirePro M3900 + 103c 3673 Radeon HD 6470M + 1043 100a Radeon HD 7470M + 1043 100c Radeon HD 6470M + 1043 101b Radeon HD 6470M + 1043 101c Radeon HD 6470M + 1043 102a Radeon HD 7450M + 1043 102c Radeon HD 6470M + 1043 104b Radeon HD 7470M + 1043 105d Radeon HD 7470M + 1043 106b Radeon HD 7470M + 1043 106d Radeon HD 7470M + 1043 107d Radeon HD 7470M + 1043 1cb2 Radeon HD 6470M + 1043 1d22 Radeon HD 6470M + 1043 1d32 Radeon HD 6470M + 1043 2001 Radeon HD 6470M + 1043 2002 Radeon HD 7470M + 1043 2107 Radeon HD 7470M + 1043 2108 Radeon HD 7470M + 1043 2109 Radeon HD 7470M + 1043 84a0 Radeon HD 6470M + 1043 84e9 Radeon HD 6470M + 1043 8515 Radeon HD 7470M + 1043 8517 Radeon HD 7470M + 1043 855a Radeon HD 7470M + 104d 907b Radeon HD 6470M + 104d 9081 Radeon HD 6470M + 104d 9084 Radeon HD 6470M + 104d 9085 Radeon HD 6470M + 1179 0001 Radeon HD 6450M + 1179 0003 Radeon HD 6450M + 1179 0004 Radeon HD 6450M + 1179 fb22 Radeon HD 7470M + 1179 fb23 Radeon HD 7470M + 1179 fb2c Radeon HD 7470M + 1179 fb31 Radeon HD 7470M + 1179 fb32 Radeon HD 7470M + 1179 fb33 Radeon HD 7470M + 1179 fb38 Radeon HD 7470M + 1179 fb39 Radeon HD 7470M + 1179 fb3a Radeon HD 7470M + 1179 fb40 Radeon HD 7470M + 1179 fb41 Radeon HD 7470M + 1179 fb42 Radeon HD 7470M + 1179 fb47 Radeon HD 7470M + 1179 fb48 Radeon HD 7470M + 1179 fb51 Radeon HD 7470M + 1179 fb52 Radeon HD 7470M + 1179 fb53 Radeon HD 7470M + 1179 fb81 Radeon HD 7470M + 1179 fb82 Radeon HD 7470M + 1179 fb83 Radeon HD 7470M + 1179 fc51 Radeon HD 6470M + 1179 fc52 Radeon HD 7470M + 1179 fc56 Radeon HD 7470M + 1179 fcd3 Radeon HD 7470M + 1179 fcd4 Radeon HD 7470M + 1179 fcee Radeon HD 7470M + 1179 fdee Radeon HD 7470M + 144d b074 Radeon HD 6470M + 144d b084 Radeon HD 6470M + 144d c095 Radeon HD 6470M + 144d c0b3 Radeon HD 6490M + 144d c538 Radeon HD 6470M + 144d c581 Radeon HD 6470M + 144d c589 Radeon HD 6470M + 144d c609 Radeon HD 7470M + 144d c625 Radeon HD 7470M + 144d c636 Radeon HD 7450M + 1462 10ac Radeon HD 6470M + 152d 0916 Radeon HD 6470M + 17aa 21e5 Radeon HD 6470M + 17aa 3900 Radeon HD 7450M + 17aa 3902 Radeon HD 7450M + 17aa 3969 Radeon HD 6470M + 17aa 3970 Radeon HD 7450M + 17aa 3976 Radeon HD 6470M + 17aa 397b Radeon HD 6470M + 17aa 397d Radeon HD 6470M + 17aa 5101 Radeon HD 7470M + 17aa 5102 Radeon HD 7450M + 17aa 5103 Radeon HD 7450M + 17aa 5106 Radeon HD 7450M + 1854 0897 Radeon HD 6470M + 1854 0900 Radeon HD 6470M + 1854 0908 Radeon HD 6470M + 1854 2015 Radeon HD 6470M + 6761 Seymour LP [Radeon HD 6430M] + 6763 Seymour [Radeon E6460] + 6764 Seymour [Radeon HD 6400M Series] + 6765 Seymour [Radeon HD 6400M Series] + 6766 Caicos + 6767 Caicos + 6768 Caicos + 6770 Caicos [Radeon HD 6450A/7450A] + 17aa 308d Radeon HD 7450A + 17aa 3623 Radeon HD 6450A + 17aa 3627 Radeon HD 6450A + 17aa 3629 Radeon HD 6450A + 17aa 363c Radeon HD 6450A + 17aa 3658 Radeon HD 7470A + 6771 Caicos XTX [Radeon HD 8490 / R5 235X OEM] + 6772 Caicos [Radeon HD 7450A] + 6778 Caicos XT [Radeon HD 7470/8470 / R5 235/310 OEM] + 1019 0024 Radeon HD 7470 + 1019 0027 Radeon HD 8470 + 1028 2120 Radeon HD 7470 + 1462 b491 Radeon HD 8470 + 1462 b492 Radeon HD 8470 + 1462 b493 Radeon HD 8470 OEM + 1462 b499 Radeon R5 235 OEM + 1642 3c65 Radeon HD 8470 + 1642 3c75 Radeon HD 8470 + 174b 8145 Radeon HD 8470 + 174b d145 Radeon R5 235 OEM + 174b d335 Radeon R5 310 OEM + 174b e145 Radeon HD 7470 + 17aa 3694 Radeon R5 A220 + 6779 Caicos [Radeon HD 6450/7450/8450 / R5 230 OEM] + 1019 0016 Radeon HD 6450 + 1019 0017 Radeon HD 6450 + 1019 0018 Radeon HD 6450 + 1028 2120 Radeon HD 6450 + 103c 2128 Radeon HD 6450 + 103c 2aee Radeon HD 7450A + 1092 6450 Radeon HD 6450 + 1462 2125 Radeon HD 6450 + 1462 2346 Radeon HD 7450 + 1462 2490 Radeon HD 6450 + 1462 2494 Radeon HD 6450 + 1462 2496 Radeon HD 7450 + 148c 7450 Radeon HD 7450 + 148c 8450 Radeon HD 8450 OEM + 1545 7470 Radeon HD 7470 + 1642 3a65 Radeon HD 6450 + 1642 3a66 Radeon HD 7450 + 1642 3a75 Radeon HD 6450 + 1642 3a76 Radeon HD 7450 + 1682 3200 Radeon HD 7450 + 174b 7450 Radeon HD 7450 + 174b e127 Radeon HD 6450 + 174b e153 Radeon HD 6450 + 174b e164 Radeon HD 6450 1 GB DDR3 + 174b e180 Radeon HD 6450 + 174b e201 Radeon HD 6450 + 1787 2311 Radeon HD 6450 + 17af 8450 Radeon HD 8450 OEM + 1b0a 9096 Radeon HD 6450 + 1b0a 9097 Radeon HD 6450 + 1b0a 90a8 Radeon HD 6450A + 1b0a 90b1 Radeon HD 6450 + 1b0a 90b3 Radeon HD 7450A + 1b0a 90bb Radeon HD 7450A + 677b Caicos PRO [Radeon HD 7450] + 6780 Tahiti XT GL [FirePro W9000] + 6784 Tahiti [FirePro Series Graphics Adapter] + 6788 Tahiti [FirePro Series Graphics Adapter] + 678a Tahiti PRO GL [FirePro Series] + 1002 030c FirePro W8000 + 1002 0310 FirePro S9000 + 1002 0420 Radeon Sky 700 + 1002 0422 Radeon Sky 900 + 1002 0710 FirePro S9050 + 1002 0b0e FirePro S10000 Passive + 1002 0b2a FirePro S10000 + 1028 030c FirePro W8000 + 1028 0710 FirePro S9000 + 6798 Tahiti XT [Radeon HD 7970/8970 OEM / R9 280X] + 1002 3000 Tahiti XT2 [Radeon HD 7970 GHz Edition] + 1002 3001 Tahiti XTL [Radeon R9 280X] + 1002 4000 Radeon HD 8970 OEM + 1043 041c HD 7970 DirectCU II + 1043 0420 HD 7970 DirectCU II TOP + 1043 0444 HD 7970 DirectCU II TOP + 1043 0448 HD 7970 DirectCU II TOP + 1043 044a Tahiti XT2 [Matrix HD 7970] + 1043 044c Tahiti XT2 [Matrix HD 7970 Platinum] + 1043 3001 Tahiti XTL [ROG Matrix R9 280X] + 1043 3006 Tahiti XTL [Radeon R9 280X DirectCU II TOP] + 1043 9999 ARES II + 106b 0127 FirePro D700 + 106b 0128 FirePro D700 + 1092 3000 Tahiti XT2 [Radeon HD 7970 GHz Edition] + 1458 2261 Tahiti XT2 [Radeon HD 7970 GHz Edition OC] +# GV-R928XOC-3GD + 1458 3001 Tahiti XTL [Radeon R9 280X OC] + 1462 2774 HD 7970 TwinFrozr III Boost Edition OC + 1682 3001 Tahiti XTL [Radeon R9 280X] + 1682 3211 Double D HD 7970 Black Edition +# FX-797A-TNBC + 1682 3213 HD 7970 Black Edition + 1682 3214 Double D HD 7970 + 1787 201c HD 7970 IceQ X² +# Radeon HD 7970 X2 + 1787 2317 Radeon HD 7990 + 1787 3000 Tahiti XT2 [Radeon HD 7970 GHz Edition] + 679a Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280] + 1002 0b01 Radeon HD 8950 OEM + 1002 3000 Tahiti PRO2 [Radeon HD 7950 Boost] + 1462 3000 Radeon HD 8950 OEM + 174b a003 Radeon R9 280 + 679b Malta [Radeon HD 7990/8990 OEM] + 1002 0b28 Radeon HD 8990 OEM + 1002 0b2a Radeon HD 7990 + 1462 8036 Radeon HD 8990 OEM + 148c 8990 Radeon HD 8990 OEM + 679e Tahiti LE [Radeon HD 7870 XT] + 106b 0125 FirePro D500 + 106b 0126 FirePro D500 + 1787 2328 Radeon HD 7870 Black Edition 2 GB GDDR5 [2GBD5-2DHV3E] + 679f Tahiti + 67a0 Hawaii XT GL [FirePro W9100] + 1002 0335 FirePro S9150 + 1002 0735 FirePro S9170 + 1028 031f FirePro W9100 + 1028 0335 FirePro S9150 + 67a1 Hawaii PRO GL [FirePro W8100] + 1002 0335 FirePro S9100 + 1028 0335 FirePro S9100 + 67a2 Hawaii GL + 67a8 Hawaii + 67a9 Hawaii + 67aa Hawaii + 67b0 Hawaii XT / Grenada XT [Radeon R9 290X/390X] + 1028 0b00 Grenada XT [Radeon R9 390X] + 103c 6566 Radeon R9 390X + 1043 046a R9 290X DirectCU II + 1043 046c R9 290X DirectCU II OC + 1043 0474 Matrix R9 290X Platinum + 1043 0476 ARES III + 1043 04d7 Radeon R9 390X + 1043 04db Radeon R9 390X + 1043 04df Radeon R9 390X + 1043 04e9 Radeon R9 390X + 1458 227c R9 290X WindForce 3X OC + 1458 2281 R9 290X WindForce 3X OC + 1458 228c R9 290X WindForce 3X + 1458 228d R9 290X WindForce 3X OC + 1458 2290 R9 290X WindForce 3X + 1458 22bc Radeon R9 390X + 1458 22c1 Grenada PRO [Radeon R9 390] + 1462 2015 Radeon R9 390X + 1462 3070 R9 290X Lightning + 1462 3071 R9 290X Lightning + 1462 3072 R9 290X Lightning LE + 1462 3080 R9 290X Gaming + 1462 3082 R9 290X Gaming OC + 148c 2347 Devil 13 Dual Core R9 290X + 148c 2357 Grenada XT [Radeon R9 390X] + 1682 9290 Double Dissipation R9 290X + 1682 9395 Grenada XT [Radeon R9 390X] + 174b 0e34 Radeon R9 390X + 174b e282 Vapor-X R9 290X Tri-X OC + 174b e285 R9 290X Tri-X OC + 174b e324 Grenada XT2 [Radeon R9 390X] + 1787 2020 R9 290X IceQ X² Turbo + 1787 2357 Grenada XT [Radeon R9 390X] + 67b1 Hawaii PRO [Radeon R9 290/390] + 1043 04dd STRIX R9 390 + 148c 2358 Radeon R9 390 + 174b e324 Sapphire Nitro R9 390 + 67b8 Hawaii XT [Radeon R9 290X Engineering Sample] + 67b9 Vesuvius [Radeon R9 295X2] + 67be Hawaii LE + 67c0 Ellesmere [Radeon Pro WX 7100 Mobile] + 67c2 Ellesmere [Radeon Pro V7300X / V7350x2] + 67c4 Ellesmere [Radeon Pro WX 7100] + 1002 0336 Radeon Pro Duo + 1002 1336 Radeon Pro Duo + 67c7 Ellesmere [Radeon Pro WX 5100] + 67ca Ellesmere [Polaris10] + 67cc Ellesmere [Polaris10] + 67cf Ellesmere [Polaris10] + 67d0 Ellesmere [Radeon Pro V7300X / V7350x2] + 67d4 Ellesmere [Radeon Pro WX 7100 / Barco MXRT-8700] + 67d7 Ellesmere [Radeon Pro WX 5100 / Barco MXRT-6700] + 67df Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] + 1002 0b37 Radeon RX 480 + 1028 1722 Radeon RX 570X + 1028 1723 Radeon RX 580X +# OEM card found in desktops sold by HP. + 103c 840e Radeon RX 580 4GB + 1043 04a8 Radeon RX 480 + 1043 04b0 Radeon RX 470 + 1043 04fb Radeon RX 480 + 1043 04fd Radeon RX 480 8GB + 1043 056a Radeon RX 590 + 106b 0161 Radeon Pro 580 + 106b 0162 Radeon Pro 575 + 106b 0163 Radeon Pro 570 + 1458 22f0 Radeon RX 570 + 1458 22f7 Radeon RX 570 Gaming 4G + 1462 3411 Radeon RX 470 + 1462 3413 Radeon RX 480 Gaming X 8GB + 1462 3416 Radeon RX 570 + 1462 3418 Radeon RX 580 Armor 4G OC + 1462 341b Radeon RX 570 Armor 8G OC + 1462 341e Radeon RX 570 Armor 4G OC + 1462 809e Radeon RX 480 4GB + 1462 8a92 Radeon RX 580 + 148c 2372 Radeon RX 480 [Red Dragon] + 148c 2373 Radeon RX 470 + 148c 2377 Red Devil RX 580 8G Golden +# https://www.techpowerup.com/vgabios/?manufacturer=Powercolor&model=RX+580 + 148c 2378 Radeon RX 580 + 148c 2379 Radeon RX 570 4G [Red Dragon] + 148c 2391 Radeon RX 590 [Red Devil] + 1682 9470 Radeon RX 470 + 1682 9480 Radeon RX 480 + 1682 9587 Radeon RX 590 FATBOY 8GB + 1682 9588 Radeon RX 580 XTR + 1682 c570 Radeon RX 570 + 1682 c580 Radeon RX 580 + 174b e347 Radeon RX 470/480 + 174b e349 Radeon RX 470 + 1787 a470 Radeon RX 470 + 1787 a480 Radeon RX 480 + 1849 5001 Phantom Gaming X RX 580 OC + 1849 5030 Phantom Gaming D Radeon RX580 8G OC + 1da2 e353 Radeon RX 570 Pulse 4GB + 1da2 e366 Nitro+ Radeon RX 570/580/590 + 1da2 e387 Radeon RX 580 Pulse 4GB + 67e0 Baffin [Radeon Pro WX 4170] + 103c 8270 Radeon Pro WX 4170 + 103c 8272 Radeon Pro WX 4170 + 67e1 Baffin [Polaris11] + 67e3 Baffin [Radeon Pro WX 4100] + 67e8 Baffin [Radeon Pro WX 4130/4150] + 1028 075d Radeon Pro WX 4150 + 1028 07b0 Radeon Pro WX 4130/4150 + 1028 07b1 Radeon Pro WX 4130 + 1028 175d Radeon Pro WX 4150 + 1028 17b0 Radeon Pro WX 4130/4150 + 1028 17b1 Radeon Pro WX 4130 + 103c 8275 Radeon Pro WX 4150 + 103c 8277 Radeon Pro WX 4150 + 67e9 Baffin [Polaris11] + 67eb Baffin [Radeon Pro V5300X] + 67ef Baffin [Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X] + 1025 1367 RX560X 4GB + 1028 1703 RX 560D OEM OC 2 GB + 103c 3421 Radeon RX 460 + 1043 0561 AREZ Radeon RX 560 + 106b 0160 Radeon Pro 460 + 106b 0166 Radeon Pro 455 + 106b 0167 Radeon Pro 450 + 106b 0179 Radeon Pro 560 + 106b 017a Radeon Pro 555 + 106b 018f Radeon Pro 560X + 106b 0190 Radeon Pro 555X + 1642 1727 Polaris 21 XL [Radeon RX 560D] + 1682 956d Polaris 21 XL [Radeon RX 560D] + 67ff Baffin [Radeon RX 550 640SP / RX 560/560X] + 1002 0b04 Radeon RX 560 + 1028 1721 Radeon RX 560X + 1028 1726 Radeon RX 560DX + 103c 8479 Radeon RX 560X Mobile + 1043 04bc Radeon RX 560 + 1043 052f Radeon RX 560 + 1458 22ed Radeon RX 560 + 148c 2381 Radeon RX 560 + 1682 9560 Radeon RX 560 + 1da2 e348 Radeon RX 560 + 1da2 e367 Radeon RX 550 640SP + 6800 Wimbledon XT [Radeon HD 7970M] + 1002 0124 Radeon HD 7970M + 8086 2110 Radeon HD 7970M + 8086 2111 Radeon HD 7970M + 6801 Neptune XT [Radeon HD 8970M] + 1002 0124 Radeon HD 8970M + 1462 1117 Radeon R9 M290X + 8086 2110 Radeon HD 8970M + 8086 2111 Radeon HD 8970M + 6802 Wimbledon + 6806 Neptune + 6808 Pitcairn XT GL [FirePro W7000] + 1002 0310 FirePro S7000 + 1002 0420 Radeon Sky 500 + 103c 030c MED-X7000 + 13cc 3d25 MXRT-7500 + 15c3 030c MED-X7000 + 6809 Pitcairn LE GL [FirePro W5000] + 13cc 3d23 MXRT-5500 + 13cc 3d24 MXRT-5550 + 15c3 0b06 MED-X5000 + 6810 Curacao XT / Trinidad XT [Radeon R7 370 / R9 270X/370X] + 106b 012a FirePro D300 + 106b 012b FirePro D300 + 148c 0908 Radeon R9 370 OEM + 1682 7370 Radeon R7 370 + 6811 Curacao PRO [Radeon R7 370 / R9 270/370 OEM] + 1028 0b00 Trinidad PRO [Radeon R9 370 OEM] + 1043 2016 Trinidad PRO [Radeon R9 370 OEM] + 1458 2016 Trinidad PRO [Radeon R9 370 OEM] + 1462 2016 Trinidad PRO [Radeon R9 370 OEM] + 1462 3050 R9 270 Gaming OC + 148c 2016 Trinidad PRO [Radeon R9 370 OEM] + 1682 2015 Trinidad PRO [Radeon R7 370] + 174b 2015 NITRO Radeon R7 370 + 174b 2016 Trinidad PRO [Radeon R9 370 OEM] + 1787 2016 Trinidad PRO [Radeon R9 370 OEM] + 6816 Pitcairn + 6817 Pitcairn + 6818 Pitcairn XT [Radeon HD 7870 GHz Edition] + 1002 0b05 Radeon HD 8870 OEM + 174b 8b04 Radeon HD 8860 + 6819 Pitcairn PRO [Radeon HD 7850 / R7 265 / R9 270 1024SP] + 1043 042c Radeon HD 7850 + 1682 7269 Radeon R9 270 1024SP + 1682 9278 Radeon R9 270 1024SP + 174b a008 Radeon R9 270 1024SP + 174b e221 Radeon HD 7850 2GB GDDR5 DVI-I/DVI-D/HDMI/DP + 6820 Venus XTX [Radeon HD 8890M / R9 M275X/M375X] + 103c 1851 Radeon HD 7750M + 17aa 3643 Radeon R9 A375 + 17aa 3801 Radeon R9 M275 + 17aa 3824 Radeon R9 M375 + 1da2 e26a Radeon R7 250 + 6821 Venus XT [Radeon HD 8870M / R9 M270X/M370X] + 1002 031e FirePro SX4000 + 1028 05cc FirePro M5100 + 1028 15cc FirePro M5100 + 106b 0149 Radeon R9 M370X Mac Edition + 6822 Venus PRO [Radeon E8860] + 6823 Venus PRO [Radeon HD 8850M / R9 M265X] + 6825 Heathrow XT [Radeon HD 7870M] + 1028 053f FirePro M6000 + 1028 05cd FirePro M6000 + 1028 15cd FirePro M6000 + 103c 176c FirePro M6000 + 8086 2111 Chelsea PRO + 6826 Chelsea LP [Radeon HD 7700M Series] + 6827 Heathrow PRO [Radeon HD 7850M/8850M] + 6828 Cape Verde PRO [FirePro W600] + 15c3 2b1e MED-X6000 + 6829 Cape Verde + 682a Venus PRO + 682b Cape Verde PRO / Venus LE / Tropo PRO-L [Radeon HD 8830M / R7 250 / R7 M465X] + 0128 079c Radeon R7 465X + 1462 3012 Radeon R7 250 + 682c Cape Verde GL [FirePro W4100] + 682d Chelsea XT GL [FirePro M4000] + 682f Chelsea LP [Radeon HD 7730M] + 103c 1851 Radeon HD 7750M + 6835 Cape Verde PRX [Radeon R9 255 OEM] + 6837 Cape Verde LE [Radeon HD 7730/8730] + 1462 2796 Radeon HD 8730 + 1462 8092 Radeon HD 8730 + 148c 8730 Radeon HD 8730 + 1787 3000 Radeon HD 6570 + 683d Cape Verde XT [Radeon HD 7770/8760 / R7 250X] + 1002 0030 Radeon HD 8760 OEM + 1019 0030 Radeon HD 8760 OEM + 103c 6890 Radeon HD 8760 OEM + 1043 8760 Radeon HD 8760 OEM + 1462 2710 R7770-PMD1GD5 + 174b 8304 Radeon HD 8760 OEM + 683f Cape Verde PRO [Radeon HD 7750/8740 / R7 250E] + 1462 2790 Radeon HD 8740 + 1462 2791 Radeon HD 8740 + 1642 3b97 Radeon HD 8740 + 6840 Thames [Radeon HD 7500M/7600M Series] + 1025 050e Radeon HD 7670M + 1025 050f Radeon HD 7670M + 1025 0513 Radeon HD 7670M + 1025 0514 Radeon HD 7670M + 1025 056d Radeon HD 7670M + 1025 059a Radeon HD 7670M + 1025 059b Radeon HD 7670M + 1025 059e Radeon HD 7670M + 1025 0600 Radeon HD 7670M + 1025 0606 Radeon HD 7670M + 1025 0696 Radeon HD 7650M + 1025 0697 Radeon HD 7650M + 1025 0698 Radeon HD 7650M + 1025 0699 Radeon HD 7650M + 1025 0757 Radeon HD 7670M + 1028 056a Radeon HD 7670M + 1028 056e Radeon HD 7670M + 1028 0598 Radeon HD 7670M + 1028 059d Radeon HD 7670M + 1028 05a3 Radeon HD 7670M + 1028 05b9 Radeon HD 7670M + 1028 05bb Radeon HD 7670M + 103c 1789 FirePro M2000 + 103c 17f1 Radeon HD 7570M + 103c 17f4 Radeon HD 7650M + 103c 1813 Radeon HD 7590M + 103c 182f Radeon HD 7670M + 103c 1830 Radeon HD 7670M + 103c 1835 Radeon HD 7670M + 103c 183a Radeon HD 7670M + 103c 183c Radeon HD 7670M + 103c 183e Radeon HD 7670M + 103c 1840 Radeon HD 7670M + 103c 1842 Radeon HD 7670M + 103c 1844 Radeon HD 7670M + 103c 1848 Radeon HD 7670M + 103c 184a Radeon HD 7670M + 103c 184c Radeon HD 7670M + 103c 1895 Radeon HD 7670M + 103c 1897 Radeon HD 7670M + 103c 18a5 Radeon HD 7670M + 103c 18a7 Radeon HD 7670M + 103c 18f4 Radeon HD 7670M + 1043 100a Radeon HD 7670M + 1043 104b Radeon HD 7670M + 1043 10dc Radeon HD 7670M + 1043 2121 Radeon HD 7670M + 1043 2122 Radeon HD 7670M + 1043 2123 Radeon HD 7670M + 1043 2125 Radeon HD 7670M + 1043 2127 Radeon HD 7670M + 1179 fb11 Radeon HD 7670M + 1179 fb22 Radeon HD 7670M + 1179 fb23 Radeon HD 7670M + 1179 fb2c Radeon HD 7670M + 1179 fb31 Radeon HD 7670M + 1179 fb32 Radeon HD 7670M + 1179 fb38 Radeon HD 7670M + 1179 fb39 Radeon HD 7670M + 1179 fb3a Radeon HD 7670M + 1179 fb40 Radeon HD 7670M + 1179 fb41 Radeon HD 7670M + 1179 fb47 Radeon HD 7670M + 1179 fb48 Radeon HD 7670M + 1179 fb51 Radeon HD 7670M + 1179 fb52 Radeon HD 7670M + 1179 fb53 Radeon HD 7670M + 1179 fb81 Radeon HD 7670M + 1179 fb82 Radeon HD 7670M + 1179 fb83 Radeon HD 7670M + 1179 fc56 Radeon HD 7670M + 1179 fcd4 Radeon HD 7670M + 1179 fcee Radeon HD 7670M + 144d c0c5 Radeon HD 7690M + 144d c0ce Radeon HD 7670M + 144d c0da Radeon HD 7670M + 17aa 3970 Radeon HD 7670M + 17aa 397b Radeon HD 7670M + 17aa 5101 Radeon HD 7670M + 17aa 5102 Radeon HD 7670M + 17aa 5103 Radeon HD 7670M + 6841 Thames [Radeon HD 7550M/7570M/7650M] + 1028 0561 Radeon HD 7650M + 1028 056c Radeon HD 7650M + 1028 057f Radeon HD 7570M + 103c 17f1 Radeon HD 7570M + 103c 17f4 Radeon HD 7650M + 103c 1813 Radeon HD 7570M + 103c 183a Radeon HD 7650M + 103c 183c Radeon HD 7650M + 103c 183e Radeon HD 7650M + 103c 1840 Radeon HD 7650M + 103c 1842 Radeon HD 7650M + 103c 1844 Radeon HD 7650M + 1043 100a Radeon HD 7650M + 1043 104b Radeon HD 7650M + 1043 10dc Radeon HD 7650M + 1043 2134 Radeon HD 7650M + 1179 0001 Radeon HD 7570M + 1179 0002 Radeon HD 7570M + 1179 fb43 Radeon HD 7550M + 1179 fb91 Radeon HD 7550M + 1179 fb92 Radeon HD 7550M + 1179 fb93 Radeon HD 7550M + 1179 fba2 Radeon HD 7550M + 1179 fba3 Radeon HD 7550M + 144d c0c7 Radeon HD 7550M + 6842 Thames LE [Radeon HD 7000M Series] + 6843 Thames [Radeon HD 7670M] + 6860 Vega 10 [Radeon Instinct MI25] + 1002 0c35 Radeon PRO V320 + 1002 6c75 Radeon PRO V320 + 106b 017c Radeon Pro Vega 64 + 6861 Vega 10 XT [Radeon PRO WX 9100] + 6862 Vega 10 XT [Radeon PRO SSG] + 6863 Vega 10 XTX [Radeon Vega Frontier Edition] + 6864 Vega 10 [Radeon Pro V340] + 6867 Vega 10 XL [Radeon Pro Vega 56] + 6868 Vega 10 [Radeon PRO WX 8100/8200] + 6869 Vega 10 XGA [Radeon Pro Vega 48] + 686a Vega 10 LEA + 686b Vega 10 XTXA [Radeon Pro Vega 64X] + 686c Vega 10 [Radeon Instinct MI25 MxGPU] + 686d Vega 10 GLXTA + 686e Vega 10 GLXLA + 687f Vega 10 XL/XT [Radeon RX Vega 56/64] + 1002 0b36 RX Vega64 + 1002 6b76 RX Vega64 +# ROG-STRIX-RXVEGA64-O8G-GAMING + 1043 04c4 Radeon RX Vega 64 + 1458 230c Radeon RX VEGA 56 GAMING OC 8G + 1da2 e376 Radeon RX VEGA 56 Pulse 8GB OC HBM2 + 6880 Lexington [Radeon HD 6550M] + 103c 163c Pavilion dv6 Radeon HD 6550M + 6888 Cypress XT [FirePro V8800] + 6889 Cypress PRO [FirePro V7800] + 1002 0301 FirePro V7800P + 13cc 3d1f MXRT-7400 + 688a Cypress XT [FirePro V9800] + 1002 030c FirePro V9800P + 688c Cypress XT GL [FireStream 9370] + 688d Cypress PRO GL [FireStream 9350] + 6898 Cypress XT [Radeon HD 5870] + 1002 0b00 Radeon HD 5870 Eyefinity⁶ Edition + 106b 00d0 Radeon HD 5870 Mac Edition +# R5870-PM2D1G + 1462 8032 Radeon HD 5870 1 GB GDDR5 + 174b 6870 Radeon HD 6870 1600SP Edition + 6899 Cypress PRO [Radeon HD 5850] +# EAH5850 + 1043 0330 Radeon HD 5850 + 174b 237b Radeon HD 5850 X2 + 174b 6850 Radeon HD 6850 1440SP Edition + 689b Cypress PRO [Radeon HD 6800 Series] + 689c Hemlock [Radeon HD 5970] + 1043 0352 ARES + 689d Hemlock [Radeon HD 5970] + 689e Cypress LE [Radeon HD 5830] + 68a0 Broadway XT [Mobility Radeon HD 5870] + 1028 12ef FirePro M7820 + 103c 1520 FirePro M7820 + 68a1 Broadway PRO [Mobility Radeon HD 5850] + 106b 00cc iMac MC511 Mobility Radeon HD 5850 MXM Module + 68a8 Granville [Radeon HD 6850M/6870M] + 1025 0442 Radeon HD 6850M + 1025 0451 Radeon HD 6850M + 1025 050a Radeon HD 6850M + 1025 050b Radeon HD 6850M + 1025 050c Radeon HD 6850M + 1025 050e Radeon HD 6850M + 1025 050f Radeon HD 6850M + 1025 0513 Radeon HD 6850M + 1025 0514 Radeon HD 6850M + 1025 0515 Radeon HD 6850M + 1025 0516 Radeon HD 6850M + 1025 0525 Radeon HD 6850M + 1025 0526 Radeon HD 6850M + 1025 056d Radeon HD 6850M + 1028 048f Radeon HD 6870M + 1028 0490 Radeon HD 6870M + 1028 04b9 Radeon HD 6870M + 1028 04ba Radeon HD 6870M + 103c 159b Radeon HD 6850M + 144d c0ad Radeon HD 6850M + 68a9 Juniper XT [FirePro V5800] + 13cc 3d1e MXRT-5400 + 13cc 3d20 MXRT-5450 + 68b8 Juniper XT [Radeon HD 5770] + 106b 00cf MacPro5,1 [Mac Pro 2.8GHz DDR3] + 68b9 Juniper LE [Radeon HD 5670 640SP Edition] + 68ba Juniper XT [Radeon HD 6770] + 68be Juniper PRO [Radeon HD 5750] + 148c 3000 Radeon HD 6750 + 68bf Juniper PRO [Radeon HD 6750] + 174b 6750 Radeon HD 6750 + 68c0 Madison [Mobility Radeon HD 5730 / 6570M] + 1019 2383 Mobility Radeon HD 5730 + 1028 02a2 Mobility Radeon HD 5730 + 1028 02fe Mobility Radeon HD 5730 + 1028 0419 Mobility Radeon HD 5730 + 103c 147d Mobility Radeon HD 5730 + 103c 1521 Madison XT [FirePro M5800] + 103c 1593 Mobility Radeon HD 6570 + 103c 1596 Mobility Radeon HD 6570 + 103c 1599 Mobility Radeon HD 6570 + 1043 1c22 Mobility Radeon HD 5730 + 17aa 3927 Mobility Radeon HD 5730 + 17aa 3952 Mobility Radeon HD 5730 + 17aa 3978 Radeon HD 6570M + 68c1 Madison [Mobility Radeon HD 5650/5750 / 6530M/6550M] + 1025 0205 Mobility Radeon HD 5650 + 1025 0293 Mobility Radeon HD 5650 + 1025 0294 Mobility Radeon HD 5650 + 1025 0296 Mobility Radeon HD 5650 + 1025 0308 Mobility Radeon HD 5650 + 1025 030a Mobility Radeon HD 5650 + 1025 0311 Mobility Radeon HD 5650 + 1025 0312 Mobility Radeon HD 5650 + 1025 031c Mobility Radeon HD 5650 + 1025 031d Mobility Radeon HD 5650 + 1025 033d Mobility Radeon HD 5650 + 1025 033e Mobility Radeon HD 5650 + 1025 033f Mobility Radeon HD 5650 + 1025 0346 Mobility Radeon HD 5650 + 1025 0347 Aspire 7740G + 1025 0348 Mobility Radeon HD 5650 + 1025 0356 Mobility Radeon HD 5650 + 1025 0357 Mobility Radeon HD 5650 + 1025 0358 Mobility Radeon HD 5650 + 1025 0359 Mobility Radeon HD 5650 + 1025 035a Mobility Radeon HD 5650 + 1025 035b Mobility Radeon HD 5650 + 1025 035c Mobility Radeon HD 5650 + 1025 035d Mobility Radeon HD 5650 + 1025 035e Mobility Radeon HD 5650 + 1025 0360 Mobility Radeon HD 5650 + 1025 0362 Mobility Radeon HD 5650 + 1025 0364 Mobility Radeon HD 5650 + 1025 0365 Mobility Radeon HD 5650 + 1025 0366 Mobility Radeon HD 5650 + 1025 0367 Mobility Radeon HD 5650 + 1025 0368 Mobility Radeon HD 5650 + 1025 036c Mobility Radeon HD 5650 + 1025 036d Mobility Radeon HD 5650 + 1025 036e Mobility Radeon HD 5650 + 1025 036f Mobility Radeon HD 5650 + 1025 0372 Mobility Radeon HD 5650 + 1025 0373 Mobility Radeon HD 5650 + 1025 0377 Mobility Radeon HD 5650 + 1025 0378 Mobility Radeon HD 5650 + 1025 0379 Mobility Radeon HD 5650 + 1025 037a Mobility Radeon HD 5650 + 1025 037b Mobility Radeon HD 5650 + 1025 037e Mobility Radeon HD 5650 + 1025 037f Mobility Radeon HD 5650 + 1025 0382 Mobility Radeon HD 5650 + 1025 0383 Mobility Radeon HD 5650 + 1025 0384 Mobility Radeon HD 5650 + 1025 0385 Mobility Radeon HD 5650 + 1025 0386 Mobility Radeon HD 5650 + 1025 0387 Mobility Radeon HD 5650 + 1025 0388 Mobility Radeon HD 5650 + 1025 038b Mobility Radeon HD 5650 + 1025 038c Mobility Radeon HD 5650 + 1025 039a Mobility Radeon HD 5650 + 1025 0411 Mobility Radeon HD 5650 + 1025 0412 Mobility Radeon HD 5650 + 1025 0418 Mobility Radeon HD 5650 + 1025 0419 Mobility Radeon HD 5650 + 1025 0420 Mobility Radeon HD 5650 + 1025 0421 Mobility Radeon HD 5650 + 1025 0425 Mobility Radeon HD 5650 + 1025 042a Mobility Radeon HD 5650 + 1025 042e Mobility Radeon HD 5650 + 1025 042f Mobility Radeon HD 5650 + 1025 0432 Mobility Radeon HD 5650 + 1025 0433 Mobility Radeon HD 5650 + 1025 0442 Mobility Radeon HD 5650 + 1025 044c Mobility Radeon HD 5650 + 1025 044e Mobility Radeon HD 5650 + 1025 0451 Mobility Radeon HD 5650 + 1025 0454 Mobility Radeon HD 5650 + 1025 0455 Mobility Radeon HD 5650 + 1025 0475 Mobility Radeon HD 5650 + 1025 0476 Mobility Radeon HD 5650 + 1025 0487 Mobility Radeon HD 5650 + 1025 0489 Mobility Radeon HD 5650 + 1025 0498 Mobility Radeon HD 5650 + 1025 0517 Radeon HD 6550M + 1025 051a Radeon HD 6550M + 1025 051b Radeon HD 6550M + 1025 051c Radeon HD 6550M + 1025 051d Radeon HD 6550M + 1025 0525 Radeon HD 6550M + 1025 0526 Radeon HD 6550M + 1025 052b Radeon HD 6550M + 1025 052c Radeon HD 6550M + 1025 053c Radeon HD 6550M + 1025 053d Radeon HD 6550M + 1025 053e Radeon HD 6550M + 1025 053f Radeon HD 6550M + 1025 0607 Radeon HD 6550M + 1028 041b Mobility Radeon HD 5650 + 1028 0447 Mobility Radeon HD 5650 + 1028 0448 Mobility Radeon HD 5650 + 1028 0456 Mobility Radeon HD 5650 + 1028 0457 Mobility Radeon HD 5650 + 103c 1436 Mobility Radeon HD 5650 + 103c 1437 Mobility Radeon HD 5650 + 103c 1440 Mobility Radeon HD 5650 + 103c 1448 Mobility Radeon HD 5650 + 103c 1449 Mobility Radeon HD 5650 + 103c 144a Mobility Radeon HD 5650 + 103c 144b Mobility Radeon HD 5650 + 103c 147b Mobility Radeon HD 5650 + 103c 149c Mobility Radeon HD 5650 + 103c 149e Mobility Radeon HD 5650 + 103c 1521 Madison Pro [FirePro M5800] + 1043 1bc2 Mobility Radeon HD 5650 + 104d 9071 Mobility Radeon HD 5650 + 104d 9077 Mobility Radeon HD 5650 + 104d 9081 Mobility Radeon HD 5650 + 1179 fd00 Mobility Radeon HD 5650 + 1179 fd12 Mobility Radeon HD 5650 + 1179 fd1a Mobility Radeon HD 5650 + 1179 fd30 Mobility Radeon HD 5650 + 1179 fd31 Mobility Radeon HD 5650 + 1179 fd50 Mobility Radeon HD 5650 + 1179 fd52 Radeon HD 6530M + 1179 fd63 Radeon HD 6530M + 1179 fd65 Radeon HD 6530M + 1179 fdd0 Mobility Radeon HD 5650 + 1179 fdd2 Radeon HD 6530M + 144d c07e Mobility Radeon HD 5650 + 144d c085 Mobility Radeon HD 5650 + 14c0 0043 Mobility Radeon HD 5650 + 14c0 004d Mobility Radeon HD 5650 + 17aa 3928 Mobility Radeon HD 5650 + 17aa 3951 Mobility Radeon HD 5650 + 17aa 3977 Radeon HD 6550M + 68c7 Pinewood [Mobility Radeon HD 5570/6550A] + 1462 2241 Mobility Radeon HD 5570 + 1462 2243 Mobility Radeon HD 5570 + 1462 2244 Mobility Radeon HD 5570 + 1462 2245 Radeon HD 6550A + 1462 2246 Radeon HD 6550A + 68c8 Redwood XT GL [FirePro V4800] + 68c9 Redwood PRO GL [FirePro V3800] + 13cc 3d1d MXRT-2400 + 68d8 Redwood XT [Radeon HD 5670/5690/5730] + 1028 68e0 Radeon HD 5670 + 174b 5690 Radeon HD 5690 + 174b 5730 Radeon HD 5730 + 174b e151 Radeon HD 5670 + 1787 3000 Radeon HD 5730 + 17af 3010 Radeon HD 5730 + 17af 3011 Radeon HD 5690 + 68d9 Redwood PRO [Radeon HD 5550/5570/5630/6510/6610/7570] + 103c 6870 Radeon HD 5570 + 103c 6872 Radeon HD 5570 + 1043 03ce Radeon HD 5550 + 1462 2151 Radeon HD 5570 + 1462 2240 Radeon HD 5570 + 148c 3000 Radeon HD 6510 + 148c 3001 Radeon HD 6610 + 1545 5550 Radeon HD 5550 + 1545 7570 Radeon HD 7570 + 1642 3985 Radeon HD 5570 + 1642 3996 Radeon HD 5570 + 174b 3000 Radeon HD 6510 + 174b 6510 Radeon HD 6510 + 174b 6610 Radeon HD 6610 + 174b e142 Radeon HD 5570 + 1787 3000 Radeon HD 6510 + 17af 3000 Radeon HD 6510 + 17af 3010 Radeon HD 5630 + 68da Redwood LE [Radeon HD 5550/5570/5630/6390/6490/7570] + 1462 8071 VR5550-MD1G (Radeon HD 5550) + 148c 3000 Radeon HD 6390 + 148c 3001 Radeon HD 6490 + 1545 7570 Radeon HD 7570 + 174b 3000 Radeon HD 6390 + 174b 5570 Radeon HD 5570 + 174b 5630 Radeon HD 5630 + 174b 6490 Radeon HD 6490 + 1787 3000 Radeon HD 5630 + 17af 3000 Radeon HD 6390 + 17af 3010 Radeon HD 5630 + 68de Redwood + 68e0 Park [Mobility Radeon HD 5430/5450/5470] + 1028 0404 Mobility Radeon HD 5450 + 1028 0414 Mobility Radeon HD 5450 + 1028 0434 Mobility Radeon HD 5450 + 103c 1433 Mobility Radeon HD 5450 + 103c 1434 Mobility Radeon HD 5450 + 103c 1469 Mobility Radeon HD 5450 + 103c 146b Mobility Radeon HD 5450 + 103c 1486 TouchSmart tm2-2050er discrete GPU (Mobility Radeon HD 5450) + 103c 1622 Mobility Radeon HD 5450 + 103c 1623 Mobility Radeon HD 5450 + 103c eeee Mobility Radeon HD 5450 + 104d 9076 Mobility Radeon HD 5450 + 1682 304e Caicos [Radeon HD 5450] + 1682 6000 Caicos [Radeon HD 5450] + 17aa 9e52 FirePro M3800 + 17aa 9e53 FirePro M3800 + 68e1 Park [Mobility Radeon HD 5430] + 1043 041f Caicos [Radeon HD 7350] + 1043 3000 Caicos [Radeon HD 5450] + 148c 3000 Caicos [Radeon HD 5450] + 148c 3001 Caicos [Radeon HD 6230] + 148c 3002 Caicos [Radeon HD 6250] + 148c 3003 Caicos [Radeon HD 6350] + 148c 7350 Caicos [Radeon HD 7350] + 148c 8350 Caicos [Radeon HD 8350] + 1545 5450 Caicos [Radeon HD 5450] + 1545 7350 Caicos [Radeon HD 7350] + 1682 3000 Caicos [Radeon HD 5450] + 1682 6000 Caicos [Radeon HD 5450] + 1682 7350 Caicos [Radeon HD 7350] + 174b 3000 Caicos [Radeon HD 5450] + 174b 5470 Caicos [Radeon HD 5470] + 174b 6000 Caicos [Radeon HD 5450] + 174b 6230 Caicos [Radeon HD 6230] + 174b 6350 Caicos [Radeon HD 6350] + 174b 7350 Caicos [Radeon HD 7350] + 1787 3000 Caicos [Radeon HD 5450] + 17af 3000 Caicos [Radeon HD 5450] + 17af 3001 Caicos [Radeon HD 6230] + 17af 3014 Caicos [Radeon HD 6350] + 17af 3015 Caicos [Radeon HD 7350] + 17af 8350 Caicos [Radeon HD 8350 OEM] + 68e4 Robson CE [Radeon HD 6370M/7370M] + 1019 2386 Radeon HD 6350M + 1019 2387 Radeon HD 6350M + 1019 238d Radeon HD 6370M + 1019 238e Radeon HD 6370M + 1025 0382 Radeon HD 6370M + 1025 0489 Radeon HD 6370M + 1025 048a Radeon HD 6370M + 1025 048b Radeon HD 6370M + 1025 048c Radeon HD 6370M + 1028 04c1 Radeon HD 6370M + 1028 04ca Radeon HD 6370M + 1028 04cc Radeon HD 6370M + 1028 04cd Radeon HD 6370M + 1028 04d7 Radeon HD 6370M + 103c 1411 Radeon HD 6370M + 103c 1421 Radeon HD 6370M + 103c 1426 Radeon HD 6370M + 103c 1428 Radeon HD 6370M + 103c 142a Radeon HD 6370M + 103c 142b Radeon HD 6370M + 103c 143a Radeon HD 6370M + 103c 143c Radeon HD 6370M + 103c 1445 Radeon HD 6370M + 103c 162c Radeon HD 6370M + 103c 162d Radeon HD 6370M + 103c 162e Radeon HD 6370M + 103c 162f Radeon HD 6370M + 103c 1639 Radeon HD 6370M + 103c 163a Radeon HD 6370M + 103c 163b Radeon HD 6370M + 103c 163c Radeon HD 6370M + 103c 163d Radeon HD 6370M + 103c 163e Radeon HD 6370M + 103c 163f Radeon HD 6370M + 103c 1641 Radeon HD 6370M + 103c 1643 Radeon HD 6370M + 103c 3578 Radeon HD 6370M + 103c 357a Radeon HD 6370M + 103c 3673 Radeon HD 6370M + 103c 3675 Radeon HD 6370M + 1043 1c92 Radeon HD 6370M + 1043 84a1 Radeon HD 6370M + 1043 84ad Radeon HD 6370M + 104d 9081 Radeon HD 6370M + 1545 7350 Cedar [Radeon HD 7350] + 1558 4510 Radeon HD 6370M + 1558 5505 Radeon HD 6370M + 174b 5450 Cedar [Radeon HD 5450] + 17aa 21dd Radeon HD 6370M + 17aa 21e9 Radeon HD 6370M + 17aa 3971 Radeon HD 6370M + 17aa 3972 Radeon HD 7370M + 17aa 397a Radeon HD 6370M/7370M + 17aa 397b Radeon HD 6370M/7370M + 17aa 397f Radeon HD 7370M + 68e5 Robson LE [Radeon HD 6330M] + 1179 fd3c Radeon HD 6330M + 1179 fd50 Radeon HD 6330M + 1179 fd52 Radeon HD 6330M + 1179 fd63 Radeon HD 6330M + 1179 fd65 Radeon HD 6330M + 1179 fd73 Radeon HD 6330M + 1179 fd75 Radeon HD 6330M + 1179 fdd0 Radeon HD 6330M + 1179 fdd2 Radeon HD 6330M + 1179 fdea Radeon HD 6330M + 1179 fdf8 Radeon HD 6330M + 148c 5450 Cedar [Radeon HD 5450] + 148c 6350 Cedar [Radeon HD 6350] + 148c 7350 Cedar [Radeon HD 7350] + 148c 8350 Cedar [Radeon HD 8350] + 1545 7350 Cedar [Radeon HD 7350] + 68e8 Cedar + 68e9 Cedar [ATI FirePro (FireGL) Graphics Adapter] + 68f1 Cedar GL [FirePro 2460] + 68f2 Cedar GL [FirePro 2270] + 68f8 Cedar [Radeon HD 7300 Series] + 68f9 Cedar [Radeon HD 5000/6000/7350/8350 Series] + 1019 0001 Radeon HD 5450 + 1019 0002 Radeon HD 5450 + 1019 0019 Radeon HD 6350 + 1025 0518 Radeon HD 5450 + 1025 0519 Radeon HD 5450 + 1028 010e XPS 8300 + 1028 2126 Radeon HD 6350 + 103c 2126 Radeon HD 6350 + 103c 2aac Radeon HD 5450 + 103c 2aae Radeon HD 5450 + 103c 3580 Radeon HD 5450 + 1043 0386 Radeon HD 5450 + 1043 03c2 EAH5450 SILENT/DI/512MD2 (LP) + 1462 2130 Radeon HD 5450 + 1462 2131 Radeon HD 5450 + 1462 2133 Radeon HD 6350 + 1462 2180 Radeon HD 5450 + 1462 2181 Radeon HD 5450 + 1462 2182 Radeon HD 6350 + 1462 2183 Radeon HD 6350 + 1462 2230 Radeon HD 5450 + 1462 2231 Radeon HD 5450 + 1462 2495 Radeon HD 6350 + 148c 3001 Radeon HD 5530/6250 + 148c 3002 Radeon HD 6290 + 148c 3003 Radeon HD 6230 + 148c 3004 Radeon HD 6350 + 148c 7350 Radeon HD 7350 + 148c 8350 Radeon HD 8350 + 1545 7350 Radeon HD 7350 + 1642 3983 Radeon HD 5450 + 1642 3984 Radeon HD 6350 + 1642 3987 Radeon HD 6350 + 1642 3997 Radeon HD 5450 + 1642 3a05 Radeon HD 5450 + 1642 3b31 Radeon HD 6350A + 1682 3270 Radeon HD 7350 + 174b 3000 Radeon HD 6230 + 174b 3987 Radeon HD 6350 + 174b 5470 Radeon HD 5470 + 174b 5490 Radeon HD 5490 + 174b 5530 Radeon HD 5530 + 174b 6230 Radeon HD 6230 + 174b 6250 Radeon HD 6250 + 174b 6290 Radeon HD 6290 + 174b 6350 Radeon HD 6350 + 174b 7350 Radeon HD 7350 + 174b 8350 Radeon HD 8350 + 174b e127 Radeon HD 5450 + 174b e145 Radeon HD 5450 + 174b e153 Radeon HD 5450 + 1787 3000 Radeon HD 5470 + 1787 3001 Radeon HD 5530 + 1787 3002 Radeon HD 5490 + 17aa 3602 Radeon HD 5450 + 17aa 3603 Radeon HD 5450 + 17aa 360f Radeon HD 5450 + 17aa 3619 Radeon HD 5450 + 17af 3000 Radeon HD 6250 + 17af 3001 Radeon HD 6230 + 17af 3002 Radeon HD 6290 + 17af 3011 Radeon HD 5470 + 17af 3012 Radeon HD 5490 + 17af 3013 Radeon HD 5470 + 17af 3014 Radeon HD 6350 + 68fa Cedar [Radeon HD 7350/8350 / R5 220] + 1019 0019 Radeon HD 7350 + 1019 0021 Radeon HD 7350 + 1019 0022 Radeon HD 7350 + 1019 0026 Radeon HD 8350 + 103c 2adf Radeon HD 7350A + 103c 2ae8 Radeon HD 7350A + 1043 8350 Radeon HD 8350 + 1462 2128 Radeon HD 7350 + 1462 2184 Radeon HD 7350 + 1462 2186 Radeon HD 7350 + 1462 2495 Radeon HD 7350 + 1462 b490 Radeon HD 7350 + 1642 3985 Radeon HD 7350 + 174b 3510 Radeon HD 8350 + 174b 3521 Radeon R5 220 + 174b 3522 Radeon R5 220 + 174b 7350 Radeon HD 7350 + 174b 8153 Radeon HD 8350 + 174b e127 Radeon HD 7350 + 174b e153 Radeon HD 7350 + 174b e180 Radeon HD 7350 + 17af 3015 Radeon HD 7350 + 68fe Cedar LE + 6900 Topaz XT [Radeon R7 M260/M265 / M340/M360 / M440/M445 / 530/535 / 620/625 Mobile] + 1025 1056 Radeon R7 M360 / R8 M365DX + 1028 0640 Radeon R7 M260/M265 + 1028 0643 Radeon R7 M260/M265 + 1028 067f Radeon R7 M260 + 1028 0767 Radeon R7 M445 + 1028 0810 Radeon 530 + 1028 130a Radeon R7 M260 + 103c 2263 Radeon R7 M260 + 103c 2269 Radeon R7 M260 + 103c 22c6 Radeon R7 M260 + 103c 22c8 Radeon R7 M260 + 103c 2b45 Radeon R7 A360 + 103c 808c Radeon R7 M260 + 103c 8099 Radeon R7 M360 + 103c 80b5 Radeon R7 M360 + 103c 80b9 Radeon R7 M360 + 103c 811c Radeon R7 M340 + 103c 8226 Radeon R7 M440 + 10cf 1906 Radeon R7 M260 + 1170 9979 Radeon R7 M360 + 1179 f903 Radeon R7 M260 + 1179 f922 Radeon R7 M260 + 1179 f923 Radeon R7 M260 + 1179 f934 Radeon R7 M260 + 17aa 3822 Radeon R7 M360 + 17aa 3824 Radeon R7 M360 + 17aa 5021 Radeon R7 M260 + 6901 Topaz PRO [Radeon R5 M255] + 103c 1318 Radeon R6 M255DX + 6907 Meso XT [Radeon R5 M315] + 6920 Amethyst [Radeon R9 M395/ M395X Mac Edition] + 6921 Amethyst XT [Radeon R9 M295X / M390X] + 6929 Tonga XT GL [FirePro S7150] + 692b Tonga PRO GL [FirePro W7100] + 13cc 3d2b MXRT-7600 + 692f Tonga XTV GL [FirePro S7150V] + 6938 Tonga XT / Amethyst XT [Radeon R9 380X / R9 M295X] + 1043 04f5 Radeon R9 380X + 1043 04f7 Radeon R9 380X + 106b 013a Radeon R9 M295X Mac Edition + 1458 22c8 Radeon R9 380X + 148c 2350 Radeon R9 380X + 1682 9385 Radeon R9 380X + 174b e308 Radeon R9 380X Nitro 4G D5 + 17af 2006 Radeon R9 380X + 6939 Tonga PRO [Radeon R9 285/380] + 1462 2015 Radeon R9 380 Gaming 4G + 148c 9380 Radeon R9 380 +# Make naming scheme consistent + 174b e308 Radeon R9 380 Nitro 4G D5 + 174b e315 Radeon R9 285 + 693b Tonga PRO GL [FirePro W7100 / Barco MXRT-7600] + 694c Polaris 22 XT [Radeon RX Vega M GH] + 694e Polaris 22 XL [Radeon RX Vega M GL] + 694f Polaris 22 MGL XL [Radeon Pro WX Vega M GL] + 6980 Polaris12 + 6981 Lexa XT [Radeon PRO WX 3200] + 6985 Lexa XT [Radeon PRO WX 3100] + 6986 Polaris12 + 6987 Lexa [Radeon 540X/550X/630 / RX 640 / E9171 MCM] + 698f Lexa XT [Radeon PRO WX 3100 / Barco MXRT 4700] + 6995 Lexa XT [Radeon PRO WX 2100] + 699f Lexa PRO [Radeon 540/540X/550/550X / RX 540X/550/550X] + 1028 1720 Radeon RX 550X + 148c 2380 Lexa XL [Radeon RX 550] + 1da2 e367 Lexa PRO [Radeon RX 550] + 69a0 Vega 12 + 69a1 Vega 12 + 69a2 Vega 12 + 69a3 Vega 12 + 69af Vega 12 [Radeon Pro Vega 20] + 6fdf Polaris 20 XL [Radeon RX 580 2048SP] + 700f RS100 AGP Bridge + 7010 RS200/RS250 AGP Bridge + 7100 R520 [Radeon X1800 XT] + 7101 R520/M58 [Mobility Radeon X1800 XT] + 7102 R520/M58 [Mobility Radeon X1800] + 7104 R520 GL [FireGL V7200 / Barco MXTR-5100] + 13cc 3d0a MXRT-5100 + 7109 R520 [Radeon X1800 XL] + 1002 0322 All-in-Wonder X1800XL + 1002 0d02 Radeon X1800 CrossFire Edition + 710a R520 [Radeon X1800 GTO] + 1002 0b12 Radeon X1800 GTO² + 710b R520 [Radeon X1800 GTO] + 710e R520 GL [FireGL V7300] + 13cc 3d0c MXRT-5150 + 710f R520 GL [FireGL V7350] + 13cc 3d0e MXRT-7100 + 7120 R520 [Radeon X1800] (Secondary) + 7124 R520 GL [FireGL V7200] (Secondary) + 13cc 3d0b MXRT-5100 (Secondary) + 7129 R520 [Radeon X1800] (Secondary) + 1002 0323 All-In-Wonder X1800 XL (Secondary) + 1002 0d03 Radeon X1800 CrossFire Edition (Secondary) + 712e R520 GL [FireGL V7300] (Secondary) + 13cc 3d0d MXRT-5150 (Secondary) + 712f R520 GL [FireGL V7350] (Secondary) + 13cc 3d0f MXRT-7100 (Secondary) + 7140 RV515 [Radeon X1300/X1550/X1600 Series] + 7142 RV515 PRO [Radeon X1300/X1550 Series] + 1002 0322 All-in-Wonder 2006 PCI-E Edition + 1043 0142 EAX1300PRO/TD/256M + 7143 RV505 [Radeon X1300/X1550 Series] + 7145 RV515/M54 [Mobility Radeon X1400] + 17aa 2006 Thinkpad T60 model 2007 + 7146 RV515 [Radeon X1300/X1550] + 1002 0322 All-in-Wonder 2006 PCI-E Edition + 1545 1996 Radeon X1300 512MB PCI-e + 7147 RV505 [Radeon X1550 64-bit] + 7149 RV515/M52 [Mobility Radeon X1300] + 714a RV515/M52 [Mobility Radeon X1300] + 7152 RV515 GL [FireGL V3300] + 7153 RV515 GL [FireGL V3350] + 715f RV505 CE [Radeon X1550 64-bit] + 7162 RV515 PRO [Radeon X1300/X1550 Series] (Secondary) + 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary) + 7163 RV505 [Radeon X1550 Series] (Secondary) + 7166 RV515 [Radeon X1300/X1550 Series] (Secondary) + 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary) + 1545 1997 Radeon X1300 512MB PCI-e (Secondary) + 7167 RV515 [Radeon X1550 64-bit] (Secondary) + 7172 RV515 GL [FireGL V3300] (Secondary) + 7173 RV515 GL [FireGL V3350] (Secondary) + 7181 RV516 [Radeon X1600/X1650 Series] + 7183 RV516 [Radeon X1300/X1550 Series] + 7186 RV516/M64 [Mobility Radeon X1450] + 7187 RV516 [Radeon X1300/X1550 Series] + 7188 RV516/M64-S [Mobility Radeon X2300] + 103c 30c1 6910p + 718a RV516/M64 [Mobility Radeon X2300] + 718b RV516/M62 [Mobility Radeon X1350] + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 718c RV516/M62-CSP64 [Mobility Radeon X1350] + 718d RV516/M64-CSP128 [Mobility Radeon X1450] + 7193 RV516 [Radeon X1550 Series] + 7196 RV516/M62-S [Mobility Radeon X1350] + 719b RV516 GL [FireMV 2250] + 13cc 3d12 MXRT-1150 + 13cc 3d14 MXRT-2150 + 719f RV516 [Radeon X1550 Series] + 71a0 RV516 [Radeon X1300/X1550 Series] (Secondary) + 71a1 RV516 [Radeon X1600/X1650 Series] (Secondary) + 71a3 RV516 [Radeon X1300/X1550 Series] (Secondary) + 71a7 RV516 [Radeon X1300/X1550 Series] (Secondary) + 71bb RV516 GL [FireMV 2250] (Secondary) + 13cc 3d13 MXRT-1150 (Secondary) + 13cc 3d15 MXRT-2150 (Secondary) + 71c0 RV530 [Radeon X1600 XT/X1650 GTO] + 1002 e160 Radeon X1650 GTO + 174b e160 Radeon X1650 GTO + 71c1 RV535 [Radeon X1650 PRO] + 174b 0880 Radeon X1700 FSC + 71c2 RV530 [Radeon X1600 PRO] + 71c3 RV530 [Radeon X1600 PRO] + 71c4 RV530/M56 GL [Mobility FireGL V5200] + 17aa 2007 ThinkPad T60p + 71c5 RV530/M56-P [Mobility Radeon X1600] + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq NW8440 + 1043 10b2 A6J-Q008 + 106b 0080 MacBook Pro + 71c6 RV530LE [Radeon X1600/X1650 PRO] + 71c7 RV535 [Radeon X1650 PRO] + 1787 3000 PowerColor X1650 PRO AGP + 71ce RV530 [Radeon X1300 XT/X1600 PRO] + 71d2 RV530 GL [FireGL V3400] + 13cc 3d08 MXRT-2100 + 71d4 RV530/M66 GL [Mobility FireGL V5250] + 71d5 RV530/M66-P [Mobility Radeon X1700] + 71d6 RV530/M66-XT [Mobility Radeon X1700] + 71de RV530/M66 [Mobility Radeon X1700/X2500] + 71e0 RV530 [Radeon X1600] (Secondary) + 174b e161 Radeon X1600 GTO (Secondary) + 71e1 RV535 [Radeon X1650 PRO] (Secondary) + 174b 0881 Radeon X1700 FSC (Secondary) + 71e2 RV530 [Radeon X1600] (Secondary) + 71e6 RV530 [Radeon X1650] (Secondary) + 71e7 RV535 [Radeon X1650 PRO] (Secondary) + 1787 3001 Radeon X1650 PRO AGP + 71f2 RV530 GL [FireGL V3400] (Secondary) + 13cc 3d09 MXRT-2100 (Secondary) + 7210 RV550/M71 [Mobility Radeon HD 2300] + 7211 RV550/M71 [Mobility Radeon X2300 HD] + 7240 R580+ [Radeon X1950 XTX] + 1002 0d02 Radeon X1950 CrossFire Edition + 7244 R580+ [Radeon X1950 XT] + 7248 R580 [Radeon X1950] + 7249 R580 [Radeon X1900 XT] + 1002 0412 All-In-Wonder X1900 + 1002 0b12 Radeon X1900 XT/XTX + 1002 0d02 Radeon X1900 CrossFire Edition + 1043 0160 Radeon X1900 XTX 512 MB GDDR3 + 724b R580 [Radeon X1900 GT] + 1002 0b12 Radeon X1900 (Primary) + 1002 0b13 Radeon X1900 (Secondary) + 724e R580 GL [FireGL V7350] + 7269 R580 [Radeon X1900 XT] (Secondary) + 726b R580 [Radeon X1900 GT] (Secondary) + 726e R580 [AMD Stream Processor] (Secondary) + 7280 RV570 [Radeon X1950 PRO] + 7288 RV570 [Radeon X1950 GT] + 7291 RV560 [Radeon X1650 XT] + 1462 0810 Radeon X1700 SE + 7293 RV560 [Radeon X1650 GT] + 72a0 RV570 [Radeon X1950 PRO] (Secondary) + 72a8 RV570 [Radeon X1950 GT] (Secondary) + 72b1 RV560 [Radeon X1650 XT] (Secondary) + 72b3 RV560 [Radeon X1650 GT] (Secondary) + 7300 Fiji [Radeon R9 FURY / NANO Series] + 1002 0b36 Radeon R9 FURY X / NANO + 1002 1b36 Radeon Pro Duo + 1043 049e Radeon R9 FURY + 1043 04a0 Radeon R9 FURY X + 174b e329 Radeon R9 FURY + 7310 Navi 10 [Radeon Pro W5700X] + 7312 Navi 10 [Radeon Pro W5700] + 7314 Navi 10 USB + 731e TDC-150 + 731f Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] + 1002 0b36 Reference RX 5700 XT + 1458 2313 Radeon RX 5700 XT Gaming OC + 1682 5701 RX 5700 XT RAW II + 1849 5120 Radeon RX 5600 XT + 1da2 e409 Sapphire Technology Limited Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT] + 1da2 e411 Radeon RX 5600 XT + 7340 Navi 14 [Radeon RX 5500/5500M / Pro 5500M] + 7341 Navi 14 [Radeon Pro W5500] + 7347 Navi 14 [Radeon Pro W5500M] + 734f Navi 14 [Radeon Pro W5300M] + 7360 Navi 12 [Radeon Pro 5600M/V520/BC-160] + 7362 Navi 12 [Radeon Pro V520] + 7388 Arcturus GL-XL + 738c Arcturus GL-XL [Instinct MI100] + 738e Arcturus GL-XL [Instinct MI100] + 73a1 Navi 21 [Radeon Pro V620] + 73a2 Navi 21 Pro-XTA [Radeon Pro W6900X] + 73a3 Navi 21 GL-XL [Radeon PRO W6800] + 73a4 Navi 21 USB + 73a5 Navi 21 [Radeon RX 6950 XT] + 73ab Navi 21 Pro-XLA [Radeon Pro W6800X/Radeon Pro W6800X Duo] + 73ae Navi 21 [Radeon Pro V620 MxGPU] + 73af Navi 21 [Radeon RX 6900 XT] + 148c 2414 Navi 21 XTXH [PowerColor Red Devil RX 6900 XT Ultimate] + 73bf Navi 21 [Radeon RX 6800/6800 XT / 6900 XT] + 1002 0e3a Radeon RX 6900 XT + 148c 2408 Red Devil AMD Radeon RX 6900 XT + 1da2 440f TOXIC RX 6900 XT + 1eae 6701 XFX Speedster MERC 319 AMD Radeon RX 6800 XT Black + 73c3 Navi 22 + 73c4 Navi 22 USB + 73ce Navi22-XL SRIOV MxGPU + 73df Navi 22 [Radeon RX 6700/6700 XT/6750 XT / 6800M] + 73e0 Navi 23 + 73e1 Navi 23 WKS-XM [Radeon PRO W6600M] + 73e3 Navi 23 WKS-XL [Radeon PRO W6600] + 73e4 Navi 23 USB + 73ef Navi 23 [Radeon RX 6650 XT] + 73ff Navi 23 [Radeon RX 6600/6600 XT/6600M] + 148c 2412 PowerColor Red Devil RX 6600 XT + 7408 Aldebaran + 740c Aldebaran + 740f Aldebaran + 7421 Navi 24 [Radeon PRO W6500M] + 7422 Navi 24 [Radeon PRO W6400] + 7423 Navi 24 [Radeon PRO W6300/W6300M] + 7424 Navi 24 [Radeon RX 6300] + 743f Navi 24 [Radeon RX 6400 / 6500 XT] + 1da2 e457 PULSE AMD Radeon RX 6500 XT + 7833 RS350 Host Bridge + 7834 RS350 [Radeon 9100 PRO/XT IGP] + 7835 RS350M [Mobility Radeon 9000 IGP] + 7838 RS350 AGP Bridge + 7910 RS690 Host Bridge + 1179 ff50 Satellite P305D-S8995E + 17f2 5000 KI690-AM2 Motherboard + 7911 RS690/RS740 Host Bridge + 1002 7910 RS690/RS740 Host Bridge + 7912 RS690/RS740 PCI to PCI Bridge (Internal gfx) + 7913 RS690 PCI to PCI Bridge (PCI Express Graphics Port 0) + 7915 RS690 PCI to PCI Bridge (PCI Express Port 1) + 7916 RS690 PCI to PCI Bridge (PCI Express Port 2) + 7917 RS690 PCI to PCI Bridge (PCI Express Port 3) + 1002 7910 RS690 PCI to PCI Bridge + 7919 RS690 HDMI Audio [Radeon Xpress 1200 Series] + 1179 7919 Satellite P305D-S8995E + 17f2 5000 KI690-AM2 Motherboard + 791e RS690 [Radeon X1200] + 1462 7327 K9AG Neo2 + 17f2 5000 KI690-AM2 Motherboard + 791f RS690M [Radeon Xpress 1200/1250/1270] + 1179 ff50 Satellite P305D-S8995E + 7930 RS600 Host Bridge + 7932 RS600 PCI to PCI Bridge (Internal gfx) + 7933 RS600 PCI to PCI Bridge (PCI Express Graphics Port 0) + 7935 RS600 PCI to PCI Bridge (PCI Express Port 1) + 7936 RS600 PCI to PCI Bridge (PCI Express Port 2) + 7937 RS690 PCI to PCI Bridge (PCI Express Port 3) + 793b RS600 HDMI Audio [Radeon Xpress 1250] + 793f RS690M [Radeon Xpress 1200/1250/1270] (Secondary) + 7941 RS600 [Radeon Xpress 1250] + 7942 RS600M [Radeon Xpress 1250] + 796e RS740 [Radeon 2100] + 105b 0e13 N15235/A74MX mainboard + 9400 R600 [Radeon HD 2900 PRO/XT] + 1002 2552 Radeon HD 2900 XT + 1002 3000 Radeon HD 2900 PRO + 1002 3142 HIS Radeon HD 2900XT 512MB GDDR3 VIVO PCIe + 9401 R600 [Radeon HD 2900 XT] + 9403 R600 [Radeon HD 2900 PRO] + 9405 R600 [Radeon HD 2900 GT] + 940a R600 GL [FireGL V8650] + 13cc 3d16 MXRT-7200 + 940b R600 GL [FireGL V8600] + 940f R600 GL [FireGL V7600] + 9440 RV770 [Radeon HD 4870] + 9441 R700 [Radeon HD 4870 X2] + 9442 RV770 [Radeon HD 4850] + 1002 0502 MSI Radeon HD 4850 512MB GDDR3 + 174b e810 Radeon HD 4850 512MB GDDR3 + 9443 R700 [Radeon HD 4850 X2] + 9444 RV770 GL [FirePro V8750] + 9446 RV770 GL [FirePro V7760] + 944a RV770/M98L [Mobility Radeon HD 4850] + 944b RV770/M98 [Mobility Radeon HD 4850 X2] + 944c RV770 LE [Radeon HD 4830] + 944e RV770 CE [Radeon HD 4710] + 174b 3261 Radeon HD 4810 + 9450 RV770 GL [FireStream 9270] + 9452 RV770 GL [FireStream 9250] + 9456 RV770 GL [FirePro V8700] + 945a RV770/M98-XT [Mobility Radeon HD 4870] + 9460 RV790 [Radeon HD 4890] + 9462 RV790 [Radeon HD 4860] + 946a RV770 GL [FirePro M7750] + 9480 RV730/M96 [Mobility Radeon HD 4650/5165] + 103c 3628 Mobility Radeon HD 4650 [dv6-1190en] + 9488 RV730/M96-XT [Mobility Radeon HD 4670] + 9489 RV730/M96 GL [Mobility FireGL V5725] + 9490 RV730 XT [Radeon HD 4670] + 174b e880 Radeon HD 4670 512MB GDDR3 Dual DVI-I/TVO + 9491 RV730/M96-CSP [Radeon E4690] + 9495 RV730 [Radeon HD 4600 AGP Series] + 1002 0028 Radeon HD 4650/4670 AGP + 1092 0028 Radeon HD 4670 AGP 512MB DDR2 + 1458 0028 Radeon HD 4650 AGP + 1682 0028 Radeon HD 4650 AGP + 174b 0028 Radeon HD 4650 AGP DDR2 + 9498 RV730 PRO [Radeon HD 4650] + 949c RV730 GL [FirePro V7750] + 13cc 3d1b MXRT-7300 + 949e RV730 GL [FirePro V5700] + 949f RV730 GL [FirePro V3750] + 94a0 RV740/M97 [Mobility Radeon HD 4830] + 94a1 RV740/M97-XT [Mobility Radeon HD 4860] + 94a3 RV740/M97 GL [FirePro M7740] + 94b3 RV740 PRO [Radeon HD 4770] + 94b4 RV740 PRO [Radeon HD 4750] + 94c1 RV610 [Radeon HD 2400 PRO/XT] + 1028 0211 Optiplex 755 + 1028 0d02 Optiplex 755 + 94c3 RV610 [Radeon HD 2400 PRO] + 1028 0302 Radeon HD 2400 Pro + 174b e400 Radeon HD 2400 PRO + 18bc 3550 Radeon HD 2400 PRO + 94c4 RV610 LE [Radeon HD 2400 PRO AGP] + 94c5 RV610 [Radeon HD 2400 LE] + 94c7 RV610 [Radeon HD 2350] + 94c8 RV610/M74 [Mobility Radeon HD 2400 XT] + 94c9 RV610/M72-S [Mobility Radeon HD 2400] + 1002 94c9 Radeon HD2400 + 94cb RV610 [Radeon E2400] + 94cc RV610 LE [Radeon HD 2400 PRO PCI] + 9500 RV670 [Radeon HD 3850 X2] + 9501 RV670 [Radeon HD 3870] + 174b e620 Radeon HD 3870 + 9504 RV670/M88 [Mobility Radeon HD 3850] + 9505 RV670 [Radeon HD 3690/3850] + 148c 3000 Radeon HD 3850 + 174b 3000 Radeon HD 3690/3850 + 1787 3000 Radeon HD 3690 + 9506 RV670/M88 [Mobility Radeon HD 3850 X2] + 9507 RV670 [Radeon HD 3830] + 9508 RV670/M88-XT [Mobility Radeon HD 3870] + 9509 RV670/M88 [Mobility Radeon HD 3870 X2] + 950f R680 [Radeon HD 3870 X2] + 9511 RV670 GL [FireGL V7700] + 9513 RV670 [Radeon HD 3850 X2] + 9515 RV670 PRO [Radeon HD 3850 AGP] + 9519 RV670 GL [FireStream 9170] + 9540 RV710 [Radeon HD 4550] + 954f RV710 [Radeon HD 4350/4550] + 1462 1618 R4350 MD512H (MS-V161) + 9552 RV710/M92 [Mobility Radeon HD 4330/4350/4550] + 1028 1103 M92 [Mobility Radeon HD 4330] +# GV-R435OC-512I/FF1 + 1458 21ac Radeon HD 4350 +# GV-R455HM-512I/F41 + 1458 21ed Radeon HD 4550 +# 113-100928-J01 + 148c 3000 Radeon HD 4350 Go! Green 512MB GDDR3 +# 113-2E172001-003 + 174b 3000 Radeon HD 4350/4550 HyperMemory DDR2 + 9553 RV710/M92 [Mobility Radeon HD 4530/4570/545v] + 1025 015e Mobility Radeon HD 4570 + 1025 017d Mobility Radeon HD 4570 + 1025 0205 Mobility Radeon HD 4570 / 545v + 1025 0206 Mobility Radeon HD 4570 + 1025 0237 Mobility Radeon HD 4570 + 1028 02be Mobility Radeon HD 4570 / 545v + 1028 02e8 Mobility Radeon HD 4530 + 103c 143c Mobility Radeon HD 545v + 103c 1446 Mobility Radeon HD 545v + 103c 3624 Mobility Radeon HD 4530 + 103c 3628 Mobility Radeon HD 4530 + 103c 3636 Mobility Radeon HD 4530 + 1043 1b32 Mobility Radeon HD 4570 + 1043 1b42 Mobility Radeon HD 4570 + 104d 9056 Mobility Radeon HD 4570 + 1179 ff82 Satellite L505-13T GPU (Mobility Radeon HD 5145) + 144d c07f Mobility Radeon HD 545v + 144d c571 Mobility Radeon HD 545v + 1462 1006 Mobility Radeon HD 545v + 17aa 2129 Mobility Radeon HD 545v + 17aa 215b Mobility Radeon HD 545v + 17aa 21bb Mobility Radeon HD 545v + 9555 RV710/M92 [Mobility Radeon HD 4350/4550] + 103c 1411 ProBook 4720s GPU (Mobility Radeon HD 4350) + 9557 RV711/M93 GL [FirePro RG220] + 955f RV710/M92 [Mobility Radeon HD 4330] + 9580 RV630 [Radeon HD 2600 PRO] + 9581 RV630/M76 [Mobility Radeon HD 2600] + 9583 RV630/M76 [Mobility Radeon HD 2600 XT/2700] + 106b 0083 iMac 7,1 + 1734 1107 Mobility Radeon HD 2700 + 9586 RV630 XT [Radeon HD 2600 XT AGP] + 9587 RV630 PRO [Radeon HD 2600 PRO AGP] + 9588 RV630 XT [Radeon HD 2600 XT] + 1458 216c Radeon HD 2600 XT, 256MB GDDR3, 2x DVI, TV-out, PCIe (GV-RX26T256H) + 9589 RV630 PRO [Radeon HD 2600 PRO] +# Rebranded HD 2600 PRO + 1787 3000 Radeon HD 3610 + 958a RV630 [Radeon HD 2600 X2] + 958b RV630/M76 [Mobility Radeon HD 2600 XT] + 958c RV630 GL [FireGL V5600] + 13cc 3d18 MXRT-5200 + 958d RV630 GL [FireGL V3600] + 9591 RV635/M86 [Mobility Radeon HD 3650] + 1002 9591 Mobility Radeon HD 3650 + 9593 RV635/M86 [Mobility Radeon HD 3670] + 9595 RV635/M86 GL [Mobility FireGL V5700] + 9596 RV635 PRO [Radeon HD 3650 AGP] + 1043 0028 EAH3650 SILENT/HTDI/512M/A + 9597 RV635 PRO [Radeon HD 3650 AGP] + 9598 RV635 [Radeon HD 3650/3750/4570/4580] + 1002 9598 Mobility Radeon HD 3600 + 1043 01d6 EAH3650 Silent + 1043 3001 Radeon HD 4570 + 174b 3001 Radeon HD 3750 + 174b 4580 RV635 PRO [Radeon HD 4580] + 17af 3011 RV635 PRO [Radeon HD 4580] + 9599 RV635 PRO [Radeon HD 3650 AGP] + 95c0 RV620 PRO [Radeon HD 3470] + 1002 95c0 Mobility Radeon HD 3470 + 1028 3243 C120D + 95c2 RV620/M82 [Mobility Radeon HD 3410/3430] + 95c4 RV620/M82 [Mobility Radeon HD 3450/3470] + 1002 95c4 Mobility Radeon HD 3400 + 95c5 RV620 LE [Radeon HD 3450] + 1028 0342 OptiPlex 980 + 95c6 RV620 LE [Radeon HD 3450 AGP] + 95c9 RV620 LE [Radeon HD 3450 PCI] + 95cc RV620 GL [FirePro V3700] + 95cd RV620 GL [FirePro 2450] + 95cf RV620 GL [FirePro 2260] + 960f RS780 HDMI Audio [Radeon 3000/3100 / HD 3200/3300] + 1462 7596 760GM-E51(MS-7596) Motherboard + 9610 RS780 [Radeon HD 3200] + 1458 d000 GA-MA78GM-S2H Motherboard + 9611 RS780C [Radeon 3100] + 9612 RS780M [Mobility Radeon HD 3200] + 9613 RS780MC [Mobility Radeon HD 3100] + 9614 RS780D [Radeon HD 3300] + 9615 RS780E [Radeon HD 3200] + 9616 RS780L [Radeon 3000] +# ID is probably a copy-paste error by a MSI developer from another mainboard, since all other ID numbers on this mainboard including the sub-device of this device has used subsystem ID 1462:7596 + 1462 7501 760GM-E51(MS-7596) Motherboard + 9640 Sumo [Radeon HD 6550D] + 9641 Sumo [Radeon HD 6620G] + 9642 SuperSumo [Radeon HD 6370D] + 9643 SuperSumo [Radeon HD 6380G] + 9644 SuperSumo [Radeon HD 6410D] + 9645 SuperSumo [Radeon HD 6410D] + 9647 Sumo [Radeon HD 6520G] + 9648 Sumo [Radeon HD 6480G] + 9649 SuperSumo [Radeon HD 6480G] + 964a Sumo [Radeon HD 6530D] + 964b Sumo + 964c Sumo + 964e Sumo + 964f Sumo + 970f RS880 HDMI Audio [Radeon HD 4200 Series] + 1019 2120 A785GM-M + 1043 83a2 M4A785TD Motherboard + 1043 843e M5A88-V EVO + 9710 RS880 [Radeon HD 4200] + 1019 2120 A785GM-M + 1043 83a2 M4A785TD Motherboard + 9712 RS880M [Mobility Radeon HD 4225/4250] + 103c 1609 ProLiant MicroServer N36L + 9713 RS880M [Mobility Radeon HD 4100] + 9714 RS880 [Radeon HD 4290] + 9715 RS880 [Radeon HD 4250] + 1043 843e M5A88-V EVO +# Radeon HD 6250 too? + 9802 Wrestler [Radeon HD 6310] + 174b 1001 PURE Fusion Mini + 9803 Wrestler [Radeon HD 6310] + 9804 Wrestler [Radeon HD 6250] + 9805 Wrestler [Radeon HD 6250] + 9806 Wrestler [Radeon HD 6320] + 9807 Wrestler [Radeon HD 6290] + 9808 Wrestler [Radeon HD 7340] + 9809 Wrestler [Radeon HD 7310] + 980a Wrestler [Radeon HD 7290] + 9830 Kabini [Radeon HD 8400 / R3 Series] + 1043 8623 AM1I-A Motherboard + 9831 Kabini [Radeon HD 8400E] + 9832 Kabini [Radeon HD 8330] + 1849 9832 QC5000-ITX/PH + 9833 Kabini [Radeon HD 8330E] + 9834 Kabini [Radeon HD 8210] + 9835 Kabini [Radeon HD 8310E] + 9836 Kabini [Radeon HD 8280 / R3 Series] + 9837 Kabini [Radeon HD 8280E] + 9838 Kabini [Radeon HD 8240 / R3 Series] + 9839 Kabini [Radeon HD 8180] + 983d Temash [Radeon HD 8250/8280G] + 9840 Kabini HDMI/DP Audio + 1043 8623 AM1I-A Motherboard + 1849 9840 QC5000-ITX/PH + 9850 Mullins [Radeon R3 Graphics] + 9851 Mullins [Radeon R4/R5 Graphics] + 1179 f928 Beema [Radeon R5 Graphics] + 9852 Mullins [Radeon R2 Graphics] + 9853 Mullins [Radeon R2 Graphics] + 9854 Mullins [Radeon R3E Graphics] + 9855 Mullins [Radeon R6 Graphics] + 9856 Mullins [Radeon R1E/R2E Graphics] + 9857 Mullins [Radeon APU XX-2200M with R2 Graphics] + 9858 Mullins + 9859 Mullins + 985a Mullins + 985b Mullins + 985c Mullins + 985d Mullins + 985e Mullins + 985f Mullins + 9874 Wani [Radeon R5/R6/R7 Graphics] + 1002 1871 Radeon R5 Graphics + 1002 1e20 Radeon R7 Graphics + 1028 06bd Radeon R6 Graphics + 103c 2b44 Radeon R6 Graphics + 103c 8221 Radeon R5 Graphics + 103c 8223 Radeon R5 Graphics + 103c 8238 Radeon R7 Graphics + 103c 8353 Radeon R7 Graphics + 1458 d000 Radeon R7 Graphics + 17aa 5113 Radeon R6 Graphics + 17aa 5116 Radeon R6 Graphics + 17aa 5118 Radeon R5 Graphics + 9890 Amur + 98c0 Nolan + 98e4 Stoney [Radeon R2/R3/R4/R5 Graphics] + 9900 Trinity [Radeon HD 7660G] + 103c 1985 Pavilion 17-e163sg Notebook PC +# AMD A10-5800K CPU + 9901 Trinity [Radeon HD 7660D] + 9902 Trinity HDMI Audio Controller + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 9903 Trinity [Radeon HD 7640G] + 103c 194e ProBook 455 G1 Notebook + 103c 1952 ProBook 455 G1 Notebook + 9904 Trinity [Radeon HD 7560D] + 9905 Trinity GL [FirePro A300] + 9906 Trinity GL [FirePro A320] + 9907 Trinity [Radeon HD 7620G] + 9908 Trinity [Radeon HD 7600G] + 9909 Trinity [Radeon HD 7500G] + 990a Trinity [Radeon HD 7500G] + 990b Richland [Radeon HD 8650G] + 990c Richland [Radeon HD 8670D] + 990d Richland [Radeon HD 8550G] + 990e Richland [Radeon HD 8570D] + 990f Richland [Radeon HD 8610G] + 9910 Trinity [Radeon HD 7660G] + 9913 Trinity [Radeon HD 7640G] + 9917 Trinity [Radeon HD 7620G] + 9918 Trinity [Radeon HD 7600G] + 9919 Trinity [Radeon HD 7500G] + 991e Bishop [Xbox One S APU] + 9920 Liverpool [Playstation 4 APU] + 9921 Liverpool HDMI/DP Audio Controller + 9922 Starshp + 9923 Starsha2 [Kingston/Clayton] + 9924 Gladius + 9925 Kingston/Clayton/Jupiter/Gladius/Montego HDMI Controller + 9926 Jupiter + 9990 Trinity 2 [Radeon HD 7520G] + 9991 Trinity 2 [Radeon HD 7540D] + 9992 Trinity 2 [Radeon HD 7420G] + 9993 Trinity 2 [Radeon HD 7480D] + 9994 Trinity 2 [Radeon HD 7400G] + 9995 Richland [Radeon HD 8450G] + 9996 Richland [Radeon HD 8470D] + 9997 Richland [Radeon HD 8350G] + 9998 Richland [Radeon HD 8370D] + 9999 Richland [Radeon HD 8510G] + 999a Richland [Radeon HD 8410G] + 999b Richland [Radeon HD 8310G] + 999c Richland [Radeon HD 8650D] +# AMD Quad-Core A8-Series APU A8-6500T with Radeon HD 8550D + 999d Richland [Radeon HD 8550D] + 99a0 Trinity 2 [Radeon HD 7520G] + 99a2 Trinity 2 [Radeon HD 7420G] + 99a4 Trinity 2 [Radeon HD 7400G] + aa00 R600 HDMI Audio [Radeon HD 2900 GT/PRO/XT] + aa01 RV635 HDMI Audio [Radeon HD 3650/3730/3750] + aa08 RV630 HDMI Audio [Radeon HD 2600 PRO/XT / HD 3610] + aa10 RV610 HDMI Audio [Radeon HD 2350 PRO / 2400 PRO/XT / HD 3410] + 174b aa10 Radeon HD 2400 PRO + 18bc aa10 Radeon HD 2400 PRO + aa18 RV670/680 HDMI Audio [Radeon HD 3690/3800 Series] + aa20 RV635 HDMI Audio [Radeon HD 3650/3730/3750] + aa28 RV620 HDMI Audio [Radeon HD 3450/3470/3550/3570] + aa30 RV770 HDMI Audio [Radeon HD 4850/4870] + 174b aa30 Radeon HD 4850 512MB GDDR3 PCI-E Dual Slot Fansink + aa38 RV710/730 HDMI Audio [Radeon HD 4000 series] + 103c 3628 dv6-1190en + aa50 Cypress HDMI Audio [Radeon HD 5830/5850/5870 / 6850/6870 Rebrand] + aa58 Juniper HDMI Audio [Radeon HD 5700 Series] +# 5500, 5600 and mobile 5700 series + aa60 Redwood HDMI Audio [Radeon HD 5000 Series] + 1025 033d Mobility Radeon HD 5650 + 1025 0347 Aspire 7740G + aa68 Cedar HDMI Audio [Radeon HD 5400/6300/7300 Series] + 1028 aa68 XPS 8300 + aa80 Cayman/Antilles HDMI Audio [Radeon HD 6930/6950/6970/6990] + aa88 Barts HDMI Audio [Radeon HD 6790/6850/6870 / 7720 OEM] + aa90 Turks HDMI Audio [Radeon HD 6500/6600 / 6700M Series] + 1028 04a3 Precision M4600 + aa98 Caicos HDMI Audio [Radeon HD 6450 / 7450/8450/8490 OEM / R5 230/235/235X OEM] + 174b aa98 Radeon HD 6450 1GB DDR3 + aaa0 Tahiti HDMI Audio [Radeon HD 7870 XT / 7950/7970] + aab0 Oland/Hainan/Cape Verde/Pitcairn HDMI Audio [Radeon HD 7000 Series] + aab8 Tiran HDMI Audio + aac0 Tobago HDMI Audio [Radeon R7 360 / R9 360 OEM] + 1043 aac0 R7260X-DC2OC-2GD5 + aac8 Hawaii HDMI Audio [Radeon R9 290/290X / 390/390X] + aad8 Tonga HDMI Audio [Radeon R9 285/380] + 174b aad8 Radeon R9 285/380 HDMI Audio + aae0 Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X] + aae8 Fiji HDMI/DP Audio [Radeon R9 Nano / FURY/FURY X] + aaf0 Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] + aaf8 Vega 10 HDMI Audio [Radeon Vega 56/64] + ab00 Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X] + ab08 Polaris 22 HDMI Audio + ab10 Lexa HDMI Audio + ab18 Vega 12 HDMI Audio + ab20 Vega 20 HDMI Audio [Radeon VII] + ab28 Navi 21/23 HDMI/DP Audio Controller + ab38 Navi 10 HDMI Audio + ac00 Theater 506 World-Wide Analog Decoder + ac01 Theater 506 World-Wide Analog Decoder + ac02 TV Wonder HD 600 PCIe + ac03 Theater 506 PCIe + ac04 Theater 506 USB + ac05 Theater 506 USB + ac06 Theater 506 External USB + ac07 Theater 506 External USB + ac08 Theater 506A World-Wide Analog Decoder + Demodulator + ac09 Theater 506A World-Wide Analog Decoder + Demodulator + ac0a Theater 506A PCIe + ac0b Theater 506A PCIe + ac0c Theater 506A USB + ac0d Theater 506A USB + ac0e Theater 506A External USB + ac0f Theater 506A External USB + ac12 Theater HD T507 (DVB-T) TV tuner/capture device + cab0 RS100 Host Bridge + cab2 RS200 Host Bridge + cab3 RS250 Host Bridge + cbb2 RS200 Host Bridge +1003 ULSI Systems + 0201 US201 +1004 VLSI Technology Inc + 0005 82C592-FC1 + 0006 82C593-FC1 + 0007 82C594-AFC2 + 0008 82C596/7 [Wildcat] + 0009 82C597-AFC2 + 000c 82C541 [Lynx] + 000d 82C543 [Lynx] + 0101 82C532 + 0102 82C534 [Eagle] + 0103 82C538 + 0104 82C535 + 0105 82C147 + 0200 82C975 + 0280 82C925 + 0304 QSound ThunderBird PCI Audio + 1004 0304 QSound ThunderBird PCI Audio + 122d 1206 DSP368 Audio + 1483 5020 XWave Thunder 3D Audio + 0305 QSound ThunderBird PCI Audio Gameport + 1004 0305 QSound ThunderBird PCI Audio Gameport + 122d 1207 DSP368 Audio Gameport + 1483 5021 XWave Thunder 3D Audio Gameport + 0306 QSound ThunderBird PCI Audio Support Registers + 1004 0306 QSound ThunderBird PCI Audio Support Registers + 122d 1208 DSP368 Audio Support Registers + 1483 5022 XWave Thunder 3D Audio Support Registers + 0307 SAA7785 ThunderBird PCI Audio + 1004 0703 Philips Rhythmic Edge PSC703 + 1004 0705 Philips Seismic Edge PSC705 + 1004 0706 Philips Acoustic Edge PSC706 + 0308 SAA7785 ThunderBird PCI Audio Gameport + 0702 VAS96011 [Golden Gate II] + 0703 Tollgate +1005 Avance Logic Inc. [ALI] + 2064 ALG2032/2064 + 2128 ALG2364A + 2301 ALG2301 + 2302 ALG2302 + 2364 ALG2364 + 2464 ALG2364A + 2501 ALG2564A/25128A +1006 Reply Group +1007 NetFrame Systems Inc +1008 Epson +100a Phoenix Technologies +100b National Semiconductor Corporation + 0001 DP83810 + 0002 87415/87560 IDE + 000e 87560 Legacy I/O + 000f FireWire Controller + 0011 NS87560 National PCI System I/O + 0012 USB Controller + 0020 DP83815 (MacPhyter) Ethernet Controller + 103c 0024 Pavilion ze4400 builtin Network + 12d9 000c Aculab E1/T1 PMXc cPCI carrier card + 1385 f311 FA311 / FA312 (FA311 with WoL HW) + 1385 f312 FA312 (rev. A1) Fast Ethernet PCI Adapter + 0021 PC87200 PCI to ISA Bridge + 0022 DP83820 10/100/1000 Ethernet Controller + 1186 4900 DGE-500T + 1385 621a GA621 + 1385 622a GA622T + 0028 Geode GX2 Host Bridge + 002a CS5535 South Bridge + 002b CS5535 ISA bridge + 002d CS5535 IDE + 002e CS5535 Audio + 002f CS5535 USB + 0030 Geode GX2 Graphics Processor + 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller + 0500 SCx200 Bridge + 0501 SCx200 SMI + 0502 SCx200, SC1100 IDE controller + 100b 0502 IDE Controller + 0503 SCx200, SC1100 Audio Controller + 100b 0503 XpressAudio controller + 0504 SCx200 Video + 0505 SCx200 XBus + 0510 SC1100 Bridge + 100b 0500 GPIO and LPC support bridge + 0511 SC1100 SMI & ACPI + 100b 0501 SC1100 SMI & ACPI bridge + 0515 SC1100 XBus + 100b 0505 SC1100 PCI to XBus bridge + d001 87410 IDE +100c Tseng Labs Inc + 3202 ET4000/W32p rev A + 3205 ET4000/W32p rev B + 3206 ET4000/W32p rev C + 3207 ET4000/W32p rev D + 3208 ET6000 + 4702 ET6300 +100d AST Research Inc +100e Weitek + 9000 P9000 Viper + 9001 P9000 Viper + 9002 P9000 Viper + 9100 P9100 Viper Pro/SE +1010 Video Logic, Ltd. +1011 Digital Equipment Corporation + 0001 DECchip 21050 + 0002 DECchip 21040 [Tulip] + 0004 DECchip 21030 [TGA] + 0007 NVRAM [Zephyr NVRAM] + 0008 KZPSA [KZPSA] + 0009 DECchip 21140 [FasterNet] + 1025 0310 21140 Fast Ethernet + 10b8 2001 SMC9332BDT EtherPower 10/100 + 10b8 2002 SMC9332BVT EtherPower T4 10/100 + 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port) + 1109 2400 ANA-6944A/TX Fast Ethernet + 1112 2300 RNS2300 Fast Ethernet + 1112 2320 RNS2320 Fast Ethernet + 1112 2340 RNS2340 Fast Ethernet + 1113 1207 EN-1207-TX Fast Ethernet + 1186 1100 DFE-500TX Fast Ethernet + 1186 1112 DFE-570TX Fast Ethernet + 1186 1140 DFE-660 Cardbus Ethernet 10/100 + 1186 1142 DFE-660 Cardbus Ethernet 10/100 + 11f6 0503 Freedomline Fast Ethernet + 1282 9100 AEF-380TXD Fast Ethernet + 1385 1100 FA310TX Fast Ethernet + 2646 0001 KNE100TX Fast Ethernet + 000a 21230 Video Codec + 000d PBXGB [TGA2] + 000f PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA) + 1011 def1 FDDIcontroller/PCI (DEFPA) + 103c def1 FDDIcontroller/PCI (3X-DEFPA) + 0014 DECchip 21041 [Tulip Pass 3] + 1186 0100 DE-530+ + 0016 ATMworks 350 Adapter [OPPO] (DGLPB) + 0017 PV-PCI Graphics Controller (ZLXp-L) + 0018 Memory Channel interface + 0019 DECchip 21142/43 + 1011 500a DE500A Fast Ethernet + 1011 500b DE500B Fast Ethernet + 1014 0001 10/100 EtherJet Cardbus + 1025 0315 ALN315 Fast Ethernet + 1033 800c PC-9821-CS01 100BASE-TX Interface Card + 1033 800d PC-9821NR-B06 100BASE-TX Interface Card + 103c 125a 10/100Base-TX (PCI) [A5506B] + 108d 0016 Rapidfire 2327 10/100 Ethernet + 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus + 10b8 2005 SMC8032DT Extreme Ethernet 10/100 + 10b8 8034 SMC8034 Extreme Ethernet 10/100 + 10ef 8169 Cardbus Fast Ethernet + 1109 2a00 ANA-6911A/TX Fast Ethernet + 1109 2b00 ANA-6911A/TXC Fast Ethernet + 1109 3000 ANA-6922/TX Fast Ethernet + 1113 1207 Cheetah Fast Ethernet + 1113 2220 Cardbus Fast Ethernet + 115d 0002 Cardbus Ethernet 10/100 + 1179 0203 Fast Ethernet + 1179 0204 Cardbus Fast Ethernet + 1186 1100 DFE-500TX Fast Ethernet + 1186 1101 DFE-500TX Fast Ethernet + 1186 1102 DFE-500TX Fast Ethernet + 1186 1112 DFE-570TX Quad Fast Ethernet + 11f0 4235 21143 [FASTLine-II UTP 10/100] + 1259 2800 AT-2800Tx Fast Ethernet + 1266 0004 Eagle Fast EtherMAX + 12af 0019 NetFlyer Cardbus Fast Ethernet + 1374 0001 Cardbus Ethernet Card 10/100 + 1374 0002 Cardbus Ethernet Card 10/100 + 1374 0007 Cardbus Ethernet Card 10/100 + 1374 0008 Cardbus Ethernet Card 10/100 + 1385 2100 FA510 + 1395 0001 10/100 Ethernet CardBus PC Card + 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200) + 1498 000a TPMC880-10 10/100Base-T and 10Base2 PMC Ethernet Adapter + 1498 000b TPMC880-11 Single 10/100Base-T PMC Ethernet Adapter + 1498 000c TPMC880-12 Single 10Base2 PMC Ethernet Adapter + 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card + 1668 2000 FastNet Pro (PE2000) + 2646 0001 KNE100TX + 2646 0002 KNE-CB4TX + 8086 0001 EtherExpress PRO/100 Mobile CardBus 32 + 001a Farallon PN9000SX Gigabit Ethernet + 0021 DECchip 21052 + 0022 DECchip 21150 + 0023 DECchip 21150 + 0024 DECchip 21152 + 0025 DECchip 21153 + 0026 DECchip 21154 + 0034 56k Modem Cardbus + 1374 0003 56k Modem Cardbus + 0045 DECchip 21553 + 0046 DECchip 21554 + 0e11 4050 Smart Array 4200 Controller + 0e11 4051 Smart Array 4250ES Controller + 0e11 4058 Smart Array 431 Controller + 103c 10c2 NetRAID-4M + 12d9 000a IP Telephony card + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 9005 0364 5400S (Mustang) + 9005 0365 5400S (Mustang) + 9005 1364 Dell PowerEdge RAID Controller 2 + 9005 1365 Dell PowerEdge RAID Controller 2 + e4bf 1000 CC8-1-BLUES + 1065 StrongARM DC21285 + 1069 0020 DAC960P / DAC1164P +1012 Micronics Computers Inc +1013 Cirrus Logic + 0038 GD 7548 + 0040 GD 7555 Flat Panel GUI Accelerator + 004c GD 7556 Video/Graphics LCD/CRT Ctrlr + 00a0 GD 5430/40 [Alpine] + 00a2 GD 5432 [Alpine] + 00a4 GD 5434-4 [Alpine] + 00a8 GD 5434-8 [Alpine] + 00ac GD 5436 [Alpine] + 00b0 GD 5440 + 00b8 GD 5446 + 1af4 1100 QEMU Virtual Machine + 00bc GD 5480 + 1013 00bc CL-GD5480 + 00d0 GD 5462 + 00d2 GD 5462 [Laguna I] + 00d4 GD 5464 [Laguna] + 00d5 GD 5464 BD [Laguna] + 00d6 GD 5465 [Laguna] + 13ce 8031 Barco Metheus 2 Megapixel, Dual Head + 13cf 8031 Barco Metheus 2 Megapixel, Dual Head + 00e8 GD 5436U + 1100 CL 6729 + 1110 PD 6832 PCMCIA/CardBus Ctrlr + 1112 PD 6834 PCMCIA/CardBus Ctrlr + 1113 PD 6833 PCMCIA/CardBus Ctrlr + 1200 GD 7542 [Nordic] + 1202 GD 7543 [Viking] + 1204 GD 7541 [Nordic Light] + 4000 MD 5620 [CLM Data Fax Voice] + 4400 CD 4400 + 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator] + 1014 1010 CS4610 SoundFusion Audio Accelerator + 6003 CS 4614/22/24/30 [CrystalClear SoundFusion Audio Accelerator] + 1013 4280 Crystal SoundFusion PCI Audio Accelerator + 1014 0153 ThinkPad 600X/A20m + 153b 112e DMX XFire 1024 + 153b 1136 SiXPack 5.1+ + 1681 0050 Game Theater XP + 1681 a010 Gamesurround Fortissimo II + 1681 a011 Gamesurround Fortissimo III 7.1 + 5053 3357 Santa Cruz + 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] + 6005 Crystal CS4281 PCI Audio + 1013 4281 Crystal CS4281 PCI Audio + 10cf 10a8 Crystal CS4281 PCI Audio + 10cf 10a9 Crystal CS4281 PCI Audio + 10cf 10aa Crystal CS4281 PCI Audio + 10cf 10ab Crystal CS4281 PCI Audio + 10cf 10ac Crystal CS4281 PCI Audio + 10cf 10ad Crystal CS4281 PCI Audio + 10cf 10b4 Crystal CS4281 PCI Audio + 1179 0001 Crystal CS4281 PCI Audio + 14c0 000c Crystal CS4281 PCI Audio +1014 IBM + 0002 PCI to MCA Bridge + 0005 Processor to I/O Controller [Alta Lite] + 0007 Processor to I/O Controller [Alta MP] + 000a PCI to ISA Bridge (IBM27-82376) [Fire Coral] + 0017 CPU to PCI Bridge + 0018 TR Auto LANstreamer + 001b GXT-150P + 001c Carrera + 001d SCSI-2 FAST PCI Adapter (82G2675) + 0020 GXT1000 Graphics Adapter + 0022 PCI to PCI Bridge (IBM27-82351) + 002d Processor to I/O Controller [Python] + 002e SCSI RAID Adapter [ServeRAID] + 1014 002e ServeRAID-3x + 1014 022e ServeRAID-4H + 0031 2 Port Serial Adapter +# AS400 iSeries PCI sync serial card + 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter + 0036 PCI to 32-bit LocalBus Bridge [Miami] + 0037 PowerPC to PCI Bridge (IBM27-82660) + 003a CPU to PCI Bridge + 003c GXT250P/GXT255P Graphics Adapter + 003e 16/4 Token ring UTP/STP controller + 1014 003e Token-Ring Adapter + 1014 00cd Token-Ring Adapter + Wake-On-LAN + 1014 00ce 16/4 Token-Ring Adapter 2 + 1014 00cf 16/4 Token-Ring Adapter Special + 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter + 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN + 1014 016d iSeries 2744 Card + 0045 SSA Adapter + 0046 MPIC interrupt controller + 0047 PCI to PCI Bridge + 0048 PCI to PCI Bridge + 0049 Warhead SCSI Controller + 004e ATM Controller (14104e00) + 004f ATM Controller (14104f00) + 0050 ATM Controller (14105000) + 0053 25 MBit ATM Controller + 0054 GXT500P/GXT550P Graphics Adapter + 0057 MPEG PCI Bridge + 0058 SSA Adapter [Advanced SerialRAID/X] + 005e GXT800P Graphics Adapter + 007c ATM Controller (14107c00) + 007d 3780IDSP [MWave] + 008b EADS PCI to PCI Bridge + 008e GXT3000P Graphics Adapter + 0090 GXT 3000P + 1014 008e GXT-3000P + 0091 SSA Adapter + 0095 20H2999 PCI Docking Bridge + 0096 Chukar chipset SCSI controller + 1014 0097 iSeries 2778 DASD IOA + 1014 0098 iSeries 2763 DASD IOA + 1014 0099 iSeries 2748 DASD IOA + 009f PCI 4758 Cryptographic Accelerator + 00a5 ATM Controller (1410a500) + 00a6 ATM 155MBPS MM Controller (1410a600) + 00b7 GXT2000P Graphics Adapter + 1092 00b8 FireGL1 AGP 32Mb + 00b8 GXT2000P Graphics Adapter + 00be ATM 622MBPS Controller (1410be00) + 00dc Advanced Systems Management Adapter (ASMA) + 00fc CPC710 Dual Bridge and Memory Controller (PCI-64) + 0105 CPC710 Dual Bridge and Memory Controller (PCI-32) + 010f Remote Supervisor Adapter (RSA) + 0142 Yotta Video Compositor Input + 1014 0143 Yotta Input Controller (ytin) + 0144 Yotta Video Compositor Output + 1014 0145 Yotta Output Controller (ytout) + 0156 405GP PLB to PCI Bridge + 015e 622Mbps ATM PCI Adapter + 0160 64bit/66MHz PCI ATM 155 MMF + 016e GXT4000P Graphics Adapter + 0170 GXT6000P Graphics Adapter + 1092 0172 Fire GL2 + 1092 0173 Fire GL3 + 1092 0174 Fire GL4 + 1092 0184 Fire GL4s + 017d GXT300P Graphics Adapter + 0180 Snipe chipset SCSI controller + 1014 0241 iSeries 2757 DASD IOA + 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780) + 0188 EADS-X PCI-X to PCI-X Bridge + 01a7 PCI-X to PCI-X Bridge + 01bd ServeRAID Controller + 1014 01bd ServeRAID 4Lx + 1014 01be ServeRAID-4M + 1014 01bf ServeRAID-4L + 1014 0208 ServeRAID-4Mx + 1014 020e ServeRAID-4Lx + 1014 022e ServeRAID-4H + 1014 0258 ServeRAID-5i + 1014 0259 ServeRAID-5i + 01c1 64bit/66MHz PCI ATM 155 UTP + 01e6 Cryptographic Accelerator + 01ef PowerPC 440GP PCI Bridge + 1734 102b PCEAS PCI-X Dual Port ESCON Adapter + 1734 10f8 PCEAT PCI-Express Dual Port ESCON Adapter + 01ff 10/100 Mbps Ethernet + 0219 Multiport Serial Adapter + 1014 021a Dual RVX + 1014 0251 Internal Modem/RVX + 1014 0252 Quad Internal Modem + 021b GXT6500P Graphics Adapter + 021c GXT4500P Graphics Adapter + 0233 GXT135P Graphics Adapter +# Internal debugging card for CELL based systems + 025a Drone card + 028c Citrine chipset SCSI controller + 1014 028d Dual Channel PCI-X DDR SAS RAID Adapter (572E) + 1014 02be Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B) + 1014 02c0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A) + 1014 030d PCI-X DDR Auxiliary Cache Adapter (575B) + 02a1 Calgary PCI-X Host Bridge + 02bd Obsidian chipset SCSI controller + 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C) + 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/571D) + 1014 0338 PCI-X DDR Auxiliary Cache Adapter (575C) + 0302 Winnipeg PCI-X Host Bridge + 0308 CalIOC2 PCI-E Root Port + 0311 FC 5740/1954 4-Port 10/100/1000 Base-TX PCI-X Adapter for POWER + 0314 ZISC 036 Neural accelerator card + 032d Axon - Cell Companion Chip + 1014 03a1 PCIe PowerXCell 8i Cell Accelerator Board + 0339 Obsidian-E PCI-E SCSI controller + 1014 030a PCIe 3Gb SAS RAID Adapter (574E) + 1014 033a PCIe 3Gb SAS Adapter (57B3) + 1014 035c PCIe x8 Internal 3Gb SAS adapter (57CC) + 1014 0360 PCI-E Auxiliary Cache Adapter (57B7) + 033d PCI-E IPR SAS Adapter (FPGA) + 1014 033c PCIe2 1.8GB Cache 6Gb SAS RAID Adapter Tri-port (57B5) + 1014 0353 PCIe2 3.1GB Cache 6Gb SAS RAID Enclosure (57C3) + 1014 0354 PCIe2 6Gb SAS Adapter Dual-port (57C4) + 1014 0356 PCIe2 1.8GB Cache 6Gb SAS RAID & SSD Adapter (574D) + 1014 035f PCIe2 6Gb SAS Adapter Quad-port (57B2) + 034a PCI-E IPR SAS Adapter (ASIC) + 1014 033b PCIe2 6Gb SAS RAID Adapter Quad-port (57B4) + 1014 0355 PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57B1) + 1014 0357 PCIe2 6Gb SAS Adapter Quad-port (57C6) + 1014 035d PCIe3 1.8GB Cache RAID SAS Adapter Quad-port 6GB (57C8) + 1014 035e PCIe2 3.6GB Cache 6Gb SAS RAID Adapter Quad-port (57CE) + 1014 03fb PCIe3 28GB Cache RAID SAS Enclosure 6Gb x 16 (57D5) + 1014 03fe PCIe3 x8 Cache SAS RAID Internal Adapter 6Gb (57D8) + 1014 03ff PCIe3 x8 SAS RAID Internal Adapter 6Gb (57D7) + 1014 0474 PCIe3 x16 Cache SAS RAID Internal Adapter 6Gb (57EB) + 1014 0475 PCIe3 x16 SAS RAID Internal Adapter 6Gb (57EC) + 1014 0499 PCIe3 x16 Cache SAS RAID Internal Adapter 6Gb (57ED) + 1014 049a PCIe3 x16 SAS RAID Internal Adapter 6Gb (57EE) + 1014 04c7 PCIe3 x 8 Cache SAS RAID Internal Adapter 6GB(2CCA) + 1014 04c8 PCIe3 x 8 Cache SAS RAID Internal Adapter 6GB(2CD2) + 1014 04c9 PCIe3 x 8 Cache SAS RAID Internal Adapter 6GB(2CCD) + 03dc POWER8 Host Bridge (PHB3) + 044b GenWQE Accelerator Adapter + 04aa Flash Adapter 90 (PCIe2 0.9TB) + 04c1 POWER9 Host Bridge (PHB4) + 04da PCI-E IPR SAS+ Adapter (ASIC) + 1014 04fb PCIe3 x16 20GB Cache 12Gb Quad SAS RAID+ Adapter(580B) + 1014 04fc PCIe3 x8 12Gb Quad SAS RAID+ Adapter(580A) + 04ed Internal Shared Memory (ISM) virtual PCI device + 3022 QLA3022 Network Adapter + 4022 QLA3022 Network Adapter + ffff MPIC-2 interrupt controller +1015 LSI Logic Corp of Canada +1016 ICL Personal Systems +1017 SPEA Software AG + 5343 SPEA 3D Accelerator +1018 Unisys Systems +1019 Elitegroup Computer Systems +101a AT&T GIS (NCR) + 0005 100VG ethernet + 0007 BYNET BIC4G/2C/2G + 101a 0019 BYNET BIC2C + 101a 001c BYNET BIC2G + 101a 001f BYNET BIC4G + 0009 PQS Memory Controller + 000a BYNET BPCI Adapter + 000b BYNET 4 Port BYA Switch (BYA4P) + 000c BYNET 4 Port BYA Switch (BYA4G) + 0010 NCR AMC Memory Controller + 1dc1 BYNET BIC2M/BIC4M/BYA4M + 101a 0019 BIC2M + 101a 001f BIC4M + 101a 0ece BYA4M + 1fa8 BYNET Multi-port BIC Adapter (XBIC Based) + 101a 00c3 BYNET BIC2SE +101b Vitesse Semiconductor +# Maxim VSC452 Super BMC Controller with Video + 0452 VSC452 [SuperBMC] +101c Western Digital + 0193 33C193A + 0196 33C196A + 0197 33C197A + 0296 33C296A + 3193 7193 + 3197 7197 + 3296 33C296A + 4296 34C296 + 9710 Pipeline 9710 + 9712 Pipeline 9712 + c24a 90C +# ID for Newly Acquired Storage Products from Vitesse +101d Maxim Integrated Products +101e American Megatrends Inc. + 0009 MegaRAID 428 Ultra RAID Controller (rev 03) + 1960 MegaRAID + 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller + 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller + 101e 0477 MegaRAID 477 Elite 3100 RAID Controller + 101e 0493 MegaRAID 493 Elite 1600 RAID Controller + 101e 0494 MegaRAID 494 Elite 1650 RAID Controller + 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller + 101e 0511 MegaRAID 511 i4 IDE RAID Controller + 101e 0522 MegaRAID 522 i4133 RAID Controller + 1028 0471 PowerEdge RAID Controller 3/QC + 1028 0475 PowerEdge RAID Controller 3/SC + 1028 0493 PowerEdge RAID Controller 3/DC + 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch + 103c 60e7 NetRAID-1M + 103c 60e8 NetRaid 2M [AMI MegaRaid 493] + 9010 MegaRAID 428 Ultra RAID Controller + 9030 EIDE Controller + 9031 EIDE Controller + 9032 EIDE & SCSI Controller + 9033 SCSI Controller + 9040 Multimedia card + 9060 MegaRAID 434 Ultra GT RAID Controller + 9063 MegaRAC + 101e 0767 Dell Remote Assistant Card 2 +101f PictureTel +1020 Hitachi Computer Products +1021 OKI Electric Industry Co. Ltd. +1022 Advanced Micro Devices, Inc. [AMD] + 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration + 1101 K8 [Athlon64/Opteron] Address Map + 1102 K8 [Athlon64/Opteron] DRAM Controller + 1103 K8 [Athlon64/Opteron] Miscellaneous Control + 1200 Family 10h Processor HyperTransport Configuration + 1201 Family 10h Processor Address Map + 1202 Family 10h Processor DRAM Controller + 1203 Family 10h Processor Miscellaneous Control + 1204 Family 10h Processor Link Control + 1300 Family 11h Processor HyperTransport Configuration + 1301 Family 11h Processor Address Map + 1302 Family 11h Processor DRAM Controller + 1303 Family 11h Processor Miscellaneous Control + 1304 Family 11h Processor Link Control + 1305 Griffin Function 5 + 1306 Griffin Function 6 + 1307 Griffin Function 7 + 1308 Kaveri Audio Controller + 1314 Wrestler/Bheem/Ontario/Krishna Audio Controller + 13e0 Ariel Root Complex + 13e1 Ariel IOMMU + 13e2 Ariel PCIe Dummy Host Bridge + 13e3 Ariel PCIe GPP Bridge + 13e4 Ariel PCIe Dummy Host Bridge + 13e5 Ariel Internal PCIe GPP Bridge 0 to Bus A + 13e6 Ariel Internal PCIe GPP Bridge 0 to Bus B + 13e7 Ariel SMBus Controller + 13e8 Ariel LPC Bridge + 13e9 Ariel Internal GPU + 13ea Ariel HD Audio Controller + 13eb Ariel HD Audio Coprocessor + 13ec Ariel Cryptographic Coprocessor + 13ed Ariel USB 3.1 Type C: Gen2 x 1port + DP Alt Mode + 13ee Ariel USB 3.1 Type A: Gen2 x 2 ports + 13ef Ariel ZCN/MP4 + 13f0 Ariel Device 24: Function 0 + 13f1 Ariel Device 24: Function 1 + 13f2 Ariel Device 24: Function 2 + 13f3 Ariel Device 24: Function 3 + 13f4 Ariel Device 24: Function 4 + 13f5 Ariel Device 24: Function 5 + 13f6 Ariel Device 24: Function 6 + 13f7 Ariel Device 24: Function 7 + 1400 Family 15h (Models 10h-1fh) Processor Function 0 + 1401 Family 15h (Models 10h-1fh) Processor Function 1 + 1402 Family 15h (Models 10h-1fh) Processor Function 2 + 1403 Family 15h (Models 10h-1fh) Processor Function 3 + 1404 Family 15h (Models 10h-1fh) Processor Function 4 + 1405 Family 15h (Models 10h-1fh) Processor Function 5 + 1410 Family 15h (Models 10h-1fh) Processor Root Complex + 103c 1985 Pavilion 17-e163sg Notebook PC + 1412 Family 15h (Models 10h-1fh) Processor Root Port + 1022 1234 Trinity A-series APU + 1413 Family 15h (Models 10h-1fh) Processor Root Port + 1414 Family 15h (Models 10h-1fh) Processor Root Port + 1022 1234 Trinity A-series APU + 1415 Family 15h (Models 10h-1fh) Processor Root Port + 1416 Family 15h (Models 10h-1fh) Processor Root Port + 1417 Family 15h (Models 10h-1fh) Processor Root Port + 1418 Family 15h (Models 10h-1fh) Processor Root Port + 1419 Family 15h (Models 10h-1fh) I/O Memory Management Unit + 141a Family 15h (Models 30h-3fh) Processor Function 0 + 141b Family 15h (Models 30h-3fh) Processor Function 1 + 141c Family 15h (Models 30h-3fh) Processor Function 2 + 141d Family 15h (Models 30h-3fh) Processor Function 3 + 141e Family 15h (Models 30h-3fh) Processor Function 4 + 141f Family 15h (Models 30h-3fh) Processor Function 5 + 1422 Family 15h (Models 30h-3fh) Processor Root Complex + 1423 Family 15h (Models 30h-3fh) I/O Memory Management Unit + 1424 Family 15h (Models 30h-3fh) Processor Root Port + 1425 Kaveri P2P Bridge for GFX PCIe Port [1:0] + 1426 Family 15h (Models 30h-3fh) Processor Root Port + 142e Liverpool Processor HT configuration + 142f Liverpool Processor Address Maps + 1430 Liverpool Processor DRAM configuration + 1431 Liverpool Processor Misc configuration + 1432 Liverpool Processor PM configuration + 1433 Liverpool Processor NB Performance Monitor + 1434 Liverpool Processor SPLL Configuration + 1436 Liverpool Processor Root Complex + 1437 Liverpool I/O Memory Management Unit + 1438 Liverpool UMI PCIe Dummy Host Bridge + 1439 Family 16h Processor Functions 5:1 + 143a Kingston/Clayton/Gladius/Montego Root Complex + 143b Kingston/Clayton/Gladius/Montego P2P Bridge for UMI Link + 1440 Matisse/Vermeer Data Fabric: Device 18h; Function 0 + 1441 Matisse/Vermeer Data Fabric: Device 18h; Function 1 + 1442 Matisse/Vermeer Data Fabric: Device 18h; Function 2 + 1443 Matisse/Vermeer Data Fabric: Device 18h; Function 3 + 1444 Matisse/Vermeer Data Fabric: Device 18h; Function 4 + 1445 Matisse/Vermeer Data Fabric: Device 18h; Function 5 + 1446 Matisse/Vermeer Data Fabric: Device 18h; Function 6 + 1447 Matisse/Vermeer Data Fabric: Device 18h; Function 7 + 1448 Renoir Device 24: Function 0 + 1449 Renoir Device 24: Function 1 + 144a Renoir Device 24: Function 2 + 144b Renoir Device 24: Function 3 + 144c Renoir Device 24: Function 4 + 144d Renoir Device 24: Function 5 + 144e Renoir Device 24: Function 6 + 144f Renoir Device 24: Function 7 + 1450 Family 17h (Models 00h-0fh) Root Complex + 1451 Family 17h (Models 00h-0fh) I/O Memory Management Unit + 1452 Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge + ea50 ce19 mCOM10-L1900 + 1453 Family 17h (Models 00h-0fh) PCIe GPP Bridge + 1454 Family 17h (Models 00h-0fh) Internal PCIe GPP Bridge 0 to Bus B + 1455 Zeppelin/Renoir PCIe Dummy Function + 1456 Family 17h (Models 00h-0fh) Platform Security Processor + 1457 Family 17h (Models 00h-0fh) HD Audio Controller + 145a Zeppelin/Raven/Raven2 PCIe Dummy Function + 145b Zeppelin Non-Transparent Bridge + 145c Family 17h (Models 00h-0fh) USB 3.0 Host Controller + 145d Zeppelin Switch Upstream (PCIE SW.US) + 145e Zeppelin Switch Downstream (PCIE SW.DS) + 145f Zeppelin USB 3.0 Host controller + 1460 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 0 + 1461 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 1 + 1462 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 2 + 1463 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 3 + 1464 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 4 + 1465 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 5 + 1466 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 6 + 1467 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 7 + 1468 Zeppelin Cryptographic Coprocessor NTBCCP + 1470 Vega 10 PCIe Bridge + 1471 Vega 10 PCIe Bridge + 1480 Starship/Matisse Root Complex + 1462 7c37 X570-A PRO motherboard + 15d9 1b95 H12SSL-i + 1481 Starship/Matisse IOMMU + 1482 Starship/Matisse PCIe Dummy Host Bridge + 1483 Starship/Matisse GPP Bridge + 01de fff9 Gimlet Baseboard + 1484 Starship/Matisse Internal PCIe GPP Bridge 0 to bus[E:B] + 1485 Starship/Matisse Reserved SPP + 1486 Starship/Matisse Cryptographic Coprocessor PSPCPP + 1487 Starship/Matisse HD Audio Controller + 1462 9c37 X570-A PRO motherboard + 1488 Starship Reserved SSP + 1489 Starship Reserved SSP + 148a Starship/Matisse PCIe Dummy Function + 148b Starship/Matisse Non-Transparent Bridge + 148c Starship USB 3.0 Host Controller + 15d9 145c H12SSL-i + 148d Starship/Matisse Switch Upstream (PCIE SW.US) + 148e Starship/Matisse Switch Downstream (PCIE SW.DS) + 148f Starship Reserved SSP + 1490 Starship Device 24; Function 0 + 1491 Starship Device 24; Function 1 + 1492 Starship Device 24; Function 2 + 1493 Starship Device 24; Function 3 + 1494 Starship Device 24; Function 4 + 1495 Starship Device 24; Function 5 + 1496 Starship Device 24; Function 6 + 1497 Starship Device 24; Function 7 + 1498 Starship/Matisse PTDMA + 1499 Starship/Matisse NVMe + 149a Starship PCIe GPP Bridge [1:0] + 149b Starship Reserved SSP + 149c Matisse USB 3.0 Host Controller + 1462 7c37 X570-A PRO motherboard + 149d Vangogh CVIP + 1510 Family 14h Processor Root Complex + 174b 1001 PURE Fusion Mini + 1512 Family 14h Processor Root Port + 1513 Family 14h Processor Root Port + 1514 Family 14h Processor Root Port + 1515 Family 14h Processor Root Port + 1516 Family 14h Processor Root Port + 1530 Family 16h Processor Function 0 + 1531 Family 16h Processor Function 1 + 1532 Family 16h Processor Function 2 + 1533 Family 16h Processor Function 3 + 1534 Family 16h Processor Function 4 + 1535 Family 16h Processor Function 5 + 1536 Family 16h Processor Root Complex + 1043 8623 AM1I-A Motherboard + 1849 1536 QC5000-ITX/PH + 1537 Kabini/Mullins PSP-Platform Security Processor + 1538 Family 16h Processor Function 0 + 1539 Kabini P2P Bridge for PCIe Ports[4:0] + 1540 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky HT Configuration + 1541 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky Address Maps + 1542 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky DRAM Configuration + 1543 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky Miscellaneous Configuration + 1544 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky PM Configuration + 1545 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky NB Performance Monitor + 1546 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky Root Complex + 1547 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky IOMMU + 1548 Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky UMI PCIe Dummy Host Bridge + 1549 Kryptos/Cato/Garfield/Garfield+ P2P Bridge for PCIe Port [3:0] + 154a Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky Audio Processor + 154b Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky Security Processor + 154d Kryptos/Cato/Garfield/Garfield+/Arlene/Pooky/Anubis HDMI Controller + 154f Anubis Audio Processor + 1550 Garfield+/Arlene/Pooky/Anubis SPLL Configuration + 1553 Arlene/Pooky P2P Bridge for PCIE (3:0) + 155b Anubis Root Complex + 155c Anubis IOMMU + 155d Anubis UMI PCIe Dummy Bridge + 155e Anubis P2P Bridge for PCIe Ports [4:0] + 1560 Anubis Security Processor + 1566 Family 16h (Models 30h-3fh) Processor Root Complex + 1567 Mullins IOMMU + 156b Family 16h (Models 30h-3fh) Host Bridge + 1570 Family 15h (Models 60h-6fh) Processor Function 0 + 1571 Family 15h (Models 60h-6fh) Processor Function 1 + 1572 Family 15h (Models 60h-6fh) Processor Function 2 + 1573 Family 15h (Models 60h-6fh) Processor Function 3 + 1574 Family 15h (Models 60h-6fh) Processor Function 4 + 1575 Family 15h (Models 60h-6fh) Processor Function 5 + 1576 Family 15h (Models 60h-6fh) Processor Root Complex + 1577 Family 15h (Models 60h-6fh) I/O Memory Management Unit + 1578 Carrizo Platform Security Processor + 1579 Carrizo Audio Processor + 157a Family 15h (Models 60h-6fh) Audio Controller + 157b Family 15h (Models 60h-6fh) Host Bridge + 157c Family 15h (Models 60h-6fh) Processor Root Port + 157d Carrizo Audio Dummy Host Bridge + 157e Carrizo Audio Controller + 1580 Family 16h (Models 30h-3fh) Processor Function 0 + 1581 Family 16h (Models 30h-3fh) Processor Function 1 + 1582 Family 16h (Models 30h-3fh) Processor Function 2 + 1583 Family 16h (Models 30h-3fh) Processor Function 3 + 1584 Family 16h (Models 30h-3fh) Processor Function 4 + 1585 Family 16h (Models 30h-3fh) Processor Function 5 + 1590 Amur/Nolan HT Configuration + 1591 Amur/Nolan Address Maps + 1592 Amur/Nolan DRAM Configuration + 1593 Amur/Nolan Miscellaneous Configuration + 1594 Amur/Nolan PM Configuration + 1595 Amur/Nolan NB Performance Monitor + 1596 Amur/Nolan Root Complex + 1597 Amur/Nolan IOMMU + 1598 Amur/Nolan Platform Security Processor + 1599 Amur/Nolan PCIe Dummy Host Bridge + 159d Amur Function 6: Gasket + 15b0 Stoney HT Configuration + 15b1 Stoney Address Maps + 15b2 Stoney DRAM Configuration + 15b3 Stoney Miscellaneous Configuration + 15b4 Stoney PM Configuration + 15b5 Stoney NB Performance Monitor + 15bc Stoney PCIe [GFX,GPP] Bridge [4:0] + 15be Stoney Audio Processor + 15d0 Raven/Raven2 Root Complex + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME B450M-A Motherboard + ea50 ce19 mCOM10-L1900 + 15d1 Raven/Raven2 IOMMU + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME B450M-A Motherboard + ea50 ce19 mCOM10-L1900 + 15d2 Raven/Raven2 PCIe Dummy Host Bridge + 15d3 Raven/Raven2 PCIe GPP Bridge [6:0] + ea50 ce19 mCOM10-L1900 + 15d4 FireFlight USB 3.1 + 15d5 FireFlight USB 3.1 + 15da Raven/Raven2 PCIe Dummy Host Bridge + 15db Raven/Raven2 Internal PCIe GPP Bridge 0 to Bus A + ea50 ce19 mCOM10-L1900 + 15dc Raven/Raven2 Internal PCIe GPP Bridge 0 to Bus B + ea50 ce19 mCOM10-L1900 + 15de Raven/Raven2/FireFlight HD Audio Controller + 15df Family 17h (Models 10h-1fh) Platform Security Processor + 1043 876b PRIME Motherboard + 17aa 5124 ThinkPad E595 + ea50 ce19 mCOM10-L1900 + 15e0 Raven USB 3.1 + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME Motherboard + 17aa 5124 ThinkPad E595 + ea50 ce19 mCOM10-L1900 + 15e1 Raven USB 3.1 + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME Motherboard + 17aa 5124 ThinkPad E595 + ea50 ce19 mCOM10-L1900 + 15e2 ACP/ACP3X/ACP6x Audio Coprocessor + 17aa 5124 ThinkPad E595 + ea50 ce19 mCOM10-L1900 + 15e3 Family 17h/19h HD Audio Controller + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 86c7 PRIME B450M-A Motherboard + 17aa 5124 ThinkPad E595 + 15e4 Sensor Fusion Hub + 15e5 Raven2 USB 3.1 + ea50 ce19 mCOM10-L1900 + 15e6 Raven/Raven2/Renoir Non-Sensor Fusion Hub KMDF driver + 1022 15e4 Raven/Raven2/Renoir Sensor Fusion Hub + ea50 ce19 mCOM10-L1900 + 15e8 Raven/Raven2 Device 24: Function 0 + 15e9 Raven/Raven2 Device 24: Function 1 + 15ea Raven/Raven2 Device 24: Function 2 + 15eb Raven/Raven2 Device 24: Function 3 + 15ec Raven/Raven2 Device 24: Function 4 + 15ed Raven/Raven2 Device 24: Function 5 + 15ee Raven/Raven2 Device 24: Function 6 + 15ef Raven/Raven2 Device 24: Function 7 + 15f0 FireFlight Device 24: Function 0 + 15f1 FireFlight Device 24: Function 1 + 15f2 FireFlight Device 24: Function 2 + 15f3 FireFlight Device 24: Function 3 + 15f4 FireFlight Device 24: Function 4 + 15f5 FireFlight Device 24: Function 5 + 15f6 FireFlight Device 24: Function 6 + 15f7 FireFlight Device 24: Function 7 + 15f8 FireFlight Root Complex + 15f9 FireFlight IOMMU + 15fa FireFlight PCIe Dummy Host Bridge + 15fb FireFlight PCIe GPP Bride 3:0 + 15fc FireFlight PCIe Dummy Host Bridge + 15fd FireFlight Internal PCIe GPP Bridge 0 to Bus A + 15fe FireFlight Internal PCIe GPP Bridge 0 to Bus B + 15ff FireFlight Bus A; Device 0: Function 0: Internal GPU + 1600 Family 15h Processor Function 0 + 1601 Family 15h Processor Function 1 + 1602 Family 15h Processor Function 2 + 1603 Family 15h Processor Function 3 + 1604 Family 15h Processor Function 4 + 1605 Family 15h Processor Function 5 + 1606 Arden Security Processor + 1608 Arden Device 18h: Function 0 + 1609 Arden Device 18h: Function 1 + 160a Arden Device 18h: Function 2 + 160b Arden Device 18h: Function 3 + 160c Arden Device 18h: Function 4 + 160d Arden Device 18h: Function 5 + 160e Arden Device 18h: Function 6 + 160f Arden Device 18h: Function 7 + 1620 Anubis HT Configuration + 1621 Anubis Address Maps + 1622 Anubis DRAM Configuration + 1623 Anubis Miscellaneous Configuration + 1624 Anubis PM Configuration + 1625 Anubis NB Performance Monitor + 1626 Arden Root Complex + 1627 Arden IOMMU + 1628 Arden PCIe Dummy Host Bridge + 1629 Arden PCIe GPP Bridge + 162a Arden Internal PCIe GPP Bridge 0 to bus X + 162b Arden PCIe Non-Transparent Bridge + 1630 Renoir/Cezanne Root Complex + 1631 Renoir/Cezanne IOMMU + 1632 Renoir PCIe Dummy Host Bridge + 1633 Renoir PCIe GPP Bridge + 1634 Renoir/Cezanne PCIe GPP Bridge + 1635 Renoir Internal PCIe GPP Bridge to Bus + 1637 Renoir HD Audio Controller + 1639 Renoir/Cezanne USB 3.1 + 163a VanGogh USB0 + 163b VanGogh USB1 + 163c VanGogh SecUSB + 163d VanGogh SecureFunction + 163e VanGogh HSP + 1641 Renoir 10GbE Controller Port 0 (XGBE0/1) + 1642 Renoir WLAN + 1643 Renoir BT + 1644 Renoir I2S + 1648 VanGogh Root Complex + 1649 VanGogh PSP/CCP + 164f Milan IOMMU + 1650 Milan Data Fabric; Function 0 + 1651 Milan Data Fabric; Function 1 + 1652 Milan Data Fabric; Function 2 + 1653 Milan Data Fabric; Function 3 + 1654 Milan Data Fabric; Function 4 + 1655 Milan Data Fabric; Function 5 + 1656 Milan Data Fabric; Function 6 + 1657 Milan Data Fabric; Function 7 + 166a Cezanne Data Fabric; Function 0 + 166b Cezanne Data Fabric; Function 1 + 166c Cezanne Data Fabric; Function 2 + 166d Cezanne Data Fabric; Function 3 + 166e Cezanne Data Fabric; Function 4 + 166f Cezanne Data Fabric; Function 5 + 1670 Cezanne Data Fabric; Function 6 + 1671 Cezanne Data Fabric; Function 7 + 1700 Family 12h/14h Processor Function 0 + 1701 Family 12h/14h Processor Function 1 + 1702 Family 12h/14h Processor Function 2 + 1703 Family 12h/14h Processor Function 3 + 1704 Family 12h/14h Processor Function 4 + 1705 Family 12h Processor Root Complex + 1706 Llano P2P Bridge to external GPU + 1707 Family 12h Processor Root Port + 1708 Family 12h Processor Root Port + 1709 Family 12h Processor Root Port + 170a Family 12h Processor Root Port + 170b Family 12h Processor Root Port + 170c Family 12h Processor Root Port + 170d Family 12h Processor Root Port + 1716 Family 12h/14h Processor Function 5 + 1718 Family 12h/14h Processor Function 6 + 1719 Family 12h/14h Processor Function 7 + 2000 79c970 [PCnet32 LANCE] + 1014 2000 NetFinity 10/100 Fast Ethernet + 1022 2000 PCnet - Fast 79C971 + 103c 104c Ethernet with LAN remote power Adapter + 103c 1064 Ethernet with LAN remote power Adapter + 103c 1065 Ethernet with LAN remote power Adapter + 103c 106c Ethernet with LAN remote power Adapter + 103c 106e Ethernet with LAN remote power Adapter + 103c 10ea Ethernet with LAN remote power Adapter + 1113 1220 EN1220 10/100 Fast Ethernet + 1259 2450 AT-2450 10/100 Fast Ethernet + 1259 2454 AT-2450v4 10Mb Ethernet Adapter + 1259 2700 AT-2700TX 10/100 Fast Ethernet + 1259 2701 AT-2700FX 100Mb Ethernet + 1259 2702 AT-2700FTX 10/100 Mb Fiber/Copper Fast Ethernet + 1259 2703 AT-2701FX + 1259 2704 AT-2701FTX 10/100 Mb Fiber/Copper Fast Ethernet + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1010 CP5/CR6 mainboard + 4c53 1020 VR6 mainboard + 4c53 1030 PC5 mainboard + 4c53 1040 CL7 mainboard + 4c53 1060 PC7 mainboard +# Via AMD's own technical reference on their Am79C978 NICs; https://www.amd.com/system/files/TechDocs/22206.pdf + 2001 Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY] + 1092 0a78 Multimedia Home Network Adapter + 1668 0299 ActionLink Home Network Adapter + 2003 Am 1771 MBW [Alchemy] + 2020 53c974 [PCscsi] + 1af4 1100 QEMU Virtual Machine + 2040 79c974 + 2080 CS5536 [Geode companion] Host Bridge + 2081 Geode LX Video + 2082 Geode LX AES Security Block + 208f CS5536 GeodeLink PCI South Bridge + 2090 CS5536 [Geode companion] ISA + 2091 CS5536 [Geode companion] FLASH + 2093 CS5536 [Geode companion] Audio + 2094 CS5536 [Geode companion] OHC + 2095 CS5536 [Geode companion] EHC + 2096 CS5536 [Geode companion] UDC + 2097 CS5536 [Geode companion] UOC + 209a CS5536 [Geode companion] IDE + 2625 Am79C973 [Lance/PCI PCNet/32] + 2627 Am79C975 [Lance/PCI PCNet/32] + 3000 ELanSC520 Microcontroller + 43a0 Hudson PCI to PCI bridge (PCIE port 0) + 43a1 Hudson PCI to PCI bridge (PCIE port 1) + 43a2 Hudson PCI to PCI bridge (PCIE port 2) + 43a3 Hudson PCI to PCI bridge (PCIE port 3) + 43b0 X370 Series Chipset PCIe Upstream Port + 1849 43c6 Fatal1ty X370 Professional Gaming + 43b1 X399 Series Chipset PCIe Bridge + 43b4 300 Series Chipset PCIe Port + 43b5 X370 Series Chipset SATA Controller + 1849 43c8 Fatal1ty X370 Professional Gaming + 43b6 X399 Series Chipset SATA Controller + 43b7 300 Series Chipset SATA Controller + 43b9 X370 Series Chipset USB 3.1 xHCI Controller + 1849 43d0 Fatal1ty X370 Professional Gaming + 43ba X399 Series Chipset USB 3.1 xHCI Controller + 43bb 300 Series Chipset USB 3.1 xHCI Controller + 43c6 400 Series Chipset PCIe Bridge + 43c7 400 Series Chipset PCIe Port + 43c8 400 Series Chipset SATA Controller + 43d5 400 Series Chipset USB 3.1 XHCI Controller + 43e9 500 Series Chipset Switch Upstream Port + 43eb 500 Series Chipset SATA Controller +# or ASM106X Serial ATA Controller + 1b21 1062 ASM1062 Serial ATA Controller + 43ee 500 Series Chipset USB 3.1 XHCI Controller +# maybe + 1b21 1142 ASM1042A USB 3.0 Host Controller + 57a3 Matisse PCIe GPP Bridge + 57a4 Matisse PCIe GPP Bridge + 57ad Matisse Switch Upstream + 7006 AMD-751 [Irongate] System Controller + 7007 AMD-751 [Irongate] AGP Bridge + 700a AMD-IGR4 AGP Host to PCI Bridge + 700b AMD-IGR4 PCI to PCI Bridge + 700c AMD-760 MP [IGD4-2P] System Controller + 700d AMD-760 MP [IGD4-2P] AGP Bridge + 700e AMD-760 [IGD4-1P] System Controller + 700f AMD-760 [IGD4-1P] AGP Bridge + 7400 AMD-755 [Cobra] ISA + 7401 AMD-755 [Cobra] IDE + 7403 AMD-755 [Cobra] ACPI + 7404 AMD-755 [Cobra] USB + 7408 AMD-756 [Viper] ISA + 7409 AMD-756 [Viper] IDE + 740b AMD-756 [Viper] ACPI + 740c AMD-756 [Viper] USB + 7410 AMD-766 [ViperPlus] ISA + 7411 AMD-766 [ViperPlus] IDE + 7413 AMD-766 [ViperPlus] ACPI + 7414 AMD-766 [ViperPlus] USB + 7440 AMD-768 [Opus] ISA + 1043 8044 A7M-D Mainboard + 7441 AMD-768 [Opus] IDE + 7443 AMD-768 [Opus] ACPI + 1043 8044 A7M-D Mainboard + 7445 AMD-768 [Opus] Audio + 7446 AMD-768 [Opus] MC97 Modem + 7448 AMD-768 [Opus] PCI + 7449 AMD-768 [Opus] USB + 7450 AMD-8131 PCI-X Bridge + 7451 AMD-8131 PCI-X IOAPIC + 7454 AMD-8151 System Controller + 7455 AMD-8151 AGP Bridge + 7458 AMD-8132 PCI-X Bridge + 7459 AMD-8132 PCI-X IOAPIC + 7460 AMD-8111 PCI + 161f 3017 HDAMB + 7461 AMD-8111 USB + 7462 AMD-8111 Ethernet + 7463 AMD-8111 USB EHCI + 7464 AMD-8111 USB OHCI + 161f 3017 HDAMB + 7468 AMD-8111 LPC + 161f 3017 HDAMB + 7469 AMD-8111 IDE + 1022 2b80 AMD-8111 IDE [Quartet] + 161f 3017 HDAMB + 746a AMD-8111 SMBus 2.0 + 746b AMD-8111 ACPI + 161f 3017 HDAMB + 746d AMD-8111 AC97 Audio + 161f 3017 HDAMB + 746e AMD-8111 MC97 Modem + 756b AMD-8111 ACPI + 7800 FCH SATA Controller [IDE mode] + 7801 FCH SATA Controller [AHCI mode] + 103c 168b ProBook 4535s Notebook + 103c 194e ProBook 455 G1 Notebook + 1043 8623 AM1I-A Motherboard + 17aa 3988 Z50-75 + 1849 7801 QC5000-ITX/PH + 7802 FCH SATA Controller [RAID mode] + 7803 FCH SATA Controller [RAID mode] + 7804 FCH SATA Controller [AHCI mode] + 103c 1985 Pavilion 17-e163sg Notebook PC + 7805 FCH SATA Controller [RAID mode] + 7806 FCH SD Flash Controller + 7807 FCH USB OHCI Controller + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 1043 8623 AM1I-A Motherboard + 17aa 3988 Z50-75 + 1849 7807 QC5000-ITX/PH + 7808 FCH USB EHCI Controller + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 1043 8623 AM1I-A Motherboard + 17aa 3988 Z50-75 + 1849 7808 QC5000-ITX/PH + 7809 FCH USB OHCI Controller + 103c 194e ProBook 455 G1 Notebook + 17aa 3988 Z50-75 + 780a Kabini/Mullins SATA Raid/AHCI Mode (DotHill driver) + 780b FCH SMBus Controller + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 1043 8623 AM1I-A Motherboard + 17aa 3988 Z50-75 + 1849 780b QC5000-ITX/PH + 780c FCH IDE Controller + 780d FCH Azalia Controller + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 1043 8444 F2A85-M Series + 1043 8576 AM1I-A Motherboard + 17aa 3988 Z50-75 + 1849 8892 QC5000-ITX/PH + 780e FCH LPC Bridge + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 1043 8623 AM1I-A Motherboard + 17aa 3988 Z50-75 + 1849 780e QC5000-ITX/PH + 780f FCH PCI Bridge + 7812 FCH USB XHCI Controller + 7813 FCH SD Flash Controller + 7814 FCH USB XHCI Controller + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 1043 8623 AM1I-A Motherboard + 17aa 3988 Z50-75 + 1849 7814 QC5000-ITX/PH + 7900 FCH SATA Controller [IDE mode] + 7901 FCH SATA Controller [AHCI mode] + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME Motherboard + 1462 7c37 X570-A PRO motherboard + 15d9 7901 H12SSL-i + ea50 ce19 mCOM10-L1900 + 7902 FCH SATA Controller [RAID mode] + 7903 FCH SATA Controller [RAID mode] + 7904 FCH SATA Controller [AHCI mode] + 7906 FCH SD Flash Controller + 7908 FCH USB EHCI Controller + 790b FCH SMBus Controller + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME Motherboard + 1462 7c37 X570-A PRO motherboard + 15d9 790b H12SSL-i + 17aa 5124 ThinkPad E595 + ea50 ce19 mCOM10-L1900 + 790e FCH LPC Bridge + 103c 8615 Pavilion Laptop 15-cw1xxx + 1043 876b PRIME B450M-A Motherboard + 1462 7c37 X570-A PRO motherboard + 15d9 790e H12SSL-i + 17aa 5124 ThinkPad E595 + ea50 ce19 mCOM10-L1900 + 790f FCH PCI Bridge + 7914 FCH USB XHCI Controller + 9600 RS780 Host Bridge + 1043 82ee M378A-CM Motherboard + 1043 82f1 M3A78-EH Motherboard + 9601 RS880 Host Bridge + 1019 2120 A785GM-M + 103c 1609 ProLiant MicroServer N36L + 1043 83a2 M4A785-M Mainboard + 1043 843e M5A88-V EVO + 9602 RS780/RS880 PCI to PCI bridge (int gfx) + 9603 RS780 PCI to PCI bridge (ext gfx port 0) + 103c 1609 ProLiant MicroServer N36L + 9604 RS780/RS880 PCI to PCI bridge (PCIE port 0) + 9605 RS780/RS880 PCI to PCI bridge (PCIE port 1) + 9606 RS780 PCI to PCI bridge (PCIE port 2) + 103c 1609 ProLiant MicroServer N36L + 9607 RS780/RS880 PCI to PCI bridge (PCIE port 3) + 9608 RS780/RS880 PCI to PCI bridge (PCIE port 4) + 9609 RS780/RS880 PCI to PCI bridge (PCIE port 5) + 960a RS780 PCI to PCI bridge (NB-SB link) + 960b RS780 PCI to PCI bridge (ext gfx port 1) +1023 Trident Microsystems + 0194 82C194 + 2000 4DWave DX + 2001 4DWave NX + 122d 1400 Trident PCI288-Q3DII (NX) + 2100 CyberBlade XP4m32 + 2200 XGI Volari XP5 + 8400 CyberBlade/i7 + 1023 8400 CyberBlade i7 AGP + 8420 CyberBlade/i7d + 0e11 b15a CyberBlade i7 AGP + 8500 CyberBlade/i1 + 8520 CyberBlade i1 + 0e11 b16e CyberBlade i1 AGP + 1023 8520 CyberBlade i1 AGP + 8620 CyberBlade/i1 + 1014 0502 ThinkPad R30/T30 + 1014 1025 Travelmate 352TE + 8820 CyberBlade XPAi1 + 9320 TGUI 9320 + 9350 GUI Accelerator + 9360 Flat panel GUI Accelerator + 9382 Cyber 9382 [Reference design] + 9383 Cyber 9383 [Reference design] + 9385 Cyber 9385 [Reference design] + 9386 Cyber 9386 + 9388 Cyber 9388 + 9397 Cyber 9397 + 939a Cyber 9397DVD + 9420 TGUI 9420 + 9430 TGUI 9430 + 9440 TGUI 9440 + 9460 TGUI 9460 + 9470 TGUI 9470 + 9520 Cyber 9520 + 9525 Cyber 9525 + 9540 Cyber 9540 + 9660 TGUI 9660/938x/968x + 9680 TGUI 9680 + 9682 TGUI 9682 + 9683 TGUI 9683 + 9685 ProVIDIA 9685 + 9750 3DImage 9750 + 1014 9750 3DImage 9750 + 1023 9750 3DImage 9750 + 9753 TGUI 9753 + 9754 TGUI 9754 + 9759 TGUI 975 + 9783 TGUI 9783 + 9785 TGUI 9785 + 9850 3DImage 9850 + 9880 Blade 3D PCI/AGP + 1023 9880 Blade 3D + 9910 CyberBlade/XP + 9930 CyberBlade/XPm + 9960 CyberBlade XP2 +1024 Zenith Data Systems +1025 Acer Incorporated [ALI] + 1435 M1435 + 1445 M1445 + 1449 M1449 + 1451 M1451 + 1461 M1461 + 1489 M1489 + 1511 M1511 + 1512 ALI M1512 Aladdin + 1513 M1513 + 1521 ALI M1521 Aladdin III CPU Bridge + 10b9 1521 ALI M1521 Aladdin III CPU Bridge + 1523 ALI M1523 ISA Bridge + 10b9 1523 ALI M1523 ISA Bridge + 1531 M1531 Northbridge [Aladdin IV/IV+] + 1533 M1533 PCI-to-ISA Bridge + 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge + 1535 M1535 PCI Bridge + Super I/O + FIR + 1541 M1541 Northbridge [Aladdin V] + 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge + 1542 M1542 Northbridge [Aladdin V] + 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR + 1561 M1561 Northbridge [Aladdin 7] + 1621 M1621 Northbridge [Aladdin-Pro II] + 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2] + 1641 M1641 Northbridge [Aladdin-Pro IV] + 1647 M1647 [MaGiK1] PCI North Bridge + 1671 M1671 Northbridge [ALADDiN-P4] + 1672 Northbridge [CyberALADDiN-P4] + 3141 M3141 + 3143 M3143 + 3145 M3145 + 3147 M3147 + 3149 M3149 + 3151 M3151 + 3307 M3307 MPEG-I Video Controller + 3309 M3309 MPEG-II Video w/ Software Audio Decoder + 3321 M3321 MPEG-II Audio/Video Decoder + 5212 M4803 + 5215 ALI PCI EIDE Controller + 5217 M5217H + 5219 M5219 + 5225 M5225 + 5229 M5229 + 5235 M5235 + 5237 M5237 PCI USB Host Controller + 5240 EIDE Controller + 5241 PCMCIA Bridge + 5242 General Purpose Controller + 5243 PCI to PCI Bridge Controller + 5244 Floppy Disk Controller + 5247 M1541 PCI to PCI Bridge + 5251 M5251 P1394 Controller + 5427 PCI to AGP Bridge + 5451 M5451 PCI AC-Link Controller Audio Device + 5453 M5453 PCI AC-Link Controller Modem Device + 7101 M7101 PCI PMU Power Management Controller + 10b9 7101 M7101 PCI PMU Power Management Controller +# should be 1022:9602 + 9602 AMD RS780/RS880 PCI to PCI bridge (int gfx) +1028 Dell + 0001 PowerEdge Expandable RAID Controller 2/Si + 1028 0001 PowerEdge 2400 + 0002 PowerEdge Expandable RAID Controller 3/Di + 1028 0002 PowerEdge 4400 + 1028 00d1 PERC 3/DiV [Viper] + 1028 00d9 PERC 3/DiL [Lexus] + 0003 PowerEdge Expandable RAID Controller 3/Si + 1028 0003 PowerEdge 2450 +# PowerEdge Codename Iguana + 0004 PowerEdge Expandable RAID Controller 3/Di [Iguana] + 1028 0004 PERC 3/DiF [Iguana] + 0006 PowerEdge Expandable RAID Controller 3/Di + 0007 Remote Access Card III + 0008 Remote Access Card III + 0009 Remote Access Card III: BMC/SMIC device not present + 000a PowerEdge Expandable RAID Controller 3/Di + 1028 0106 PERC 3/DiJ [Jaguar] + 1028 011b PERC 3/DiD [Dagger] + 1028 0121 PERC 3/DiB [Boxster] + 000c Embedded Remote Access or ERA/O + 000d Embedded Remote Access: BMC/SMIC device + 000e PowerEdge Expandable RAID controller 4/Di + 000f PowerEdge Expandable RAID controller 4/Di + 1028 014a PowerEdge 1750 + 0010 Remote Access Card 4 + 0011 Remote Access Card 4 Daughter Card + 0012 Remote Access Card 4 Daughter Card Virtual UART + 0013 PowerEdge Expandable RAID controller 4 + 1028 016c PowerEdge Expandable RAID Controller 4e/Si + 1028 016d PowerEdge Expandable RAID Controller 4e/Di + 1028 016e PowerEdge Expandable RAID Controller 4e/Di + 1028 016f PowerEdge Expandable RAID Controller 4e/Di + 1028 0170 PowerEdge Expandable RAID Controller 4e/Di + 0014 Remote Access Card 4 Daughter Card SMIC interface + 0015 PowerEdge Expandable RAID controller 5 + 1028 1f01 PERC 5/E Adapter RAID Controller + 1028 1f02 PERC 5/i Adapter RAID Controller + 1028 1f03 PERC 5/i Integrated RAID Controller + 0016 PowerEdge Expandable RAID controller S300 + 1028 1f24 PERC S300 Controller +# NV-RAM Adapter used in Dell DR appliances + 0073 NV-RAM Adapter + 1028 PCIe Bridge riser +1029 Siemens Nixdorf IS +102a LSI Logic + 0000 HYDRA + 0010 ASPEN + 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers + 9005 000f 2940U2W SCSI Controller + 9005 0106 2940U2W SCSI Controller + 9005 a180 2940U2W SCSI Controller + 00c5 AIC-7899 U160/m SCSI Controller + 1028 00c5 PowerEdge 2550/2650/4600 + 00cf AIC-7899P U160/m + 1028 0106 PowerEdge 4600 + 1028 0121 PowerEdge 2650 +102b Matrox Electronics Systems Ltd. +# DJ: I've a suspicion that 0010 is a duplicate of 0d10. + 0010 MGA-I [Impression?] + 0100 MGA 1064SG [Mystique] + 0518 MGA-II [Athena] + 0519 MGA 2064W [Millennium] + 051a MGA 1064SG [Mystique] + 102b 0100 MGA-1064SG Mystique + 102b 051a MGA-1164SG Mystique 220 + 102b 1100 MGA-1084SG Mystique + 102b 1200 MGA-1084SG Mystique + 1100 102b MGA-1084SG Mystique + 110a 0018 Scenic Pro C5 (D1025) + 051b MGA 2164W [Millennium II] + 102b 051b MGA-2164W Millennium II + 102b 1100 MGA-2164W Millennium II + 102b 1200 MGA-2164W Millennium II + 102b 2100 MGA-2164W Millennium II + 051e MGA 1064SG [Mystique] AGP + 051f MGA 2164W [Millennium II] AGP + 102b 2100 MGA-2164WA [Millennium II A] + 0520 MGA G200 + 102b dbc2 G200 Multi-Monitor + 102b dbc8 G200 Multi-Monitor + 102b dbe2 G200 Multi-Monitor + 102b dbe8 G200 Multi-Monitor + 102b ff03 Millennium G200 SD + 102b ff04 Marvel G200 + 0521 MGA G200 AGP + 1014 ff03 Millennium G200 AGP + 102b 48e9 Mystique G200 AGP + 102b 48f8 Millennium G200 SD AGP + 102b 4a60 Millennium G200 LE AGP + 102b 4a64 Millennium G200 AGP + 102b c93c Millennium G200 AGP + 102b c9b0 Millennium G200 AGP + 102b c9bc Millennium G200 AGP + 102b ca60 Millennium G250 LE AGP + 102b ca6c Millennium G250 AGP + 102b dbbc Millennium G200 AGP + 102b dbc2 Millennium G200 MMS (Dual G200) + 102b dbc3 G200 Multi-Monitor + 102b dbc8 Millennium G200 MMS (Dual G200) + 102b dbd2 G200 Multi-Monitor + 102b dbd3 G200 Multi-Monitor + 102b dbd4 G200 Multi-Monitor + 102b dbd5 G200 Multi-Monitor + 102b dbd8 G200 Multi-Monitor + 102b dbd9 G200 Multi-Monitor + 102b dbe2 Millennium G200 MMS (Quad G200) + 102b dbe3 G200 Multi-Monitor + 102b dbe8 Millennium G200 MMS (Quad G200) + 102b dbf2 G200 Multi-Monitor + 102b dbf3 G200 Multi-Monitor + 102b dbf4 G200 Multi-Monitor + 102b dbf5 G200 Multi-Monitor + 102b dbf8 G200 Multi-Monitor + 102b dbf9 G200 Multi-Monitor + 102b f806 Mystique G200 Video AGP + 102b ff00 MGA-G200 AGP + 102b ff02 Mystique G200 AGP + 102b ff03 Millennium G200A AGP + 102b ff04 Marvel G200 AGP + 110a 0032 MGA-G200 AGP + 0522 MGA G200e [Pilot] ServerEngines (SEP1) + 103c 31fa ProLiant DL140 G3 + 0525 MGA G400/G450 + 0e11 b16f MGA-G400 AGP + 102b 0328 Millennium G400 16Mb SDRAM + 102b 0338 Millennium G400 16Mb SDRAM + 102b 0378 Millennium G400 32Mb SDRAM + 102b 0541 Millennium G450 Dual Head + 102b 0542 Millennium G450 Dual Head LX + 102b 0543 Millennium G450 Single Head LX + 102b 0641 Millennium G450 32Mb SDRAM Dual Head + 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX + 102b 0643 Millennium G450 32Mb SDRAM Single Head LX + 102b 07c0 Millennium G450 Dual Head LE + 102b 07c1 Millennium G450 SDR Dual Head LE + 102b 0d41 Millennium G450 Dual Head PCI + 102b 0d42 Millennium G450 Dual Head LX PCI + 102b 0d43 Millennium G450 32Mb Dual Head PCI + 102b 0e00 Marvel G450 eTV + 102b 0e01 Marvel G450 eTV + 102b 0e02 Marvel G450 eTV + 102b 0e03 Marvel G450 eTV + 102b 0f80 Millennium G450 Low Profile + 102b 0f81 Millennium G450 Low Profile + 102b 0f82 Millennium G450 Low Profile DVI + 102b 0f83 Millennium G450 Low Profile DVI + 102b 19d8 Millennium G400 16Mb SGRAM + 102b 19f8 Millennium G400 32Mb SGRAM + 102b 2159 Millennium G400 Dual Head 16Mb + 102b 2179 Millennium G400 MAX/Dual Head 32Mb + 102b 217d Millennium G400 Dual Head Max + 102b 23c0 Millennium G450 + 102b 23c1 Millennium G450 + 102b 23c2 Millennium G450 DVI + 102b 23c3 Millennium G450 DVI + 102b 2f58 Millennium G400 + 102b 2f78 Millennium G400 + 102b 3693 Marvel G400 AGP + 102b 5dd0 4Sight II + 102b 5f50 4Sight II + 102b 5f51 4Sight II + 102b 5f52 4Sight II + 102b 9010 Millennium G400 Dual Head + 1458 0400 GA-G400 + 1705 0001 Millennium G450 32MB SGRAM + 1705 0002 Millennium G450 16MB SGRAM + 1705 0003 Millennium G450 32MB + 1705 0004 Millennium G450 16MB + 0527 Parhelia + 102b 0840 Parhelia 128Mb + 102b 0850 Parhelia 256MB + 102b 0870 MED2mp-DVI + 102b 0880 P-256 Edge Overlap Controller + 0528 Parhelia + 102b 1020 Parhelia 128MB + 102b 1030 Parhelia 256 MB Dual DVI + 102b 1040 MED2mp-DVI + 102b 1050 Sono S20 + 102b 1060 PJ-30L + 102b 1070 PJ-40L + 102b 1421 MED5mp + 102b 1431 MED3mp-DVI + 102b 1451 MED5mp-DVI + 102b 1491 MED2mp-DVI + 102b 14b1 MED3mp-DVI + 102b 14c1 MED5mp-DVI + 102b 14e1 Parhelia PCI 256MB + 102b 14f1 Parhelia Precision SGT + 102b 1501 ATC-4MP + 102b 1511 ATC-4MP + 102b 1521 TheatreVUE T30 + 102b 1531 TheatreVUE T20 + 102b 1541 MED2mp-DVI + 102b 1551 MED3mp-DVI + 102b 1561 MED5mp-DVI + 102b 1571 Parhelia DL256 PCI + 102b 1591 Parhelia Precision SDT + 102b 15a1 MED4mp-DVI + 102b 2011 Parhelia HR256 + 102b 2021 QID Pro + 102b 2061 PJ-40LP + 102b 2081 EWS Quad + 102b 2411 PPX-OUT8 + 102b 2421 VPX-OUT8 + 102b 2441 PPX-OUT4 + 102b 2451 VPX-OUT4 + 102b 2491 LPX-OUT4 + 0530 MGA G200EV + 0532 MGA G200eW WPCM450 + 1028 0235 PowerEdge R710 MGA G200eW WPCM450 + 1028 0236 PowerEdge R610 MGA G200eW WPCM450 + 1028 0237 PowerEdge T610 MGA G200eW WPCM450 + 1028 0287 PowerEdge M610 MGA G200eW WPCM450 + 1028 028c PowerEdge R410 MGA G200eW WPCM450 + 1028 028d PowerEdge T410 MGA G200eW WPCM450 + 1028 029c PowerEdge M710 MGA G200eW WPCM450 + 1028 02a4 PowerEdge T310 MGA G200eW WPCM450 + 15d9 0605 X8SIL + 15d9 0624 X9SCM-F Motherboard + 15d9 066b X9SRL-F + 15d9 a811 H8DGU + 0533 MGA G200EH + 103c 3381 iLO4 + 0534 G200eR2 + 1028 04f7 PowerEdge R320 server + 0536 Integrated Matrox G200eW3 Graphics Controller + 0538 MGA G200eH3 + 1590 00e4 iLO5 VGA + 0540 M91XX + 102b 2080 M9140 LP PCIe x16 + 102b 20c0 Xenia + 102b 20c1 Xenia Pro + 102b 2100 M9120 PCIe x16 + 102b 2140 M9125 PCIe x16 + 102b 2180 M9120 Plus LP PCIe x16 + 102b 21c0 M9120 Plus LP PCIe x1 + 102b 2200 VDA1164 Output Board + 102b 2240 M9148 LP PCIe x16 + 102b 2241 M9138 LP PCIe x16 + 102b 2280 M9188 ATX PCIe x16 + 102b 22c0 M9128 LP PCIe x16 + 0550 SV2 + 102b 00c0 MURA-IPX-I4EF + 102b 00c1 MURA-IPX-I4DF + 102b 00c3 MURA-IPX-I4DHF + 102b 00c5 MURA-IPX-I4EHF + 0d10 MGA Ultima/Impression + 1000 MGA G100 [Productiva] + 102b ff01 Productiva G100 + 102b ff05 Productiva G100 Multi-Monitor + 1001 MGA G100 [Productiva] AGP + 102b 1001 MGA-G100 AGP + 102b ff00 MGA-G100 AGP + 102b ff01 MGA-G100 Productiva AGP + 102b ff03 Millennium G100 AGP + 102b ff04 MGA-G100 AGP + 102b ff05 MGA-G100 Productiva AGP Multi-Monitor + 110a 001e MGA-G100 AGP + 2007 MGA Mistral + 2527 Millennium G550 +# PCI\VEN_102B&DEV_2527&SUBSYS_0F42102B&REV_01 + 102b 0f42 Matrox G550 Low Profile PCI + 102b 0f83 Millennium G550 + 102b 0f84 Millennium G550 Dual Head DDR 32Mb + 102b 1e41 Millennium G550 + 102b 22c0 G550 PCIe + 102b 2300 Millennium G550 LP PCIE + 2537 Millennium P650/P750 + 102b 1820 Millennium P750 64MB + 102b 1830 Millennium P650 64MB + 102b 1850 RAD2mp + 102b 1860 RAD3mp + 102b 1880 Sono S10 + 102b 1c10 QID 128MB + 102b 2811 Millennium P650 Low-profile PCI 64MB + 102b 2821 Millennium P650 Low-profile PCI + 102b 2841 RAD PCI + 102b 2851 Spectrum PCI + 102b 2871 EpicA TC2 + 102b 2c11 QID Low-profile PCI + 102b 2c21 QID LP PCI LW + 102b 2c31 QID LP PCI + 102b 2c41 EpicA TC4 + 102b 3001 Extio F1400 + 102b 3011 Extio F1220 + 102b 3041 RG-200DL + 102b 3051 RG-400SL + 102b 3061 Extio F1420 + 102b 3081 Extio F1240 + 2538 Millennium P650 PCIe + 102b 0847 RAD PCIe + 102b 08c7 Millennium P650 PCIe 128MB + 102b 0907 Millennium P650 PCIe 64MB + 102b 0947 Parhelia APVe + 102b 0987 ATC PCIe 4MP + 102b 1047 Millennium P650 LP PCIe 128MB + 102b 1087 Millennium P650 LP PCIe 64MB + 102b 1801 Millennium P650 PCIe x1 + 102b 2538 Parhelia APVe + 102b 3007 QID Low-profile PCIe + 102b 3087 Aurora VX3mp + 102b 30c7 QID LP PCIe + 2539 Millennium P690 + 102b 0040 Millennium P690 PCIe x16 + 102b 0042 ONYX + 102b 0043 SPECTRA + 102b 0080 Millennium P690 Plus LP PCIe x16 + 102b 0081 Millennium P690 LP PCIe x16 + 102b 0082 RAD LPX PCIe x16 + 102b 00c0 Millennium P690 Plus LP PCI + 102b 00c2 Millennium P690 LP PCI + 102b 00c3 RAD LPX PCI + 102b 0101 Millennium P690 PCI + 102b 0140 Millennium P690 LP PCIe x1 + 102b 0180 Display Wall IP Decode 128 MB + 4164 Morphis QxT frame grabber + 43b4 Morphis Qxt encoding engine + 4510 Morphis COM port + 4536 VIA Framegrabber + 4686 Concord GX (customized Intel 82541) + 475b Solios eCL/XCL-B frame grabber + 475d Vio frame grabber family + 102b 4b90 Vio Duo frame grabber (single channel) + 102b 4b91 Vio Duo frame grabber + 102b 4b92 Vio Analog frame grabber + 102b 4b93 Vio SDI Frame Grabber + 102b 4b94 Vio DVI-A frame grabber + 475f Solios (single-Full) CL frame grabber + 102b 475f Solios eCL/XCL-F frame grabber + 102b 4d5f Solios eV-CL (single-Full) frame grabber + 102b 4e5f Solios eM-CL (single-Full) frame grabber + 47a1 Solios eA/XA frame grabber + 102b 4be0 Solios eA/XA (single) frame grabber + 102b 4be1 Solios eA/XA (dual) frame grabber + 102b 4be2 Solios eA/XA (quad) frame grabber + 47a2 Solios COM port + 47c1 Solios (dual-Base/single-Medium) CL frame grabber + 102b 0000 Solios frame grabber + 102b 4b80 Solios eCL/XCL (single-Medium) frame grabber + 102b 4b81 Solios eCL/XCL (dual-Base) frame grabber + 102b 4d80 Solios eV-CL (single-Medium) frame grabber + 102b 4d81 Solios eV-CL (dual-Base) frame grabber + 102b 4e80 Solios eM-CL (single-Medium) frame grabber + 102b 4e81 Solios eM-CL (dual-Base) frame grabber + 47c2 Solios COM port + 4949 Radient frame grabber family + 102b 0010 Radient eCL (Single-full) frame grabber + 102b 0011 Radient eCLV (Single-full) frame grabber + 102b 0020 Radient eCL (Dual-base) frame grabber + 102b 0030 Radient eCL (Dual-full) frame grabber + 102b 0040 Radient eCL (Quad-base) frame grabber + 102b 0050 Radient eCL (Golden) frame grabber + 102b 1010 Radient eV-CXP (quad CXP-6) frame grabber + 102b 1015 Radient eV-CXP (dual CXP-6) frame grabber + 102b 1020 Radient eV-CXP (quad CXP-3) frame grabber + 102b 1050 Radient eV-CXP (Golden) frame grabber + 4cdc Morphis JPEG2000 accelerator + 4f54 Morphis (e)Quad frame grabber + 4fc5 Morphis (e)Dual frame grabber + 5e10 Morphis aux I/O + 6573 Shark 10/100 Multiport SwitchNIC +102c Chips and Technologies + 00b8 F64310 + 00c0 F69000 HiQVideo + 102c 00c0 F69000 HiQVideo + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1010 CP5/CR6 mainboard + 4c53 1020 VR6 mainboard + 4c53 1030 PC5 mainboard + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 00d0 F65545 + 00d8 F65545 + 00dc F65548 + 00e0 F65550 + 00e4 F65554 + 00e5 F65555 HiQVPro + 0e11 b049 Armada 1700 Laptop Display Controller + 1179 0001 Satellite Pro/Satellite + 00f0 F68554 + 00f4 F68554 HiQVision + 00f5 F68555 + 0c30 F69030 + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 4c53 1080 CT8 mainboard +102d Wyse Technology Inc. + 50dc 3328 Audio +102e Olivetti Advanced Technology +102f Toshiba America + 0009 r4x00 + 000a TX3927 MIPS RISC PCI Controller + 0020 ATM Meteor 155 + 102f 00f8 ATM Meteor 155 + 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller + 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL + 0032 TC35815CF PCI 10/100 Mbit Ethernet Controller on TX4939 + 0105 TC86C001 [goku-s] IDE + 0106 TC86C001 [goku-s] USB 1.1 Host + 0107 TC86C001 [goku-s] USB Device Controller + 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller + 0180 TX4927/38 MIPS RISC PCI Controller + 0181 TX4925 MIPS RISC PCI Controller + 0182 TX4937 MIPS RISC PCI Controller + 01b4 Celleb platform IDE interface + 01b5 SCC USB 2.0 EHCI controller + 01b6 SCC USB 1.1 OHCI controller +1030 TMC Research +1031 Miro Computer Products AG + 5601 DC20 ASIC + 5607 Video I/O & motion JPEG compressor + 5631 Media 3D + 6057 MiroVideo DC10/DC30+ +1032 Compaq +1033 NEC Corporation + 0000 Vr4181A USB Host or Function Control Unit + 0001 PCI to 486-like bus Bridge + 0002 PCI to VL98 Bridge + 0003 ATM Controller + 0004 R4000 PCI Bridge + 0005 PCI to 486-like bus Bridge + 0006 PC-9800 Graphic Accelerator + 0007 PCI to UX-Bus Bridge + 0008 PC-9800 Graphic Accelerator + 0009 PCI to PC9800 Core-Graph Bridge + 0016 PCI to VL Bridge + 001a [Nile II] + 0021 Vrc4373 [Nile I] + 0029 PowerVR PCX1 + 002a PowerVR 3D + 002c Star Alpha 2 + 002d PCI to C-bus Bridge + 0035 OHCI USB Controller + 1033 0035 USB Controller + 103c 1293 USB add-in card + 103c 1294 USB 2.0 add-in card + 1179 0001 USB + 1186 0035 DUB-C2 USB 2.0 2-port 32-bit cardbus controller + 12ee 7000 Root Hub + 14c2 0105 PTI-205N USB 2.0 Host Controller + 1799 0001 Root Hub + 1931 000a GlobeTrotter Fusion Quad Lite (PPP data) + 1931 000b GlobeTrotter Fusion Quad Lite (GSM data) + 807d 0035 PCI-USB2 (OHCI subsystem) + 8086 4d44 D850EMV2 motherboard + 003b PCI to C-bus Bridge + 003e NAPCCARD Cardbus Controller + 0046 PowerVR PCX2 [midas] + 005a Vrc5074 [Nile 4] + 0063 uPD72862 [Firewarden] IEEE1394 OHCI 1.0 Link Controller + 0067 PowerVR Neon 250 Chipset + 1010 0020 PowerVR Neon 250 AGP 32Mb + 1010 0080 PowerVR Neon 250 AGP 16Mb + 1010 0088 PowerVR Neon 250 16Mb + 1010 0090 PowerVR Neon 250 AGP 16Mb + 1010 0098 PowerVR Neon 250 16Mb + 1010 00a0 PowerVR Neon 250 AGP 32Mb + 1010 00a8 PowerVR Neon 250 32Mb + 1010 0120 PowerVR Neon 250 AGP 32Mb + 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr + 0074 56k Voice Modem + 1033 8014 RCV56ACF 56k Voice Modem + 009b Vrc5476 + 00a5 VRC4173 + 00a6 VRC5477 AC97 + 00cd uPD72870 [Firewarden] IEEE1394a OHCI 1.0 Link/3-port PHY Controller + 12ee 8011 Root hub + 00ce uPD72871 [Firewarden] IEEE1394a OHCI 1.0 Link/1-port PHY Controller + 00df Vr4131 + 00e0 uPD72010x USB 2.0 Controller + 1186 f100 DUB-C2 USB 2.0 2-port 32-bit cardbus controller + 12ee 7001 Root hub + 14c2 0205 PTI-205N USB 2.0 Host Controller + 1799 0002 Root Hub + 807d 1043 PCI-USB2 (EHCI subsystem) + 8086 4d44 D850EMV2 motherboard + 00e7 uPD72873 [Firewarden] IEEE1394a OHCI 1.1 Link/2-port PHY Controller + 00f2 uPD72874 [Firewarden] IEEE1394a OHCI 1.1 Link/3-port PHY Controller + 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2] + 010c VR7701 + 0125 uPD720400 PCI Express - PCI/PCI-X Bridge + 013a Dual Tuner/MPEG Encoder + 0194 uPD720200 USB 3.0 Host Controller + 1028 04a3 Precision M4600 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 1043 8413 P8P67 Deluxe Motherboard + 104d 907a Vaio VPCF1 + 1af4 1100 QEMU Virtual Machine + 1b96 0001 USB 3.0 PCIe Card + 01e7 uPD72873 [Firewarden] IEEE1394a OHCI 1.1 Link/2-port PHY Controller + 01f2 uPD72874 [Firewarden] IEEE1394a OHCI 1.1 Link/3-port PHY Controller +1034 Framatome Connectors USA Inc. +1035 Comp. & Comm. Research Lab +1036 Future Domain Corp. + 0000 TMC-18C30 [36C70] +1037 Hitachi Micro Systems +1038 AMP, Inc +1039 Silicon Integrated Systems [SiS] + 0001 AGP Port (virtual PCI-to-PCI bridge) + 0002 AGP Port (virtual PCI-to-PCI bridge) + 0003 AGP Port (virtual PCI-to-PCI bridge) + 0004 PCI-to-PCI bridge + 1039 0000 PCIe x16 port + 0006 85C501/2/3 + 0008 SiS85C503/5513 (LPC Bridge) + 0009 5595 Power Management Controller + 000a PCI-to-PCI bridge + 1039 0000 PCIe x1 port + 0016 SiS961/2/3 SMBus controller + 0018 SiS85C503/5513 (LPC Bridge) + 0163 163 802.11b/g Wireless LAN Adapter + 0180 RAID bus controller 180 SATA/PATA [SiS] + 0181 SATA + 0182 182 SATA/RAID Controller + 1734 1095 D2030-A1 + 0186 AHCI Controller (0106) + 0190 190 Ethernet Adapter + 0191 191 Gigabit Ethernet Adapter + 1043 8139 P5SD2-FM/S mainboard + 0200 5597/5598/6326 VGA + 1039 0000 SiS5597 SVGA (Shared RAM) + 0204 82C204 + 0205 SG86C205 + 0300 300/305 PCI/AGP VGA Display Adapter + 107d 2720 Leadtek WinFast VR300 + 0310 315H PCI/AGP VGA Display Adapter + 0315 315 PCI/AGP VGA Display Adapter + 0325 315PRO PCI/AGP VGA Display Adapter + 0330 330 [Xabre] PCI/AGP VGA Display Adapter + 0406 85C501/2 + 0496 SiS85C496 PCI & CPU Memory Controller (PCM) + 0530 530 Host + 0540 540 Host + 0550 550 Host + 0597 5513C + 0601 85C601 + 0620 620 Host + 0630 630 Host + 0633 633 Host + 0635 635 Host + 0645 SiS645 Host & Memory & AGP Controller + 0646 SiS645DX Host & Memory & AGP Controller + 0648 645xx + 0649 SiS649 Host + 0650 650/M650 Host + 0651 651 Host + 0655 655 Host + 0660 660 Host + 0661 661FX/M661FX/M661MX Host + 0662 662 Host + 0671 671MX + 0730 730 Host + 0733 733 Host + 0735 735 Host + 0740 740 Host + 0741 741/741GX/M741 Host + 1849 0741 K7S41/K7S41GX motherboard + 0745 745 Host + 0746 746 Host + 0755 755 Host + 0760 760/M760 Host + 0761 761/M761 Host + 1734 1099 D2030-A1 Motherboard + 0900 SiS900 PCI Fast Ethernet + 1019 0a14 K7S5A motherboard + 1039 0900 SiS900 10/100 Ethernet Adapter onboard + 1043 8035 CUSI-FX motherboard + 1043 80a7 Motherboard P4S800D-X + 1462 0900 MS-6701 motherboard + 0961 SiS961 [MuTIOL Media IO] + 0962 SiS962 [MuTIOL Media IO] LPC Controller + 0963 SiS963 [MuTIOL Media IO] LPC Controller + 0964 SiS964 [MuTIOL Media IO] LPC Controller + 0965 SiS965 [MuTIOL Media IO] + 0966 SiS966 [MuTIOL Media IO] + 0968 SiS968 [MuTIOL Media IO] + 1180 SATA Controller / IDE mode + 1182 SATA Controller / RAID mode + 1039 0180 SiS 966 4-port SATA controller + 1183 SATA Controller / IDE mode + 1039 0180 SiS 966 4-port SATA controller + 1184 AHCI Controller / RAID mode + 1185 AHCI IDE Controller (0106) + 3602 83C602 + 5107 5107 + 5300 SiS540 PCI Display Adapter + 5315 550 PCI/AGP VGA Display Adapter + 5401 486 PCI Chipset + 5511 5511/5512 + 5513 5513 IDE Controller + 1019 0970 P6STP-FL motherboard + 1039 5513 SiS5513 EIDE Controller (A,B step) + 1043 8035 CUSI-FX motherboard + 1462 7010 MS-6701 motherboard + 1631 5513 GA-8SIML Rev1.0 Motherboard + 1734 1095 D2030-A1 Motherboard + 5517 5517 + 5571 5571 + 5581 5581 Pentium Chipset + 5582 5582 + 5591 5591/5592 Host + 5596 5596 Pentium Chipset + 5597 5597 [SiS5582] + 5600 5600 Host + 6204 Video decoder & MPEG interface + 6205 VGA Controller + 6236 6236 3D-AGP + 6300 630/730 PCI/AGP VGA Display Adapter + 1019 0970 P6STP-FL motherboard + 1043 8035 CUSI-FX motherboard + 104d 80e2 VAIO PCV-J200 + 6306 530/620 PCI/AGP VGA Display Adapter + 6325 65x/M650/740 PCI/AGP VGA Display Adapter + 1039 6325 SiS 651 onboard [Asus P4SC-EA] + 1631 1004 SiS 651C onboard [Gigabyte GA-8SIML Rev1.0] + 6326 86C326 5598/6326 + 1039 6326 SiS6326 GUI Accelerator + 1092 0a50 SpeedStar A50 + 1092 0a70 SpeedStar A70 + 1092 4910 SpeedStar A70 + 1092 4920 SpeedStar A70 + 10b0 6326 S6110-B (AGP) + 1569 6326 SiS6326 GUI Accelerator + 6330 661/741/760 PCI/AGP or 662/761Gx PCIE VGA Display Adapter + 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter + 1043 8113 SiS Real 256E (ASUS P5S800-VM motherboard) + 1458 d000 SiS661FX GUI 2D/3D Accelerator + 1734 1099 D2030-A1 + 6350 770/670 PCIE VGA Display Adapter + 6351 771/671 PCIE VGA Display Adapter + 7001 USB 1.1 Controller + 1019 0a14 K7S5A motherboard + 1039 7000 Onboard USB Controller + 1462 5470 ECS K7SOM+ motherboard + 1462 7010 MS-6701 motherboard + 1734 1095 D2030-A1 Motherboard + 7002 USB 2.0 Controller + 1462 5470 K7SOM+ 5.2C Motherboard + 1462 7010 MS-6701 motherboard + 1509 7002 Onboard USB Controller + 1734 1095 D2030-A1 + 7007 FireWire Controller + 1462 701d MS-6701 + 7012 SiS7012 AC'97 Sound Controller + 1019 0f05 A928 (i-Buddie) + 1039 7012 SiS 7012 onboard [Asus P4SC-EA] AC'97 Sound Controller + 1043 818f A8S-X Motherboard + 13f6 0300 CMI9739(A) on ECS K7S series motherboard + 1462 5850 MSI 648 Max (MS-6585) + 1462 7010 MS-6701 motherboard + 15bd 1001 DFI 661FX motherboard + 1734 109f D2030-A1 Motherboard + 1849 7012 K7S41GX motherboard +# There are may be different modem codecs here (Intel537 compatible and incompatible) + 7013 AC'97 Modem Controller + 7016 SiS7016 PCI Fast Ethernet Adapter + 1039 7016 SiS7016 10/100 Ethernet Adapter + 7018 SiS PCI Audio Accelerator + 1014 01b6 SiS PCI Audio Accelerator + 1014 01b7 SiS PCI Audio Accelerator + 1019 7018 SiS PCI Audio Accelerator + 1025 000e SiS PCI Audio Accelerator + 1025 0018 SiS PCI Audio Accelerator + 1039 7018 SiS PCI Audio Accelerator + 1043 1453 SiS PCI Audio Accelerator + 1043 800b SiS PCI Audio Accelerator + 104d 80e2 VAIO PCV-J200 + 1054 7018 SiS PCI Audio Accelerator + 107d 5330 SiS PCI Audio Accelerator + 107d 5350 SiS PCI Audio Accelerator + 1170 3209 SiS PCI Audio Accelerator + 1462 400a SiS PCI Audio Accelerator + 14a4 2089 SiS PCI Audio Accelerator + 14cd 2194 SiS PCI Audio Accelerator + 14ff 1100 SiS PCI Audio Accelerator + 152d 8808 SiS PCI Audio Accelerator + 1558 1103 SiS PCI Audio Accelerator + 1558 2200 SiS PCI Audio Accelerator + 1563 7018 SiS PCI Audio Accelerator + 15c5 0111 SiS PCI Audio Accelerator + 270f a171 SiS PCI Audio Accelerator + a0a0 0022 SiS PCI Audio Accelerator + 7019 SiS7019 Audio Accelerator + 7502 Azalia Audio Controller + 1043 81a1 P5SD2-FM/S mainboard +103a Seiko Epson Corporation +103b Tatung Corp. Of America +103c Hewlett-Packard Company + 1005 A4977A Visualize EG + 1008 Visualize FX + 1028 Tach TL Fibre Channel Host Adapter + 1029 Tach XL2 Fibre Channel Host Adapter + 107e 000f Interphase 5560 Fibre Channel Adapter + 9004 9210 1Gb/2Gb Family Fibre Channel Controller + 9004 9211 1Gb/2Gb Family Fibre Channel Controller + 102a Tach TS Fibre Channel Host Adapter + 107e 000e Interphase 5540/5541 Fibre Channel Adapter + 9004 9110 1Gb/2Gb Family Fibre Channel Controller + 9004 9111 1Gb/2Gb Family Fibre Channel Controller + 1030 J2585A DeskDirect 10/100VG NIC + 1031 J2585B HP 10/100VG PCI LAN Adapter + 103c 1040 J2973A DeskDirect 10BaseT NIC + 103c 1041 J2585B DeskDirect 10/100VG NIC + 103c 1042 J2970A DeskDirect 10BaseT/2 NIC + 1040 J2973A DeskDirect 10BaseT NIC + 1041 J2585B DeskDirect 10/100 NIC + 1042 J2970A DeskDirect 10BaseT/2 NIC + 1048 Diva Serial [GSP] Multiport UART + 103c 1049 Tosca Console + 103c 104a Tosca Secondary + 103c 104b Maestro SP2 + 103c 1223 Superdome Console + 103c 1226 Keystone SP2 + 103c 1227 Powerbar SP2 + 103c 1282 Everest SP2 + 103c 1301 Diva RMP3 + 1054 PCI Local Bus Adapter + 1064 79C970 PCnet Ethernet Controller + 108b Visualize FXe + 10c1 NetServer Smart IRQ Router + 10ed TopTools Remote Control + 10f0 rio System Bus Adapter + 10f1 rio I/O Controller + 1219 NetServer PCI Hot-Plug Controller + 121a NetServer SMIC Controller + 121b NetServer Legacy COM Port Decoder + 121c NetServer PCI COM Port Decoder + 1229 zx1 System Bus Adapter + 122a zx1 I/O Controller + 122e PCI-X Local Bus Adapter + 127b sx1000 System Bus Adapter + 127c sx1000 I/O Controller + 128d Diva [GSP] Management Board + 1290 Auxiliary Diva Serial Port + 103c 1291 Diva SP2 + 1291 Auxiliary Diva Serial Port + 12b4 zx1 QuickSilver AGP8x Local Bus Adapter + 12eb sx2000 System Bus Adapter + 12ec sx2000 I/O Controller + 12ee PCI-X 2.0 Local Bus Adapter + 1302 RMP-3 Shared Memory Driver + 1303 RMP-3 (Remote Management Processor) + 22f6 iLO5 Virtual USB Controller + 1590 00e4 iLO5 Standard Virtual USB Controller + 2910 E2910A PCIBus Exerciser + 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer + 3206 Adaptec Embedded Serial ATA HostRAID + 3220 Smart Array P600 + 103c 3225 3 Gb/s SAS RAID + 3230 Smart Array Controller + 103c 3223 Smart Array P800 + 103c 3234 P400 SAS Controller + 103c 3235 P400i SAS Controller + 103c 3237 E500 SAS Controller + 103c 323d P700m SAS Controller + 3238 Smart Array E200i (SAS Controller) + 103c 3211 Smart Array E200i + 103c 3212 Smart Array E200 + 3239 Smart Array Gen9 Controllers + 103c 21bd P244br + 103c 21be P741m + 103c 21bf H240ar + 103c 21c0 P440ar + 103c 21c1 P840ar + 103c 21c2 P440 + 103c 21c3 P441 + 103c 21c4 Smart Array + 103c 21c5 P841 + 103c 21c6 H244br + 103c 21c7 H240 + 103c 21c8 H241 + 103c 21c9 Smart Array + 103c 21ca P246br + 103c 21cb P840 + 103c 21cc Smart Array + 103c 21cd P240nr + 103c 21ce H240nr + 323a Smart Array G6 controllers + 103c 3241 Smart Array P212 + 103c 3243 Smart Array P410 + 103c 3245 Smart Array P410i + 103c 3247 Smart Array P411 + 103c 3249 Smart Array P812 + 103c 324a Smart Array 712m (Mezzanine RAID controller) + 103c 324b Smart Array P711m (Mezzanine RAID controller) + 323b Smart Array Gen8 Controllers + 103c 3350 P222 + 103c 3351 P420 + 103c 3352 P421 + 103c 3354 P420i + 103c 3355 P220i + 323c Smart Array Gen8+ Controllers + 103c 1920 P430i + 103c 1921 P830i + 103c 1922 P430 + 103c 1923 P431 + 103c 1924 P830 + 103c 1925 Smart Array + 103c 1926 P731m + 103c 1928 P230i + 3300 Integrated Lights-Out Standard Virtual USB Controller + 103c 3304 iLO2 + 103c 3305 iLO2 + 103c 3309 iLO2 GXL/iLO3 GXE + 103c 330e iLO3 + 103c 3381 iLO4 + 3301 Integrated Lights-Out Standard Serial Port + 103c 3304 iLO2 + 103c 3305 iLO2 + 103c 330e iLO3 + 103c 3381 iLO4 +# Virtual serial port which is presented on a Java applet + 3302 Integrated Lights-Out Standard KCS Interface + 103c 3304 iLO2 + 103c 3305 iLO2 + 103c 330e iLO3 + 103c 3381 iLO4 + 3305 Integrated Lights-Out (iLO2) Controller + 3306 Integrated Lights-Out Standard Slave Instrumentation & System Support + 103c 330e iLO3 + 103c 3381 iLO4 + 1590 00e4 iLO5 + 3307 Integrated Lights-Out Standard Management Processor Support and Messaging +# HP DL380 G6 + 103c 3309 iLO 2 + 103c 330e iLO3 + 103c 3381 iLO4 + 3308 Integrated Lights-Out Standard MS Watchdog Timer + 103c 330e iLO3 + 103c 3381 iLO4 + 4030 zx2 System Bus Adapter + 4031 zx2 I/O Controller + 4037 PCIe Local Bus Adapter + 9602 AMD RS780/RS880 PCI to PCI bridge (int gfx) + 103c 1609 ProLiant MicroServer N36L +103e Solliday Engineering +103f Synopsys/Logic Modeling Group +1040 Accelgraphics Inc. +1041 Computrend +1042 Micron + 1000 PC Tech RZ1000 + 1001 PC Tech RZ1001 + 3000 Samurai_0 + 3010 Samurai_1 + 3020 Samurai_IDE +1043 ASUSTeK Computer Inc. + 0464 Radeon R9 270x GPU + 0521 RX580 [RX 580 Dual O8G] + 0675 ISDNLink P-IN100-ST-D + 0675 1704 ISDN Adapter (PCI Bus, D, C) + 0675 1707 ISDN Adapter (PCI Bus, DV, W) + 10cf 105e ISDN Adapter (PCI Bus, DV, W) +# Should be 1022:9602 + 9602 AMD RS780/RS880 PCI to PCI bridge (int gfx) + 1043 83a2 M4A785TD Motherboard +1044 Adaptec (formerly DPT) + 1012 Domino RAID Engine + a400 SmartCache/Raid I-IV Controller + a500 PCI Bridge + a501 SmartRAID V Controller + 1044 c001 PM1554U2 Ultra2 Single Channel + 1044 c002 PM1654U2 Ultra2 Single Channel + 1044 c003 PM1564U3 Ultra3 Single Channel + 1044 c004 PM1564U3 Ultra3 Dual Channel + 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI) + 1044 c00a PM2554U2 Ultra2 Single Channel + 1044 c00b PM2654U2 Ultra2 Single Channel + 1044 c00c PM2664U3 Ultra3 Single Channel + 1044 c00d PM2664U3 Ultra3 Dual Channel + 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI) + 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI) + 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI) + 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI) + 1044 c016 PM3755F Fibre Channel (NON ACPI) + 1044 c01e PM3757U2 Ultra2 Single Channel + 1044 c01f PM3757U2 Ultra2 Dual Channel + 1044 c020 PM3767U3 Ultra3 Dual Channel + 1044 c021 PM3767U3 Ultra3 Quad Channel + 1044 c028 PM2865U3 Ultra3 Single Channel + 1044 c029 PM2865U3 Ultra3 Dual Channel + 1044 c02a PM2865F Fibre Channel + 1044 c03c 2000S Ultra3 Single Channel + 1044 c03d 2000S Ultra3 Dual Channel + 1044 c03e 2000F Fibre Channel + 1044 c046 3000S Ultra3 Single Channel + 1044 c047 3000S Ultra3 Dual Channel + 1044 c048 3000F Fibre Channel + 1044 c050 5000S Ultra3 Single Channel + 1044 c051 5000S Ultra3 Dual Channel + 1044 c052 5000F Fibre Channel + 1044 c05a 2400A UDMA Four Channel + 1044 c05b 2400A UDMA Four Channel DAC + 1044 c064 3010S Ultra3 Dual Channel + 1044 c065 3410S Ultra160 Four Channel + 1044 c066 3010S Fibre Channel + a511 SmartRAID V Controller + 1044 c032 ASR-2005S I2O Zero Channel + 1044 c035 ASR-2010S I2O Zero Channel + c066 3010S Ultra3 Dual Channel +1045 OPTi Inc. + a0f8 82C750 [Vendetta] USB Controller + c101 92C264 + c178 92C178 + c556 82X556 [Viper] + c557 82C557 [Viper-M] + c558 82C558 [Viper-M ISA+IDE] + c567 82C750 [Vendetta], device 0 + c568 82C750 [Vendetta], device 1 + c569 82C579 [Viper XPress+ Chipset] + c621 82C621 [Viper-M/N+] + c700 82C700 [FireStar] + c701 82C701 [FireStar Plus] + c814 82C814 [Firebridge 1] + c822 82C822 + c824 82C824 + c825 82C825 [Firebridge 2] + c832 82C832 + c861 82C861 OHCI USB Host + c881 82C881 [FireLink] 1394 OHCI Link Controller + c895 82C895 + c935 EV1935 ECTIVA MachOne PCIAudio + d568 82C825 [Firebridge 2] + d721 IDE [FireStar] +1046 IPC Corporation, Ltd. +1047 Genoa Systems Corp +1048 Elsa AG + 0c60 Gladiac MX + 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL] + 1000 QuickStep 1000 + 3000 QuickStep 3000 + 8901 Gloria XL + 1048 0935 GLoria XL (Virge) +1049 Fountain Technologies, Inc. +# nee SGS Thomson Microelectronics +104a STMicroelectronics + 0000 STLS2F Host Bridge + 0008 STG 2000X + 0009 STG 1764X + 0010 STG4000 [3D Prophet Kyro Series] + 104a 4018 ST PowerVR Kyro (64MB AGP TVO) +# 64MB AGP + 1681 0010 PowerVR Kyro II [3D Prophet 4500] + 1681 0028 3D Prophet 4000XT + 1681 c010 3D Prophet 4500 TV-Out + 1681 c069 3D Prophet 4000XT + 0201 STPC Vega Northbridge + 0209 STPC Consumer/Industrial North- and Southbridge + 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge + 020b STPC Consumer II ISA Bridge + 0210 STPC Atlas ISA Bridge + 021a STPC Consumer S Southbridge + 021b STPC Consumer IIA Southbridge + 0220 STPC Industrial PCI to PCCard bridge + 0228 STPC Atlas IDE + 0229 STPC Vega IDE + 0230 STPC Atlas/Vega OHCI USB Controller + 0238 STPC Vega LAN + 0500 ST70137 [Unicorn] ADSL DMT Transceiver + 104a 0500 BeWAN ADSL PCI st + 0564 STPC Client Northbridge + 0981 21x4x DEC-Tulip compatible 10/100 Ethernet + 1746 STG 1764X + 2774 21x4x DEC-Tulip compatible 10/100 Ethernet + 3520 MPEG-II decoder card + 55cc STPC Client Southbridge +104b BusLogic + 0140 BT-946C (old) [multimaster 01] + 1040 BT-946C (BA80C30) [MultiMaster 10] + 8130 Flashpoint LT +104c Texas Instruments + 0500 100 MBit LAN Controller + 0508 TMS380C2X Compressor Interface + 1000 Eagle i/f AS + 104c PCI1510 PC card Cardbus Controller + 3d04 TVP4010 [Permedia] + 3d07 TVP4020 [Permedia 2] + 1011 4d10 Comet + 1040 000f AccelStar II + 1040 0011 AccelStar II + 1048 0a31 WINNER 2000 + 1048 0a32 GLoria Synergy + 1048 0a34 GLoria Synergy + 1048 0a35 GLoria Synergy + 1048 0a36 GLoria Synergy + 1048 0a43 GLoria Synergy + 1048 0a44 GLoria Synergy + 107d 2633 WinFast 3D L2300 + 1092 0126 FIRE GL 1000 PRO + 1092 0127 FIRE GL 1000 PRO + 1092 0136 FIRE GL 1000 PRO + 1092 0141 FIRE GL 1000 PRO + 1092 0146 FIRE GL 1000 PRO + 1092 0148 FIRE GL 1000 PRO + 1092 0149 FIRE GL 1000 PRO + 1092 0152 FIRE GL 1000 PRO + 1092 0154 FIRE GL 1000 PRO + 1092 0155 FIRE GL 1000 PRO + 1092 0156 FIRE GL 1000 PRO + 1092 0157 FIRE GL 1000 PRO + 1097 3d01 Jeronimo Pro + 1102 100f Graphics Blaster Extreme + 3d3d 0100 Reference Permedia 2 3D + 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller + 105e 8003 FireBoard200 + 1443 8003 FireBoard200 + 1443 8005 FireBoard400 + 1443 8006 FireBoard400 + e4bf 1010 CF1-1-SNARE + e4bf 1020 CF1-2-SNARE + e4bf 1040 FireCompact400 + 8009 TSB12LV22 IEEE-1394 Controller + 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller + 1443 8010 FireBoard400-OHCI + 8017 PCI4410 FireWire Controller + 8019 TSB12LV23 IEEE-1394 Controller + 11bd 000a Studio DV500-1394 + 11bd 000e Studio DV + 1443 8010 FireBoard400-OHCI + e4bf 1010 CF2-1-CYMBAL + 8020 TSB12LV26 IEEE-1394 Controller (Link) + 1028 00d8 Precision 530 + 104d 80e2 VAIO PCV-J200 + 11bd 000f Studio DV500-1394 + 11bd 001c Excalibur 4.1 + 1443 8010 FireBoard400-OHCI + 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated) + 104d 80df Vaio PCG-FX403 + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link) [iOHCI-Lynx] + 104c 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link) + 8023 TSB43AB22A IEEE-1394a-2000 Controller (PHY/Link) [iOHCI-Lynx] + 1028 0168 Precision Workstation 670 Mainboard + 103c 088c NC8000 laptop + 1043 808b K8N4/A8N Series Mainboard + 1043 815b P5W DH Deluxe Motherboard + 1443 8023 FireCard400 + 8086 5044 Desktop Board DP35DP + 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link) + 107d 6620 Winfast DV2000 FireWire Controller + 1443 8024 FireBoard Blue + 1458 1000 Motherboard + 8025 TSB82AA2 IEEE-1394b Link Layer Controller + 1043 813c P5P series mainboard + 1443 8025 FireBoard800 + 1458 1000 GA-K8N Ultra-9 Mainboard + 1546 8025 FWB-PCI01 + 17fc 8025 GIC3800 + 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link) + 1025 0035 TravelMate 660 + 1025 003c Aspire 2001WLCi (Compaq CL50 motherboard) + 103c 0025 XE4500 Notebook + 103c 006a NX9500 + 1043 808d A7V333 mainboard. + 8027 PCI4451 IEEE-1394 Controller + 1028 00e5 Latitude C810 + 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100) + 8029 PCI4510 IEEE-1394 Controller + 1028 0163 Latitude D505 + 1028 0196 Inspiron 5160 + 1071 8160 MIM2900 + 802b PCI7410,7510,7610 OHCI-Lynx Controller + 1028 0139 Latitude D400 + 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Latitude D800) + 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller + 1028 018d Inspiron 700m/710m + 8031 PCIxx21/PCIxx11/PCIx515 PC Card Controller + 1025 0064 Extensa 3000 series laptop + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8032 OHCI Compliant IEEE 1394 Host Controller + 1025 0064 Extensa 3000 series laptop + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8033 PCIxx21/PCIxx11 Flash Media Controller + 1025 0064 Extensa 3000 series laptop + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8034 PCIxx21/PCIxx11 SD Host Controller + 1025 0080 Aspire 5024WLMi + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 103c 308b MX6125 + 8035 PCIxx21/PCIxx11 Smart Card Controller + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 8036 PCI6515 Cardbus Controller + 8038 PCI6515 SmartCard Controller + 8039 PCIxx12 Cardbus Controller + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 104d 902d VAIO VGN-NR120E + 803a PCIxx12 OHCI Compliant IEEE 1394 Host Controller + 103c 309f nx9420 + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 104d 902d VAIO VGN-NR120E + 803b PCIxx12 Flash Media Controller + 103c 309f nx9420 + 103c 30a3 Compaq nw8440 + 104d 8212 VAIO VGN-N21E + 104d 902d VAIO VGN-NR120E + 803c PCIxx12 SDA Standard Compliant SD Host Controller + 103c 309f nx9420 + 103c 30a3 Compaq nw8440 + 803d PCIxx12 GemCore based SmartCard controller + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 nc8430 + 103c 30aa nc6310 + 8101 TSB43DB42 IEEE-1394a-2000 Controller (PHY/Link) + 8201 PCI1620 Firmware Loading Function + 8204 PCI7410/7510/7610 PCI Firmware Loading Function + 1028 0139 Latitude D400 + 1028 014e Latitude D800 + 8231 XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge + 5678 1234 DC-1394 PCIe + 8232 XIO3130 PCI Express Switch (Upstream) + 8233 XIO3130 PCI Express Switch (Downstream) + 8235 XIO2200A IEEE-1394a-2000 Controller (PHY/Link) + 5678 1234 DC-1394 PCIe + 823e XIO2213A/B/XIO2221 PCI Express to PCI Bridge [Cheetah Express] + 823f XIO2213A/B/XIO2221 IEEE-1394b OHCI Controller [Cheetah Express] + 1546 803c FWB-PCIE1X11B + 8240 XIO2001 PCI Express-to-PCI Bridge + 8241 TUSB73x0 SuperSpeed USB 3.0 xHCI Host Controller + 1014 04b2 S824 (8286-42A) + 8400 ACX 100 22Mbps Wireless Interface + 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus] + 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter + 1395 2201 WL22-PC + 16ab 8501 WL-8305 IEEE802.11b+ Wireless LAN PCI Adapter + 8401 ACX 100 22Mbps Wireless Interface + 8888 Multicore DSP+ARM KeyStone II SOC + 9000 Wireless Interface (of unknown type) + 9065 TMS320DM642 + 9066 ACX 111 54Mbps Wireless Interface + 0308 3404 G-102 v1 802.11g Wireless Cardbus Adapter + 0308 3406 G-162 v2 802.11g Wireless Cardbus Adapter + 104c 9066 WL212 Sitecom Wireless Network PCI-Card 100M (Version 1) +# Found in Philips ADSL ANNEX A WLAN Router SNA6500/18 sold by Belgacom + 104c 9067 TNETW1130GVF + 104c 9096 Trendnet TEW-412PC Wireless PCI Adapter (Version A) + 1186 3b04 DWL-G520+ Wireless PCI Adapter + 1186 3b05 DWL-G650+ AirPlusG+ CardBus Wireless LAN + 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.B1) + 1385 4c00 WG311v2 802.11g Wireless PCI Adapter + 13d1 aba0 SWLMP-54108 108Mbps Wireless mini PCI card 802.11g+ + 14ea ab07 GW-NS54GM Wireless Cardbus Adapter + 16ec 010d USR5416 802.11g Wireless Turbo PCI Adapter + 16ec 010e USR5410 802.11g Wireless Cardbus Adapter + 1737 0033 WPC54G v2 802.11g Wireless-G Notebook Adapter + 17cf 0032 G-162 v1 802.11g Wireless Cardbus Adapter + 17cf 0033 Z-Com XG650 Wireless miniPCI 802.11b/g + 187e 340b G-302 v2 802.11g Wireless PCI Adapter + 187e 340c G-360 v2 802.11g Wireless PCI Adapter + a001 TDC1570 + a100 TDC1561 + a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f + a106 TMS320C6414 TMS320C6415 TMS320C6416 + 175c 5000 ASI50xx Audio Adapter + 175c 6400 ASI6400 Cobranet series + 175c 8700 ASI87xx Radio Tuner card + ac10 PCI1050 + ac11 PCI1053 + ac12 PCI1130 + ac13 PCI1031 + ac15 PCI1131 + ac16 PCI1250 + 1014 0092 ThinkPad 600 + ac17 PCI1220 + ac18 PCI1260 + ac19 PCI1221 + ac1a PCI1210 + ac1b PCI1450 + 0e11 b113 Armada M700 + 1014 0130 ThinkPad 600X/A21m/T20/T22 + ac1c PCI1225 + 0e11 b121 Armada E500 + 1028 0088 Latitude CPi A400XT + ac1d PCI1251A + ac1e PCI1211 + ac1f PCI1251B + ac20 TI 2030 + ac21 PCI2031 + ac22 PCI2032 PCI Docking Bridge + ac23 PCI2250 PCI-to-PCI Bridge + ac28 PCI2050 PCI-to-PCI Bridge + ac2c PCI2060 PCI-to-PCI Bridge + ac30 PCI1260 PC card Cardbus Controller + ac40 PCI4450 PC card Cardbus Controller + ac41 PCI4410 PC card Cardbus Controller + ac42 PCI4451 PC card Cardbus Controller + 1028 00e6 PCI4451 PC card CardBus Controller (Inspiron 8100) + ac44 PCI4510 PC card Cardbus Controller + 1028 0149 Inspiron 5100 + 1028 0163 Latitude D505 + 1028 0196 Inspiron 5160 + 1071 8160 MIM2000 + ac46 PCI4520 PC card Cardbus Controller + 1014 0552 ThinkPad + ac47 PCI7510 PC card Cardbus Controller + 1028 0139 Latitude D400 + 1028 013f Precision M60 + 1028 014e Latitude D800 + ac48 PCI7610 PC Card Cardbus Controller + ac49 PCI7410 PC Card Cardbus Controller + ac4a PCI7510/7610 CardBus Bridge + 1028 0139 Latitude D400 + 1028 014e Latitude D800 + ac4b PCI7610 SD/MMC controller + ac4c PCI7610 Memory Stick controller + ac50 PCI1410 PC card Cardbus Controller + ac51 PCI1420 PC card Cardbus Controller + 0e11 004e Evo N600c + 1014 0148 ThinkPad A20m + 1014 023b ThinkPad T23 + 1028 00b1 Latitude C600 + 1028 012a Latitude C640 + 1033 80cd Versa Note VXi + 10cf 1095 Lifebook S-4510/C6155 + e4bf 1000 CP2-2-HIPHOP + ac52 PCI1451 PC card Cardbus Controller + ac53 PCI1421 PC card Cardbus Controller + ac54 PCI1620 PC Card Controller + 103c 08b0 tc1100 tablet + ac55 PCI1520 PC card Cardbus Controller + 1014 0512 ThinkPad T30/T40 + 103c 0025 XE4500 Notebook + ac56 PCI1510 PC card Cardbus Controller + 1014 0512 ThinkPad R50e + 1014 0528 ThinkPad R40e + 17aa 2012 ThinkPad T60/R60 series + ac60 PCI2040 PCI to DSP Bridge Controller + 175c 5100 ASI51xx Audio Adapter + 175c 6100 ASI61xx Audio Adapter + 175c 6200 ASI62xx Audio Adapter + 175c 8800 ASI88xx Audio Adapter + 186f 3001 WR-G303 PCI radio receiver + 186f 3005 WR-G305 PCI radio receiver + 186f 3101 WR-G313 PCI radio receiver + 186f 3105 WR-G315 PCI radio receiver + ac8d PCI 7620 + ac8e PCI7420 CardBus Controller + 1028 018d Inspiron 700m/710m + ac8f PCI7420/7620 SD/MS-Pro Controller + 1028 018d Inspiron 700m/710m + b001 TMS320C6424 + fe00 FireWire Host Controller + fe03 12C01A FireWire Host Controller +104d Sony Corporation + 8004 DTL-H2500 [Playstation development board] + 8009 CXD1947Q i.LINK Controller + 800c DTL-H800 [PS1 sound development board] + 8039 CXD3222 i.LINK Controller + 8047 PS2 TOOL MRP + 8056 Rockwell HCF 56K modem + 808a Memory Stick Controller + 80ff PS2 Performance Analyzer + 814a PS2 Performance Analyzer + 8183 ATHENS [PS3 prototype developer interface card] + 81b0 BM-1 [PSP TOOL Board Management Device] + 81c3 VO-4 [PSP TOOL Video Output Device] + 81ce SxS Pro memory card + 81ff PS3 TOOL MRP + 8200 PS3 TOOL RSX Tracing FPGA + 820e CXD9208GP [PS3 PS2 emulation subsystem adapter] +# 2nd ID + 905c SxS Pro memory card +# 2nd ID + 907f SxS Pro+ memory card + 908f Aeolia ACPI + 909e Aeolia Ethernet Controller (Marvell Yukon 2 Family) + 909f Aeolia SATA AHCI Controller + 90a0 Aeolia SD/MMC Host Controller + 90a1 Aeolia PCI Express Glue and Miscellaneous Devices + 90a2 Aeolia DMA Controller + 90a3 Aeolia Memory (DDR3/SPM) + 90a4 Aeolia USB 3.0 xHCI Host Controller + 90bc SxS Pro+ memory card + 90c8 Belize ACPI + 90c9 Belize Ethernet Controller + 90ca Belize SATA AHCI Controller + 90cb Belize SD/MMC Host Controller + 90cc Belize PCI Express Glue and Miscellaneous Devices + 90cd Belize DMA Controller + 90ce Belize Memory (DDR3/SPM) + 90cf Belize USB 3.0 xHCI Host Controller + 90d7 Baikal ACPI + 90d8 Baikal Ethernet Controller + 90d9 Baikal SATA AHCI Controller + 90da Baikal SD/MMC Host Controller + 90db Baikal PCI Express Glue and Miscellaneous Devices + 90dc Baikal DMA Controller + 90dd Baikal Memory (DDR3/SPM) + 90de Baikal USB 3.0 xHCI Host Controller +104e Oak Technology, Inc + 0017 OTI-64017 + 0107 OTI-107 [Spitfire] + 0109 Video Adapter + 0111 OTI-64111 [Spitfire] + 0217 OTI-64217 + 0317 OTI-64317 +104f Co-time Computer Ltd +1050 Winbond Electronics Corp + 0000 NE2000 + 0001 W83769F + 0033 W89C33D 802.11 a/b/g BB/MAC + 0105 W82C105 + 0840 W89C840 + 1050 0001 W89C840 Ethernet Adapter + 1050 0840 W89C840 Ethernet Adapter + 0940 W89C940 + 5a5a W89C940F + 6692 W6692 + 1043 1702 ISDN Adapter (PCI Bus, D, W) + 1043 1703 ISDN Adapter (PCI Bus, DV, W) + 1043 1707 ISDN Adapter (PCI Bus, DV, W) + 144f 1702 ISDN Adapter (PCI Bus, D, W) + 144f 1703 ISDN Adapter (PCI Bus, DV, W) + 144f 1707 ISDN Adapter (PCI Bus, DV, W) + 9921 W99200F MPEG-1 Video Encoder + 9922 W99200F/W9922PF MPEG-1/2 Video Encoder + 9970 W9970CF +1051 Anigma, Inc. +1052 ?Young Micro Systems +1053 Young Micro Systems +1054 Hitachi, Ltd + 3009 2Gbps Fibre Channel to PCI HBA 3009 + 300a 4Gbps Fibre Channel to PCI-X HBA 300a + 300b 4Gbps Fibre Channel to PCI-X HBA 300b + 300f ColdFusion 3 Chipset Processor to I/O Controller + 3010 ColdFusion 3 Chipset Memory Controller Hub + 3011 ColdFusion 3e Chipset Processor to I/O Controller + 3012 ColdFusion 3e Chipset Memory Controller Hub + 3017 Unassigned Hitachi Shared FC Device 3017 + 301b Virtual VGA Device + 301d PCIe-to-PCIe Bridge with Virtualization IO Assist Feature + 3020 FIVE-EX based Fibre Channel to PCIe HBA + 302c M001 PCI Express Switch Upstream Port + 302d M001 PCI Express Switch Downstream Port + 3070 Hitachi FIVE-FX Fibre Channel to PCIe HBA + 3505 SH7751 PCI Controller (PCIC) + 350e SH7751R PCI Controller (PCIC) +1055 Microchip Technology / SMSC + 7430 LAN7430 + 7431 LAN7431 + 9130 SLC90E66 [Victory66] IDE + 9460 SLC90E66 [Victory66] ISA + 9462 SLC90E66 [Victory66] USB + 9463 SLC90E66 [Victory66] ACPI + e420 LAN9420/LAN9420i +1056 ICL +# Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this. +1057 Motorola + 0001 MPC105 [Eagle] + 0002 MPC106 [Grackle] + 0003 MPC8240 [Kahlua] + 0004 MPC107 + 0006 MPC8245 [Unity] + 0008 MPC8540 + 0009 MPC8560 + 0012 MPC8548 [PowerQUICC III] + 0100 MC145575 [HFC-PCI] + 0431 KTI829c 100VG + 1073 Nokia N770 + 1219 Nokia N800 + 1801 DSP56301 Digital Signal Processor + 14fb 0101 Transas Radar Imitator Board [RIM] + 14fb 0102 Transas Radar Imitator Board [RIM-2] + 14fb 0202 Transas Radar Integrator Board [RIB-2] + 14fb 0611 1 channel CAN bus Controller [CanPci-1] + 14fb 0612 2 channels CAN bus Controller [CanPci-2] + 14fb 0613 3 channels CAN bus Controller [CanPci-3] + 14fb 0614 4 channels CAN bus Controller [CanPci-4] + 14fb 0621 1 channel CAN bus Controller [CanPci2-1] + 14fb 0622 2 channels CAN bus Controller [CanPci2-2] + 14fb 0810 Transas VTS Radar Integrator Board [RIB-4] + 175c 4200 ASI4215 Audio Adapter + 175c 4300 ASI43xx Audio Adapter + 175c 4400 ASI4401 Audio Adapter + ecc0 0010 Darla + ecc0 0020 Gina + ecc0 0030 Layla rev.0 + ecc0 0031 Layla rev.1 + ecc0 0040 Darla24 rev.0 + ecc0 0041 Darla24 rev.1 + ecc0 0050 Gina24 rev.0 + ecc0 0051 Gina24 rev.1 + ecc0 0070 Mona rev.0 + ecc0 0071 Mona rev.1 + ecc0 0072 Mona rev.2 + 18c0 MPC8265A/8266/8272 + 18c1 MPC8271/MPC8272 + 3052 SM56 Data Fax Modem + 3410 DSP56361 Digital Signal Processor + ecc0 0050 Gina24 rev.0 + ecc0 0051 Gina24 rev.1 + ecc0 0060 Layla24 + ecc0 0070 Mona rev.0 + ecc0 0071 Mona rev.1 + ecc0 0072 Mona rev.2 + ecc0 0080 Mia rev.0 + ecc0 0081 Mia rev.1 + ecc0 0090 Indigo + ecc0 00a0 Indigo IO + ecc0 00b0 Indigo DJ + ecc0 0100 3G + 4801 Raven + 4802 Falcon + 4803 Hawk + 4806 CPX8216 +# MPC7410 PowerPC microprocessor and PCI host bridge + 480b MPC7410 + 4d68 20268 + 5600 SM56 PCI Modem + 1057 0300 SM56 PCI Speakerphone Modem + 1057 0301 SM56 PCI Voice Modem + 1057 0302 SM56 PCI Fax Modem + 1057 5600 SM56 PCI Voice modem + 13d2 0300 SM56 PCI Speakerphone Modem + 13d2 0301 SM56 PCI Voice modem + 13d2 0302 SM56 PCI Fax Modem + 1436 0300 SM56 PCI Speakerphone Modem + 1436 0301 SM56 PCI Voice modem + 1436 0302 SM56 PCI Fax Modem + 144f 100c SM56 PCI Fax Modem + 1494 0300 SM56 PCI Speakerphone Modem + 1494 0301 SM56 PCI Voice modem + 14c8 0300 SM56 PCI Speakerphone Modem + 14c8 0302 SM56 PCI Fax Modem + 1668 0300 SM56 PCI Speakerphone Modem + 1668 0302 SM56 PCI Fax Modem + 5608 Wildcard X100P + 5803 MPC5200 + 5806 MCF54 Coldfire + 5808 MPC8220 + 5809 MPC5200B + 6400 MPC190 Security Processor (S1 family, encryption) + 6405 MPC184 Security Processor (S1 family) +1058 Electronics & Telecommunications RSH +1059 Kontron +105a Promise Technology, Inc. + 0d30 PDC20265 (FastTrak100 Lite/Ultra100) + 1043 8042 AV7266-E South Bridge Promise RAID + 105a 4d33 Ultra100 + 0d38 20263 + 105a 4d39 Fasttrak66 + 1275 20275 + 3318 PDC20318 (SATA150 TX4) + 3319 PDC20319 (FastTrak S150 TX4) + 105a 3319 FastTrak S150 TX4 4 port SATA PCI board + 8086 3427 S875WP1-E mainboard + 3371 PDC20371 (FastTrak S150 TX2plus) + 3373 PDC20378 (FastTrak 378/SATA 378) + 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard + 1462 590d KT6 Delta-FIS2R (MS-6590) + 1462 702e K8T NEO FIS2R motherboard + 3375 PDC20375 (SATA150 TX2plus) + 3376 PDC20376 (FastTrak 376) + 1043 809e A7V8X motherboard + 3515 PDC40719 [FastTrak TX4300/TX4310] + 3519 PDC40519 (FastTrak TX4200) + 3570 PDC20771 [FastTrak TX2300] + 3571 PDC20571 (FastTrak TX2200) + 3574 PDC20579 SATAII 150 IDE Controller + 3577 PDC40779 (SATA 300 779) + 3d17 PDC40718 (SATA 300 TX4) + 3d18 PDC20518/PDC40518 (SATAII 150 TX4) + 3d73 PDC40775 (SATA 300 TX2plus) + 3d75 PDC20575 (SATAII150 TX2plus) + 3f20 PDC42819 [FastTrak TX2650/TX4650] + 4302 80333 [SuperTrak EX4350] + 4d30 PDC20267 (FastTrak100/Ultra100) + 105a 4d33 Ultra100 + 105a 4d39 FastTrak100 + 8086 5744 S845WD1-E mainboard + 4d33 20246 + 105a 4d33 20246 IDE Controller + 4d38 PDC20262 (FastTrak66/Ultra66) + 105a 4d30 Ultra Device on SuperTrak + 105a 4d33 Ultra66 + 105a 4d39 FastTrak66 + 4d68 PDC20268 [Ultra100 TX2] + 105a 4d68 Ultra100 TX2 + 4d69 20269 + 105a 4d68 Ultra133TX2 + 5275 PDC20276 (MBFastTrak133 Lite) + 1043 807e A7V333 motherboard. + 105a 0275 SuperTrak SX6000 IDE + 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode) + 1458 b001 MBUltra 133 + 5300 DC5300 + 6268 PDC20270 (FastTrak100 LP/TX2/TX4) + 105a 4d68 FastTrak100 TX2 + 6269 PDC20271 (FastTrak TX2000) + 105a 6269 FastTrak TX2/TX2000 + 6300 PDC81731 [FastTrak SX8300] + 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite) + 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller + 6624 PDC20621 [FastTrak SX4100] + 6626 PDC20618 (Ultra 618) + 6629 PDC20619 (FastTrak TX4000) + 7275 PDC20277 (SBFastTrak133 Lite) + 8002 SATAII150 SX8 + 8350 80333 [SuperTrak EX8350/EX16350], 80331 [SuperTrak EX8300/EX16300] + 8650 81384 [SuperTrak EX SAS and SATA RAID Controller] + 105a 4600 SuperTrak EX4650A + 105a 4601 SuperTrak EX4650 + 105a 4610 SuperTrak EX4650EL + 105a 8600 SuperTrak EX8650EL + 105a 8601 SuperTrak EX8650A + 105a 8602 SuperTrak EX8654 + 105a 8603 SuperTrak EX8658 + 105a 8604 SuperTrak EX8650 + 105a 8610 SuperTrak EX8650M + 105a a600 SuperTrak EX12650 + 105a b600 SuperTrak EX16650 + 105a b601 SuperTrak EX16654 + 105a b602 SuperTrak EX16658 + 8760 PM8010 [SuperTrak EX SAS and SATA 6G RAID Controller] + c350 80333 [SuperTrak EX12350] + e350 80333 [SuperTrak EX24350] +105b Foxconn International, Inc. +105c Wipro Infotech Limited +105d Number 9 Computer Company + 2309 Imagine 128 + 2339 Imagine 128-II + 105d 0000 Imagine 128 series 2 4Mb VRAM + 105d 0001 Imagine 128 series 2 4Mb VRAM + 105d 0002 Imagine 128 series 2 4Mb VRAM + 105d 0003 Imagine 128 series 2 4Mb VRAM + 105d 0004 Imagine 128 series 2 4Mb VRAM + 105d 0005 Imagine 128 series 2 4Mb VRAM + 105d 0006 Imagine 128 series 2 4Mb VRAM + 105d 0007 Imagine 128 series 2 4Mb VRAM + 105d 0008 Imagine 128 series 2e 4Mb DRAM + 105d 0009 Imagine 128 series 2e 4Mb DRAM + 105d 000a Imagine 128 series 2 8Mb VRAM + 105d 000b Imagine 128 series 2 8Mb H-VRAM + 11a4 000a Metheus 5 Megapixel + 13cc 0000 Metheus 5 Megapixel + 13cc 0004 Metheus 5 Megapixel + 13cc 0005 Metheus 5 Megapixel + 13cc 0006 Metheus 5 Megapixel + 13cc 0008 Metheus 5 Megapixel + 13cc 0009 Metheus 5 Megapixel + 13cc 000a Metheus 5 Megapixel + 13cc 000c Metheus 5 Megapixel + 493d Imagine 128 T2R [Ticket to Ride] + 11a4 000a Metheus 5 Megapixel, Dual Head + 11a4 000b Metheus 5 Megapixel, Dual Head + 13cc 0002 Metheus 4 Megapixel, Dual Head + 13cc 0003 Metheus 5 Megapixel, Dual Head + 13cc 0007 Metheus 5 Megapixel, Dual Head + 13cc 0008 Metheus 5 Megapixel, Dual Head + 13cc 0009 Metheus 5 Megapixel, Dual Head + 13cc 000a Metheus 5 Megapixel, Dual Head + 5348 Revolution 4 + 105d 0037 Revolution IV-FP AGP (For SGI 1600SW) + 11a4 0028 PVS5600M + 11a4 0038 PVS5600D +105e Vtech Computers Ltd +105f Infotronic America Inc +1060 United Microelectronics [UMC] + 0001 UM82C881 + 0002 UM82C886 + 0101 UM8673F + 0881 UM8881 + 0886 UM8886F + 0891 UM8891A + 1001 UM886A + 673a UM8886BF + 673b EIDE Master/DMA + 8710 UM8710 + 886a UM8886A + 8881 UM8881F + 8886 UM8886F + 888a UM8886A + 8891 UM8891A + 9017 UM9017F + 9018 UM9018 + 9026 UM9026 + e881 UM8881N + e886 UM8886N + e88a UM8886N + e891 UM8891N +1061 I.I.T. + 0001 AGX016 + 0002 IIT3204/3501 +1062 Maspar Computer Corp +1063 Ocean Office Automation +1064 Alcatel + 1102 Dynamite 2840 (ADSL PCI modem) +1065 Texas Microsystems +1066 PicoPower Technology + 0000 PT80C826 + 0001 PT86C521 [Vesuvius v1] Host Bridge + 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master + 0003 PT86C524 [Nile] PCI-to-PCI Bridge + 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge + 0005 National PC87550 System Controller + 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave +1067 Mitsubishi Electric + 0301 AccelGraphics AccelECLIPSE + 0304 AccelGALAXY A2100 [OEM Evans & Sutherland] + 0308 Tornado 3000 [OEM Evans & Sutherland] + 1002 VG500 [VolumePro Volume Rendering Accelerator] +1068 Diversified Technology +1069 Mylex Corporation + 0001 DAC960P + 0002 DAC960PD + 0010 DAC960PG + 0020 DAC960LA + 0050 AcceleRAID 352/170/160 support Device + 1069 0050 AcceleRAID 352 support Device + 1069 0052 AcceleRAID 170 support Device + 1069 0054 AcceleRAID 160 support Device + b166 AcceleRAID 600/500/400/Sapphire support Device + 1014 0242 iSeries 2872 DASD IOA + 1014 0266 Dual Channel PCI-X U320 SCSI Adapter + 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter + 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter + 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter + 1069 0200 AcceleRAID 400, Single Channel, PCI-X, U320, SCSI RAID + 1069 0202 AcceleRAID Sapphire, Dual Channel, PCI-X, U320, SCSI RAID + 1069 0204 AcceleRAID 500, Dual Channel, Low-Profile, PCI-X, U320, SCSI RAID + 1069 0206 AcceleRAID 600, Dual Channel, PCI-X, U320, SCSI RAID + ba55 eXtremeRAID 1100 support Device + ba56 eXtremeRAID 2000/3000 support Device + 1069 0030 eXtremeRAID 3000 support Device + 1069 0040 eXtremeRAID 2000 support Device + ba57 eXtremeRAID 4000/5000 support Device + 1069 0072 eXtremeRAID 5000 support Device +106a Aten Research Inc +106b Apple Inc. + 0001 Bandit PowerPC host bridge + 0002 Grand Central I/O + 0003 Control Video + 0004 PlanB Video-In + 0007 O'Hare I/O + 000b Apple Camera + 000c DOS on Mac + 000e Hydra Mac I/O + 0010 Heathrow Mac I/O + 0017 Paddington Mac I/O + 0018 UniNorth FireWire + 0019 KeyLargo USB + 001e UniNorth Internal PCI + 001f UniNorth PCI + 0020 UniNorth AGP + 0021 UniNorth GMAC (Sun GEM) + 0022 KeyLargo Mac I/O + 0024 UniNorth/Pangea GMAC (Sun GEM) + 0025 KeyLargo/Pangea Mac I/O + 0026 KeyLargo/Pangea USB + 0027 UniNorth/Pangea AGP + 0028 UniNorth/Pangea PCI + 0029 UniNorth/Pangea Internal PCI + 002d UniNorth 1.5 AGP + 002e UniNorth 1.5 PCI + 002f UniNorth 1.5 Internal PCI + 0030 UniNorth/Pangea FireWire + 0031 UniNorth 2 FireWire + 106b 5811 iBook G4 2004 + 0032 UniNorth 2 GMAC (Sun GEM) + 0033 UniNorth 2 ATA/100 + 0034 UniNorth 2 AGP + 0035 UniNorth 2 PCI + 0036 UniNorth 2 Internal PCI + 003b UniNorth/Intrepid ATA/100 + 003e KeyLargo/Intrepid Mac I/O + 003f KeyLargo/Intrepid USB + 1af4 1100 QEMU Virtual Machine + 0040 K2 KeyLargo USB + 0041 K2 KeyLargo Mac/IO + 0042 K2 FireWire + 0043 K2 ATA/100 + 0045 K2 HT-PCI Bridge + 0046 K2 HT-PCI Bridge + 0047 K2 HT-PCI Bridge + 0048 K2 HT-PCI Bridge + 0049 K2 HT-PCI Bridge + 004a CPC945 HT Bridge + 004b U3 AGP + 004c K2 GMAC (Sun GEM) + 004f Shasta Mac I/O + 0050 Shasta IDE + 0051 Shasta (Sun GEM) + 0052 Shasta Firewire + 0053 Shasta PCI Bridge + 0054 Shasta PCI Bridge + 0055 Shasta PCI Bridge + 0056 U4 PCIe + 0057 U3 HT Bridge + 0058 U3L AGP Bridge + 0059 U3H AGP Bridge + 005b CPC945 PCIe Bridge + 0066 Intrepid2 AGP Bridge + 0067 Intrepid2 PCI Bridge + 0068 Intrepid2 PCI Bridge + 0069 Intrepid2 ATA/100 + 006a Intrepid2 Firewire + 006b Intrepid2 GMAC (Sun GEM) + 0074 U4 HT Bridge +# should be 14e4:1645 + 1645 Broadcom NetXtreme BCM5701 Gigabit Ethernet + 1801 T2 Bridge Controller + 1802 T2 Secure Enclave Processor + 1803 Apple Audio Device + 2001 S1X NVMe Controller + 2002 S3ELab NVMe Controller + 2003 S3X NVMe Controller + 2005 ANS2 NVMe Controller +106c Hynix Semiconductor + 8139 8139c 100BaseTX Ethernet Controller + 8801 Dual Pentium ISA/PCI Motherboard + 8802 PowerPC ISA/PCI Motherboard + 8803 Dual Window Graphics Accelerator + 8804 LAN Controller + 8805 100-BaseT LAN +106d Sequent Computer Systems +106e DFI, Inc +106f City Gate Development Ltd +1070 Daewoo Telecom Ltd +1071 Mitac + 8160 Mitac 8060B Mobile Platform +1072 GIT Co Ltd +1073 Yamaha Corporation + 0001 3D GUI Accelerator + 0002 YGV615 [RPA3 3D-Graphics Controller] + 0003 YMF-740 + 0004 YMF-724 + 1073 0004 YMF724-Based PCI Audio Adapter + 0005 DS1 Audio + 1073 0005 DS-XG PCI Audio CODEC + 0006 DS1 Audio + 0008 DS1 Audio + 1073 0008 DS-XG PCI Audio CODEC + 000a DS1L Audio + 1073 0004 DS-XG PCI Audio CODEC + 1073 000a DS-XG PCI Audio CODEC + 8086 4d55 DS-XG PCI Audio CODEC [Intel MU440EX] + 000c YMF-740C [DS-1L Audio Controller] + 107a 000c DS-XG PCI Audio CODEC + 000d YMF-724F [DS-1 Audio Controller] + 1073 000d DS-XG PCI Audio CODEC + 0010 YMF-744B [DS-1S Audio Controller] + 1073 0006 DS-XG PCI Audio CODEC + 1073 0010 DS-XG PCI Audio CODEC + 0012 YMF-754 [DS-1E Audio Controller] + 1073 0012 DS-XG PCI Audio Codec + 0020 DS-1 Audio + 1000 SW1000XG [XG Factory] + 2000 DS2416 Digital Mixing Card + 1073 2000 DS2416 Digital Mixing Card +1074 NexGen Microsystems + 4e78 82c500/1 +1075 Advanced Integrations Research +1076 Chaintech Computer Co. Ltd +1077 QLogic Corp. + 1016 ISP10160 Single Channel Ultra3 SCSI Processor + 1020 ISP1020 Fast-wide SCSI + 1022 ISP1022 Fast-wide SCSI + 1080 ISP1080 SCSI Host Adapter + 1216 ISP12160 Dual Channel Ultra3 SCSI Processor + 101e 8471 QLA12160 on AMI MegaRAID + 101e 8493 QLA12160 on AMI MegaRAID + 1240 ISP1240 SCSI Host Adapter + 1280 ISP1280 SCSI Host Adapter + 1634 FastLinQ QL45000 Series 40GbE Controller + 1077 e4f1 FastLinQ QL45212H 40GbE Adapter + 1077 e4f2 FastLinQ QL45211H 40GbE Adapter + 1077 e4f3 FastLinQ QL45412H 40GbE Adapter + 1077 e4f4 FastLinQ QL45411H 40GbE Adapter + 1644 FastLinQ QL45000 Series 100GbE Controller + 1077 e4f8 FastLinQ QL45611H 100GbE Adapter + 1654 FastLinQ QL45000 Series 50GbE Controller + 1077 0032 QL45212 Flex 50Gb 2-port Ethernet Adapter + 1590 0223 Synergy 6810C 25/50Gb Ethernet Adapter + 1590 0287 Synergy 6820C 25/50Gb CNA + 1656 FastLinQ QL45000 Series 25GbE Controller + 1077 0033 QL45214 Flex 25Gb 4-port Ethernet Adapter + 1077 02a7 QL45212-DE 25GbE Adapter + 1077 e4f6 FastLinQ QL45211H 25GbE Adapter + 1077 e4f7 FastLinQ QL45212H 25GbE Adapter + 1590 0245 10/20/25GbE 2P 4820c CNA + 165c FastLinQ QL45000 Series 10/25/40/50GbE Controller (FCoE) + 1077 0034 QL45262 Flex 50Gb 2-port Ethernet Adapter w/ iSCSI/FCoE + 1077 e4f1 FastLinQ QL45462H 40GbE FCoE Adapter + 1077 e4f2 FastLinQ QL45461H 40GbE FCoE Adapter + 1590 0245 10/20/25GbE 2P 4820c CNA FCoE + 165e FastLinQ QL45000 Series 10/25/40/50GbE Controller (iSCSI) + 1077 0034 QL45262 Flex 50Gb 2-port Ethernet Adapter w/ iSCSI/FCoE + 1077 e4f1 FastLinQ QL45462H 40GbE iSCSI Adapter + 1077 e4f2 FastLinQ QL45461H 40GbE iSCSI Adapter + 1590 0245 10/20/25GbE 2P 4820c CNA iSCSI + 1664 FastLinQ QL45000 Series Gigabit Ethernet Controller (SR-IOV VF) + 1077 e4f1 FastLinQ QL45462H 40GbE Adapter (SR-IOV VF) + 1077 e4f2 FastLinQ QL45461H 40GbE Adapter (SR-IOV VF) + 1077 e4f3 FastLinQ QL45412H 40GbE Adapter (SR-IOV VF) + 1077 e4f4 FastLinQ QL45411H 40GbE Adapter (SR-IOV VF) + 1077 e4f6 FastLinQ QL45211H 25GbE Adapter (SR-IOV VF) + 1077 e4f7 FastLinQ QL45212H 25GbE Adapter (SR-IOV VF) + 1077 e4f8 FastLinQ QL45611H 100GbE Adapter (SR-IOV VF) + 1590 0245 10/20/25GbE 2P 4820c CNA SRIOV + 2020 ISP2020A Fast!SCSI Basic Adapter + 2031 ISP8324-based 16Gb Fibre Channel to PCI Express Adapter + 103c 17e7 SN1000Q 16Gb Single Port Fibre Channel Adapter + 103c 17e8 SN1000Q 16Gb Dual Port Fibre Channel Adapter + 103c 1939 QMH2672 16Gb Dual Port Fibre Channel Adapter + 103c 8002 3830C 16G Fibre Channel Host Bus Adapter + 1077 0241 QLE2670 16Gb Single Port Fibre Channel Adapter + 2071 ISP2714-based 16/32Gb Fibre Channel to PCIe Adapter + 1077 0283 QLE2764 Quad Port 32Gb Fibre Channel to PCIe Adapter + 1077 029e QLE2694 Quad Port 16Gb Fibre Channel to PCIe Adapter + 1077 02a2 QLE2694L Quad Port 16Gb Fibre Channel to PCIe Adapter + 1077 02ad QLE2694U Quad Port 16/32Gb Fibre Channel to PCIe Adapter + 2081 ISP2814-based 64/32G Fibre Channel to PCIe Controller + 1077 02e1 QLE2874 Quad Port 64GFC PCIe Gen4 x16 Adapter + 1077 02e3 QLE2774 Quad Port 32GFC PCIe Gen4 x16 Adapter + 2089 ISP2854-based 64/32G Fibre Channel to PCIe Controller with StorCryption + 1077 02e8 QLE2884 Quad Port 64GFC PCIe Gen4 x16 Adapter with StorCryption + 1077 02ea QLE2784 Quad Port 32GFC PCIe Gen4 x16 Adapter with StorCryption + 2100 QLA2100 64-bit Fibre Channel Adapter + 1077 0001 QLA2100 64-bit Fibre Channel Adapter + 2200 QLA2200 64-bit Fibre Channel Adapter + 1077 0002 QLA2200 + 2261 ISP2722-based 16/32Gb Fibre Channel to PCIe Adapter + 1077 0299 QLE2740 Single Port 32Gb Fibre Channel to PCIe Adapter + 1077 029a QLE2742 Dual Port 32Gb Fibre Channel to PCIe Adapter + 1077 029b QLE2690 Single Port 16Gb Fibre Channel to PCIe Adapter + 1077 029c QLE2692 Dual Port 16Gb Fibre Channel to PCIe Adapter + 1077 02a7 QLE2690 Single Port 16Gb FC to PCIe Gen3 x8 Adapter + 1077 02a8 QLE2692 Dual Port 16Gb FC to PCIe Gen3 x8 Adapter + 1077 02ab QLE2740 Single Port 32Gb FC to PCIe Gen3 x8 Adapter + 1077 02ac QLE2742 Dual Port 32Gb FC to PCIe Gen3 x8 Adapter + 1077 02b8 2x16Gb QME2692 FC HBA + 1077 02b9 2x32Gb QME2742 FC HBA + 1590 00f9 StoreFabric SN1100Q 16Gb Single Port Fibre Channel Host Bus Adapter + 1590 00fa StoreFabric SN1100Q 16Gb Dual Port Fibre Channel Host Bus Adapter + 1590 0203 StoreFabric SN1600Q 32Gb Single Port Fibre Channel Host Bus Adapter + 1590 0204 StoreFabric SN1600Q 32Gb Dual Port Fibre Channel Host Bus Adapter + 1590 022d 5830C 32Gb Dual Port Fibre Channel Adapter + 193d 100d NIC-FC680i-Mb-2x16G + 2281 ISP2812-based 64/32G Fibre Channel to PCIe Controller + 1077 02e2 QLE2872 Dual Port 64GFC PCIe Gen4 x8 Adapter + 1077 02e4 QLE2772 Dual Port 32GFC PCIe Gen4 x8 Adapter + 1077 02ee QLE2870 Single Port 64GFC PCIe Gen4 x8 Adapter + 1077 02f0 QLE2770 Single Port 32GFC PCIe Gen4 x8 Adapter + 1077 02f2 QLogic 1x32Gb QLE2770 FC HBA + 1077 02f3 QLogic 2x32Gb QLE2772 FC HBA + 1590 02d3 SN1610Q - 1P Enhanced 32GFC Single Port Fibre Channel Host Bus Adapter + 1590 02d4 SN1610Q – 2P Enhanced 32GFC Dual Port Fibre Channel Host Bus Adapter + 2289 ISP2852-based 64/32G Fibre Channel to PCIe Controller with StorCryption + 1077 02e9 QLE2882 Dual Port 64GFC PCIe Gen4 x8 Adapter with StorCryption + 1077 02eb QLE2782 Dual Port 32GFC PCIe Gen4 x8 Adapter with StorCryption + 1077 02ef QLE2880 Single Port 64GFC PCIe Gen4 x8 Adapter with StorCryption + 1077 02f1 QLE2780 Single Port 32GFC PCIe Gen4 x8 Adapter with StorCryption + 2300 QLA2300 64-bit Fibre Channel Adapter + 2312 ISP2312-based 2Gb Fibre Channel to PCI-X HBA + 103c 0131 2Gb Fibre Channel - Single port [A7538A] + 103c 12ba 2Gb Fibre Channel - Dual port [A6826A] + 2322 ISP2322-based 2Gb Fibre Channel to PCI-X HBA + 2422 ISP2422-based 4Gb Fibre Channel to PCI-X HBA + 103c 12d7 4Gb Fibre Channel [AB379A] + 103c 12dd 4Gb Fibre Channel [AB429A] + 2432 ISP2432-based 4Gb Fibre Channel to PCI Express HBA + 103c 7040 FC1142SR 4Gb 1-port PCIe Fibre Channel Host Bus Adapter [HPAE311A] + 1077 0137 QLE2460 Single-Port 4Gbps FC-to-PCI-X/PCIe Host Bus Adapter + 1077 0138 QLE2462 Dual-Port 4Gbps FC-to-PCI-X/PCIe Host Bus Adapter + 2532 ISP2532-based 8Gb Fibre Channel to PCI Express HBA + 1014 041e FC EN0Y/EN12 PCIe2 LP 8 Gb 4-port Fibre Channel Adapter for POWER + 103c 3262 StorageWorks 81Q + 103c 3263 StorageWorks 82Q + 1077 015c QLE2560 PCI Express to 8Gb FC Single Channel + 1077 015d QLE2562 PCI Express to 8Gb FC Dual Channel + 1077 015e QLE2564 PCI Express to 8Gb FC Quad Channel + 1077 0167 QME2572 Dual Port FC8 HBA Mezzanine + 1590 00fc StoreFabric 84Q 8Gb Quad Port Fibre Channel Host Bus Adapter + 2971 ISP2684 + 3022 ISP4022-based Ethernet NIC + 3032 ISP4032-based Ethernet IPv6 NIC + 4010 ISP4010-based iSCSI TOE HBA + 4022 ISP4022-based iSCSI TOE HBA + 4032 ISP4032-based iSCSI TOE IPv6 HBA + 5432 SP232-based 4Gb Fibre Channel to PCI Express HBA + 6312 SP202-based 2Gb Fibre Channel to PCI-X HBA + 6322 SP212-based 2Gb Fibre Channel to PCI-X HBA + 7220 IBA7220 InfiniBand HCA + 7322 IBA7322 QDR InfiniBand HCA + 8000 10GbE Converged Network Adapter (TCP/IP Networking) + 8001 10GbE Converged Network Adapter (FCoE) + 1014 03af FC 5708/5270 10 Gb FCoE PCIe Dual Port Adapter for POWER + 8020 cLOM8214 1/10GbE Controller + 1028 1f64 QMD8262-k 10G DP bNDC KR + 103c 3346 CN1000Q Dual Port Converged Network Adapter + 103c 3733 NC523SFP 10Gb 2-port Server Adapter + 1077 0203 8200 Series Single Port 10GbE Converged Network Adapter (TCP/IP Networking) + 1077 0207 8200 Series Dual Port 10GbE Converged Network Adapter (TCP/IP Networking) + 1077 020b 3200 Series Dual Port 10Gb Intelligent Ethernet Adapter + 1077 020c 3200 Series Quad Port 1Gb Intelligent Ethernet Adapter + 1077 020f 3200 Series Single Port 10Gb Intelligent Ethernet Adapter + 1077 0210 QME8242-k 10GbE Dual Port Mezzanine Card + 1077 0233 QME8262-k 10GbE Dual Port Mezzanine Card + 8021 8200 Series 10GbE Converged Network Adapter (FCoE) + 103c 3348 CN1000Q Dual Port Converged Network Adapter + 1077 0211 QME8242-k 10GbE Dual Port Mezzanine Card, FCoE + 8022 8200 Series 10GbE Converged Network Adapter (iSCSI) + 103c 3347 CN1000Q Dual Port Converged Network Adapter + 1077 0212 QME8242-k 10GbE Dual Port Mezzanine Card, iSCSI + 8030 ISP8324 1/10GbE Converged Network Controller + 1077 0243 8300 Series Single Port 10GbE Converged Network Adapter (TCP/IP Networking) + 1077 0246 8300 Series Dual Port 10GbE Converged Network Adapter (TCP/IP Networking) + 8031 8300 Series 10GbE Converged Network Adapter (FCoE) + 8032 8300 Series 10GbE Converged Network Adapter (iSCSI) + 8070 FastLinQ QL41000 Series 10/25/40/50GbE Controller + 1077 0001 10GE 2P QL41162HxRJ-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0004 4x10GE QL41164HFCU CNA + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x1GE+2x10GE QL41264HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000f 2x25GE QL41262HMKR CNA + 1077 0010 2x25GE QL41232HMKR NIC + 1077 0011 FastLinQ QL41212HLCU 25GbE Adapter + 1077 0012 FastLinQ QL41112H 10GbE Adapter + 1077 0019 QL41232HOCU - Dual Port 25/10GbE SFP28 OCP Adapter + 1077 0039 QLogic QL41262 PCIe 25Gb 2-Port SFP28 Ethernet Adapter + 1077 0053 QLogic 2x25GE QL41232HQCU NIC + 1077 0054 2x10GE QL41132HQRJ NIC + 1077 0055 QLogic 2x10GE QL41132HQCU NIC + 1077 0056 2x10GE QL41132HxRJ NIC + 1077 0057 2x25GE QL41232HxCU NIC + 1077 0065 QLogic 4x10GE QL41154HQRJ CNA + 1077 0066 QLogic 4x10GE QL41154HQCU CNA + 1077 0068 10GbE 2p SFP+ QL41132HLCU-HC Adapter + 1077 0069 10GbE 2p BASE-T QL41132HQRJ-HC OCP3 Adapter + 1077 0070 10GbE 2p BASE-T QL41132HLRJ-HC Adapter + 1077 0071 10GbE 2p SFP+ QL41132HQCU-HC OCP3 Adapter + 1077 0072 10GbE 4p SFP+ QL41134HLCU-HC Adapter + 1077 0073 10/25GbE 2p SFP28 QL41232HQCU-HC OCP3 Adapter + 1077 0074 10/25GbE 2p SFP28 QL41232HLCU-HC Adapter + 1590 021a 10GbE 2P QL41162HLRJ-HP Adapter + 1590 021b 10GbE 2P QL41162HLRJ-HP Adapter + 1590 021d 10/25GbE 2P QL41222HLCU-HP Adapter + 1590 021e 10/25GbE 2P QL41162HMRJ-HP Adapter + 1590 021f 10/25GbE 2P QL41262HMCU-HP Adapter + 1590 0220 10/25GbE 2P QL41122HLRJ-HP Adapter + 1590 02bd 10Gb 2P 524SFP+ NIC + 193d 1030 NIC-ETH681i-Mb-2x25G + 193d 1032 NIC-ETH682i-Mb-2x25G + 8080 FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE) + 1077 0001 10GE 2P QL41162HxRJ-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0004 4x10GE QL41164HFCU CNA + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x1GE+2x10GE QL41264HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000c QLogic 2x25GE QL41262HMCU CNA + 1077 000d FastLinQ QL41262H 25GbE FCoE Adapter + 1077 000e FastLinQ QL41162H 10GbE FCoE Adapter + 1077 000f 2x25GE QL41262HMKR CNA + 1590 021a 10GbE 2P QL41162HLRJ-HP Adapter + 1590 021b 10GbE 2P QL41162HLRJ-HP Adapter + 8084 FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) + 1077 0001 10GE 2P QL41162HxRJ-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0003 4x10GE QL41164HxRJ CNA + 1077 0004 4x10GE QL41164HFCU CNA + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x25GE QL41262HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000c QLogic 2x25GE QL41262HMCU CNA + 1077 000d FastLinQ QL41262H 25GbE iSCSI Adapter + 1077 000e FastLinQ QL41162H 10GbE iSCSI Adapter + 1077 000f 2x25GE QL41262HMKR CNA + 1077 0065 QLogic 4x10GE QL41154HQRJ CNA + 1077 0066 QLogic 4x10GE QL41154HQCU CNA + 1590 021a 10GbE 2P QL41162HLRJ-HP Adapter + 1590 021b 10GbE 2P QL41162HLRJ-HP Adapter + 8090 FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) + 1077 0001 25GE 2P QL41262HxCU-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0003 4x10GE QL41164HxRJ CNA + 1077 0004 4x10GE QL41164HFCU CNA + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x1GE+2x10GE QL41264HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000c QLogic 2x25GE QL41262HMCU CNA + 1077 000d FastLinQ QL41262H 25GbE FCoE Adapter (SR-IOV VF) + 1077 000e FastLinQ QL41162H 10GbE iSCSI Adapter (SR-IOV VF) + 1077 000f 2x25GE QL41262HMKR CNA + 1077 0010 2x25GE QL41232HMKR NIC + 1077 0011 FastLinQ QL41212H 25GbE Adapter (SR-IOV VF) + 1077 0012 FastLinQ QL41112H 10GbE Adapter (SR-IOV VF) + 1077 0053 QLogic 2x25GE QL41232HQCU NIC + 1077 0054 QLogic 2x10GE QL41132HQRJ NIC + 1077 0055 QLogic 2x10GE QL41132HQCU NIC + 1077 0056 2x10GE QL41132HxRJ NIC + 1077 0057 2x25GE QL41232HxCU NIC + 1077 0065 QLogic 4x10GE QL41154HQRJ CNA + 1077 0066 QLogic 4x10GE QL41154HQCU CNA + 1590 021a 10GbE 2P QL41162HLRJ-HP Adapter + 1590 021b 10GbE 2P QL41162HLRJ-HP Adapter + 1590 021e 10/25GbE 2P QL41162HMRJ-HP Adapter + 1590 021f 10/25GbE 2P QL41262HMCU-HP Adapter + 1590 02bd 10Gb 2P 524SFP+ NIC + 8430 ISP8324 1/10GbE Converged Network Controller (NIC VF) + 8431 8300 Series 10GbE Converged Network Adapter (FCoE VF) + 8432 ISP2432M-based 10GbE Converged Network Adapter (CNA) +1078 Cyrix Corporation + 0000 5510 [Grappa] + 0001 PCI Master + 0002 5520 [Cognac] + 0100 5530 Legacy [Kahlua] + 0101 5530 SMI [Kahlua] + 0102 5530 IDE [Kahlua] + 0103 5530 Audio [Kahlua] + 0104 5530 Video [Kahlua] + 0400 ZFMicro PCI Bridge + 0401 ZFMicro Chipset SMI + 0402 ZFMicro Chipset IDE + 0403 ZFMicro Expansion Bus +1079 I-Bus +107a NetWorth +# formerly Gateway 2000 / acquired by Acer Inc. +107b Gateway, Inc. +107c LG Electronics [Lucky Goldstar Co. Ltd] +107d LeadTek Research Inc. + 0000 P86C850 +107e Interphase Corporation + 0001 5515 ATM Adapter [Flipper] + 0002 100 VG AnyLan Controller + 0004 5526 Fibre Channel Host Adapter + 0005 x526 Fibre Channel Host Adapter + 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic] + 9003 5535-4P-BRI-ST + 9007 5535-4P-BRI-U + 9008 5535-1P-SR + 900c 5535-1P-SR-ST + 900e 5535-1P-SR-U + 9011 5535-1P-PRI + 9013 5535-2P-PRI + 9023 5536-4P-BRI-ST + 9027 5536-4P-BRI-U + 9031 5536-1P-PRI + 9033 5536-2P-PRI +107f Data Technology Corporation + 0802 SL82C105 +1080 Contaq Microsystems + 0600 82C599 + c691 Cypress CY82C691 + c693 82c693 +1081 Supermac Technology + 0d47 Radius PCI to NuBUS Bridge +1082 EFA Corporation of America +1083 Forex Computer Corporation + 0001 FR710 +1084 Parador +1086 J. Bond Computer Systems +1087 Cache Computer +1088 Microcomputer Systems (M) Son +1089 Data General Corporation +# Formerly Bit3 Computer Corp. +108a SBS Technologies + 0001 VME Bridge Model 617 + 0010 VME Bridge Model 618 + 0040 dataBLIZZARD + 3000 VME Bridge Model 2706 +108c Oakleigh Systems Inc. +108d Olicom + 0001 Token-Ring 16/4 PCI Adapter (3136/3137) + 0002 16/4 Token Ring + 0004 RapidFire OC-3139/3140 Token-Ring 16/4 PCI Adapter + 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter + 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card + 0006 OC-3530 RapidFire Token-Ring 100 + 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter + 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter + 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter + 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter + 0011 OC-2315 + 0012 OC-2325 + 0013 OC-2183/2185 + 0014 OC-2326 + 0019 OC-2327/2250 10/100 Ethernet Adapter + 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter + 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter + 0021 OC-6151/6152 [RapidFire ATM 155] + 0022 ATM Adapter +108e Oracle/SUN + 0001 EBUS + 1000 EBUS + 1001 Happy Meal 10/100 Ethernet [hme] + 1100 RIO EBUS + 108e 1100 RIO EBUS on Blade 100 motherboard + 1101 RIO 10/100 Ethernet [eri] + 108e 1101 RIO GEM on Blade 100 motherboard + 1102 RIO 1394 + 108e 1102 RIO 1394 on Blade 100 motherboard + 1103 RIO USB + 108e 1103 RIO USB on Blade 100 motherboard + 1647 Broadcom 570x 10/100/1000 Ethernet [bge] + 1648 Broadcom 570x 10/100/1000 Ethernet [bge] + 16a7 Broadcom 570x 10/100/1000 Ethernet [bge] + 16a8 Broadcom 570x 10/100/1000 Ethernet [bge] + 2bad GEM 10/100/1000 Ethernet [ge] + 5000 Simba Advanced PCI Bridge + 108e 5000 Netra AX1105-500 + 5043 SunPCI Co-processor + 5ca0 Crypto Accelerator 6000 [mca] + 6300 Intel 21554 PCI-PCI bus bridge [db21554] + 6301 Intel 21554 PCI-PCI bus bridge [db21554] + 6302 Intel 21554 PCI-PCI bus bridge [db21554] + 6303 Intel 21554 PCI-PCI bus bridge [db21554] + 6310 Intel 21554 PCI-PCI bus bridge [db21554] + 6311 Intel 21554 PCI-PCI bus bridge [db21554] + 6312 Intel 21554 PCI-PCI bus bridge [db21554] + 6313 Intel 21554 PCI-PCI bus bridge [db21554] + 6320 Intel 21554 PCI-PCI bus bridge [db21554] + 6323 Intel 21554 PCI-PCI bus bridge [db21554] + 6330 Intel 21554 PCI-PCI bus bridge [db21554] + 6331 Intel 21554 PCI-PCI bus bridge [db21554] + 6332 Intel 21554 PCI-PCI bus bridge [db21554] + 6333 Intel 21554 PCI-PCI bus bridge [db21554] + 6340 Intel 21554 PCI-PCI bus bridge [db21554] + 6343 Intel 21554 PCI-PCI bus bridge [db21554] + 6350 Intel 21554 PCI-PCI bus bridge [db21554] + 6353 Intel 21554 PCI-PCI bus bridge [db21554] + 6722 Intel 21554 PCI-PCI bus bridge [db21554] + 676e SunPCiIII + 7063 SunPCiII / SunPCiIIpro + 8000 Psycho PCI Bus Module + 8001 Schizo PCI Bus Module + 8002 Schizo+ PCI Bus Module + 80f0 PCIe switch [px] + 80f8 PCIe switch [px] + 9010 PCIe/PCI bridge switch [pxb_plx] + 9020 PCIe/PCI bridge switch [pxb_plx] + 9102 Davicom Fast Ethernet driver for Davicom DM9102A [dmfe] + a000 Psycho UPA-PCI Bus Module [pcipsy] + a001 Psycho UPA-PCI Bus Module [pcipsy] + 108e a001 Ultra IIe on Blade 100 motherboard + a801 Schizo Fireplane-PCI bus bridge module [pcisch] + aaaa Multithreaded Shared 10GbE Ethernet Network Controller + abba Cassini 10/100/1000 + abcd Multithreaded 10-Gigabit Ethernet Network Controller + c416 Sun Fire System/System Controller Interface chip [sbbc] +108f Systemsoft +1090 Compro Computer Services, Inc. + 4610 PCI RTOM + 4620 GPIO HSD +1091 Intergraph Corporation + 0020 3D graphics processor + 0021 3D graphics processor w/Texturing + 0040 3D graphics frame buffer + 0041 3D graphics frame buffer + 0060 Proprietary bus bridge + 00e4 Powerstorm 4D50T + 0720 Motion JPEG codec + 0780 Intense3D Wildcat 3410 (MSMT496) + 07a0 Sun Expert3D-Lite Graphics Accelerator + 1091 Sun Expert3D Graphics Accelerator +1092 Diamond Multimedia Systems + 0028 Viper V770 + 1092 4a00 Viper V770 32MB + 00a0 Speedstar Pro SE + 00a8 Speedstar 64 + 0550 Viper V550 + 08d4 Supra 2260 Modem + 094c SupraExpress 56i Pro + 1001 Video Crunch It 1001 capture card + 1092 Viper V330 + 6120 Maximum DVD + 8810 Stealth SE + 8811 Stealth 64/SE + 8880 Stealth + 8881 Stealth + 88b0 Stealth 64 + 88b1 Stealth 64 + 88c0 Stealth 64 + 88c1 Stealth 64 + 88d0 Stealth 64 + 88d1 Stealth 64 + 88f0 Stealth 64 + 88f1 Stealth 64 + 9999 DMD-I0928-1 "Monster sound" sound chip +1093 National Instruments + 0160 PCI-DIO-96 + 0162 PCI-MIO-16XE-50 + 0fe1 PXI-8320 + 1150 PCI-6533 (PCI-DIO-32HS) + 1170 PCI-MIO-16XE-10 + 1180 PCI-MIO-16E-1 + 1190 PCI-MIO-16E-4 + 11b0 PXI-6070E + 11c0 PXI-6040E + 11d0 PXI-6030E + 1270 PCI-6032E + 1290 PCI-6704 + 12b0 PCI-6534 + 1310 PCI-6602 + 1320 PXI-6533 + 1330 PCI-6031E + 1340 PCI-6033E + 1350 PCI-6071E + 1360 PXI-6602 + 13c0 PXI-6508 + 1490 PXI-6534 + 14e0 PCI-6110 + 14f0 PCI-6111 + 1580 PXI-6031E + 15b0 PXI-6071E + 1710 PXI-6509 + 17c0 PXI-5690 + 17d0 PCI-6503 + 1870 PCI-6713 + 1880 PCI-6711 + 18b0 PCI-6052E + 18c0 PXI-6052E + 1920 PXI-6704 + 1930 PCI-6040E + 19c0 PCI-4472 + 1aa0 PXI-4110 + 1ad0 PCI-6133 + 1ae0 PXI-6133 + 1e30 PCI-6624 + 1e40 PXI-6624 + 1e50 PXI-5404 + 2410 PCI-6733 + 2420 PXI-6733 + 2430 PCI-6731 + 2470 PCI-4474 + 24a0 PCI-4065 + 24b0 PXI-4200 + 24f0 PXI-4472 + 2510 PCI-4472 + 2520 PCI-4474 + 27a0 PCI-6123 + 27b0 PXI-6123 + 2880 DAQCard-6601 + 2890 PCI-6036E + 28a0 PXI-4461 + 28b0 PCI-6013 + 28c0 PCI-6014 + 28d0 PCI-5122 + 28e0 PXI-5122 + 29f0 PXI-7334 + 2a00 PXI-7344 + 2a60 PCI-6023E + 2a70 PCI-6024E + 2a80 PCI-6025E + 2ab0 PXI-6025E + 2b10 PXI-6527 + 2b20 PCI-6527 + 2b80 PXI-6713 + 2b90 PXI-6711 + 2c60 PCI-6601 + 2c70 PXI-6601 + 2c80 PCI-6035E + 2c90 PCI-6703 + 2ca0 PCI-6034E + 2cb0 PCI-7344 + 2cc0 PXI-6608 + 2d20 PXI-5600 + 2db0 PCI-6608 + 2dc0 PCI-4070 + 2dd0 PXI-4070 + 2eb0 PXI-4472 + 2ec0 PXI-6115 + 2ed0 PCI-6115 + 2ee0 PXI-6120 + 2ef0 PCI-6120 + 2fd1 PCI-7334 + 2fd2 PCI-7350 + 2fd3 PCI-7342 + 2fd5 PXI-7350 + 2fd6 PXI-7342 + 7003 PCI-6551 + 7004 PXI-6551 + 700b PXI-5421 + 700c PCI-5421 + 701a VXIpc-87xB + 701b VXIpc-770 + 7023 PXI-2593 + 7027 PCI-MXI-2 Universal + 702c PXI-7831R + 702d PCI-7831R + 702e PXI-7811R + 702f PCI-7811R + 7030 PCI-CAN (Series 2) + 7031 PCI-CAN/2 (Series 2) + 7032 PCI-CAN/LS (Series 2) + 7033 PCI-CAN/LS2 (Series 2) + 7034 PCI-CAN/DS (Series 2) + 7035 PXI-8460 (Series 2, 1 port) + 7036 PXI-8460 (Series 2, 2 ports) + 7037 PXI-8461 (Series 2, 1 port) + 7038 PXI-8461 (Series 2, 2 ports) + 7039 PXI-8462 (Series 2) + 703f PXI-2566 + 7040 PXI-2567 + 7044 MXI-4 Connection Monitor + 7047 PXI-6653 + 704c PXI-2530 + 704f PXI-4220 + 7050 PXI-4204 + 7055 PXI-7830R + 7056 PCI-7830R + 705a PCI-CAN/XS (Series 2) + 705b PCI-CAN/XS2 (Series 2) + 705c PXI-8464 (Series 2, 1 port) + 705d PXI-8464 (Series 2, 2 ports) + 705e cRIO-9102 + 7060 PXI-5610 + 7064 PXI-1045 Trigger Routing Module + 7065 PXI-6652 + 7066 PXI-6651 + 7067 PXI-2529 + 7068 PCI-CAN/SW (Series 2) + 7069 PCI-CAN/SW2 (Series 2) + 706a PXI-8463 (Series 2, 1 port) + 706b PXI-8463 (Series 2, 2 ports) + 7073 PCI-6723 + 7074 PXI-7833R + 7075 PXI-6552 + 7076 PCI-6552 + 707c PXI-1428 + 707e PXI-4462 + 7080 PXI-8430/2 (RS-232) Interface + 7081 PXI-8431/2 (RS-485) Interface + 7083 PCI-7833R + 7085 PCI-6509 + 7086 PXI-6528 + 7087 PCI-6515 + 7088 PCI-6514 + 708c PXI-2568 + 708d PXI-2569 + 70a9 PCI-6528 + 70aa PCI-6229 + 70ab PCI-6259 + 70ac PCI-6289 + 70ad PXI-6251 + 70ae PXI-6220 + 70af PCI-6221 + 70b0 PCI-6220 + 70b1 PXI-6229 + 70b2 PXI-6259 + 70b3 PXI-6289 + 70b4 PCI-6250 + 70b5 PXI-6221 + 70b6 PCI-6280 + 70b7 PCI-6254 + 70b8 PCI-6251 + 70b9 PXI-6250 + 70ba PXI-6254 + 70bb PXI-6280 + 70bc PCI-6284 + 70bd PCI-6281 + 70be PXI-6284 + 70bf PXI-6281 + 70c0 PCI-6143 + 70c3 PCI-6511 + 70c4 PXI-7330 + 70c5 PXI-7340 + 70c6 PCI-7330 + 70c7 PCI-7340 + 70c8 PCI-6513 + 70c9 PXI-6515 + 70ca PCI-1405 + 70cc PCI-6512 + 70cd PXI-6514 + 70ce PXI-1405 + 70cf PCIe-GPIB + 70d0 PXI-2570 + 70d1 PXI-6513 + 70d2 PXI-6512 + 70d3 PXI-6511 + 70d4 PCI-6722 + 70d6 PXI-4072 + 70d7 PXI-6541 + 70d8 PXI-6542 + 70d9 PCI-6541 + 70da PCI-6542 + 70db PCI-8430/2 (RS-232) Interface + 70dc PCI-8431/2 (RS-485) Interface + 70dd PXI-8430/4 (RS-232) Interface + 70de PXI-8431/4 (RS-485) Interface + 70df PCI-8430/4 (RS-232) Interface + 70e0 PCI-8431/4 (RS-485) Interface + 70e1 PXI-2532 + 70e2 PXI-8430/8 (RS-232) Interface + 70e3 PXI-8431/8 (RS-485) Interface + 70e4 PCI-8430/8 (RS-232) Interface + 70e5 PCI-8431/8 (RS-485) Interface + 70e6 PXI-8430/16 (RS-232) Interface + 70e7 PCI-8430/16 (RS-232) Interface + 70e8 PXI-8432/2 (Isolated RS-232) Interface + 70e9 PXI-8433/2 (Isolated RS-485) Interface + 70ea PCI-8432/2 (Isolated RS-232) Interface + 70eb PCI-8433/2 (Isolated RS-485) Interface + 70ec PXI-8432/4 (Isolated RS-232) Interface + 70ed PXI-8433/4 (Isolated RS-485) Interface + 70ee PCI-8432/4 (Isolated RS-232) Interface + 70ef PCI-8433/4 (Isolated RS-485) Interface + 70f0 PXI-5922 + 70f1 PCI-5922 + 70f2 PCI-6224 + 70f3 PXI-6224 + 70f6 cRIO-9101 + 70f7 cRIO-9103 + 70f8 cRIO-9104 + 70ff PXI-6723 + 7100 PXI-6722 + 7104 PCIx-1429 + 7105 PCIe-1429 + 710a PXI-4071 + 710d PXI-6143 + 710e PCIe-GPIB + 710f PXI-5422 + 7110 PCI-5422 + 7111 PXI-5441 + 7119 PXI-6561 + 711a PXI-6562 + 711b PCI-6561 + 711c PCI-6562 + 7120 PCI-7390 + 7121 PXI-5122EX + 7122 PCI-5122EX + 7123 PXIe-5653 + 7124 PCI-6510 + 7125 PCI-6516 + 7126 PCI-6517 + 7127 PCI-6518 + 7128 PCI-6519 + 7137 PXI-2575 + 713c PXI-2585 + 713d PXI-2586 + 7142 PXI-4224 + 7144 PXI-5124 + 7145 PCI-5124 + 7146 PCI-6132 + 7147 PXI-6132 + 7148 PCI-6122 + 7149 PXI-6122 + 714c PXI-5114 + 714d PCI-5114 + 7150 PXI-2564 + 7152 PCI-5640R + 7156 PXI-1044 Trigger Routing Module + 715d PCI-1426 + 7167 PXI-5412 + 7168 PCI-5412 + 716b PCI-6230 + 716c PCI-6225 + 716d PXI-6225 + 716f PCI-4461 + 7170 PCI-4462 + 7171 PCI-6010 + 7174 PXI-8360 + 7177 PXI-6230 + 717d PCIe-6251 + 717f PCIe-6259 + 7187 PCI-1410 + 718b PCI-6521 + 718c PXI-6521 + 7191 PCI-6154 + 7193 PXI-7813R + 7194 PCI-7813R + 7195 PCI-8254R + 7197 PXI-5402 + 7198 PCI-5402 + 719f PCIe-6535 + 71a0 PCIe-6536 + 71a3 PXI-5650 + 71a4 PXI-5652 + 71a5 PXI-2594 + 71a7 PXI-2595 + 71a9 PXI-2596 + 71aa PXI-2597 + 71ab PXI-2598 + 71ac PXI-2599 + 71ad PCI-GPIB+ + 71ae PCIe-1430 + 71b7 PXI-1056 Trigger Routing Module + 71b8 PXI-1045 Trigger Routing Module + 71b9 PXI-1044 Trigger Routing Module + 71bb PXI-2584 + 71bc PCI-6221 (37-pin) + 71bf PCIe-1427 + 71c5 PCI-6520 + 71c6 PXI-2576 + 71c7 cRIO-9072 + 71dc PCI-1588 + 71e0 PCI-6255 + 71e1 PXI-6255 + 71e2 PXI-5406 + 71e3 PCI-5406 + 71fc PXI-4022 + 7209 PCI-6233 + 720a PXI-6233 + 720b PCI-6238 + 720c PXI-6238 + 7260 PXI-5142 + 7261 PCI-5142 + 726d PXI-5651 + 7273 PXI-4461 + 7274 PXI-4462 + 7279 PCI-6232 + 727a PXI-6232 + 727b PCI-6239 + 727c PXI-6239 + 727e SMBus Controller + 1093 75ac PXIe-8388 + 1093 75ad PXIe-8389 + 1093 7650 PXIe-8381 + 1093 8360 PXIe-8360 + 1093 8370 PXIe-8370 + 1093 8375 PXIe-8375 + 7281 PCI-6236 + 7282 PXI-6236 + 7283 PXI-2554 + 7288 PXIe-5611 + 7293 PCIe-8255R + 729d cRIO-9074 + 72a4 PCIe-4065 + 72a7 PCIe-6537 + 72a8 PXI-5152 + 72a9 PCI-5152 + 72aa PXI-5105 + 72ab PCI-5105 + 72b8 PXI-6682 + 72d0 PXI-2545 + 72d1 PXI-2546 + 72d2 PXI-2547 + 72d3 PXI-2548 + 72d4 PXI-2549 + 72d5 PXI-2555 + 72d6 PXI-2556 + 72d7 PXI-2557 + 72d8 PXI-2558 + 72d9 PXI-2559 + 72e8 PXIe-6251 + 72e9 PXIe-6259 + 72ef PXI-4498 + 72f0 PXI-4496 + 72fb PXIe-6672 + 730e PXI-4130 + 730f PXI-5922EX + 7310 PCI-5922EX + 731c PXI-2535 + 731d PXI-2536 + 7322 PXIe-6124 + 7327 PXI-6529 + 732c VXI-8360T + 7331 PXIe-5602 + 7332 PXIe-5601 + 7333 PXI-5900 + 7335 PXI-2533 + 7336 PXI-2534 + 7342 PXI-4461 + 7349 PXI-5154 + 734a PCI-5154 + 7357 PXI-4065 + 7359 PXI-4495 + 7370 PXI-4461 + 7373 sbRIO-9601 + 7374 IOtech-9601 + 7375 sbRIO-9602 + 7378 sbRIO-9641 + 737d PXI-5124EX + 7384 PXI-7851R + 7385 PXI-7852R + 7386 PCIe-7851R + 7387 PCIe-7852R + 7390 PXI-7841R + 7391 PXI-7842R + 7392 PXI-7853R + 7393 PCIe-7841R + 7394 PCIe-7842R + 7397 sbRIO-9611 + 7398 sbRIO-9612 + 7399 sbRIO-9631 + 739a sbRIO-9632 + 739b sbRIO-9642 + 73a1 PXIe-4498 + 73a2 PXIe-4496 + 73a5 PXIe-5641R + 73a7 PXI-8250 Chassis Monitor Module + 73a8 PXI-8511 CAN/LS + 73a9 PXI-8511 CAN/LS + 73aa PXI-8512 CAN/HS + 73ab PXI-8512 CAN/HS + 73ac PXI-8513 CAN/XS + 73ad PXI-8513 CAN/XS + 73af PXI-8516 LIN + 73b1 PXI-8517 FlexRay + 73b2 PXI-8531 CANopen + 73b3 PXI-8531 CANopen + 73b4 PXI-8532 DeviceNet + 73b5 PXI-8532 DeviceNet + 73b6 PCI-8511 CAN/LS + 73b7 PCI-8511 CAN/LS + 73b8 PCI-8512 CAN/HS + 73b9 PCI-8512 CAN/HS + 73ba PCI-8513 CAN/XS + 73bb PCI-8513 CAN/XS + 73bd PCI-8516 LIN + 73bf PCI-8517 FlexRay + 73c0 PCI-8531 CANopen + 73c1 PCI-8531 CANopen + 73c2 PCI-8532 DeviceNet + 73c3 PCI-8532 DeviceNet + 73c5 PXIe-2527 + 73c6 PXIe-2529 + 73c8 PXIe-2530 + 73c9 PXIe-2532 + 73ca PXIe-2569 + 73cb PXIe-2575 + 73cc PXIe-2593 + 73d5 PXI-7951R + 73d6 PXI-7952R + 73d7 PXI-7953R + 73e1 PXI-7854R + 73ec PXI-7954R + 73ed cRIO-9073 + 73f0 PXI-5153 + 73f1 PCI-5153 + 73f4 PXI-2515 + 73f6 cRIO-9111 + 73f7 cRIO-9112 + 73f8 cRIO-9113 + 73f9 cRIO-9114 + 73fa cRIO-9116 + 73fb cRIO-9118 + 7404 PXI-4132 + 7405 PXIe-6674T + 7406 PXIe-6674 + 740e PCIe-8430/16 (RS-232) Interface + 740f PCIe-8430/8 (RS-232) Interface + 7410 PCIe-8431/16 (RS-485) Interface + 7411 PCIe-8431/8 (RS-485) Interface + 7414 PCIe-GPIB+ + 741c PXI-5691 + 741d PXI-5695 + 743c CSC-3059 + 7448 PXI-2510 + 7454 PXI-2512 + 7455 PXI-2514 + 7456 PXIe-2512 + 7457 PXIe-2514 + 745a PXI-6682H + 745e PXI-5153EX + 745f PCI-5153EX + 7460 PXI-5154EX + 7461 PCI-5154EX + 746d PXIe-5650 + 746e PXIe-5651 + 746f PXIe-5652 + 7472 PXI-2800 + 7495 PXIe-5603 + 7497 PXIe-5605 + 74ae PXIe-2515 + 74b4 PXI-2531 + 74b5 PXIe-2531 + 74c1 PXIe-8430/16 (RS-232) Interface + 74c2 PXIe-8430/8 (RS-232) Interface + 74c3 PXIe-8431/16 (RS-485) Interface + 74c4 PXIe-8431/8 (RS-485) Interface + 74d5 PXIe-5630 + 74d9 PCIe-8432/2 (Isolated RS-232) Interface + 74da PCIe-8433/2 (Isolated RS-485) Interface + 74db PCIe-8432/4 (Isolated RS-232) Interface + 74dc PCIe-8433/4 (Isolated RS-485) Interface + 74e8 NI 9148 + 7515 PCIe-8430/2 (RS-232) Interface + 7516 PCIe-8430/4 (RS-232) Interface + 7517 PCIe-8431/2 (RS-485) Interface + 7518 PCIe-8431/4 (RS-485) Interface + 751b cRIO-9081 + 751c cRIO-9082 + 7528 PXIe-4497 + 7529 PXIe-4499 + 752a PXIe-4492 + 7539 NI 9157 + 753a NI 9159 + 7598 PXI-2571 + 75a4 PXI-4131A + 75b1 PCIe-7854R + 75ba PXI-2543 + 75bb PXIe-2543 + 75e5 PXI-6683 + 75e6 PXI-6683H + 75ef PXIe-5632 + 761c VXI-8360LT + 761f PXI-2540 + 7620 PXIe-2540 + 7621 PXI-2541 + 7622 PXIe-2541 + 7626 NI 9154 + 7627 NI 9155 + 7638 PXI-2720 + 7639 PXI-2722 + 763a PXIe-2725 + 763b PXIe-2727 + 763c PXI-4465 + 764b PXIe-2790 + 764c PXI-2520 + 764d PXI-2521 + 764e PXI-2522 + 764f PXI-2523 + 7654 PXI-2796 + 7655 PXI-2797 + 7656 PXI-2798 + 7657 PXI-2799 + 765d PXI-2542 + 765e PXIe-2542 + 765f PXI-2544 + 7660 PXIe-2544 + 766d PCIe-6535B + 766e PCIe-6536B + 766f PCIe-6537B + 76a3 PXIe-6535B + 76a4 PXIe-6536B + 76a5 PXIe-6537B + 783e PXI-8368 + 9020 PXI-2501 + 9030 PXI-2503 + 9040 PXI-2527 + 9050 PXI-2565 + 9060 PXI-2590 + 9070 PXI-2591 + 9080 PXI-2580 + 9090 PCI-4021 + 90a0 PXI-4021 + a001 PCI-MXI-2 + b001 PCI-1408 + b011 PXI-1408 + b021 PCI-1424 + b022 PXI-1424 + b031 PCI-1413 + b041 PCI-1407 + b051 PXI-1407 + b061 PCI-1411 + b071 PCI-1422 + b081 PXI-1422 + b091 PXI-1411 + b0b1 PCI-1409 + b0c1 PXI-1409 + b0e1 PCI-1428 + c4c4 PXIe/PCIe Device + 1093 728a PXIe-5421 + 1093 728b PXIe-5442 + 1093 728d PXIe-5451 + 1093 72a2 PXIe-5122 + 1093 72da PXIe-5422 + 1093 72f7 PXIe-6535 + 1093 72f8 PXIe-6536 + 1093 72f9 PXIe-6537 + 1093 7326 PCIe-6509 + 1093 736c PXIe-4140 + 1093 738b PXIe-5622 + 1093 73c4 PXIe-5450 + 1093 73c7 PXIe-6545 + 1093 73d4 PXIe-6544 + 1093 7425 PCIe-6320 + 1093 7427 PCIe-6321 + 1093 7428 PXIe-6323 + 1093 7429 PCIe-6323 + 1093 742a PXIe-6341 + 1093 742b PCIe-6341 + 1093 742c PXIe-6343 + 1093 742d PCIe-6343 + 1093 742f PCIe-6351 + 1093 7431 PCIe-6353 + 1093 7432 PXIe-6361 + 1093 7433 PCIe-6361 + 1093 7434 PXIe-6363 + 1093 7435 PCIe-6363 + 1093 7436 PXIe-6356 + 1093 7437 PXIe-6358 + 1093 7438 PXIe-6366 + 1093 7439 PXIe-6368 + 1093 7468 PXIe-5185 + 1093 7469 PXIe-5186 + 1093 7492 PXIe-4300 + 1093 7498 PXIe-6548 + 1093 7499 PXIe-6547 + 1093 74a8 PXIe-4330 + 1093 74a9 PXIe-4331 + 1093 74b1 PXIe-4154 + 1093 74b2 PXIe-4353 + 1093 74b6 PCIe-1433 + 1093 74cd PXIe-5643R + 1093 74d0 PXIe-7961R + 1093 74dd PXIe-6376 + 1093 74de PXIe-6378 + 1093 74e2 PXIe-7962R + 1093 74e3 PXIe-7965R + 1093 74e5 PXIe-4844 + 1093 74f3 PCIe-5140 + 1093 753c PXIe-1435 + 1093 7548 PXIe-5622 (25MHz DDC) + 1093 754d PCIe-5155 + 1093 7551 PXIe-6556 + 1093 7553 PCIe-1473R + 1093 7570 PCIe-1474R + 1093 7571 PXIe-1475R + 1093 7572 PXIe-1476R + 1093 75a2 PXIe-5693 + 1093 75a3 PXIe-5694 + 1093 75a5 PXIe-4141 + 1093 75ce PXIe-7966R + 1093 75cf PXIe-4357 + 1093 75d2 PXIe-RevB-5643R + 1093 75d3 PXIe-5644R + 1093 75ee PXIe-5645R + 1093 7613 PXIe-6555 + 1093 7619 PXIe-5185 + 1093 761a PXIe-5186 + 1093 7629 PXIe-4142 + 1093 762a PXIe-4143 + 1093 762b PXIe-4138 + 1093 762c PXIe-4144 + 1093 762d PXIe-4145 + 1093 762e PXIe-5606 + 1093 7644 PXIe-4841 + 1093 764a PCIe-8237R-S + 1093 7658 PXIe-5162 (4CH) + 1093 76ab PXIe-4322 + 1093 76ad PXIe-4112 + 1093 76ae PXIe-4113 + 1093 76b5 PXIe-7971R + 1093 76b6 PXIe-7972R + 1093 76b7 PXIe-7975R + 1093 76b8 PXIe-5696 + 1093 76b9 PXIe-5654 + 1093 76c8 PXIe-6614 + 1093 76c9 PXIe-6612 + 1093 76cb PXIe-5646R + 1093 76cc PXIe-5162 (2CH) + 1093 76ce CVS-1459 + 1093 76d0 PXIe-5160 (2CH) + 1093 76d1 PXIe-5160 (4CH) + 1093 76dc PXIe-4610 + 1093 76ec PXIe-2524 + 1093 76ed PXIe-2525 + 1093 76ee PXIe-2526 + 1093 76ef PXIe-2737 + 1093 76f0 PXIe-2738 + 1093 76f1 PXIe-2739 + 1093 76fb PCIe-1473R-LX110 + 1093 76fc PXIe-5105 + 1093 76fd PXIe-5114 + 1093 76fe PXIe-5644R + 1093 76ff PXIe-5644R + 1093 7700 PXIe-5644R + 1093 7701 PXIe-5645R + 1093 7702 PXIe-5645R + 1093 7703 PXIe-5645R + 1093 770c PXIe-4139 + 1093 7711 PXIe-4464 + 1093 7712 PXIe-4463 + 1093 7716 PCIe-6612 + 1093 771d Unconfigured CA4 Switch + 1093 771e PXIe-4339 + 1093 7735 cRIO-9033 + 1093 773e PXIe-5624R + 1093 774b cRIO-9031 + 1093 774d cRIO-9034 + 1093 7755 cRIO-9030 + 1093 7768 PXIe-2747 + 1093 7769 PXIe-2748 + 1093 776a PXIe-2746 + 1093 7777 PXIe-7976R + 1093 7782 PXIe-5646R + 1093 7783 PXIe-5646R + 1093 7784 PXIe-5646R + 1093 7790 PXIe-5170R (4CH) + 1093 7791 PXIe-5170R (8CH) + 1093 7793 PXIe-5171R (8CH) + 1093 77a5 PXIe-6345 + 1093 77a6 PXIe-6355 + 1093 77a7 PXIe-6365 + 1093 77a8 PXIe-6375 + 1093 77aa CVS-1458 + 1093 77ad IC-3173 + 1093 77b4 PXIe-7820R + 1093 77b5 PXIe-7821R + 1093 77b6 PXIe-7822R + 1093 77b9 cRIO-9038 + 1093 77ba PXIe-4136 + 1093 77bb PXIe-4137 + 1093 77c0 PXIe-5624R + 1093 77c1 PXIe-5624R + 1093 77c2 PXIe-5624R + 1093 77ca PXIe-6738 + 1093 77cb PXIe-6739 + 1093 77db cRIO-9035 + 1093 77dc cRIO-9036 + 1093 77dd cRIO-9039 + 1093 7802 PXIe-4302 + 1093 7803 PXIe-4303 + 1093 7805 PXIe-4305 + 1093 786f PXIe-4163 + 1093 788e PXIe-4304 + 1093 78f8 NI FlexRIO Module (KU035) + 1093 78f9 NI FlexRIO Module (KU040) + 1093 78fa NI FlexRIO Module (KU060) + 1093 78ff PXIe-4162 + 1093 7995 PXIe-7911R + 1093 7996 PXIe-7912R + 1093 7997 PXIe-7915R + 1093 79d3 NI FlexRIO PCIe Module (KU035) + 1093 79d4 NI FlexRIO PCIe Module (KU040) + 1093 79d5 NI FlexRIO PCIe Module (KU060) + c801 PCI-GPIB + c811 PCI-GPIB+ + c821 PXI-GPIB + c831 PMC-GPIB + c840 PCI-GPIB + d130 PCI-232/2 Interface + d140 PCI-232/4 Interface + d150 PCI-232/8 Interface + d160 PCI-485/2 Interface + d170 PCI-485/4 Interface + d190 PXI-8422/2 (Isolated RS-232) Interface + d1a0 PXI-8422/4 (Isolated RS-232) Interface + d1b0 PXI-8423/2 (Isolated RS-485) Interface + d1c0 PXI-8423/4 (Isolated RS-485) Interface + d1d0 PXI-8420/2 (RS-232) Interface + d1e0 PXI-8420/4 (RS-232) Interface + d1f0 PXI-8420/8 (RS-232) Interface + d1f1 PXI-8420/16 (RS-232) Interface + d230 PXI-8421/2 (RS-485) Interface + d240 PXI-8421/4 (RS-485) Interface + d250 PCI-232/2 (Isolated) Interface + d260 PCI-485/2 (Isolated) Interface + d270 PCI-232/4 (Isolated) Interface + d280 PCI-485/4 (Isolated) Interface + d290 PCI-485/8 Interface + d2a0 PXI-8421/8 (RS-485) Interface + d2b0 PCI-232/16 Interface + e111 PCI-CAN + e131 PXI-8461 (1 port) + e141 PCI-CAN/LS + e151 PXI-8460 (1 port) + e211 PCI-CAN/2 + e231 PXI-8461 (2 ports) + e241 PCI-CAN/LS2 + e251 PXI-8460 (2 ports) + e261 PCI-CAN/DS + e271 PXI-8462 + f110 VMEpc-650 + f120 VXIpc-650 + fe00 VXIpc-87x + fe41 VXIpc-860 + fe51 VXIpc-74x + fe61 VXIpc-850 + fe70 VXIpc-880 +1094 First International Computers [FIC] +# nee CMD Technology Inc +1095 Silicon Image, Inc. + 0240 Adaptec AAR-1210SA SATA HostRAID Controller + 0640 PCI0640 + 0643 PCI0643 + 0646 PCI0646 + 0647 PCI0647 + 0648 PCI0648 + 1043 8025 CUBX motherboard + 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller + 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller + 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller + 101e 0649 AMI MegaRAID IDE 100 Controller + 0650 PBC0650A + 0670 USB0670 + 1095 0670 USB0670 + 0673 USB0673 + 0680 PCI0680 Ultra ATA-133 Host Controller + 1095 0680 SiI 0680 ATA/133 Controller + 1095 3680 Winic W-680 (Silicon Image 680 based) + 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller + 1095 3112 SiI 3112 SATALink Controller + 1095 6112 SiI 3112 SATARaid Controller + 9005 0250 SATAConnect 1205SA Host Controller + 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller + 1043 8167 A8N-SLI Deluxe/Premium Mainboard + 1095 3114 SiI 3114 SATALink Controller + 1095 6114 SiI 3114 SATARaid Controller + 3124 SiI 3124 PCI-X Serial ATA Controller + 1095 3124 SiI 3124 PCI-X Serial ATA Controller + 3132 SiI 3132 Serial ATA Raid II Controller + 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller + 1095 3512 SiI 3512 SATALink Controller + 1095 6512 SiI 3512 SATARaid Controller + 3531 SiI 3531 [SATALink/SATARaid] Serial ATA Controller + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] +1096 Alacron +1097 Appian Technology +1098 Quantum Designs (H.K.) Ltd + 0001 QD-8500 + 0002 QD-8580 +1099 Samsung Electronics Co., Ltd +109a Packard Bell +109b Gemlight Computer Ltd. +109c Megachips Corporation +109d Zida Technologies Ltd. +109e Brooktree Corporation + 0310 Bt848 Video Capture + 032e Bt878 Video Capture + 0350 Bt848 Video Capture + 0351 Bt849A Video capture + 0369 Bt878 Video Capture + 1002 0001 TV-Wonder + 1002 0003 TV-Wonder/VE + 036c Bt879(??) Video Capture + 13e9 0070 Win/TV (Video Section) + 036e Bt878 Video Capture + 0000 0001 Euresys Picolo PCIe + 0070 13eb WinTV Series + 0070 ff01 Viewcast Osprey 200 + 0071 0101 DigiTV PCI + 107d 6606 WinFast TV 2000 + 11bd 0012 PCTV pro (TV + FM stereo receiver) + 11bd 001c PCTV Sat (DBC receiver) + 127a 0001 Bt878 Mediastream Controller NTSC + 127a 0002 Bt878 Mediastream Controller PAL BG + 127a 0003 Bt878a Mediastream Controller PAL BG + 127a 0048 Bt878/832 Mediastream Controller + 144f 3000 MagicTView CPH060 - Video + 1461 0002 TV98 Series (TV/No FM/Remote) + 1461 0003 AverMedia UltraTV PCI 350 + 1461 0004 AVerTV WDM Video Capture + 1461 0761 AverTV DVB-T + 1461 0771 AverMedia AVerTV DVB-T 771 + 14f1 0001 Bt878 Mediastream Controller NTSC + 14f1 0002 Bt878 Mediastream Controller PAL BG + 14f1 0003 Bt878a Mediastream Controller PAL BG + 14f1 0048 Bt878/832 Mediastream Controller + 1822 0001 VisionPlus DVB card + 1851 1850 FlyVideo'98 - Video + 1851 1851 FlyVideo II + 1852 1852 FlyVideo'98 - Video (with FM Tuner) + 18ac d500 DViCO FusionHDTV5 Lite + 270f fc00 Digitop DTT-1000 +# Vendor/ID appear to be randomly chosen + aa00 1460 Spectra8 CardA Input0 +# Vendor/ID appear to be randomly chosen + aa01 1461 Spectra8 CardA Input1 +# Vendor/ID appear to be randomly chosen + aa02 1462 Spectra8 CardA Input2 +# Vendor/ID appear to be randomly chosen + aa03 1463 Spectra8 CardA Input3 +# Vendor/ID appear to be randomly chosen + aa04 1464 Spectra8 CardB Input0 +# Vendor/ID appear to be randomly chosen + aa05 1465 Spectra8 CardB Input1 +# Vendor/ID appear to be randomly chosen + aa06 1466 Spectra8 CardB Input2 +# Vendor/ID appear to be randomly chosen + aa07 1467 Spectra8 CardB Input3 +# Vendor/ID appear to be randomly chosen + aa08 1468 Spectra8 CardC Input0 +# Vendor/ID appear to be randomly chosen + aa09 1469 Spectra8 CardC Input1 +# Vendor/ID appear to be randomly chosen + aa0a 146a Spectra8 CardC Input2 +# Vendor/ID appear to be randomly chosen + aa0b 146b Spectra8 CardC Input3 +# Vendor/ID appear to be randomly chosen + aa0c 146c Spectra8 CardD Input0 +# Vendor/ID appear to be randomly chosen + aa0d 146d Spectra8 CardD Input1 +# Vendor/ID appear to be randomly chosen + aa0e 146e Spectra8 CardD Input2 +# Vendor/ID appear to be randomly chosen + aa0f 146f Spectra8 CardD Input3 + bd11 1200 PCTV pro (TV + FM stereo receiver) + 036f Bt879 Video Capture + 127a 0044 Bt879 Video Capture NTSC + 127a 0122 Bt879 Video Capture PAL I + 127a 0144 Bt879 Video Capture NTSC + 127a 0222 Bt879 Video Capture PAL BG + 127a 0244 Bt879a Video Capture NTSC + 127a 0322 Bt879 Video Capture NTSC + 127a 0422 Bt879 Video Capture NTSC + 127a 1122 Bt879 Video Capture PAL I + 127a 1222 Bt879 Video Capture PAL BG + 127a 1322 Bt879 Video Capture NTSC + 127a 1522 Bt879a Video Capture PAL I + 127a 1622 Bt879a Video Capture PAL BG + 127a 1722 Bt879a Video Capture NTSC + 14f1 0044 Bt879 Video Capture NTSC + 14f1 0122 Bt879 Video Capture PAL I + 14f1 0144 Bt879 Video Capture NTSC + 14f1 0222 Bt879 Video Capture PAL BG + 14f1 0244 Bt879a Video Capture NTSC + 14f1 0322 Bt879 Video Capture NTSC + 14f1 0422 Bt879 Video Capture NTSC + 14f1 1122 Bt879 Video Capture PAL I + 14f1 1222 Bt879 Video Capture PAL BG + 14f1 1322 Bt879 Video Capture NTSC + 14f1 1522 Bt879a Video Capture PAL I + 14f1 1622 Bt879a Video Capture PAL BG + 14f1 1722 Bt879a Video Capture NTSC + 1851 1850 FlyVideo'98 - Video + 1851 1851 FlyVideo II + 1852 1852 FlyVideo'98 - Video (with FM Tuner) + 0370 Bt880 Video Capture + 1851 1850 FlyVideo'98 + 1851 1851 FlyVideo'98 EZ - video + 1852 1852 FlyVideo'98 (with FM Tuner) + 0878 Bt878 Audio Capture + 0000 0001 Euresys Picolo PCIe + 0070 13eb WinTV Series + 0070 ff01 Viewcast Osprey 200 + 0071 0101 DigiTV PCI + 1002 0001 TV-Wonder + 1002 0003 TV-Wonder/VE + 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section) + 11bd 001c PCTV Sat (DBC receiver) + 127a 0001 Bt878 Video Capture (Audio Section) + 127a 0002 Bt878 Video Capture (Audio Section) + 127a 0003 Bt878 Video Capture (Audio Section) + 127a 0048 Bt878 Video Capture (Audio Section) + 13e9 0070 Win/TV (Audio Section) + 144f 3000 MagicTView CPH060 - Audio + 1461 0002 Avermedia PCTV98 Audio Capture + 1461 0003 UltraTV PCI 350 + 1461 0004 AVerTV WDM Audio Capture + 1461 0761 AVerTV DVB-T + 1461 0771 AverMedia AVerTV DVB-T 771 + 14f1 0001 Bt878 Video Capture (Audio Section) + 14f1 0002 Bt878 Video Capture (Audio Section) + 14f1 0003 Bt878 Video Capture (Audio Section) + 14f1 0048 Bt878 Video Capture (Audio Section) + 1822 0001 VisionPlus DVB Card + 18ac d500 DViCO FusionHDTV5 Lite + 270f fc00 Digitop DTT-1000 + bd11 1200 PCTV pro (TV + FM stereo receiver, audio section) + 0879 Bt879 Audio Capture + 127a 0044 Bt879 Video Capture (Audio Section) + 127a 0122 Bt879 Video Capture (Audio Section) + 127a 0144 Bt879 Video Capture (Audio Section) + 127a 0222 Bt879 Video Capture (Audio Section) + 127a 0244 Bt879 Video Capture (Audio Section) + 127a 0322 Bt879 Video Capture (Audio Section) + 127a 0422 Bt879 Video Capture (Audio Section) + 127a 1122 Bt879 Video Capture (Audio Section) + 127a 1222 Bt879 Video Capture (Audio Section) + 127a 1322 Bt879 Video Capture (Audio Section) + 127a 1522 Bt879 Video Capture (Audio Section) + 127a 1622 Bt879 Video Capture (Audio Section) + 127a 1722 Bt879 Video Capture (Audio Section) + 14f1 0044 Bt879 Video Capture (Audio Section) + 14f1 0122 Bt879 Video Capture (Audio Section) + 14f1 0144 Bt879 Video Capture (Audio Section) + 14f1 0222 Bt879 Video Capture (Audio Section) + 14f1 0244 Bt879 Video Capture (Audio Section) + 14f1 0322 Bt879 Video Capture (Audio Section) + 14f1 0422 Bt879 Video Capture (Audio Section) + 14f1 1122 Bt879 Video Capture (Audio Section) + 14f1 1222 Bt879 Video Capture (Audio Section) + 14f1 1322 Bt879 Video Capture (Audio Section) + 14f1 1522 Bt879 Video Capture (Audio Section) + 14f1 1622 Bt879 Video Capture (Audio Section) + 14f1 1722 Bt879 Video Capture (Audio Section) + 0880 Bt880 Audio Capture + 2115 BtV 2115 Mediastream controller + 2125 BtV 2125 Mediastream controller + 2164 BtV 2164 + 2165 BtV 2165 + 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC) + 8472 Bt8472 + 8474 Bt8474 +109f Trigem Computer Inc. +10a0 Meidensha Corporation +10a1 Juko Electronics Ind. Co. Ltd +10a2 Quantum Corporation +10a3 Everex Systems Inc +10a4 Globe Manufacturing Sales +10a5 Smart Link Ltd. + 3052 SmartPCI562 56K Modem + 5449 SmartPCI561 modem +10a6 Informtech Industrial Ltd. +10a7 Benchmarq Microelectronics +10a8 Sierra Semiconductor + 0000 STB Horizon 64 +10a9 Silicon Graphics Intl. Corp. + 0001 Crosstalk to PCI Bridge + 0002 Linc I/O controller + 0003 IOC3 I/O controller + 0004 O2 MACE + 0005 RAD Audio + 0006 HPCEX + 0007 RPCEX + 0008 DiVO VIP + 0009 AceNIC Gigabit Ethernet + 10a9 8002 AceNIC Gigabit Ethernet + 0010 AMP Video I/O + 0011 GRIP + 0012 SGH PSHAC GSN + 0208 SSIM1 SAS Adapter + 1001 Magic Carpet + 1002 Lithium + 1003 Dual JPEG 1 + 1004 Dual JPEG 2 + 1005 Dual JPEG 3 + 1006 Dual JPEG 4 + 1007 Dual JPEG 5 + 1008 Cesium + 100a IOC4 I/O controller + 1504 SSIM1 Fibre Channel Adapter + 2001 Fibre Channel + 2002 ASDE + 4001 TIO-CE PCI Express Bridge + 4002 TIO-CE PCI Express Port + 8001 O2 1394 + 8002 G-net NT +# PCIe x1 Low Profile + 802b REACT external interrupt controller +10aa ACC Microelectronics + 0000 ACCM 2188 + 2051 2051 CPU bridge + 5842 2051 ISA bridge +10ab Digicom +10ac Honeywell IAC +10ad Symphony Labs + 0001 W83769F + 0003 SL82C103 + 0005 SL82C105 + 0103 SL82c103 + 0105 SL82c105 + 0565 W83C553F/W83C554F +10ae Cornerstone Technology +10af Micro Computer Systems Inc +10b0 CardExpert Technology +10b1 Cabletron Systems Inc +10b2 Raytheon Company +10b3 Databook Inc + 3106 DB87144 + b106 DB87144 +10b4 STB Systems Inc + 1b1d Velocity 128 3D + 10b4 237e Velocity 4400 +10b5 PLX Technology, Inc. + 0001 i960 PCI bus interface + 0557 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 Digium Tormenta 2 T400P-SS7 or E400P-SS7 Quad T1 or E1 PCI card + 1000 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 ATCOM AT400P Quad T1 PCI card + 1024 Acromag, Inc. IndustryPack Carrier Card + 1042 Brandywine / jxi2, Inc. - PMC-SyncClock32, IRIG A & B, Nasa 36 + 106a Dual OX16C952 4 port serial adapter [Megawolf Romulus/4] + 1076 VScom 800 8 port serial adaptor + 1077 VScom 400 4 port serial adaptor + 1078 VScom 210 2 port serial and 1 port parallel adaptor + 1103 VScom 200 2 port serial adaptor + 1146 VScom 010 1 port parallel adaptor + 1147 VScom 020 2 port parallel adaptor + 2000 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 ATCOM AE400P Quad E1 PCI card + 2540 IXXAT CAN-Interface PC-I 04/PCI + 2724 Thales PCSM Security Card + 3376 Cosateq 4 Port CAN Card + 4000 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 Tormenta 3 Varion V400P/ATCOM TE400P Quad E1/T1/J1 PCI card + 4001 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 ATCOM A400PE Quad E1 PCI card + 4002 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 ATCOM A400PT Quad T1 PCI card + 6140 PCI6140 32-bit 33MHz PCI-to-PCI Bridge + 6150 PCI6150 32-bit 33MHz PCI-to-PCI Bridge + 6152 PCI6152 32-bit 66MHz PCI-to-PCI Bridge + 6154 PCI6154 64-bit 66MHz PCI-to-PCI Bridge + 6254 PCI6254 64-bit 66MHz PCI-to-PCI Bridge + 6466 PCI6466 64-bit 66MHz PCI-to-PCI Bridge + 6520 PCI6520 64-bit 133MHz PCI-X-to-PCI-X Bridge + 6540 PCI6540 64-bit 133MHz PCI-X-to-PCI-X Bridge + 1775 1100 CR11 Single Board Computer + 4c53 10e0 PSL09 PrPMC + 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side) + 1775 1100 CR11 Single Board Computer + 4c53 10e0 PSL09 PrPMC + 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side) + 1775 1100 CR11 Single Board Computer + 4c53 10e0 PSL09 PrPMC + 8111 PEX 8111 PCI Express-to-PCI Bridge + 8112 PEX8112 x1 Lane PCI Express-to-PCI Bridge + 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge + 8311 PEX8311 x1 Lane PCI Express-to-Generic Local Bus Bridge + 8505 PEX 8505 5-lane, 5-port PCI Express Switch + 8508 PEX 8508 8-lane, 5-port PCI Express Switch + 8509 PEX 8509 8-lane, 8-port PCI Express Switch + 8512 PEX 8512 12-lane, 5-port PCI Express Switch + 8516 PEX 8516 Versatile PCI Express Switch + 8517 PEX 8517 16-lane, 5-port PCI Express Switch + 8518 PEX 8518 16-lane, 5-port PCI Express Switch + 8524 PEX 8524 24-lane, 6-port PCI Express Switch + 8525 PEX 8525 24-lane, 5-port PCI Express Switch + 8532 PEX 8532 Versatile PCI Express Switch + 8533 PEX 8533 32-lane, 6-port PCI Express Switch + 8547 PEX 8547 48-lane, 3-port PCI Express Switch + 8548 PEX 8548 48-lane, 9-port PCI Express Switch + 8603 PEX 8603 3-lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8604 PEX 8604 4-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8605 PEX 8605 PCI Express 4-port Gen2 Switch + 8606 PEX 8606 6 Lane, 6 Port PCI Express Gen 2 (5.0 GT/s) Switch + 8608 PEX 8608 8-lane, 8-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8609 PEX 8609 8-lane, 8-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA + 8612 PEX 8612 12-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8613 PEX 8613 12-lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8614 PEX 8614 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8615 PEX 8615 12-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA + 8616 PEX 8616 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8617 PEX 8617 16-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch with P2P + 8618 PEX 8618 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8619 PEX 8619 16-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch with DMA + 8624 PEX 8624 24-lane, 6-Port PCI Express Gen 2 (5.0 GT/s) Switch [ExpressLane] + 13a3 1845 DX1845 Acceleration Card + 8625 PEX 8625 24-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8632 PEX 8632 32-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8636 PEX 8636 36-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8647 PEX 8647 48-Lane, 3-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8648 PEX 8648 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8649 PEX 8649 48-lane, 12-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8664 PEX 8664 64-lane, 16-Port PCI Express Gen 2 (5.0 GT/s) Switch + 8680 PEX 8680 80-lane, 20-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch + 8696 PEX 8696 96-lane, 24-Port PCI Express Gen 2 (5.0 GT/s) Multi-Root Switch + 8717 PEX 8717 16-lane, 8-Port PCI Express Gen 3 (8.0 GT/s) Switch with DMA + 8718 PEX 8718 16-Lane, 5-Port PCI Express Gen 3 (8.0 GT/s) Switch + 8724 PEX 8724 24-Lane, 6-Port PCI Express Gen 3 (8 GT/s) Switch, 19 x 19mm FCBGA + 8725 PEX 8725 24-Lane, 10-Port PCI Express Gen 3 (8.0 GT/s) Multi-Root Switch with DMA + 8732 PEX 8732 32-lane, 8-Port PCI Express Gen 3 (8.0 GT/s) Switch + 8734 PEX 8734 32-lane, 8-Port PCI Express Gen 3 (8.0GT/s) Switch + 8747 PEX 8747 48-Lane, 5-Port PCI Express Gen 3 (8.0 GT/s) Switch + 8748 PEX 8748 48-Lane, 12-Port PCI Express Gen 3 (8 GT/s) Switch, 27 x 27mm FCBGA + 8749 PEX 8749 48-Lane, 18-Port PCI Express Gen 3 (8.0 GT/s) Multi-Root Switch with DMA + 87a0 PEX PCI Express Switch NT0 Port Link Interface + 87a1 PEX PCI Express Switch NT1 Port Link Interface + 87b0 PEX PCI Express Switch NT0 Port Virtual Interface + 1093 7761 PXIe-8830mc + 87b1 PEX PCI Express Switch NT1 Port Virtual Interface + 87d0 PEX PCI Express Switch DMA interface + 9016 PLX 9016 8-port serial controller + 9030 PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 2695 Hilscher CIF50-PB/DPS Profibus + 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board + 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board + 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board + 10b5 2977 IXXAT iPC-I XC16/PCI CAN Board + 10b5 2978 SH ARC-PCIu/SH ARC-PCI104/SH ARC-PCIe SOHARD ARCNET card + 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board + 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board + 10b5 3463 Alpermann+Velte PCL PCI D (v2) (3V/5V): Timecode Reader Board + 10b5 3591 PLURA PCL PCI L (v2) (3.3V/5V): Time Code Reader Board + 12fe 0111 CPCI-ASIO4 (ESD 4-port Serial Interface Board) + 1369 9c01 VX222v2 + 1369 9d01 VX222-Mic + 1369 9d02 VX222-Mic + 1369 9e01 PCX924v2 + 1369 9f01 PCX924-Mic + 1369 9f02 PCX924-Mic + 1369 a001 PCX22v2 + 1369 a701 LCM220v2 + 1369 a801 LCM200 + 1397 3136 4xS0-ISDN PCI Adapter + 1397 3137 S2M-E1-ISDN PCI Adapter + 1518 0200 ThinkIO-C + 15ed 1002 MCCS 8-port Serial Hot Swap + 15ed 1003 MCCS 16-port Serial Hot Swap +# MIL-STD-1553B Board + e1c5 0001 TE1-PCI + e1c5 0005 TA1-PCI + e1c5 0006 TA1-PCI4 + 9036 9036 + 9050 PCI <-> IOBus Bridge + 10b5 1067 IXXAT CAN i165 + 10b5 114e Wasco WITIO PCI168extended + 10b5 1169 Wasco OPTOIO32standard 32 digital in, 32 digital out + 10b5 1172 IK220 (Heidenhain) + 10b5 2036 SatPak GPS + 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board + 10b5 2273 SH ARC-PCI SOHARD ARCNET card + 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board + 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board + 10b5 3196 Goramo PLX200SYN sync serial card + 10b5 9050 PCI-I04 PCI Passive PC/CAN Interface + 12fe 0001 CAN-PCI/331 CAN bus controller + 1369 8901 PCX11+ PCI + 1369 8f01 VX222 + 1369 9401 PCX924 + 1369 9501 PCX22 + 1498 0362 TPMC866 8 Channel Serial Card + 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem + 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem + 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem + 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem + 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem + 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem + 15ed 1000 Macrolink MCCS 8-port Serial + 15ed 1001 Macrolink MCCS 16-port Serial + 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap + 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap + 5654 2036 OpenSwitch 6 Telephony card + 5654 3132 OpenSwitch 12 Telephony card + 5654 5634 OpenLine4 Telephony Card + d531 c002 PCIntelliCAN 2xSJA1000 CAN bus + d84d 4006 EX-4006 1P + d84d 4008 EX-4008 1P EPP/ECP + d84d 4014 EX-4014 2P + d84d 4018 EX-4018 3P EPP/ECP + d84d 4025 EX-4025 1S(16C550) RS-232 + d84d 4027 EX-4027 1S(16C650) RS-232 + d84d 4028 EX-4028 1S(16C850) RS-232 + d84d 4036 EX-4036 2S(16C650) RS-232 + d84d 4037 EX-4037 2S(16C650) RS-232 + d84d 4038 EX-4038 2S(16C850) RS-232 + d84d 4052 EX-4052 1S(16C550) RS-422/485 + d84d 4053 EX-4053 2S(16C550) RS-422/485 + d84d 4055 EX-4055 4S(16C550) RS-232 + d84d 4058 EX-4055 4S(16C650) RS-232 + d84d 4065 EX-4065 8S(16C550) RS-232 + d84d 4068 EX-4068 8S(16C650) RS-232 + d84d 4078 EX-4078 2S(16C552) RS-232+1P + 9052 PCI9052 PCI <-> IOBus Bridge + 9054 PCI9054 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 2455 Wessex Techology PHIL-PCI + 10b5 2696 Innes Corp AM Radcap card + 10b5 2717 Innes Corp Auricon card + 10b5 2844 Innes Corp TVS Encoder card + 12c7 4001 Intel Dialogic DM/V960-4T1 PCI + 12d9 0002 PCI Prosody Card rev 1.5 + 14b4 d100 Dektec DTA-100 + 14b4 d114 Dektec DTA-120 + 16df 0011 PIKA PrimeNet MM PCI + 16df 0012 PIKA PrimeNet MM cPCI 8 + 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling) + 16df 0014 PIKA PrimeNet MM cPCI 4 + 16df 0015 PIKA Daytona MM + 16df 0016 PIKA InLine MM + 9056 PCI9056 32-bit 66MHz PCI <-> IOBus Bridge + 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1 + 10b5 3268 IXXAT iPC-I XC16/PCIe CAN Board + 10b5 3334 Cambridge Pixel HPx Radar Input Card + 10b5 3352 Alpermann+Velte PCL PCIe HD: Timecode Reader Board + 10b5 3353 Alpermann+Velte PCL PCIe D: Timecode Reader Board + 10b5 3354 Alpermann+Velte PCL PCIe LV: Timecode Reader Board + 10b5 3355 Alpermann+Velte PCL PCIe L: Timecode Reader Board + 10b5 3415 Alpermann+Velte PCIe TS: Time Synchronisation Board + 10b5 3493 Alpermann+Velte PCL PCIe 3G: Timecode Reader Board + 10b5 3565 Cambridge Pixel HPx Radar Output Card + 1369 c001 LX6464ES + 1369 c201 LX1616ES + 14b4 d10a DekTec DTA-110T + 14b4 d128 Dektec DTA-140 + 14b4 d140 Dektec DTA-140 + 1a0e 006f Dektec DTA-111 + 9060 PCI9060 32-bit 33MHz PCI <-> IOBus Bridge + 906d 9060SD + 125c 0640 Aries 16000P + 906e 9060ES + 9080 PCI9080 32-bit; 33MHz PCI <-> IOBus Bridge + 103c 10eb (Agilent) E2777B 83K Series Optical Communication Interface + 103c 10ec (Agilent) E6978-66442 PCI CIC + 10b5 1123 Sectra KK631 encryption board + 10b5 9080 9080 [real subsystem ID not set] + 12d9 0002 PCI Prosody Card + 12df 4422 4422PCI ["Do-All" Telemetry Data Acquisition System] + 1369 9601 PCX822np + 1369 a102 PCX822v2 + 1369 a201 PCX442 + 1369 a301 LCM440v2 + 1369 a401 VX822 + 1369 a402 VX822v2 + 1369 a901 LCM420 + 1369 aa01 VX820v2 + 1517 000b ECSG-1R3ADC-PMC Clock synthesizer + 9656 PCI9656 PCI <-> IOBus Bridge + 1517 000f ECDR-GC314-PMC Receiver + 1885 0700 Tsunami FPGA PMC with Altera Stratix S40 + 1885 0701 Tsunami FPGA PMC with Altera Stratix S30 + 9733 PEX 9733 33-lane, 9-port PCI Express Gen 3 (8.0 GT/s) Switch + 1d49 0001 ThinkSystem 1610-4P NVMe Switch Adapter + 1d49 0002 ThinkSystem 810-4P NVMe Switch Adapter + 9749 PEX 9749 49-lane, 13-port PCI Express Gen 3 (8.0 GT/s) Switch + 1d49 0004 ThinkSystem 1610-8P NVMe Switch Adapter + a100 Blackmagic Design DeckLink + bb04 B&B 3PCIOSD1A Isolated PCI Serial + c001 CronyxOmega-PCI (8-port RS232) + d00d PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 Digium Tormenta 2 T400P or E400P Quad T1 or E1 PCI card + d33d PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 9030 Tormenta 3 Varion V401PT Quad T1/J1 PCI card + d44d PCI9030 32-bit 33MHz PCI <-> IOBus Bridge + 10b5 17f6 Allo CP100P/E 1-port E1/T1/J1 PCI/PCIe card + 10b5 17f7 Allo CP400P/E 4-port E1/T1/J1 PCI/PCIe card + 10b5 17f8 Allo CP200P/E 2-port E1/T1/J1 PCI/PCIe card + 10b5 9030 Tormenta 3 Varion V401PE Quad E1 PCI card +10b6 Madge Networks + 0001 Smart 16/4 PCI Ringnode + 0002 Smart 16/4 PCI Ringnode Mk2 + 10b6 0002 Smart 16/4 PCI Ringnode Mk2 + 10b6 0006 16/4 CardBus Adapter + 0003 Smart 16/4 PCI Ringnode Mk3 + 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL + 10b6 0003 Smart 16/4 PCI Ringnode Mk3 + 10b6 0007 Presto PCI Plus Adapter + 0004 Smart 16/4 PCI Ringnode Mk1 + 0006 16/4 Cardbus Adapter + 10b6 0006 16/4 CardBus Adapter + 0007 Presto PCI Adapter + 10b6 0007 Presto PCI + 0009 Smart 100/16/4 PCI-HS Ringnode + 10b6 0009 Smart 100/16/4 PCI-HS Ringnode + 000a Token Ring 100/16/4 Ringnode/Ringrunner + 10b6 000a Token Ring 100/16/4 Ringnode/Ringrunner + 000b 16/4 CardBus Adapter Mk2 + 10b6 0008 16/4 CardBus Adapter Mk2 + 10b6 000b 16/4 Cardbus Adapter Mk2 + 000c RapidFire 3140V2 16/4 TR Adapter + 10b6 000c RapidFire 3140V2 16/4 TR Adapter + 1000 Collage 25/155 ATM Client Adapter + 1001 Collage 155 ATM Server Adapter +10b7 3Com Corporation + 0001 3c985 1000BaseSX (SX/TX) +# wrong ID? + 9850 0001 3c985B-SX + 0013 AR5212 802.11abg NIC (3CRDAG675) + 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter + 0910 3C910-A01 + 1006 MINI PCI type 3B Data Fax Modem + 1007 Mini PCI 56k Winmodem + 10b7 615b Mini PCI 56K Modem + 10b7 615c Mini PCI 56K Modem + 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra] + 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra] + 1700 3c940 10/100/1000Base-T [Marvell] + 1043 80eb A7V600/P4P800/K8V motherboard + 10b7 0010 3C940 Gigabit LOM Ethernet Adapter + 10b7 0020 3C941 Gigabit LOM Ethernet Adapter + 147b 1407 KV8-MAX3 motherboard + 3390 3c339 TokenLink Velocity + 3590 3c359 TokenLink Velocity XL + 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B) + 4500 3c450 HomePNA [Tornado] + 5055 3c555 Laptop Hurricane + 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang] + 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card + 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone] + 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card + 5257 3cCFE575CT CardBus [Cyclone] + 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet + 5900 3c590 10BaseT [Vortex] + 5920 3c592 EISA 10mbps Demon/Vortex + 5950 3c595 100BaseTX [Vortex] + 5951 3c595 100BaseT4 [Vortex] + 5952 3c595 100Base-MII [Vortex] + 5970 3c597 EISA Fast Demon/Vortex + 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang] + 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card + 6000 3CRSHPW796 [OfficeConnect Wireless CardBus] + 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter] + 6055 3c556 Hurricane CardBus [Cyclone] + 6056 3c556B CardBus [Tornado] + 10b7 6556 10/100 Mini PCI Ethernet Adapter + 6560 3cCFE656 CardBus [Cyclone] + 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus + 6561 3cCFEM656 10/100 LAN+56K Modem CardBus + 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus + 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone] + 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus + 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus + 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus + 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado] + 7646 3cSOHO100-TX Hurricane + 7770 3CRWE777 PCI Wireless Adapter [Airconnect] + 7940 3c803 FDDILink UTP Controller + 7980 3c804 FDDILink SAS Controller + 7990 3c805 FDDILink DAS Controller + 80eb 3c940B 10/100/1000Base-T + 8811 Token ring + 9000 3c900 10BaseT [Boomerang] + 9001 3c900 10Mbps Combo [Boomerang] + 9004 3c900B-TPO Etherlink XL [Cyclone] + 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb + 9005 3c900B-Combo Etherlink XL [Cyclone] + 10b7 9005 3C900B-Combo Etherlink XL Combo + 9006 3c900B-TPC Etherlink XL [Cyclone] + 900a 3c900B-FL 10base-FL [Cyclone] + 9050 3c905 100BaseTX [Boomerang] + 9051 3c905 100BaseT4 [Boomerang] + 9054 3C905B-TX Fast Etherlink XL PCI + 10b7 9054 3C905B-TX Fast Etherlink XL PCI + 9055 3c905B 100BaseTX [Cyclone] + 1028 0080 3C905B Fast Etherlink XL 10/100 + 1028 0081 3C905B Fast Etherlink XL 10/100 + 1028 0082 3C905B Fast Etherlink XL 10/100 + 1028 0083 3C905B Fast Etherlink XL 10/100 + 1028 0084 3C905B Fast Etherlink XL 10/100 + 1028 0085 3C905B Fast Etherlink XL 10/100 + 1028 0086 3C905B Fast Etherlink XL 10/100 + 1028 0087 3C905B Fast Etherlink XL 10/100 + 1028 0088 3C905B Fast Etherlink XL 10/100 + 1028 0089 3C905B Fast Etherlink XL 10/100 + 1028 0090 3C905B Fast Etherlink XL 10/100 + 1028 0091 3C905B Fast Etherlink XL 10/100 + 1028 0092 3C905B Fast Etherlink XL 10/100 + 1028 0093 3C905B Fast Etherlink XL 10/100 + 1028 0094 3C905B Fast Etherlink XL 10/100 + 1028 0095 3C905B Fast Etherlink XL 10/100 + 1028 0096 3C905B Fast Etherlink XL 10/100 + 1028 0097 3C905B Fast Etherlink XL 10/100 + 1028 0098 3C905B Fast Etherlink XL 10/100 + 1028 0099 3C905B Fast Etherlink XL 10/100 + 10b7 9055 3C905B Fast Etherlink XL 10/100 + 9056 3c905B-T4 Fast EtherLink XL [Cyclone] + 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone] + 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone] + 9200 3c905C-TX/TX-M [Tornado] + 1028 0095 3C920 Integrated Fast Ethernet Controller + 1028 0097 3C920 Integrated Fast Ethernet Controller + 1028 00b4 OptiPlex GX110 + 1028 00d8 Precision 530 + 1028 00fe Optiplex GX240 + 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640] + 10b7 1000 3C905CX-TX/TX-M Fast Etherlink for PC Management NIC + 10b7 7000 10/100 Mini PCI Ethernet Adapter + 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller) + 144d c005 X10 Laptop + 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado] + 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller + 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller + 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller + 9300 3CSOHO100B-TX 910-A01 [tulip] + 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone] + 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter + 9805 3c980-C 10/100baseTX NIC [Python-T] + 10b7 1201 EtherLink Server 10/100 Dual Port A + 10b7 1202 EtherLink Server 10/100 Dual Port B + 10b7 9805 3c980 10/100baseTX NIC [Python-T] + 10f1 2462 Thunder K7 S2462 + 9900 3C990-TX [Typhoon] + 9902 3CR990-TX-95 [Typhoon 56-bit] + 9903 3CR990-TX-97 [Typhoon 168-bit] + 9904 3C990B-TX-M/3C990BSVR [Typhoon2] + 10b7 1000 3CR990B-TX-M [Typhoon2] + 10b7 2000 3CR990BSVR [Typhoon2 Server] + 9905 3CR990-FX-95/97/95 [Typhon Fiber] + 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit] + 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit] + 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit] + 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit] + 9908 3CR990SVR95 [Typhoon Server 56-bit] + 9909 3CR990SVR97 [Typhoon Server 168-bit] + 990a 3C990SVR [Typhoon Server] + 990b 3C990SVR [Typhoon Server] +10b8 Standard Microsystems Corp [SMC] + 0005 83c170 EPIC/100 Fast Ethernet Adapter + 1055 e000 LANEPIC 10/100 [EVB171Q-PCI] + 1055 e002 LANEPIC 10/100 [EVB171G-PCI] + 10b8 a011 EtherPower II 10/100 + 10b8 a014 EtherPower II 10/100 + 10b8 a015 EtherPower II 10/100 + 10b8 a016 EtherPower II 10/100 + 10b8 a017 EtherPower II 10/100 + 0006 83c175 EPIC/100 Fast Ethernet Adapter + 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter + 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter + 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter + 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter + 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter + 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter + 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter + 1000 FDC 37c665 + 1001 FDC 37C922 + a011 83C170QF + b106 SMC34C90 +# Split off ALi Corporation in 2003 +10b9 ULi Electronics Inc. + 0101 CMI8338/C3DX PCI Audio Device + 0111 C-Media CMI8738/C3DX Audio Device (OEM) + 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM) + 0780 Multi-IO Card + 0782 Multi-IO Card + 1435 M1435 + 1445 M1445 + 1449 M1449 + 1451 M1451 + 1461 M1461 + 1489 M1489 Cache-Memory PCI Controller (CMP) [FinALi 486] CPU to PCI bridge + 1511 M1511 [Aladdin] + 1512 M1512 [Aladdin] + 1513 M1513 [Aladdin] + 1521 M1521 [Aladdin III] + 10b9 1521 ALI M1521 Aladdin III CPU Bridge + 1523 M1523 + 10b9 1523 ALI M1523 ISA Bridge + 1531 M1531 [Aladdin IV] + 1533 M1533/M1535/M1543 PCI to ISA Bridge [Aladdin IV/V/V+] + 1014 053b ThinkPad R40e + 10b9 1533 ALi M1533 Aladdin IV/V ISA Bridge + 1541 M1541 + 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller + 1543 M1543 + 1563 M1563 HyperTransport South Bridge + 10b9 1563 ASRock 939Dual-SATA2 Motherboard + 1849 1563 ASRock 939Dual-SATA2 Motherboard + 1573 PCI to LPC Controller + 1575 M1575 South Bridge + 1621 M1621 + 1631 ALI M1631 PCI North Bridge Aladdin Pro III + 1632 M1632M Northbridge+Trident + 1641 ALI M1641 PCI North Bridge Aladdin Pro IV + 1644 M1644/M1644T Northbridge+Trident + 1646 M1646 Northbridge+Trident + 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1] + 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM] + 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR] + 1672 M1672 Northbridge [CyberALADDiN-P4] + 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR] + 1687 M1687 K8 Northbridge [AGP8X and HyperTransport] + 1689 M1689 K8 Northbridge [Super K8 Single Chip] + 1695 M1695 Host Bridge + 1697 M1697 HTT Host Bridge + 3141 M3141 + 3143 M3143 + 3145 M3145 + 3147 M3147 + 3149 M3149 + 3151 M3151 + 3307 M3307 + 3309 M3309 + 3323 M3325 Video/Audio Decoder + 5212 M4803 + 5215 MS4803 + 5217 M5217H + 5219 M5219 + 5225 M5225 + 5228 M5228 ALi ATA/RAID Controller + 5229 M5229 IDE + 1014 050f ThinkPad R30 + 1014 053d ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin IDE + 103c 0025 XE4500 Notebook + 1043 8053 A7A266 Motherboard IDE + 1849 5229 ASRock 939Dual-SATA2 Motherboard IDE (PATA) + 5235 M5225 + 5237 USB 1.1 Controller + 1014 0540 ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin USB + 103c 0025 XE4500 Notebook + 104d 810f VAIO PCG-U1 USB/OHCI Revision 1.0 + 10b9 5237 ASRock 939Dual-SATA2 Motherboard + 1849 5237 ASRock 939Dual-SATA2 Motherboard + 5239 USB 2.0 Controller + 10b9 5239 ASRock 939Dual-SATA2 Motherboard + 1849 5239 ASRock 939Dual-SATA2 Motherboard + 5243 M1541 PCI to AGP Controller + 5246 AGP8X Controller + 5247 PCI to AGP Controller + 5249 M5249 HTT to PCI Bridge + 524b PCI Express Root Port + 524c PCI Express Root Port + 524d PCI Express Root Port + 524e PCI Express Root Port + 5251 M5251 P1394 OHCI 1.0 Controller + 5253 M5253 P1394 OHCI 1.1 Controller + 5261 M5261 Ethernet Controller + 5263 ULi 1689,1573 integrated ethernet. + 5281 ALi M5281 Serial ATA / RAID Host Controller + 5287 ULi 5287 SATA + 5288 ULi M5288 SATA + 1043 8056 A8R-MVP Mainboard + 5289 ULi 5289 SATA + 5450 Lucent Technologies Soft Modem AMR + 5451 M5451 PCI AC-Link Controller Audio Device + 1014 0506 ThinkPad R30 + 1014 053e ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin Audio + 103c 0025 XE4500 Notebook + 5453 M5453 PCI AC-Link Controller Modem Device + 5455 M5455 PCI AC-Link Controller Audio Device + 10b9 5455 ASRock 939Dual-SATA2 Motherboard + 1849 0850 ASRock 939Dual-SATA2 Motherboard + 5457 M5457 AC'97 Modem Controller + 1014 0535 ThinkPad R40e + 103c 0024 Pavilion ze4400 builtin Modem Device + 103c 0025 XE4500 Notebook + 5459 SmartLink SmartPCI561 56K Modem + 545a SmartLink SmartPCI563 56K Modem + 5461 HD Audio Controller + 5471 M5471 Memory Stick Controller + 5473 M5473 SD-MMC Controller + 7101 M7101 Power Management Controller [PMU] + 1014 0510 ThinkPad R30 + 1014 053c ThinkPad R40e + 103c 0024 Pavilion ze4400 + 103c 0025 XE4500 Notebook + 1849 7101 ASRock 939Dual-SATA2 Motherboard +10ba Mitsubishi Electric Corp. + 0301 AccelGraphics AccelECLIPSE + 0304 AccelGALAXY A2100 [OEM Evans & Sutherland] + 0308 Tornado 3000 [OEM Evans & Sutherland] + 10dd 0024 Tornado 3000 + 1002 VG500 [VolumePro Volume Rendering Accelerator] +10bb Dapha Electronics Corporation +10bc Advanced Logic Research +10bd Surecom Technology + 0e34 NE-34 +10be Tseng Labs International Co. +10bf Most Inc +10c0 Boca Research Inc. +10c1 ICM Co., Ltd. +10c2 Auspex Systems Inc. +10c3 Samsung Semiconductors, Inc. +10c4 Award Software International Inc. +10c5 Xerox Corporation +10c6 Rambus Inc. +10c7 Media Vision +10c8 Neomagic Corporation + 0001 NM2070 [MagicGraph 128] + 0002 NM2090 [MagicGraph 128V] + 0003 NM2093 [MagicGraph 128ZV] + 0004 NM2160 [MagicGraph 128XD] + 1014 00ba MagicGraph 128XD + 1025 1007 MagicGraph 128XD + 1028 0074 MagicGraph 128XD + 1028 0075 MagicGraph 128XD + 1028 007d MagicGraph 128XD + 1028 007e MagicGraph 128XD + 1033 802f MagicGraph 128XD + 104d 801b MagicGraph 128XD + 104d 802f MagicGraph 128XD + 104d 830b MagicGraph 128XD + 10ba 0e00 MagicGraph 128XD + 10c8 0004 MagicGraph 128XD + 10cf 1029 MagicGraph 128XD + 10f7 8308 MagicGraph 128XD + 10f7 8309 MagicGraph 128XD + 10f7 830b MagicGraph 128XD + 10f7 830d MagicGraph 128XD + 10f7 8312 MagicGraph 128XD + 0005 NM2200 [MagicGraph 256AV] + 1014 00dd ThinkPad 570 + 1028 0088 Latitude CPi A + 0006 NM2360 [MagicMedia 256ZX] + 1014 0152 ThinkPad 600X + 0016 NM2380 [MagicMedia 256XL+] + 10c8 0016 MagicMedia 256XL+ + 0025 NM2230 [MagicGraph 256AV+] + 0083 NM2093 [MagicGraph 128ZV+] + 8005 NM2200 [MagicMedia 256AV Audio] + 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery + 0e11 b126 MagicMedia 256AV Audio Device on Durango + 1014 00dd ThinkPad 390/i1720/i1721 + 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720 + 1028 0088 Latitude CPi A + 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron + 103c 0007 MagicMedia 256AV Audio Device on Voyager II + 103c 0008 MagicMedia 256AV Audio Device on Voyager III + 103c 000d MagicMedia 256AV Audio Device on Omnibook 900 + 10c8 8005 MagicMedia 256AV Audio Device on FireAnt + 110a 8005 MagicMedia 256AV Audio Device + 14c0 0004 MagicMedia 256AV Audio Device + 8006 NM2360 [MagicMedia 256ZX Audio] + 8016 NM2380 [MagicMedia 256XL+ Audio] +10c9 Dataexpert Corporation +10ca Fujitsu Microelectr., Inc. +10cb Omron Corporation +# nee Mentor ARC Inc +10cc Mai Logic Incorporated + 0660 Articia S Host Bridge + 0661 Articia S PCI Bridge +10cd Advanced System Products, Inc + 1100 ASC1100 + 1200 ASC1200 [(abp940) Fast SCSI-II] + 1300 ASC1300 / ASC3030 [ABP940-U / ABP960-U / ABP3925] + 10cd 1310 ASC1300/3030 SCSI adapter + 1195 1320 Ultra-SCSI CardBus PC Card REX CB31 + 2300 ABP940-UW + 2500 ABP940-U2W + 2700 ABP3950-U3W +10ce Radius +# nee Citicorp TTI +10cf Fujitsu Limited. + 01ef PCEA4 PCI-Express Dual Port ESCON Adapter + 1414 On-board USB 1.1 companion controller + 1415 On-board USB 2.0 EHCI controller + 1422 E8410 nVidia graphics adapter + 142d HD audio (Realtek ALC262) + 1430 82566MM Intel 1Gb copper LAN interface + 1623 PCEA4 PCI-Express Dual Port ESCON Adapter + 2001 mb86605 + 200c MB86613L IEEE1394 OHCI 1.0 Controller + 2010 MB86613S IEEE1394 OHCI 1.1 Controller + 2019 MB86295S [CORAL P] + 201e MB86296S [CORAL PA] + 202b MB86297A [Carmine Graphics Controller] +10d1 FuturePlus Systems Corp. +10d2 Molex Incorporated +10d3 Jabil Circuit Inc +10d4 Hualon Microelectronics +10d5 Autologic Inc. +10d6 Cetia +10d7 BCM Advanced Research +10d8 Advanced Peripherals Labs +10d9 Macronix, Inc. [MXIC] + 0431 MX98715 + 0512 MX98713 + 0531 MX987x5 + 1186 1200 DFE-540TX ProFAST 10/100 Adapter + 8625 MX86250 + 8626 Macronix MX86251 + 3Dfx Voodoo Rush + 8888 MX86200 +10da Compaq IPG-Austin + 0508 TC4048 Token Ring 4/16 + 3390 Tl3c3x9 +10db Rohm LSI Systems, Inc. +10dc CERN/ECP/EDU + 0001 STAR/RD24 SCI-PCI (PMC) + 0002 TAR/RD24 SCI-PCI (PMC) + 0021 HIPPI destination + 0022 HIPPI source + 10dc ATT2C15-3 FPGA +10dd Evans & Sutherland + 0100 Lightning 1200 + 10dd 0023 Lightning 1200 15+16M +10de NVIDIA Corporation + 0008 NV1 [STG2000X-B Series] + 0009 NV1 [NV1 Series] + 0018 NV3 [Riva 128] + 0019 NV3 [Riva 128ZX] + 0020 NV4 [Riva TNT] + 1043 0200 V3400 TNT + 1048 0c18 Erazor II SGRAM + 1048 0c19 Erazor II + 1048 0c1b Erazor II + 1048 0c1c Erazor II + 1092 0550 Viper V550 + 1092 0552 Viper V550 + 1092 4804 Viper V550 + 1092 4808 Viper V550 + 1092 4810 Viper V550 + 1092 4812 Viper V550 + 1092 4815 Viper V550 + 1092 4820 Viper V550 with TV out + 1092 4822 Viper V550 + 1092 4904 Viper V550 + 1092 4914 Viper V550 + 1092 8225 Viper V550 + 10b4 273d Velocity 4400 + 10b4 273e Velocity 4400 + 10b4 2740 Velocity 4400 + 10de 0020 Riva TNT + 1102 1015 Graphics Blaster CT6710 + 1102 1016 Graphics Blaster RIVA TNT + 0028 NV5 [Riva TNT2 / TNT2 Pro] + 1043 0200 AGP-V3800 SGRAM + 1043 0201 AGP-V3800 SDRAM + 1043 0205 PCI-V3800 + 1043 4000 AGP-V3800PRO + 1048 0c21 Synergy II + 1048 0c28 Erazor III + 1048 0c29 Erazor III + 1048 0c2a Erazor III + 1048 0c2b Erazor III + 1048 0c31 Erazor III Pro + 1048 0c32 Erazor III Pro + 1048 0c33 Erazor III Pro + 1048 0c34 Erazor III Pro + 107d 2134 WinFast 3D S320 II + TV-Out + 1092 4804 Viper V770 + 1092 4a00 Viper V770 + 1092 4a02 Viper V770 Ultra + 1092 5a00 RIVA TNT2/TNT2 Pro + 1092 5a40 Viper V770D AGP + 1092 6a02 Viper V770 Ultra + 1092 7a02 Viper V770 Ultra + 10de 0005 RIVA TNT2 Pro + 10de 000f Compaq NVIDIA TNT2 Pro + 1102 1020 3D Blaster RIVA TNT2 + 1102 1026 3D Blaster RIVA TNT2 Digital + 1462 8806 MS-8806 AGPhantom Graphics Card + 14af 5810 Maxi Gamer Xentor + 0029 NV5 [Riva TNT2 Ultra] + 1043 0200 AGP-V3800 Deluxe + 1043 0201 AGP-V3800 Ultra SDRAM + 1043 0205 PCI-V3800 Ultra + 1048 0c2e Erazor III Ultra + 1048 0c2f Erazor III Ultra + 1048 0c30 Erazor III Ultra + 1102 1021 3D Blaster RIVA TNT2 Ultra + 1102 1029 3D Blaster RIVA TNT2 Ultra + 1102 102f 3D Blaster RIVA TNT2 Ultra + 14af 5820 Maxi Gamer Xentor 32 + 4843 4f34 Dynamite + 002a NV5 [Riva TNT2] + 002b NV5 [Riva TNT2] + 002c NV5 [Vanta / Vanta LT] + 1043 0200 AGP-V3800 Combat SDRAM + 1043 0201 AGP-V3800 Combat + 1048 0c20 TNT2 Vanta + 1048 0c21 TNT2 Vanta + 1048 0c25 TNT2 Vanta 16MB + 1092 6820 Viper V730 + 1102 1031 CT6938 VANTA 8MB + 1102 1034 CT6894 VANTA 16MB + 14af 5008 Maxi Gamer Phoenix 2 + 002d NV5 [Riva TNT2 Model 64 / Model 64 Pro] + 1043 0200 AGP-V3800M + 1043 0201 AGP-V3800M + 1048 0c3a Erazor III LT + 1048 0c3b Erazor III LT + 107d 2137 WinFast 3D S325 + 10de 0006 RIVA TNT2 Model 64/Model 64 Pro + 10de 001e M64 AGP4x + 1102 1023 CT6892 RIVA TNT2 Value + 1102 1024 CT6932 RIVA TNT2 Value 32Mb + 1102 102c CT6931 RIVA TNT2 Value [Jumper] + 1102 1030 CT6931 RIVA TNT2 Value +# S26361-D1243-V116 + 110a 006f GM1000-16 +# S26361-D1243-V216 + 110a 0081 GM1000-16 + 1462 8808 MSI-8808 + 14af 5620 Gamer Cougar Video Edition + 1554 1041 Pixelview RIVA TNT2 M64 + 1569 002d Palit Microsystems Daytona TNT2 M64 + 0034 MCP04 SMBus + 0035 MCP04 IDE + 0036 MCP04 Serial ATA Controller + 0037 MCP04 Ethernet Controller + 0038 MCP04 Ethernet Controller + 003a MCP04 AC'97 Audio Controller + 003b MCP04 USB Controller + 003c MCP04 USB Controller + 003d MCP04 PCI Bridge + 003e MCP04 Serial ATA Controller + 0040 NV40 [GeForce 6800 Ultra] + 0041 NV40 [GeForce 6800] + 1043 817b V9999 Gamer Edition + 107d 2992 WinFast A400 + 1458 310f Geforce 6800 GV-N6812 + 0042 NV40 [GeForce 6800 LE] + 107d 299b WinFast A400 LE + 0043 NV40 [GeForce 6800 XE] + 0044 NV40 [GeForce 6800 XT] + 0045 NV40 [GeForce 6800 GT] + 1043 817d V9999GT + 1458 3140 GV-N68T256D + 0047 NV40 [GeForce 6800 GS] + 1682 2109 GeForce 6800 GS + 0048 NV40 [GeForce 6800 XT] + 004e NV40GL [Quadro FX 4000] + 0050 CK804 ISA Bridge + 1043 815a K8N4/A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 0c11 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 0051 CK804 ISA Bridge + 1028 0225 PowerEdge T105 ISA Bridge + 0052 CK804 SMBus + 1028 0225 PowerEdge T105 SMBus + 1043 815a K8N4/A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 0c11 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 0053 CK804 IDE + 1043 815a K8N4/A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 5002 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 0054 CK804 Serial ATA Controller + 1028 0225 PowerEdge T105 Serial ATA + 1043 815a A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 b003 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 5401 NF4 AM2L Mainboard + 0055 CK804 Serial ATA Controller + 1028 0225 PowerEdge T105 Serial ATA + 1043 815a K8N4/A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 b003 GA-K8N Ultra-9 Mainboard + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 5401 NF4 AM2L Mainboard + 0056 CK804 Ethernet Controller + 0057 CK804 Ethernet Controller + 1043 8141 K8N4/A8N Series Mainboard + 10de cb84 NF4 Lanparty + 10f1 2865 Tomcat K8E (S2865) + 1458 e000 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 2501 NF4 AM2L Mainboard + 0058 CK804 AC'97 Modem + 0059 CK804 AC'97 Audio Controller + 1043 812a K8N4/A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1462 7585 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 8211 NF4 AM2L Mainboard + 005a CK804 USB Controller + 1028 0225 PowerEdge T105 onboard USB + 1043 815a K8N4/A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 5004 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 005b CK804 USB Controller + 1028 0225 PowerEdge T105 onboard USB + 1043 815a K8N4/A8N Series Mainboard + 10f1 2865 Tomcat K8E (S2865) + 1458 5004 GA-K8N Ultra-9 Mainboard + 1462 7100 MSI K8N Diamond + 1462 7125 K8N Neo4-F mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 005c CK804 PCI Bridge + 005d CK804 PCIE Bridge + 005e CK804 Memory Controller + 1028 0225 PowerEdge T105 Memory Controller + 1043 815a A8N Series Mainboard + 10de 005e ECS Elitegroup NFORCE3-A939 motherboard. + 10f1 2865 Tomcat K8E (S2865) + 10f1 2891 Thunder K8SRE Mainboard + 1458 5000 GA-K8N Ultra-9 Mainboard + 1462 7100 K8N Diamond Mainboard + 1462 7125 K8N Neo4-F Mainboard + 147b 1c1a KN8-Ultra Mainboard + 1565 3402 NF4 AM2L Mainboard + 005f CK804 Memory Controller + 0060 nForce2 ISA Bridge + 1043 80ad A7N8X Mainboard + 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X + a0a0 03ba UK79G-1394 motherboard + 0064 nForce2 SMBus (MCP) + 147b 1c02 NF7-S/NF7 (nVidia-nForce2) 2.X + a0a0 03bb UK79G-1394 motherboard + 0065 nForce2 IDE + 10de 0c11 nForce 2 EIDE Controller + a0a0 03b2 UK79G-1394 motherboard + 0066 nForce2 Ethernet Controller + 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet + 10de 0c11 nForce MCP-T Networking Adapter + a0a0 03b3 UK79G-1394 motherboard + 0067 nForce2 USB Controller + 1043 0c11 A7N8X Mainboard + a0a0 03b4 UK79G-1394 motherboard + 0068 nForce2 USB Controller + 1043 0c11 A7N8X Mainboard + a0a0 03b4 UK79G-1394 motherboard + 006a nForce2 AC97 Audio Controler (MCP) + 1043 8095 nForce2 AC97 Audio Controller (MCP) + a0a0 0304 UK79G-1394 motherboard + 006b nForce Audio Processing Unit + 10de 006b nForce2 MCP Audio Processing Unit + a0a0 0304 UK79G-1394 motherboard + 006c nForce2 External PCI Bridge + 006d nForce2 PCI Bridge + 006e nForce2 FireWire (IEEE 1394) Controller + a0a0 0306 UK79G-1394 motherboard + 0080 MCP2A ISA bridge + 147b 1c09 NV7 Motherboard + 0084 MCP2A SMBus + 147b 1c09 NV7 Motherboard + 0085 MCP2A IDE + 147b 1c09 NV7 Motherboard + 0086 MCP2A Ethernet Controller + 0087 MCP2A USB Controller + 147b 1c09 NV7 Motherboard + 0088 MCP2A USB Controller + 147b 1c09 NV7 Motherboard + 008a MCP2S AC'97 Audio Controller + 147b 1c09 NV7 Motherboard + 008b MCP2A PCI Bridge + 008c MCP2A Ethernet Controller + 008e nForce2 Serial ATA Controller + 0090 G70 [GeForce 7800 GTX] + 0091 G70 [GeForce 7800 GTX] + 0092 G70 [GeForce 7800 GT] + 0093 G70 [GeForce 7800 GS] + 0095 G70 [GeForce 7800 SLI] + 0097 G70 [GeForce GTS 250] + 0098 G70M [GeForce Go 7800] + 0099 G70M [GeForce Go 7800 GTX] + 009d G70GL [Quadro FX 4500] + 00a0 NV0A [Aladdin TNT2 IGP] + 14af 5810 Maxi Gamer Xentor + 00c0 NV41 [GeForce 6800 GS] + 00c1 NV41 [GeForce 6800] + 00c2 NV41 [GeForce 6800 LE] + 00c3 NV41 [GeForce 6800 XT] + 00c5 NV41 + 00c6 NV41 + 00c7 NV41 + 00c8 NV41M [GeForce Go 6800] + 00c9 NV41M [GeForce Go 6800 Ultra] + 00cc NV41GLM [Quadro FX Go1400] + 00cd NV42GL [Quadro FX 3450/4000 SDI] + 10de 029b Quadro FX 3450 + 00ce NV41GL [Quadro FX 1400] + 00cf NV41 + 00d0 nForce3 LPC Bridge + 00d1 nForce3 Host Bridge + 00d2 nForce3 AGP Bridge + 00d3 CK804 Memory Controller + 00d4 nForce3 SMBus + 00d5 nForce3 IDE + 00d6 nForce3 Ethernet + 00d7 nForce3 USB 1.1 + 00d8 nForce3 USB 2.0 + 00d9 nForce3 Audio + 00da nForce3 Audio + 00dd nForce3 PCI Bridge + 00df CK8S Ethernet Controller + 1043 80a7 K8N-E + 105b 0c43 Winfast NF3250K8AA + 147b 1c0b NF8 Mainboard + 00e0 nForce3 250Gb LPC Bridge + 1043 813f K8N-E + 10de 0c11 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e0 Motherboard (one of many) + 00e1 nForce3 250Gb Host Bridge + 1043 813f K8N-E + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e1 Motherboard (one of many) + 00e2 nForce3 250Gb AGP Host to PCI Bridge + 00e3 nForce3 Serial ATA Controller + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 147b 1c0b NF8 Mainboard + 1849 00e3 Motherboard (one of many) + 00e4 nForce 250Gb PCI System Management + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e4 Motherboard (one of many) + 00e5 CK8S Parallel ATA Controller (v2.5) + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e5 Motherboard (one of many) + f849 00e5 Motherboard (one of many) + 00e6 CK8S Ethernet Controller + 00e7 CK8S USB Controller + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e7 Motherboard (one of many) + 00e8 nForce3 EHCI USB 2.0 Controller + 1043 813f K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 7030 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 1849 00e8 Motherboard (one of many) + 00ea nForce3 250Gb AC'97 Audio Controller + 1043 819d K8N-E + 105b 0c43 Winfast NF3250K8AA + 1462 b010 K8N Neo-FSR v2.0 + 147b 1c0b NF8 Mainboard + 00ed nForce3 250Gb PCI-to-PCI Bridge + 00ee nForce3 Serial ATA Controller 2 + 00f1 NV43 [GeForce 6600 GT] + 1043 81a6 N6600GT TD 128M AGP + 1043 81c6 N6600GT TD 128M AGP + 1458 3150 GV-N66T128VP + 1554 1191 PixelView PV-N43UA (128KD) + 1682 2119 GeForce 6600 GT AGP + 00f2 NV43 [GeForce 6600] + 1554 1194 PixelView PV-N43AT (256KD) + 1682 211c GeForce 6600 256MB DDR DUAL DVI TV + 00f3 NV43 [GeForce 6200] + 00f4 NV43 [GeForce 6600 LE] + 00f5 G70/G71 [GeForce 7800 GS AGP] + 00f6 NV43 [GeForce 6800 GS/XT] + 1682 217e XFX GeForce 6800 XTreme 256MB DDR3 AGP + 00f8 NV45GL [Quadro FX 3400/4400] + 00f9 NV40 [GeForce 6800 GT/GTO/Ultra] + 10de 00f9 NV40 [GeForce 6800 GT] + 1682 2120 GEFORCE 6800 GT PCI-E + 00fa NV39 [GeForce PCX 5750] + 00fb NV35 [GeForce PCX 5900] + 00fc NV37GL [Quadro FX 330/GeForce PCX 5300] + 00fd NV37GL [Quadro PCI-E Series] + 00fe NV38GL [Quadro FX 1300] + 00ff NV19 [GeForce PCX 4300] + 0100 NV10 [GeForce 256 SDR] + 1043 0200 AGP-V6600 SGRAM + 1043 0201 AGP-V6600 SDRAM + 1043 4008 AGP-V6600 SGRAM + 1043 4009 AGP-V6600 SDRAM + 1048 0c41 Erazor X + 1048 0c43 ERAZOR X PCI + 1048 0c48 Synergy Force + 1102 102d CT6941 GeForce 256 + 14af 5022 3D Prophet SE + 0101 NV10 [GeForce 256 DDR] + 1043 0202 AGP-V6800 DDR + 1043 400a AGP-V6800 DDR SGRAM + 1043 400b AGP-V6800 DDR SDRAM + 1048 0c42 Erazor X + 107d 2822 WinFast GeForce 256 + 1102 102e CT6970/CT6971 + 14af 5021 3D Prophet DDR-DVI + 0103 NV10GL [Quadro] + 1048 0c40 GLoria II-64 + 1048 0c44 GLoria II + 1048 0c45 GLoria II + 1048 0c4a GLoria II-64 Pro + 1048 0c4b GLoria II-64 Pro DVII + 10a9 9002 VPro VR3 + 0110 NV11 [GeForce2 MX/MX 400] + 1043 4015 AGP-V7100 Pro + 1043 4021 V7100 Deluxe Combo + 1043 4031 V7100 Pro with TV output + 1048 0c60 Gladiac MX + 1048 0c61 Gladiac 511PCI + 1048 0c63 Gladiac 511TV-OUT 32MB + 1048 0c64 Gladiac 511TV-OUT 64MB + 1048 0c65 Gladiac 511TWIN + 1048 0c66 Gladiac 311 + 10b0 0001 GeForce2 MX Jumbo TV + 10de 0091 Dell OEM GeForce 2 MX 400 + 10de 00a1 Apple OEM GeForce2 MX + 1462 8523 MS-8852 + 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817] + 14af 7102 3D Prophet II MX + 14af 7103 3D Prophet II MX Dual-Display + 1545 0023 Xtasy Rev. B2 + 1554 1081 MVGA-NVG11AM(400) + 0111 NV11 [GeForce2 MX200] + 0112 NV11M [GeForce2 Go] + 0113 NV11GL [Quadro2 MXR/EX/Go] + 1028 00e5 Quadro2 Go + 0140 NV43 [GeForce 6600 GT] + 1458 3125 GV-NX66T128D + 1458 3126 GV-NX66T256DE + 1462 8939 MS-8983 + 0141 NV43 [GeForce 6600] + 1043 81b0 EN6600 Silencer + 107d 593a LR2A22 128MB TV OUT + 107d 597b WINFAST PX6600 + 1458 3124 GV-NX66128DP Turbo Force Edition + 0142 NV43 [GeForce 6600 LE] + 0143 NV43 [GeForce 6600 VE] + 0144 NV43M [GeForce Go 6600] + 0145 NV43 [GeForce 6610 XL] + 0146 NV43M [GeForce Go6200 TE / 6600 TE] + 0147 NV43 [GeForce 6700 XL] + 0148 NV43M [GeForce Go 6600] + 0149 NV43M [GeForce Go 6600 GT] + 014a NV43 [Quadro NVS 440] + 014b NV43 + 014d NV43GL [Quadro FX 550] + 014e NV43GL [Quadro FX 540] + 014f NV43 [GeForce 6200] + 0150 NV15 [GeForce2 GTS/Pro] + 1043 4016 V7700 AGP Video Card + 1043 402a AGP-V7700 + 1048 0c50 Gladiac + 1048 0c52 Gladiac-64 + 107d 2840 WinFast GeForce2 GTS with TV output + 107d 2842 WinFast GeForce 2 Pro + 10de 002e GeForce2 GTS + 1462 815a MS-8815 + 1462 8831 Creative GeForce2 Pro + 0151 NV15 [GeForce2 Ti] + 1043 405f V7700Ti + 1462 5506 Creative 3D Blaster GeForce2 Titanium + 1462 8364 MS-8836 + 0152 NV15 [GeForce2 Ultra] + 1048 0c56 GLADIAC Ultra + 0153 NV15GL [Quadro2 Pro] + 0160 NV44 [GeForce 6500] + 0161 NV44 [GeForce 6200 TurboCache] + 0162 NV44 [GeForce 6200 SE TurboCache] + 0163 NV44 [GeForce 6200 LE] + 0164 NV44M [GeForce Go 6200] + 0165 NV44 [Quadro NVS 285] + 0166 NV44M [GeForce Go 6400] + 0167 NV44M [GeForce Go 6200] + 0168 NV44M [GeForce Go 6400] + 0169 NV44 [GeForce 6250] + 016a NV44 [GeForce 7100 GS] + 016d NV44 + 016e NV44 + 016f NV44 + 0170 NV17 [GeForce4 MX 460] + 1462 8630 MS-8863 + 0171 NV17 [GeForce4 MX 440] + 10b0 0002 Gainward Pro/600 TV + 10de 0008 Apple OEM GeForce4 MX 440 + 1462 8661 G4MX440-VTP + 1462 8730 MX440SES-T (MS-8873) + 1462 8743 MS-8874 + 1462 8852 GeForce4 MX440 PCI + 147b 8f00 Abit Siluro GeForce4MX440 + 0172 NV17 [GeForce4 MX 420] + 1462 8730 MS-8873 + 1462 8784 MS-8878 + 0173 NV17 [GeForce4 MX 440-SE] + 0174 NV17M [GeForce4 440 Go] + 0175 NV17M [GeForce4 420 Go] + 0176 NV17M [GeForce4 420 Go 32M] + 103c 08b0 tc1100 tablet + 144d c005 X10 Laptop + 4c53 1090 Cx9 / Vx9 mainboard + 0177 NV17M [GeForce4 460 Go] + 0178 NV17GL [Quadro4 550 XGL] + 0179 NV17M [GeForce4 440 Go 64M] + 10de 0179 GeForce4 MX (Mac) + 017a NV17GL [Quadro NVS] + 017b NV17GL [Quadro4 550 XGL] + 017c NV17GL [Quadro4 500 GoGL] + 017f NV17 + 0181 NV18 [GeForce4 MX 440 AGP 8x] + 1043 8063 GeForce4 MX 440 AGP 8X + 1043 806f V9180 Magic + 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X + 1462 8900 MS-8890 GeForce 4 MX440 AGP8X + 1462 9350 MSI GeForce4 MX T8X with AGP8X + 147b 8f0d Siluro GF4 MX-8X + 1554 1111 PixelView MVGA-NVG18A + 0182 NV18 [GeForce4 MX 440SE AGP 8x] + 0183 NV18 [GeForce4 MX 420 AGP 8x] + 0184 NV18 [GeForce4 MX] + 0185 NV18 [GeForce4 MX 4000] + 0186 NV18M [GeForce4 448 Go] + 0187 NV18M [GeForce4 488 Go] + 0188 NV18GL [Quadro4 580 XGL] + 0189 NV18 [GeForce4 MX with AGP8X (Mac)] + 018a NV18GL [Quadro NVS 280 SD] + 018b NV18GL [Quadro4 380 XGL] + 018c NV18GL [Quadro NVS 50 PCI] + 018d NV18M [GeForce4 448 Go] + 0190 G80 [GeForce 8800 GTS / 8800 GTX] + 0191 G80 [GeForce 8800 GTX] + 0192 G80 [GeForce 8800 GTS] + 0193 G80 [GeForce 8800 GTS] + 107d 20bd WinFast PX 8800 GTS TDH + 0194 G80 [GeForce 8800 Ultra] + 0197 G80GL [Tesla C870] + 019d G80GL [Quadro FX 5600] + 019e G80GL [Quadro FX 4600] + 01a0 nForce 220/420 NV1A [GeForce2 MX] + 01a4 nForce CPU bridge + 01ab nForce 420 Memory Controller (DDR) + 01ac nForce 220/420 Memory Controller + 01ad nForce 220/420 Memory Controller + 01b0 nForce Audio Processing Unit + 01b1 nForce AC'97 Audio Controller + 01b2 nForce ISA Bridge + 01b4 nForce PCI System Management + 01b7 nForce AGP to PCI Bridge + 01b8 nForce PCI-to-PCI bridge + 01bc nForce IDE + 01c1 nForce AC'97 Modem Controller + 01c2 nForce USB Controller + 01c3 nForce Ethernet Controller + 01d0 G72 [GeForce 7350 LE] + 01d1 G72 [GeForce 7300 LE] + 107d 5efa WinFast PX7300LE-TD128 + 107d 5efb WinFast PX7300LE-TD256 + 1462 0345 7300LE PCI Express Graphics Adapter + 01d2 G72 [GeForce 7550 LE] + 01d3 G72 [GeForce 7200 GS / 7300 SE] + 1043 8203 EN7300SE + 1043 8250 EN7200GS + 01d5 G72 + 01d6 G72M [GeForce Go 7200] + 01d7 G72M [Quadro NVS 110M/GeForce Go 7300] + 01d8 G72M [GeForce Go 7400] + 1028 01d7 XPS M1210 + 01d9 G72M [GeForce Go 7450] + 01da G72M [Quadro NVS 110M] + 01db G72M [Quadro NVS 120M] + 01dc G72GLM [Quadro FX 350M] + 01dd G72 [GeForce 7500 LE] + 01de G72GL [Quadro FX 350] + 10de 01dc Quadro FX Go350M + 01df G72 [GeForce 7300 GS] + 01e0 nForce2 IGP2 + 147b 1c09 NV7 Motherboard + 01e8 nForce2 AGP + 01ea nForce2 Memory Controller 0 + a0a0 03b9 UK79G-1394 motherboard + 01eb nForce2 Memory Controller 1 + a0a0 03b9 UK79G-1394 motherboard + 01ec nForce2 Memory Controller 2 + a0a0 03b9 UK79G-1394 motherboard + 01ed nForce2 Memory Controller 3 + a0a0 03b9 UK79G-1394 motherboard + 01ee nForce2 Memory Controller 4 + 10de 01ee MSI Delta-L nForce2 memory controller + a0a0 03b9 UK79G-1394 motherboard + 01ef nForce2 Memory Controller 5 + a0a0 03b9 UK79G-1394 motherboard + 01f0 NV1F C17 [GeForce4 MX IGP] + a0a0 03b5 UK79G-1394 motherboard + 0200 NV20 [GeForce3] + 1043 402f AGP-V8200 DDR + 1048 0c70 GLADIAC 920 + 0201 NV20 [GeForce3 Ti 200] + 0202 NV20 [GeForce3 Ti 500] + 1043 405b V8200 T5 + 1545 002f Xtasy 6964 + 0203 NV20GL [Quadro DCC] + 0211 NV48 [GeForce 6800] + 0212 NV48 [GeForce 6800 LE] + 0215 NV48 [GeForce 6800 GT] + 0218 NV48 [GeForce 6800 XT] + 0221 NV44A [GeForce 6200] + 1043 81e1 N6200/TD/256M/A + 3842 a341 256A8N341DX + 0222 NV44 [GeForce 6200 A-LE] + 0224 NV44 + 0240 C51PV [GeForce 6150] + 1043 81cd A8N-VM CSM + 1462 7207 K8NGM2 series + 0241 C51 [GeForce 6150 LE] + 0242 C51G [GeForce 6100] + 105b 0cad Winfast 6100K8MB + 0243 C51 PCI Express Bridge + 0244 C51 [GeForce Go 6150] + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 10de 0244 GeForce Go 6150 + 0245 C51 [Quadro NVS 210S/GeForce 6150LE] + 0246 C51 PCI Express Bridge + 0247 C51 [GeForce Go 6100] + 1043 1382 MCP51 PCI-X GeForce Go 6100 + 0248 C51 PCI Express Bridge + 0249 C51 PCI Express Bridge + 024a C51 PCI Express Bridge + 024b C51 PCI Express Bridge + 024c C51 PCI Express Bridge + 024d C51 PCI Express Bridge + 024e C51 PCI Express Bridge + 024f C51 PCI Express Bridge + 0250 NV25 [GeForce4 Ti 4600] + 0251 NV25 [GeForce4 Ti 4400] + 1043 8023 v8440 GeForce 4 Ti4400 + 10de 0251 PNY GeForce4 Ti 4400 + 1462 8710 PNY GeForce4 Ti 4400 + 0252 NV25 [GeForce4 Ti] + 0253 NV25 [GeForce4 Ti 4200] + 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI) + 147b 8f09 Siluro (Dual VGA/TV-out/DVI) + 0258 NV25GL [Quadro4 900 XGL] + 0259 NV25GL [Quadro4 750 XGL] + 025b NV25GL [Quadro4 700 XGL] + 0260 MCP51 LPC Bridge + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 1458 5001 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0261 MCP51 LPC Bridge + 105b 0cad Winfast 6100K8MB + 0262 MCP51 LPC Bridge + 0263 MCP51 LPC Bridge + 0264 MCP51 SMBus + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1462 7207 K8NGM2 series + 0265 MCP51 IDE + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series +# Foxconn has used a wrong vendor ID for this one + f05b 0cad Winfast 6100K8MB + 0266 MCP51 Serial ATA Controller + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 0267 MCP51 Serial ATA Controller + 103c 2a34 Pavilion a1677c + 1043 81bc A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 0268 MCP51 Ethernet Controller + 0269 MCP51 Ethernet Controller + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 8141 A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 026a MCP51 MCI + 026b MCP51 AC97 Audio Controller + 105b 0cad Winfast 6100K8MB + 026c MCP51 High Definition Audio + 103c 2a34 Pavilion a1677c + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 10de cb84 ASUSTeK Computer Inc. A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 026d MCP51 USB Controller + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1462 7207 K8NGM2 series + 026e MCP51 USB Controller + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1462 7207 K8NGM2 series + 026f MCP51 PCI Bridge + 103c 30b7 Presario V6133CL + 0270 MCP51 Host Bridge + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81bc A8N-VM CSM Mainboard + 105b 0cad Winfast 6100K8MB + 1458 5001 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0271 MCP51 PMU + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 0272 MCP51 Memory Controller 0 + 103c 2a34 Pavilion a1677c + 105b 0cad Winfast 6100K8MB + 027e C51 Memory Controller 2 + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 027f C51 Memory Controller 3 + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0280 NV28 [GeForce4 Ti 4800] + 0281 NV28 [GeForce4 Ti 4200 AGP 8x] + 0282 NV28 [GeForce4 Ti 4800 SE] + 0286 NV28M [GeForce4 Ti 4200 Go AGP 8x] + 0288 NV28GL [Quadro4 980 XGL] + 0289 NV28GL [Quadro4 780 XGL] + 028c NV28GLM [Quadro4 Go700] + 0290 G71 [GeForce 7900 GTX] + 0291 G71 [GeForce 7900 GT/GTO] + 10de 042b NX7900GTO-T2D512E [7900 GTO] + 0292 G71 [GeForce 7900 GS] + 0293 G71 [GeForce 7900 GX2] + 0294 G71 [GeForce 7950 GX2] + 0295 G71 [GeForce 7950 GT] + 1043 8225 GeForce 7950 GT + 107d 2a68 WinFast PX7950GT TDH + 1462 0663 NX7950GT-VT2D512EZ-HD + 0297 G71M [GeForce Go 7950 GTX] + 0298 G71M [GeForce Go 7900 GS] + 0299 G71M [GeForce Go 7900 GTX] + 029a G71GLM [Quadro FX 2500M] + 029b G71GLM [Quadro FX 1500M] + 029c G71GL [Quadro FX 5500] + 029d G71GL [Quadro FX 3500] + 1028 019b G71GLM [Quadro FX 3500M] + 029e G71GL [Quadro FX 1500] + 029f G71GL [Quadro FX 4500 X2] +# Xbox Graphics Processing Unit (Integrated). GeForce3 derivative (NV20 < NV2A < NV25). + 02a0 NV2A [XGPU] + 02a5 MCPX CPU Bridge + 02a6 MCPX Memory Controller + 02e0 G73 [GeForce 7600 GT AGP] + 02e0 2249 GF 7600GT 560M 256MB DDR3 DUAL DVI TV + 02e1 G73 [GeForce 7600 GS AGP] + 1682 222b PV-T73K-UAL3 (256MB) + 1682 2247 GF 7600GS 512MB DDR2 + 02e2 G73 [GeForce 7300 GT AGP] + 02e3 G71 [GeForce 7900 GS AGP] + 02e4 G71 [GeForce 7950 GT AGP] + 1682 2271 PV-T71A-YDF7 (512MB) + 02e5 G71 [GeForce 7600 GS AGP] + 02f0 C51 Host Bridge + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1462 7207 K8NGM2 series + 02f1 C51 Host Bridge + 1458 5000 GA-M55plus-S3G + 02f2 C51 Host Bridge + 02f3 C51 Host Bridge + 02f4 C51 Host Bridge + 02f5 C51 Host Bridge + 02f6 C51 Host Bridge + 02f7 C51 Host Bridge + 02f8 C51 Memory Controller 5 + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02f9 C51 Memory Controller 4 + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02fa C51 Memory Controller 0 + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02fb C51 PCI Express Bridge + 02fc C51 PCI Express Bridge + 103c 30b7 Presario V6133CL + 02fd C51 PCI Express Bridge + 103c 30b7 Presario V6133CL + 02fe C51 Memory Controller 1 + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 02ff C51 Host Bridge + 103c 2a34 Pavilion a1677c + 103c 30b7 Presario V6133CL + 1043 81cd A8N-VM CSM Mainboard + 1458 5000 GA-M55plus-S3G + 1462 7207 K8NGM2 series + 0300 NV30 [GeForce FX] + 0301 NV30 [GeForce FX 5800 Ultra] + 0302 NV30 [GeForce FX 5800] + 0308 NV30GL [Quadro FX 2000] + 0309 NV30GL [Quadro FX 1000] + 0311 NV31 [GeForce FX 5600 Ultra] + 0312 NV31 [GeForce FX 5600] + 0314 NV31 [GeForce FX 5600XT] + 1043 814a V9560XT/TD + 0316 NV31M + 0318 NV31GL + 031a NV31M [GeForce FX Go5600] + 031b NV31M [GeForce FX Go5650] + 031c NV31GLM [Quadro FX Go700] + 0320 NV34 [GeForce FX 5200] + 0321 NV34 [GeForce FX 5200 Ultra] + 0322 NV34 [GeForce FX 5200] + 1043 02fb V9250 Magic + 1043 8180 V9520-X/TD/128M + 107d 2967 WinFast A340T 128MB + 1462 9110 MS-8911 (FX5200-TD128) + 1462 9171 MS-8917 (FX5200-T128) + 1462 9360 MS-8936 (FX5200-T128) + 1682 1351 GeForce FX 5200 + 0323 NV34 [GeForce FX 5200LE] + 0324 NV34M [GeForce FX Go5200 64M] + 1028 0196 Inspiron 5160 + 103c 006a Pavilion ZD7000 laptop + 1071 8160 MIM2000 + 0325 NV34M [GeForce FX Go5250] + 0326 NV34 [GeForce FX 5500] + 1458 310d GeForce FX 5500 128 MB + 1682 2034 GeForce 5500 256 MB + 0327 NV34 [GeForce FX 5100] + 0328 NV34M [GeForce FX Go5200 32M/64M] + 0329 NV34M [GeForce FX Go5200] + 10de 0010 Powerbook G4 + 032a NV34GL [Quadro NVS 280 PCI] + 032b NV34GL [Quadro FX 500/600 PCI] + 032c NV34M [GeForce FX Go5300 / Go5350] + 032d NV34M [GeForce FX Go5100] + 032e NV34 + 032f NV34 [GeForce FX 5200] + 0330 NV35 [GeForce FX 5900 Ultra] + 1043 8137 V9950 Ultra / 256 MB + 0331 NV35 [GeForce FX 5900] + 1043 8145 V9950GE + 0332 NV35 [GeForce FX 5900XT] + 0333 NV38 [GeForce FX 5950 Ultra] + 0334 NV35 [GeForce FX 5900ZT] + 1462 9373 FX5900ZT-VTD128 (MS-8937) + 0338 NV35GL [Quadro FX 3000] + 033f NV35GL [Quadro FX 700] + 0341 NV36 [GeForce FX 5700 Ultra] + 1462 9380 MS-8938 (FX5700U-TD128) + 0342 NV36 [GeForce FX 5700] + 0343 NV36 [GeForce FX 5700LE] + 0344 NV36 [GeForce FX 5700VE] + 0347 NV36M [GeForce FX Go5700] + 103c 006a NX9500 + 0348 NV36M [GeForce FX Go5700] + 034c NV36 [Quadro FX Go1000] + 034d NV36 + 034e NV36GL [Quadro FX 1100] + 0360 MCP55 LPC Bridge + 0361 MCP55 LPC Bridge + 1028 0221 PowerEdge R805 MCP55 LPC Bridge + 0362 MCP55 LPC Bridge + 147b 1c24 KN9 series mainboard + 0363 MCP55 LPC Bridge + 0364 MCP55 LPC Bridge + 1028 0221 PowerEdge R805 MCP55 LPC Bridge + 0365 MCP55 LPC Bridge + 0366 MCP55 LPC Bridge + 0367 MCP55 LPC Bridge + 0368 MCP55 SMBus Controller + 1028 020c PowerEdge M605 MCP55 SMBus + 1028 0221 PowerEdge R805 MCP55 SMBus + 147b 1c24 KN9 series mainboard + 0369 MCP55 Memory Controller + 147b 1c24 KN9 series mainboard + 036a MCP55 Memory Controller + 036b MCP55 SMU + 036c MCP55 USB Controller + 1028 020c PowerEdge M605 MCP55 USB Controller + 1028 0221 PowerEdge R805 MCP55 USB Controller + 147b 1c24 KN9 series mainboard + 036d MCP55 USB Controller + 1028 020c PowerEdge M605 MCP55 USB Controller + 1028 0221 PowerEdge R805 MCP55 USB Controller + 147b 1c24 KN9 series mainboard + 036e MCP55 IDE + 147b 1c24 KN9 series mainboard + 0370 MCP55 PCI bridge + 0371 MCP55 High Definition Audio + 147b 1c24 KN9 series mainboard + 0372 MCP55 Ethernet + 0373 MCP55 Ethernet + 147b 1c24 KN9 series mainboard + 0374 MCP55 PCI Express bridge + 0375 MCP55 PCI Express bridge + 0376 MCP55 PCI Express bridge + 0377 MCP55 PCI Express bridge + 0378 MCP55 PCI Express bridge + 037a MCP55 Memory Controller + 037e MCP55 SATA Controller + 037f MCP55 SATA Controller + 1028 0221 PowerEdge R805 MCP55 SATA Controller + 147b 1c24 KN9 series mainboard + 038b G73 [GeForce 7650 GS] + 0390 G73 [GeForce 7650 GS] + 0391 G73 [GeForce 7600 GT] + 1458 3427 GV-NX76T128D-RH + 1462 0452 NX7600GT-VT2D256E + 0392 G73 [GeForce 7600 GS] + 1462 0622 NX7600GS-T2D256EH + 0393 G73 [GeForce 7300 GT] + 10de 0412 NX7300GT-TD256EH + 1462 0412 NX7300GT-TD256EH + 0394 G73 [GeForce 7600 LE] + 0395 G73 [GeForce 7300 GT] + 0396 G73 + 0397 G73M [GeForce Go 7700] + 0398 G73M [GeForce Go 7600] + 1025 006c Aspire 9814WKMi + 0399 G73M [GeForce Go 7600 GT] + 039a G73M [Quadro NVS 300M] + 039b G73M [GeForce Go 7900 SE] + 039c G73GLM [Quadro FX 550M] + 10de 039c Quadro FX 560M + 039d G73 + 039e G73GL [Quadro FX 560] + 039f G73 + 03a0 C55 Host Bridge + 03a1 C55 Host Bridge + 03a2 C55 Host Bridge + 03a3 C55 Host Bridge + 03a4 C55 Host Bridge + 03a5 C55 Host Bridge + 03a6 C55 Host Bridge + 03a7 C55 Host Bridge + 03a8 C55 Memory Controller + 03a9 C55 Memory Controller + 03aa C55 Memory Controller + 03ab C55 Memory Controller + 03ac C55 Memory Controller + 03ad C55 Memory Controller + 03ae C55 Memory Controller + 03af C55 Memory Controller + 03b0 C55 Memory Controller + 03b1 C55 Memory Controller + 03b2 C55 Memory Controller + 03b3 C55 Memory Controller + 03b4 C55 Memory Controller + 03b5 C55 Memory Controller + 03b6 C55 Memory Controller + 03b7 C55 PCI Express bridge + 03b8 C55 PCI Express bridge + 03b9 C55 PCI Express bridge + 03ba C55 Memory Controller + 03bb C55 PCI Express bridge + 03bc C55 Memory Controller + 03d0 C61 [GeForce 6150SE nForce 430] + 1028 020e Inspiron 531 + 03d1 C61 [GeForce 6100 nForce 405] + 03d2 C61 [GeForce 6100 nForce 400] + 03d5 C61 [GeForce 6100 nForce 420] + 03d6 C61 [GeForce 7025 / nForce 630a] + 03e0 MCP61 LPC Bridge + 1028 020e Inspiron 531 + 1849 03e0 939NF6G-VSTA Board + 03e1 MCP61 LPC Bridge + 1043 83a4 M4N68T series motherboard + 03e2 MCP61 Host Bridge + 1043 83a4 M4N68T series motherboard + 03e3 MCP61 LPC Bridge + 03e4 MCP61 High Definition Audio + 03e5 MCP61 Ethernet + 03e6 MCP61 Ethernet + 03e7 MCP61 SATA Controller + 03e8 MCP61 PCI Express bridge + 1028 020e Inspiron 531 + 1849 03e8 939NF6G-VSTA Board + 03e9 MCP61 PCI Express bridge + 1028 020e Inspiron 531 + 1849 03e9 939NF6G-VSTA Board + 03ea MCP61 Memory Controller + 1028 020e Inspiron 531 + 1849 03ea 939NF6G-VSTA Board + 03eb MCP61 SMBus + 1028 020e Inspiron 531 + 1043 83a4 M4N68T series motherboard + 1849 03eb 939NF6G-VSTA Board + 03ec MCP61 IDE + 1025 0392 ET1350 + 1028 020e Inspiron 531 + 1043 83a4 M4N68T series motherboard + 1849 03ec 939NF6G-VSTA Board + 03ee MCP61 Ethernet + 03ef MCP61 Ethernet + 1025 8000 ET1350 + 1028 020e Inspiron 531 + 1043 83a4 M4N68T series motherboard + 1849 03ef 939NF6G-VSTA Board + 03f0 MCP61 High Definition Audio + 1028 020e Inspiron 531 + 1043 8415 M4N68T series motherboard + 1849 0888 939NF6G-VSTA Board + 03f1 MCP61 USB 1.1 Controller + 1028 020e Inspiron 531 + 1043 83a4 M4N68T series motherboard + 1849 03f1 939NF6G-VSTA Board + 03f2 MCP61 USB 2.0 Controller + 1028 020e Inspiron 531 + 1043 83a4 M4N68T series motherboard + 1849 03f2 939NF6G-VSTA Board + 03f3 MCP61 PCI bridge + 1028 020e Inspiron 531 + 1849 03f3 939NF6G-VSTA Board + 03f4 MCP61 SMU + 03f5 MCP61 Memory Controller + 1028 020e Inspiron 531 + 1043 83a4 M4N68T series motherboard + 1849 03eb 939NF6G-VSTA Board + 03f6 MCP61 SATA Controller + 1028 020e Inspiron 531 + 1043 83a4 M4N68T series motherboard + 1849 03f6 939NF6G-VSTA Board + 03f7 MCP61 SATA Controller + 0400 G84 [GeForce 8600 GTS] + 1043 8241 EN8600GTS + 0401 G84 [GeForce 8600 GT] + 0402 G84 [GeForce 8600 GT] + 1458 3455 GV-NX86T512H + 1462 0910 NX8600GT-T2D256EZ + 0403 G84 [GeForce 8600 GS] + 0404 G84 [GeForce 8400 GS] + 1462 1230 NX8400GS-TD256E + 0405 G84M [GeForce 9500M GS] + 0406 G84 [GeForce 8300 GS] + 0407 G84M [GeForce 8600M GT] + 0408 G84M [GeForce 9650M GS] + 0409 G84M [GeForce 8700M GT] + 040a G84GL [Quadro FX 370] + 040b G84GLM [Quadro NVS 320M] + 040c G84GLM [Quadro FX 570M] + 17aa 20d9 ThinkPad T61p + 040d G84GLM [Quadro FX 1600M] + 040e G84GL [Quadro FX 570] + 040f G84GL [Quadro FX 1700] + 0410 G92 [GeForce GT 330] + 0414 G92 [GeForce 9800 GT] + 0418 G92 [GeForce GT 330 OEM] + 0420 G86 [GeForce 8400 SE] + 0421 G86 [GeForce 8500 GT] + 1462 0960 NX8500GT-TD512EH/M2 + 0422 G86 [GeForce 8400 GS] + 0423 G86 [GeForce 8300 GS] + 0424 G86 [GeForce 8400 GS] + 0425 G86M [GeForce 8600M GS] + 1025 0121 Aspire 5920G + 1043 1514 F3SV + 0426 G86M [GeForce 8400M GT] + 0427 G86M [GeForce 8400M GS] + 103c 30cc Pavilion dv6700 + 103c 30cf Pavilion dv9668eg Laptop + 0428 G86M [GeForce 8400M G] + 0429 G86M [Quadro NVS 140M] + 17aa 20d8 ThinkPad T61 + 042a G86M [Quadro NVS 130M] + 042b G86M [Quadro NVS 135M] + 042c G86 [GeForce 9400 GT] + 042d G86GLM [Quadro FX 360M] + 042e G86M [GeForce 9300M G] + 042f G86 [Quadro NVS 290] + 0440 MCP65 LPC Bridge + 0441 MCP65 LPC Bridge + 0442 MCP65 LPC Bridge + 103c 30cf Pavilion dv9668eg Laptop + 0443 MCP65 LPC Bridge + 0444 MCP65 Memory Controller + 103c 30cf Pavilion dv9668eg Laptop + 0445 MCP65 Memory Controller + 0446 MCP65 SMBus + 103c 30cf Pavilion dv9668eg Laptop + 0447 MCP65 SMU + 103c 30cf Pavilion dv9500/9600/9700 series + 0448 MCP65 IDE + 103c 30cf Pavilion dv9668eg Laptop + 0449 MCP65 PCI bridge + 10de cb84 HP Pavilion dv9668eg Laptop + 044a MCP65 High Definition Audio + 103c 30cf Pavilion dv9668eg Laptop + 044b MCP65 High Definition Audio + 044c MCP65 AHCI Controller + 044d MCP65 AHCI Controller + 044e MCP65 AHCI Controller + 044f MCP65 AHCI Controller + 0450 MCP65 Ethernet + 103c 30cf Pavilion dv9668eg Laptop + 0451 MCP65 Ethernet + 0452 MCP65 Ethernet + 0453 MCP65 Ethernet + 0454 MCP65 USB 1.1 OHCI Controller + 103c 30cf Pavilion dv9668eg Laptop + 0455 MCP65 USB 2.0 EHCI Controller + 103c 30cf Pavilion dv9668eg Laptop + 0456 MCP65 USB Controller + 0457 MCP65 USB Controller + 0458 MCP65 PCI Express bridge + 10de 0000 MCP65 PCI Express bridge + 0459 MCP65 PCI Express bridge + 10de 0000 MCP65 PCI Express bridge + 045a MCP65 PCI Express bridge + 10de 0000 MCP65 PCI Express bridge + 045b MCP65 PCI Express bridge + 10de 0000 MCP65 PCI Express bridge + 045c MCP65 SATA Controller + 045d MCP65 SATA Controller + 103c 30cf Pavilion dv9668eg Laptop + 045e MCP65 SATA Controller + 045f MCP65 SATA Controller + 0531 C67 [GeForce 7150M / nForce 630M] + 0533 C67 [GeForce 7000M / nForce 610M] + 053a C68 [GeForce 7050 PV / nForce 630a] + 053b C68 [GeForce 7050 PV / nForce 630a] + 1043 8308 M2N68-AM Motherboard + 053e C68 [GeForce 7025 / nForce 630a] + 0541 MCP67 Memory Controller + 0542 MCP67 SMBus + 1043 8308 M2N68-AM Motherboard + 0543 MCP67 Co-processor + 0547 MCP67 Memory Controller + 1043 8308 M2N68-AM Motherboard + 1849 0547 ALiveNF7G-HDready + 0548 MCP67 ISA Bridge + 1043 8308 M2N68-AM Motherboard + 054c MCP67 Ethernet + 1043 8308 M2N68-AM Motherboard + 1849 054c ALiveNF7G-HDready, MCP67 Gigabit Ethernet + 054d MCP67 Ethernet + 054e MCP67 Ethernet + 054f MCP67 Ethernet + 0550 MCP67 AHCI Controller + 1043 8308 M2N68-AM Motherboard + 0554 MCP67 AHCI Controller + 1043 8308 M2N68-AM Motherboard + 0555 MCP67 SATA Controller + 1043 8308 M2N68-AM Motherboard + 055c MCP67 High Definition Audio + 1043 8290 M2N68-AM Motherboard + 055d MCP67 High Definition Audio + 055e MCP67 OHCI USB 1.1 Controller + 1043 8308 M2N68-AM Motherboard + 055f MCP67 EHCI USB 2.0 Controller + 1043 8308 M2N68-AM Motherboard + 0560 MCP67 IDE Controller + f043 8308 M2N68-AM Motherboard + 0561 MCP67 PCI Bridge + 0562 MCP67 PCI Express Bridge + 1849 0562 ALiveNF7G-HDready + 0563 MCP67 PCI Express Bridge + 0568 MCP78S [GeForce 8200] Memory Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0568 K10N78FullHD-hSLI R3.0 Memory Controller + 0569 MCP78S [GeForce 8200] PCI Express Bridge + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0569 K10N78FullHD-hSLI R3.0 PCI Express Bridge + 056a MCP73 [nForce 630i] USB 2.0 Controller (EHCI) + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 056c MCP73 IDE Controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 056d MCP73 PCI Express bridge + 1019 297a MCP73PVT-SM + 10de cb73 MCP73 PCI Bridge + 056e MCP73 PCI Express bridge + 1019 297a MCP73PVT-SM + 10de 0000 MCP73 PCIe x16 port + 056f MCP73 PCI Express bridge + 1019 297a MCP73PVT-SM + 10de 0000 MCP73 PCIe x1 port + 05b1 NF200 PCIe 2.0 switch + 05b8 NF200 PCIe 2.0 switch for GTX 295 + 05be NF200 PCIe 2.0 switch for Quadro Plex S4 / Tesla S870 / Tesla S1070 / Tesla S2050 + 05e0 GT200b [GeForce GTX 295] + 05e1 GT200 [GeForce GTX 280] + 05e2 GT200 [GeForce GTX 260] + 05e3 GT200b [GeForce GTX 285] + 1682 2490 GX-285N-ZDF + 05e6 GT200b [GeForce GTX 275] + 05e7 GT200GL [Tesla C1060 / M1060] + 10de 0595 Tesla T10 Processor + 10de 068f Tesla T10 Processor + 10de 0697 Tesla M1060 + 10de 0714 Tesla M1060 + 10de 0743 Tesla M1060 + 05ea GT200 [GeForce GTX 260] + 05eb GT200 [GeForce GTX 295] + 05ed GT200GL [Quadro Plex 2200 D2] + 05f1 GT200 [GeForce GTX 280] + 05f2 GT200 [GeForce GTX 260] + 05f8 GT200GL [Quadro Plex 2200 S4] + 05f9 GT200GL [Quadro CX] + 05fd GT200GL [Quadro FX 5800] + 05fe GT200GL [Quadro FX 4800] + 05ff GT200GL [Quadro FX 3800] + 0600 G92 [GeForce 8800 GTS 512] + 0601 G92 [GeForce 9800 GT] + 0602 G92 [GeForce 8800 GT] + 0603 G92 [GeForce GT 230 OEM] + 0604 G92 [GeForce 9800 GX2] + 0605 G92 [GeForce 9800 GT] + 0606 G92 [GeForce 8800 GS] + 0607 G92 [GeForce GTS 240] + 0608 G92M [GeForce 9800M GTX] + 0609 G92M [GeForce 8800M GTS] + 106b 00a7 GeForce 8800 GS + 060a G92M [GeForce GTX 280M] + 060b G92M [GeForce 9800M GT] + 060c G92M [GeForce 8800M GTX] + 060d G92 [GeForce 8800 GS] + 060f G92M [GeForce GTX 285M] + 0610 G92 [GeForce 9600 GSO] + 1682 2385 GeForce 9600 GSO 768mb + 0611 G92 [GeForce 8800 GT] + 107d 2ab0 Winfast PX8800 GT PCI-E + 1462 1170 NX8800GT series model V117 2xDVI+TV + 19da 1040 ZT-88TES2P-FSP + 0612 G92 [GeForce 9800 GTX / 9800 GTX+] + 0613 G92 [GeForce 9800 GTX+] + 0614 G92 [GeForce 9800 GT] + 107d 2ab3 WinFast PX9800 GT (S-Fanpipe) + 0615 G92 [GeForce GTS 250] + 3842 1150 GeForce GTS 250 P/N 512-P3-1150-TR +# Overclocked + 3842 1151 GeForce GTS 250 P/N 512-P3-1151-TR + 3842 1155 GeForce GTS 250 P/N 01G-P3-1155-TR +# Overclocked + 3842 1156 GeForce GTS 250 P/N 01G-P3-1156-TR + 0617 G92M [GeForce 9800M GTX] + 0618 G92M [GeForce GTX 260M] + 0619 G92GL [Quadro FX 4700 X2] + 061a G92GL [Quadro FX 3700] + 061b G92GL [Quadro VX 200] + 061c G92GLM [Quadro FX 3600M] + 061d G92GLM [Quadro FX 2800M] + 061e G92GLM [Quadro FX 3700M] + 061f G92GLM [Quadro FX 3800M] + 0620 G94 [GeForce 9800 GT] + 0621 G94 [GeForce GT 230] + 0622 G94 [GeForce 9600 GT] + 107d 2ac1 WinFast PX9600GT 1024MB + 1458 3481 GV-NX96T512HP + 0623 G94 [GeForce 9600 GS] + 0624 G94 [GeForce 9600 GT Green Edition] + 0625 G94 [GeForce 9600 GSO 512] + 0626 G94 [GeForce GT 130] + 0627 G94 [GeForce GT 140] + 0628 G94M [GeForce 9800M GTS] + 062a G94M [GeForce 9700M GTS] + 062b G94M [GeForce 9800M GS] + 062c G94M [GeForce 9800M GTS] + 062d G94 [GeForce 9600 GT] + 062e G94 [GeForce 9600 GT] + 106b 0605 GeForce GT 130 + 062f G94 [GeForce 9800 S] + 0630 G94 [GeForce 9600 GT] + 0631 G94M [GeForce GTS 160M] + 0632 G94M [GeForce GTS 150M] + 0633 G94 [GeForce GT 220] + 0635 G94 [GeForce 9600 GSO] + 0637 G94 [GeForce 9600 GT] + 0638 G94GL [Quadro FX 1800] + 063a G94GLM [Quadro FX 2700M] + 063f G94 [GeForce 9600 GE] + 0640 G96C [GeForce 9500 GT] + 0641 G96C [GeForce 9400 GT] + 1682 4009 PV-T94G-ZAFG + 0642 G96 [D9M-10] + 0643 G96 [GeForce 9500 GT] + 0644 G96 [GeForce 9500 GS] + 174b 9600 Geforce 9500GS 512M DDR2 V/D/HDMI + 0645 G96C [GeForce 9500 GS] + 0646 G96C [GeForce GT 120] + 0647 G96CM [GeForce 9600M GT] + 0648 G96CM [GeForce 9600M GS] + 0649 G96CM [GeForce 9600M GT] + 1043 202d GeForce GT 220M + 064a G96M [GeForce 9700M GT] + 064b G96M [GeForce 9500M G] + 064c G96CM [GeForce 9650M GT] + 064e G96C [GeForce 9600 GSO / 9800 GT] + 0651 G96CM [GeForce G 110M] + 0652 G96CM [GeForce GT 130M] + 152d 0850 GeForce GT 240M LE + 0653 G96CM [GeForce GT 120M] + 0654 G96CM [GeForce GT 220M] + 1043 14a2 GeForce GT 320M + 1043 14d2 GeForce GT 320M + 0655 G96 [GeForce GT 120 Mac Edition] + 0656 G96 [GeForce GT 120 Mac Edition] + 0658 G96GL [Quadro FX 380] + 0659 G96CGL [Quadro FX 580] + 065a G96GLM [Quadro FX 1700M] + 065b G96C [GeForce 9400 GT] + 065c G96GLM [Quadro FX 770M] + 065d G96 [GeForce 9500 GA / 9600 GT / GTS 250] + 065f G96C [GeForce G210] + 06c0 GF100 [GeForce GTX 480] + 06c4 GF100 [GeForce GTX 465] + 06ca GF100M [GeForce GTX 480M] + 06cb GF100 [GeForce GTX 480] + 06cd GF100 [GeForce GTX 470] + 06d0 GF100GL + 06d1 GF100GL [Tesla C2050 / C2070] + 10de 0771 Tesla C2050 + 10de 0772 Tesla C2070 + 06d2 GF100GL [Tesla M2070] + 10de 0774 Tesla M2070 + 10de 0830 Tesla M2070 + 10de 0842 Tesla M2070 + 10de 088f Tesla X2070 + 10de 0908 Tesla M2070 + 06d8 GF100GL [Quadro 6000] + 06d9 GF100GL [Quadro 5000] + 06da GF100GLM [Quadro 5000M] + 06dc GF100GL [Quadro 6000] + 06dd GF100GL [Quadro 4000] + 06de GF100GL [Tesla T20 Processor] + 10de 0773 Tesla S2050 + 10de 082f Tesla M2050 + 10de 0840 Tesla X2070 + 10de 0842 Tesla M2050 + 10de 0846 Tesla M2050 + 10de 0866 Tesla M2050 + 10de 0907 Tesla M2050 + 10de 091e Tesla M2050 + 06df GF100GL [Tesla M2070-Q] + 10de 084d Tesla M2070-Q + 10de 087f Tesla M2070-Q + 06e0 G98 [GeForce 9300 GE] + 107d 5a96 Geforce 9300GE + 06e1 G98 [GeForce 9300 GS] + 06e2 G98 [GeForce 8400] + 06e3 G98 [GeForce 8300 GS] + 06e4 G98 [GeForce 8400 GS Rev. 2] + 1458 3475 GV-NX84S256HE [GeForce 8400 GS] + 06e5 G98M [GeForce 9300M GS] + 06e6 G98 [GeForce G 100] + 06e7 G98 [GeForce 9300 SE] + 06e8 G98M [GeForce 9200M GS] + 103c 360b GeForce 9200M GE + 06e9 G98M [GeForce 9300M GS] + 1043 19b2 U6V laptop + 06ea G98M [Quadro NVS 150M] + 06eb G98M [Quadro NVS 160M] + 06ec G98M [GeForce G 105M] + 06ed G98 [GeForce 9600 GT / 9800 GT] + 06ee G98 [GeForce 9600 GT / 9800 GT / GT 240] + 06ef G98M [GeForce G 103M] + 06f1 G98M [GeForce G 105M] + 06f8 G98 [Quadro NVS 420] + 06f9 G98GL [Quadro FX 370 LP] + 06fa G98 [Quadro NVS 450] + 06fb G98GLM [Quadro FX 370M] + 06fd G98 [Quadro NVS 295] + 06ff G98 [HICx16 + Graphics] + 10de 0711 HICx8 + Graphics + 0751 MCP78S [GeForce 8200] Memory Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0751 K10N78FullHD-hSLI R3.0 Memory Controller + 0752 MCP78S [GeForce 8200] SMBus + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0752 K10N78FullHD-hSLI R3.0 SMBus + 0753 MCP78S [GeForce 8200] Co-Processor + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0753 K10N78FullHD-hSLI R3.0 Co-Processor + 0754 MCP78S [GeForce 8200] Memory Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0754 K10N78FullHD-hSLI R3.0 Memory Controller + 0759 MCP78S [GeForce 8200] IDE + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0759 K10N78FullHD-hSLI R3.0 IDE + 075a MCP78S [GeForce 8200] PCI Bridge + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1849 075a K10N78FullHD-hSLI R3.0 PCI Bridge + 075b MCP78S [GeForce 8200] PCI Express Bridge + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 075b K10N78FullHD-hSLI R3.0 PCI Express Bridge + 075c MCP78S [GeForce 8200] LPC Bridge + 103c 2a9e Pavilion p6310f + 1462 7508 K9N2GM-FIH + 1849 075c K10N78FullHD-hSLI R3.0 LPC Bridge + 075d MCP78S [GeForce 8200] LPC Bridge + 1043 82e8 M3N72-D + 0760 MCP77 Ethernet + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0760 K10N78FullHD-hSLI R3.0 Ethernet + 0761 MCP77 Ethernet + 0762 MCP77 Ethernet + 0763 MCP77 Ethernet + 0774 MCP72XE/MCP72P/MCP78U/MCP78S High Definition Audio + 103c 2a9e Pavilion p6310f +# has a Realtek ALC1200 HDAudio Codec + 1043 82fe M3N72-D + 1462 7508 K9N2GM-FIH + 1849 3662 K10N78FullHD-hSLI R3.0 High Definition Audio + 0778 MCP78S [GeForce 8200] PCI Express Bridge + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 0778 K10N78FullHD-hSLI R3.0 PCI Express Bridge + 077a MCP78S [GeForce 8200] PCI Bridge + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077a K10N78FullHD-hSLI R3.0 PCI Bridge + 077b MCP78S [GeForce 8200] OHCI USB 1.1 Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077b K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller + 077c MCP78S [GeForce 8200] EHCI USB 2.0 Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077c K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller + 077d MCP78S [GeForce 8200] OHCI USB 1.1 Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077d K10N78FullHD-hSLI R3.0 OHCI USB 1.1 Controller + 077e MCP78S [GeForce 8200] EHCI USB 2.0 Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1462 7508 K9N2GM-FIH + 1849 077e K10N78FullHD-hSLI R3.0 EHCI USB 2.0 Controller + 07c0 MCP73 Host Bridge + 1afa 7150 JW-IN7150-HD + 07c1 MCP73 Host Bridge + 1019 297a MCP73PVT-SM + 07c2 MCP73 Host Bridge + 07c3 MCP73 Host Bridge + 147b 1c3e I-N73V motherboard + 07c5 MCP73 Host Bridge + 07c8 MCP73 Memory Controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07cb nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07cd nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07ce nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07cf nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d0 nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d1 nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d2 nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d3 nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d6 nForce 610i/630i memory controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d7 MCP73 LPC Bridge + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d8 MCP73 SMBus + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07d9 MCP73 Memory Controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 07da MCP73 Co-processor + 1afa 7150 JW-IN7150-HD + 07dc MCP73 Ethernet + 147b 1c3e I-N73V motherboard + 07dd MCP73 Ethernet + 07de MCP73 Ethernet + 07df MCP73 Ethernet + 07e0 C73 [GeForce 7150 / nForce 630i] + 1afa 7150 JW-IN7150-HD + 07e1 C73 [GeForce 7100 / nForce 630i] + 1019 297a MCP73PVT-SM + 07e2 C73 [GeForce 7050 / nForce 630i] + 07e3 C73 [GeForce 7050 / nForce 610i] + 147b 1c3e I-N73V motherboard + 07e5 C73 [GeForce 7100 / nForce 620i] + 07f0 MCP73 SATA Controller (IDE mode) + 147b 1c3e I-N73V motherboard + 07f4 GeForce 7100/nForce 630i SATA + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 07f8 MCP73 SATA RAID Controller + 147b 1c3e I-N73V motherboard + 07fc MCP73 High Definition Audio + 1019 297a MCP73PVT-SM + 10de 07fc MCP73 High Definition Audio + 147b 1c3e I-N73V motherboard + 07fe MCP73 OHCI USB 1.1 Controller + 1019 297a MCP73PVT-SM + 147b 1c3e I-N73V motherboard + 1afa 7150 JW-IN7150-HD + 0840 C77 [GeForce 8200M] + 0844 C77 [GeForce 9100M G] + 0845 C77 [GeForce 8200M G] + 0846 C77 [GeForce 9200] + 0847 C78 [GeForce 9100] + 103c 2a9e Pavilion p6310f + 0848 C77 [GeForce 8300] + 0849 C77 [GeForce 8200] + 1462 7508 K9N2GM-FIH + 1849 0849 K10N78FullHD-hSLI R3.0 GeForce 8200 + 084a C77 [nForce 730a] + 084b C77 [GeForce 8200] + 084c C77 [nForce 780a/980a SLI] + 084d C77 [nForce 750a SLI] + 1043 82e8 M3N72-D mGPU + 084f C77 [GeForce 8100 / nForce 720a] + 0860 C79 [GeForce 9300] + 0861 C79 [GeForce 9400] + 0862 C79 [GeForce 9400M G] + 0863 C79 [GeForce 9400M] + 106b 00aa MacBook5,1 + 0864 C79 [GeForce 9300] + 0865 C79 [GeForce 9300 / ION] + 0866 C79 [GeForce 9400M G] + 106b 00b1 GeForce 9400M + 0867 C79 [GeForce 9400] + 106b 00ad iMac 9,1 + 0868 C79 [nForce 760i SLI] + 0869 MCP7A [GeForce 9400] + 086a C79 [GeForce 9400] + 086c C79 [GeForce 9300 / nForce 730i] + 086d C79 [GeForce 9200] + 086e C79 [GeForce 9100M G] + 086f MCP79 [GeForce 8200M G] + 0870 C79 [GeForce 9400M] + 0871 C79 [GeForce 9200] + 0872 C79 [GeForce G102M] + 1043 19b4 GeForce G102M + 1043 1aa2 GeForce G102M + 1043 1c02 GeForce G102M + 1043 1c42 GeForce G205M + 0873 C79 [GeForce G102M] + 1043 19b4 GeForce G102M + 1043 1c12 GeForce G102M + 1043 1c52 GeForce G205M + 0874 C79 [ION] + 0876 C79 [GeForce 9400M / ION] + 087a C79 [GeForce 9400] + 087d C79 [ION] + 19da a123 IONITX-F-E + 087e C79 [ION LE] + 087f C79 [ION LE] + 08a0 MCP89 [GeForce 320M] + 08a2 MCP89 [GeForce 320M] + 08a3 MCP89 [GeForce 320M] + 08a4 MCP89 [GeForce 320M] + 08a5 MCP89 [GeForce 320M] + 0a20 GT216 [GeForce GT 220] + 1043 8311 ENGT220/DI/1GD3(LP)/V2 + 0a21 GT216M [GeForce GT 330M] + 0a22 GT216 [GeForce 315] + 0a23 GT216 [GeForce 210] + 0a24 GT216 [GeForce 405] + 0a26 GT216 [GeForce 405] + 0a27 GT216 [GeForce 405] + 0a28 GT216M [GeForce GT 230M] + 0a29 GT216M [GeForce GT 330M] + 0a2a GT216M [GeForce GT 230M] + 0a2b GT216M [GeForce GT 330M] + 0a2c GT216M [NVS 5100M] + 0a2d GT216M [GeForce GT 320M] + 0a30 GT216 [GeForce 505] + 0a32 GT216 [GeForce GT 415] + 0a34 GT216M [GeForce GT 240M] + 0a35 GT216M [GeForce GT 325M] + 0a38 GT216GL [Quadro 400] + 0a3c GT216GLM [Quadro FX 880M] + 0a60 GT218 [GeForce G210] + 0a62 GT218 [GeForce 205] + 0a63 GT218 [GeForce 310] + 0a64 GT218 [ION] + 0a65 GT218 [GeForce 210] + 1043 8334 EN210 SILENT + 1458 36a9 GV-N210D3-1GI (rev. 6.0/6.1) + 1462 8094 N210 [Geforce 210] PCIe graphics adapter + 19da 7222 GeForce 210 1GB [Synergy Edition] + 0a66 GT218 [GeForce 310] + 0a67 GT218 [GeForce 315] + 0a68 GT218M [GeForce G 105M] + 0a69 GT218M [GeForce G 105M] + 0a6a GT218M [NVS 2100M] + 0a6c GT218M [NVS 3100M] + 1028 040b Latitude E6510 + 17aa 2142 ThinkPad T410 + 0a6e GT218M [GeForce 305M] + 0a6f GT218M [ION] + 0a70 GT218M [GeForce 310M] + 0a71 GT218M [GeForce 305M] + 0a72 GT218M [GeForce 310M] + 0a73 GT218M [GeForce 305M] + 0a74 GT218M [GeForce G210M] + 1b0a 903a GeForce G210 + 0a75 GT218M [GeForce 310M] + 0a76 GT218M [ION 2] + 0a78 GT218GL [Quadro FX 380 LP] + 0a7a GT218M [GeForce 315M] + 104d 907e GeForce 315M + 1179 fc50 GeForce 315M + 1179 fc61 GeForce 315M + 1179 fc71 GeForce 315M + 1179 fc90 GeForce 315M + 1179 fcc0 GeForce 315M + 1179 fcd0 GeForce 315M + 1179 fce2 GeForce 315M + 1179 fcf2 GeForce 315M + 1179 fd16 GeForce 315M + 1179 fd40 GeForce 315M + 1179 fd50 GeForce 315M + 1179 fd52 GeForce 315M + 1179 fd61 GeForce 315M + 1179 fd71 GeForce 315M + 1179 fd92 GeForce 315M + 1179 fd96 GeForce 315M + 1179 fdd0 GeForce 315M + 1179 fdd2 GeForce 315M + 1179 fdfe GeForce 315M + 144d c0a2 GeForce 315M + 144d c0b2 GeForce 315M + 144d c581 GeForce 315M + 144d c587 GeForce 315M + 144d c588 GeForce 315M + 144d c597 GeForce 315M + 144d c606 GeForce 315M + 1462 aa51 GeForce 405 + 1462 aa58 GeForce 405 + 1462 ac71 GeForce 405 + 1462 ac81 GeForce 315M + 1462 ac82 GeForce 405 + 1462 ae33 GeForce 405 + 1642 3980 GeForce 405 + 17aa 3950 GeForce 405M + 17aa 397d GeForce 405M + 1b0a 2091 GeForce 315M + 1b0a 90b4 GeForce 405 + 1bfd 0003 GeForce 405 + 1bfd 8006 GeForce 405 + 1bfd 8007 GeForce 315M + 0a7b GT218 [GeForce 505] + 0a7c GT218GLM [Quadro FX 380M] + 0a80 MCP79 Host Bridge + 0a81 MCP79 Host Bridge + 0a82 MCP79 Host Bridge + 0a83 MCP79 Host Bridge + 0a84 MCP79 Host Bridge + 0a85 MCP79 Host Bridge + 0a86 MCP79 Host Bridge + 0a87 MCP79 Host Bridge + 0a88 MCP79 Memory Controller + 0a89 MCP79 Memory Controller + 0a98 MCP79 Memory Controller + 10de cb79 iMac 9,1 + 0aa0 MCP79 PCI Express Bridge + 10de cb79 Apple iMac 9,1 + 0aa2 MCP79 SMBus + 10de cb79 Apple iMac 9,1 + 19da a123 IONITX-F-E + 0aa3 MCP79 Co-processor + 10de cb79 Apple iMac 9,1 + 19da a123 IONITX-F-E + 0aa4 MCP79 Memory Controller + 19da a123 IONITX-F-E + 0aa5 MCP79 OHCI USB 1.1 Controller + 10de cb79 Apple iMac 9,1 + 19da a123 IONITX-F-E + 0aa6 MCP79 EHCI USB 2.0 Controller + 10de cb79 Apple iMac 9,1 + 19da a123 IONITX-F-E + 0aa7 MCP79 OHCI USB 1.1 Controller + 10de cb79 Apple iMac 9,1 + 19da a123 IONITX-F-E + 0aa8 MCP79 OHCI USB 1.1 Controller + 0aa9 MCP79 EHCI USB 2.0 Controller + 10de cb79 Apple iMac 9,1 + 19da a123 IONITX-F-E + 0aaa MCP79 EHCI USB 2.0 Controller + 0aab MCP79 PCI Bridge + 10de cb79 Apple iMac 9,1 + 0aac MCP79 LPC Bridge + 0aad MCP79 LPC Bridge + 19da a123 IONITX-F-E + 0aae MCP79 LPC Bridge + 10de cb79 Apple iMac 9,1 + 0aaf MCP79 LPC Bridge + 0ab0 MCP79 Ethernet + 10de cb79 Apple iMac 9,1 + 19da a123 IONITX-F-E + 0ab1 MCP79 Ethernet + 0ab2 MCP79 Ethernet + 0ab3 MCP79 Ethernet + 0ab4 MCP79 SATA Controller + 19da a123 IONITX-F-E + 0ab5 MCP79 SATA Controller + 0ab6 MCP79 SATA Controller + 0ab7 MCP79 SATA Controller + 0ab8 MCP79 AHCI Controller + 0ab9 MCP79 AHCI Controller + 10de cb79 Apple iMac 9,1 + 0aba MCP79 AHCI Controller + 0abb MCP79 AHCI Controller + 0abc MCP79 RAID Controller + 0abd MCP79 RAID Controller + 0abe MCP79 RAID Controller + 0abf MCP79 RAID Controller + 0ac0 MCP79 High Definition Audio + 10de cb79 Apple iMac 9,1 + 0ac1 MCP79 High Definition Audio + 0ac2 MCP79 High Definition Audio + 0ac3 MCP79 High Definition Audio + 0ac4 MCP79 PCI Express Bridge + 10de cb79 Apple iMac 9,1 + 0ac5 MCP79 PCI Express Bridge + 0ac6 MCP79 PCI Express Bridge + 10de cb79 Apple iMac 9,1 + 0ac7 MCP79 PCI Express Bridge + 10de cb79 Apple iMac 9,1 + 0ac8 MCP79 PCI Express Bridge + 0ad0 MCP78S [GeForce 8200] SATA Controller (non-AHCI mode) + 1462 7508 K9N2GM-FIH + 1849 0ad0 K10N78FullHD-hSLI R3.0 IDE + 0ad4 MCP78S [GeForce 8200] AHCI Controller + 103c 2a9e Pavilion p6310f + 1043 82e8 M3N72-D + 1849 0ad4 K10N78FullHD-hSLI R3.0 AHCI Controller + 0ad8 MCP78S [GeForce 8200] SATA Controller (RAID mode) + 0be2 GT216 HDMI Audio Controller + 1043 8311 ENGT220/DI/1GD3(LP)/V2 + 0be3 High Definition Audio Controller + 1028 040b Latitude E6510 + 10de 066d G98 [GeForce 8400GS] + 1462 8094 N210 [Geforce 210] PCIe graphics adapter + 0be4 High Definition Audio Controller + 0be5 GF100 High Definition Audio Controller + 0be9 GF106 High Definition Audio Controller + 1558 8687 CLEVO/KAPOK W860CU + 3842 1452 GeForce GTS 450 + 0bea GF108 High Definition Audio Controller + 3842 1430 GeForce GT 430 + 0beb GF104 High Definition Audio Controller + 1462 2322 N460GTX Cyclone 1GD5/OC + 0bee GF116 High Definition Audio Controller + 0bf0 Tegra2 PCIe x4 Bridge + 0bf1 Tegra2 PCIe x2 Bridge + 0ca0 GT215 [GeForce GT 330] + 0ca2 GT215 [GeForce GT 320] + 0ca3 GT215 [GeForce GT 240] + 0ca4 GT215 [GeForce GT 340] + 0ca5 GT215 [GeForce GT 220] + 0ca7 GT215 [GeForce GT 330] + 0ca8 GT215M [GeForce GTS 260M] + 0ca9 GT215M [GeForce GTS 250M] + 0cac GT215 [GeForce GT 220/315] + 0caf GT215M [GeForce GT 335M] + 0cb0 GT215M [GeForce GTS 350M] + 0cb1 GT215M [GeForce GTS 360M] + 0cbc GT215GLM [Quadro FX 1800M] + 0d60 MCP89 HOST Bridge + 0d68 MCP89 Memory Controller + 0d69 MCP89 Memory Controller + 0d76 MCP89 PCI Express Bridge + 0d79 MCP89 SMBus + 0d7a MCP89 Co-Processor + 0d7b MCP89 Memory Controller + 0d7d MCP89 Ethernet + 0d80 MCP89 LPC Bridge + 0d85 MCP89 SATA Controller + 0d88 MCP89 SATA Controller (AHCI mode) + 0d89 MCP89 SATA Controller (AHCI mode) + 0d8d MCP89 SATA Controller (RAID mode) + 0d94 MCP89 High Definition Audio + 0d9c MCP89 OHCI USB 1.1 Controller + 0d9d MCP89 EHCI USB 2.0 Controller + 0dc0 GF106 [GeForce GT 440] + 0dc4 GF106 [GeForce GTS 450] + 0dc5 GF106 [GeForce GTS 450 OEM] + 0dc6 GF106 [GeForce GTS 450 OEM] + 0dcd GF106M [GeForce GT 555M] + 0dce GF106M [GeForce GT 555M] + 0dd1 GF106M [GeForce GTX 460M] + 1558 8687 CLEVO/KAPOK W860CU + 0dd2 GF106M [GeForce GT 445M] + 0dd3 GF106M [GeForce GT 435M] + 0dd6 GF106M [GeForce GT 550M] + 0dd8 GF106GL [Quadro 2000] + 10de 0914 Quadro 2000D + 0dda GF106GLM [Quadro 2000M] + 0de0 GF108 [GeForce GT 440] + 0de1 GF108 [GeForce GT 430] + 3842 1430 GeForce GT 430 + 0de2 GF108 [GeForce GT 420] + 0de3 GF108M [GeForce GT 635M] + 0de4 GF108 [GeForce GT 520] + 0de5 GF108 [GeForce GT 530] + 0de7 GF108 [GeForce GT 610] + 0de8 GF108M [GeForce GT 620M] + 0de9 GF108M [GeForce GT 620M/630M/635M/640M LE] + 1025 0692 GeForce GT 620M + 1025 0725 GeForce GT 620M + 1025 0728 GeForce GT 620M + 1025 072b GeForce GT 620M + 1025 072e GeForce GT 620M + 1025 0753 GeForce GT 620M + 1025 0754 GeForce GT 620M + 17aa 3977 GeForce GT 640M LE + 1b0a 2210 GeForce GT 635M + 0dea GF108M [GeForce 610M] + 17aa 365a GeForce 615 + 17aa 365b GeForce 615 + 17aa 365e GeForce 615 + 17aa 3660 GeForce 615 + 17aa 366c GeForce 615 + 0deb GF108M [GeForce GT 555M] + 0dec GF108M [GeForce GT 525M] + 0ded GF108M [GeForce GT 520M] + 0dee GF108M [GeForce GT 415M] + 0def GF108M [NVS 5400M] + 0df0 GF108M [GeForce GT 425M] + 0df1 GF108M [GeForce GT 420M] + 0df2 GF108M [GeForce GT 435M] + 0df3 GF108M [GeForce GT 420M] + 0df4 GF108M [GeForce GT 540M] + 152d 0952 GeForce GT 630M + 152d 0953 GeForce GT 630M + 0df5 GF108M [GeForce GT 525M] + 0df6 GF108M [GeForce GT 550M] + 0df7 GF108M [GeForce GT 520M] + 0df8 GF108GL [Quadro 600] + 0df9 GF108GLM [Quadro 500M] + 0dfa GF108GLM [Quadro 1000M] + 0dfc GF108GLM [NVS 5200M] + 0e08 GF119 HDMI Audio Controller + 1043 83a0 ENGT520 SILENT +# 1024MB with passive cooling (heatsink) + 10b0 104a Gainward GeForce GT 610 + 0e09 GF110 High Definition Audio Controller + 0e0a GK104 HDMI Audio Controller + 0e0b GK106 HDMI Audio Controller + 0e0c GF114 HDMI Audio Controller + 0e0f GK208 HDMI/DP Audio Controller + 0e12 TegraK1 PCIe x4 Bridge + 0e13 TegraK1 PCIe x1 Bridge + 0e1a GK110 High Definition Audio Controller + 0e1b GK107 HDMI Audio Controller + 103c 197b ZBook 15 + 1043 8428 GTX650-DC-1GD5 + 0e1c Tegra3+ PCIe x4 Bridge + 0e1d Tegra3+ PCIe x2 Bridge + 0e22 GF104 [GeForce GTX 460] + 1462 2322 N460GTX Cyclone 1GD5/OC + 0e23 GF104 [GeForce GTX 460 SE] + 0e24 GF104 [GeForce GTX 460 OEM] + 0e30 GF104M [GeForce GTX 470M] + 0e31 GF104M [GeForce GTX 485M] + 0e3a GF104GLM [Quadro 3000M] + 0e3b GF104GLM [Quadro 4000M] + 0f00 GF108 [GeForce GT 630] + 0f01 GF108 [GeForce GT 620] + 0f02 GF108 [GeForce GT 730] + 0f03 GF108 [GeForce GT 610] + 0f06 GF108 [GeForce GT 730] + 0fb0 GM200 High Definition Audio + 0fb8 GP108 High Definition Audio Controller + 0fb9 GP107GL High Definition Audio Controller + 0fba GM206 High Definition Audio Controller + 0fbb GM204 High Definition Audio Controller + 0fbc GM107 High Definition Audio Controller [GeForce 940MX] + 0fc0 GK107 [GeForce GT 640 OEM] + 0fc1 GK107 [GeForce GT 640] + 0fc2 GK107 [GeForce GT 630 OEM] + 0fc5 GK107 [GeForce GT 1030] + 0fc6 GK107 [GeForce GTX 650] + 1043 8428 GTX650-DC-1GD5 + 0fc8 GK107 [GeForce GT 740] + 0fc9 GK107 [GeForce GT 730] + 0fcd GK107M [GeForce GT 755M] + 0fce GK107M [GeForce GT 640M LE] + 0fd1 GK107M [GeForce GT 650M] + 1043 1597 GeForce GT 650M + 1043 15a7 GeForce GT 650M + 1043 2103 N56VZ + 1043 2105 GeForce GT 650M + 1043 2141 GeForce GT 650M + 0fd2 GK107M [GeForce GT 640M] + 1028 054f GeForce GT 640M + 1028 055f GeForce GT 640M + 1028 0595 GeForce GT 640M LE + 1028 05b2 GeForce GT 640M LE + 0fd3 GK107M [GeForce GT 640M LE] + 0fd4 GK107M [GeForce GTX 660M] + 0fd5 GK107M [GeForce GT 650M Mac Edition] + 0fd6 GK107M + 0fd8 GK107M [GeForce GT 640M Mac Edition] + 0fd9 GK107M [GeForce GT 645M] + 0fdb GK107M + 0fdf GK107M [GeForce GT 740M] + 0fe0 GK107M [GeForce GTX 660M Mac Edition] + 0fe1 GK107M [GeForce GT 730M] + 0fe2 GK107M [GeForce GT 745M] + 0fe3 GK107M [GeForce GT 745M] + 103c 2b16 GeForce GT 745A + 17aa 3675 GeForce GT 745A + 0fe4 GK107M [GeForce GT 750M] + 0fe5 GK107 [GeForce K340 USM] + 0fe6 GK107 [GRID K1 NVS USM] +# GRID K1 USM + 0fe7 GK107GL [GRID K100 vGPU] + 10de 101e GRID K100 + 0fe8 GK107M + 0fe9 GK107M [GeForce GT 750M Mac Edition] + 0fea GK107M [GeForce GT 755M Mac Edition] + 0fec GK107M [GeForce 710A] + 0fed GK107M [GeForce 820M] + 0fee GK107M [GeForce 810M] + 0fef GK107GL [GRID K340] + 0ff1 GK107 [NVS 1000] + 0ff2 GK107GL [GRID K1] + 0ff3 GK107GL [Quadro K420] + 0ff5 GK107GL [GRID K1 Tesla USM] + 0ff6 GK107GLM [Quadro K1100M] + 103c 197b ZBook 15 +# GRID K1 Quadro USM + 0ff7 GK107GL [GRID K140Q vGPU] + 10de 1037 GRID K140Q + 0ff8 GK107GLM [Quadro K500M] + 0ff9 GK107GL [Quadro K2000D] + 0ffa GK107GL [Quadro K600] + 0ffb GK107GLM [Quadro K2000M] + 0ffc GK107GLM [Quadro K1000M] + 0ffd GK107 [NVS 510] + 0ffe GK107GL [Quadro K2000] + 0fff GK107GL [Quadro 410] + 1001 GK110B [GeForce GTX TITAN Z] + 1003 GK110 [GeForce GTX Titan LE] + 1004 GK110 [GeForce GTX 780] + 3842 0784 GK110B [GeForce GTX 780 SC w/ ACX Cooler] + 3842 1784 GK110B [GeForce GTX 780 Dual FTW w/ ACX Cooler] + 3842 1788 GK110B [GeForce GTX 780 Dual Classified w/ ACX Cooler] + 1005 GK110 [GeForce GTX TITAN] + 1043 8451 GTXTITAN-6GD5 +# Reference Model + 10de 1035 GeForce GTX Titan +# 06G-P4-2790-KR + 3842 2790 GeForce GTX Titan +# 06G-P4-2791-KR + 3842 2791 GeForce GTX Titan SC +# 06G-P4-2793-KR + 3842 2793 GeForce GTX Titan SC Signature +# 06G-P4-2794-KR + 3842 2794 GeForce GTX Titan SC Hydro Copper +# 06G-P4-2795-KR + 3842 2795 GeForce GTX Titan SC Hydro Copper Signature + 1007 GK110 [GeForce GTX 780 Rev. 2] + 1008 GK110 [GeForce GTX 780 Ti 6GB] + 100a GK110B [GeForce GTX 780 Ti] + 100c GK110B [GeForce GTX TITAN Black] + 101e GK110GL [Tesla K20X] + 101f GK110GL [Tesla K20] + 1020 GK110GL [Tesla K20X] + 1021 GK110GL [Tesla K20Xm] + 1022 GK110GL [Tesla K20c] + 1023 GK110BGL [Tesla K40m] + 10de 097e 12GB Computational Accelerator + 1024 GK180GL [Tesla K40c] + 1026 GK110GL [Tesla K20s] + 1027 GK110BGL [Tesla K40st] + 1028 GK110GL [Tesla K20m] + 1029 GK110BGL [Tesla K40s] + 102a GK110BGL [Tesla K40t] + 102d GK210GL [Tesla K80] + 102e GK110BGL [Tesla K40d] + 102f GK110BGL [Tesla Stella Solo] + 103a GK110GL [Quadro K6000] + 103c GK110GL [Quadro K5200] + 103f GK110BGL [Tesla Stella SXM] + 1040 GF119 [GeForce GT 520] + 1043 83a0 ENGT520 SILENT + 1042 GF119 [GeForce 510] + 1045 GF119 + 1048 GF119 [GeForce 605] + 1049 GF119 [GeForce GT 620 OEM] + 104a GF119 [GeForce GT 610] +# 1024MB with passive cooling (heatsink) + 10b0 104a Gainward GeForce GT 610 + 104b GF119 [GeForce GT 625 OEM] + 104c GF119 [GeForce GT 705] + 104d GF119 [GeForce GT 710] + 1050 GF119M [GeForce GT 520M] + 1051 GF119M [GeForce GT 520MX] + 1052 GF119M [GeForce GT 520M] + 1054 GF119M [GeForce 410M] + 1055 GF119M [GeForce 410M] + 1056 GF119M [NVS 4200M] + 1057 GF119M [Quadro NVS 4200M] + 1058 GF119M [GeForce 610M] + 103c 2aed GeForce 610 + 103c 2af1 GeForce 610 + 1043 10ac GeForce GT 610M + 1043 10bc GeForce GT 610M + 1043 1652 GeForce GT 610M + 17aa 367a GeForce 610M + 17aa 3682 GeForce 800A + 17aa 3687 GeForce 800A + 17aa 3692 GeForce 705A + 17aa 3695 GeForce 800A + 17aa a117 GeForce 610M + 1059 GF119M [GeForce 610M] + 105a GF119M [GeForce 610M] + 1043 2111 GeForce GT 610M + 1043 2112 GeForce GT 610M + 105b GF119M [GeForce 705M] + 103c 2afb GeForce 705A + 17aa 309d GeForce 705A + 17aa 30b1 GeForce 800A + 17aa 30f3 GeForce 705A + 17aa 36a1 GeForce 800A + 107c GF119 [NVS 315] + 107d GF119 [NVS 310] + 1080 GF110 [GeForce GTX 580] + 1081 GF110 [GeForce GTX 570] + 10de 087e Leadtek WinFast GTX 570 + 1082 GF110 [GeForce GTX 560 Ti OEM] + 1084 GF110 [GeForce GTX 560 OEM] + 1086 GF110 [GeForce GTX 570 Rev. 2] + 1087 GF110 [GeForce GTX 560 Ti 448 Cores] + 1088 GF110 [GeForce GTX 590] + 1089 GF110 [GeForce GTX 580 Rev. 2] + 108b GF110 [GeForce GTX 580] + 108e GF110GL [Tesla C2090] + 1091 GF110GL [Tesla M2090] + 10de 088e Tesla X2090 + 10de 0891 Tesla X2090 + 10de 0974 Tesla X2090 + 10de 098d Tesla X2090 + 1094 GF110GL [Tesla M2075] + 10de 0888 Tesla M2075 + 1096 GF110GL [Tesla C2050 / C2075] + 10de 0910 Tesla C2075 + 10de 0911 Tesla C2050 + 109a GF100GLM [Quadro 5010M] + 109b GF100GL [Quadro 7000] + 10de 0918 Quadro 7000 + 10c0 GT218 [GeForce 9300 GS Rev. 2] + 10c3 GT218 [GeForce 8400 GS Rev. 3] + 10c5 GT218 [GeForce 405] + 10d8 GT218 [NVS 300] + 10ef GP102 HDMI Audio Controller + 10f0 GP104 High Definition Audio Controller + 10f1 GP106 High Definition Audio Controller + 1043 85b6 DUAL-GTX1060-O6G [GeForce GTX 1060 6GB Dual] + 10f7 TU102 High Definition Audio Controller + 10f8 TU104 HD Audio Controller + 10f9 TU106 High Definition Audio Controller + 1043 8673 TURBO-RTX2070-8G + 1140 GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M] + 1019 0799 GeForce 820M + 1019 999f GeForce GT 720M + 1025 0600 GeForce GT 620M + 1025 0606 GeForce GT 620M + 1025 064a GeForce GT 620M + 1025 064c GeForce GT 620M + 1025 067a GeForce GT 620M + 1025 0680 GeForce GT 620M + 1025 0686 GeForce 710M + 1025 0689 GeForce 710M + 1025 068b GeForce 710M + 1025 068d GeForce 710M + 1025 068e GeForce 710M + 1025 0691 GeForce 710M + 1025 0692 GeForce GT 620M + 1025 0694 GeForce GT 620M + 1025 0702 GeForce GT 620M + 1025 0719 GeForce GT 620M + 1025 0725 GeForce GT 620M + 1025 0728 GeForce GT 620M + 1025 072b GeForce GT 620M + 1025 072e GeForce GT 620M + 1025 0732 GeForce GT 620M + 1025 0763 GeForce GT 720M + 1025 0773 GeForce 710M + 1025 0774 GeForce 710M + 1025 0776 GeForce GT 720M + 1025 077a GeForce 710M + 1025 077b GeForce 710M + 1025 077c GeForce 710M + 1025 077d GeForce 710M + 1025 077e GeForce 710M + 1025 077f GeForce 710M + 1025 0781 GeForce GT 720M + 1025 0798 GeForce GT 720M + 1025 0799 GeForce GT 720M + 1025 079b GeForce GT 720M + 1025 079c GeForce GT 720M + 1025 0807 GeForce GT 720M + 1025 0821 GeForce GT 720M + 1025 0823 GeForce GT 720M + 1025 0830 GeForce GT 720M + 1025 0833 GeForce GT 720M + 1025 0837 GeForce GT 720M + 1025 083e GeForce 820M + 1025 0841 GeForce 710M + 1025 0854 GeForce 820M + 1025 0855 GeForce 820M + 1025 0856 GeForce 820M + 1025 0857 GeForce 820M + 1025 0858 GeForce 820M + 1025 0863 GeForce 820M + 1025 0868 GeForce 820M + 1025 0869 GeForce 810M + 1025 0873 GeForce 820M + 1025 0878 GeForce 820M + 1025 087b GeForce 820M + 1025 087c GeForce 810M + 1025 0881 GeForce 820M + 1025 088a GeForce 820M + 1025 089b GeForce 820M + 1025 090f GeForce 820M + 1025 0921 GeForce 820M + 1025 092e GeForce 810M + 1025 092f GeForce 820M + 1025 0932 GeForce 820M + 1025 093a GeForce 820M + 1025 093c GeForce 820M + 1025 093f GeForce 820M + 1025 0941 GeForce 820M + 1025 0945 GeForce 820M + 1025 0954 GeForce 820M + 1025 0965 GeForce 820M + 1028 054d GeForce GT 630M + 1028 054e GeForce GT 630M + 1028 0554 GeForce GT 620M + 1028 0557 GeForce GT 620M + 1028 0562 GeForce GT 625M + 1028 0565 GeForce GT 630M + 1028 0568 GeForce GT 630M + 1028 0590 GeForce GT 630M + 1028 0592 GeForce GT 625M + 1028 0594 GeForce GT 625M + 1028 0595 GeForce GT 625M + 1028 05a2 GeForce GT 625M + 1028 05b1 GeForce GT 625M + 1028 05b3 GeForce GT 625M + 1028 05da GeForce GT 630M + 1028 05de GeForce GT 720M + 1028 05e0 GeForce GT 720M + 1028 05e8 GeForce GT 630M + 1028 05f4 GeForce GT 720M + 1028 060f GeForce GT 720M + 1028 064e GeForce 820M + 1028 0652 GeForce 820M + 1028 0653 GeForce 820M + 1028 0655 GeForce 820M + 1028 065e GeForce 820M + 1028 0662 GeForce 820M + 1028 068d GeForce 820M + 1028 06ad GeForce 820M + 1028 06ae GeForce 820M + 1028 06af GeForce 820M + 1028 06b0 GeForce 820M + 1028 06c0 GeForce 820M + 1028 06c1 GeForce 820M + 103c 18ef GeForce GT 630M + 103c 18f9 GeForce GT 630M + 103c 18fb GeForce GT 630M + 103c 18fd GeForce GT 630M + 103c 18ff GeForce GT 630M + 103c 218a GeForce 820M + 103c 21bb GeForce 820M + 103c 21bc GeForce 820M + 103c 220e GeForce 820M + 103c 2210 GeForce 820M + 103c 2212 GeForce 820M + 103c 2214 GeForce 820M + 103c 2218 GeForce 820M + 103c 225b GeForce 820M + 103c 225d GeForce 820M + 103c 226d GeForce 820M + 103c 226f GeForce 820M + 103c 22d2 GeForce 820M + 103c 22d9 GeForce 820M + 103c 2335 GeForce 820M + 103c 2337 GeForce 820M + 103c 2aef GeForce GT 720A + 103c 2af9 GeForce 710A + 1043 10dd NVS 5200M + 1043 10ed NVS 5200M + 1043 11fd GeForce GT 720M + 1043 124d GeForce GT 720M + 1043 126d GeForce GT 720M + 1043 131d GeForce GT 720M + 1043 13fd GeForce GT 720M + 1043 14c7 GeForce GT 720M + 1043 1507 GeForce GT 620M + 1043 15ad GeForce 820M + 1043 15ed GeForce 820M + 1043 160d GeForce 820M + 1043 163d GeForce 820M + 1043 166d GeForce 820M + 1043 16cd GeForce 820M + 1043 16dd GeForce 820M + 1043 170d GeForce 820M + 1043 176d GeForce 820M + 1043 178d GeForce 820M + 1043 179d GeForce 820M + 1043 17dd GeForce 820M + 1043 2132 GeForce GT 620M + 1043 2136 NVS 5200M + 1043 21ba GeForce GT 720M + 1043 21fa GeForce GT 720M + 1043 220a GeForce GT 720M + 1043 221a GeForce GT 720M + 1043 223a GeForce GT 710M + 1043 224a GeForce GT 710M + 1043 227a GeForce 820M + 1043 228a GeForce 820M + 1043 232a GeForce 820M + 1043 233a GeForce 820M + 1043 235a GeForce 820M + 1043 236a GeForce 820M + 1043 238a GeForce 820M + 1043 8595 GeForce GT 720M + 1043 85ea GeForce GT 720M + 1043 85eb GeForce 820M + 1043 85ec GeForce 820M + 1043 85ee GeForce GT 720M + 1043 85f3 GeForce 820M + 1043 860e GeForce 820M + 1043 861a GeForce 820M + 1043 861b GeForce 820M + 1043 8628 GeForce 820M + 1043 8643 GeForce 820M + 1043 864c GeForce 820M + 1043 8652 GeForce 820M + 1043 8660 GeForce 820M + 1043 8661 GeForce 820M + 105b 0dac GeForce GT 720M + 105b 0dad GeForce GT 720M + 105b 0ef3 GeForce GT 720M + 1072 152d GeForce GT 720M + 10cf 17f5 GeForce GT 720M + 1179 fa01 GeForce 710M + 1179 fa02 GeForce 710M + 1179 fa03 GeForce 710M + 1179 fa05 GeForce 710M + 1179 fa11 GeForce 710M + 1179 fa13 GeForce 710M + 1179 fa18 GeForce 710M + 1179 fa19 GeForce 710M + 1179 fa21 GeForce 710M + 1179 fa23 GeForce 710M + 1179 fa2a GeForce 710M + 1179 fa32 GeForce 710M + 1179 fa33 GeForce 710M + 1179 fa36 GeForce 710M + 1179 fa38 GeForce 710M + 1179 fa42 GeForce 710M + 1179 fa43 GeForce 710M + 1179 fa45 GeForce 710M + 1179 fa47 GeForce 710M + 1179 fa49 GeForce 710M + 1179 fa58 GeForce 710M + 1179 fa59 GeForce 710M + 1179 fa88 GeForce 710M + 1179 fa89 GeForce 710M + 144d b092 GeForce GT 620M + 144d c0d5 GeForce GT 630M + 144d c0d7 GeForce GT 620M + 144d c0e2 NVS 5200M + 144d c0e3 NVS 5200M + 144d c0e4 NVS 5200M + 144d c10d GeForce 820M + 144d c652 GeForce GT 620M on NP300E5C series laptop + 144d c709 GeForce 710M + 144d c711 GeForce 710M + 144d c736 GeForce 710M + 144d c737 GeForce 710M + 144d c745 GeForce 820M + 144d c750 GeForce 820M + 1462 10b8 GeForce GT 710M + 1462 10e9 GeForce GT 720M + 1462 1116 GeForce 820M + 1462 aa33 GeForce 720M + 1462 aaa2 GeForce GT 720M + 1462 aaa3 GeForce 820M + 1462 acb2 GeForce GT 720M + 1462 acc1 GeForce GT 720M + 1462 ae61 GeForce 720M + 1462 ae65 GeForce GT 720M + 1462 ae6a GeForce 820M + 1462 ae71 GeForce GT 720M + 14c0 0083 GeForce 820M + 152d 0926 GeForce 620M + 152d 0982 GeForce GT 630M + 152d 0983 GeForce GT 630M + 152d 1005 GeForce GT 820M + 152d 1012 GeForce 710M + 152d 1019 GeForce 820M + 152d 1030 GeForce GT 630M + 152d 1055 GeForce 710M + 152d 1067 GeForce GT 720M + 152d 1072 GeForce GT 720M + 152d 1086 GeForce 820M + 152d 1092 GeForce 820M + 17aa 2200 NVS 5200M + 17aa 2213 GeForce GT 720M + 17aa 2220 GeForce GT 720M + 17aa 309c GeForce GT 720A + 17aa 30b4 GeForce 820A + 17aa 30b7 GeForce 720A + 17aa 30e4 GeForce 820A + 17aa 361b GeForce 820A + 17aa 361c GeForce 820A + 17aa 361d GeForce 820A + 17aa 3656 GeForce GT 620M + 17aa 365a GeForce 705M + 17aa 365e GeForce 800M + 17aa 3661 GeForce 820A + 17aa 366c GeForce 800M + 17aa 3685 GeForce 800M + 17aa 3686 GeForce 800M + 17aa 3687 GeForce 705A + 17aa 3696 GeForce 820A + 17aa 369b GeForce 820A + 17aa 369c GeForce 820A + 17aa 369d GeForce 820A + 17aa 369e GeForce 820A + 17aa 36a9 GeForce 820A + 17aa 36af GeForce 820A + 17aa 36b0 GeForce 820A + 17aa 36b6 GeForce 820A + 17aa 3800 GeForce GT 720M + 17aa 3801 GeForce GT 720M + 17aa 3802 GeForce GT 720M + 17aa 3803 GeForce GT 720M + 17aa 3804 GeForce GT 720M + 17aa 3806 GeForce GT 720M + 17aa 3808 GeForce GT 720M + 17aa 380d GeForce 820M + 17aa 380e GeForce 820M + 17aa 380f GeForce 820M + 17aa 3811 GeForce 820M + 17aa 3812 GeForce 820M + 17aa 3813 GeForce 820M + 17aa 3816 GeForce 820M + 17aa 3818 GeForce 820M + 17aa 381a GeForce 820M + 17aa 381c GeForce 820M + 17aa 3901 GeForce 610M / GT 620M + 17aa 3902 GeForce 710M + 17aa 3903 GeForce 610M/710M + 17aa 3904 GeForce GT 620M/625M + 17aa 3905 GeForce GT 720M + 17aa 3907 GeForce 820M + 17aa 3910 GeForce 720M + 17aa 3912 GeForce 720M + 17aa 3913 GeForce 820M + 17aa 3915 GeForce 820M + 17aa 3977 GeForce GT 720M + 17aa 3983 GeForce 610M + 17aa 5001 GeForce 610M + 17aa 5003 GeForce GT 720M + 17aa 5005 GeForce 705M + 17aa 500d GeForce GT 620M + 17aa 5014 GeForce 710M + 17aa 5017 GeForce 710M + 17aa 5019 GeForce 710M + 17aa 501a GeForce 710M + 17aa 501f GeForce GT 720M + 17aa 5025 GeForce 710M + 17aa 5027 GeForce 710M + 17aa 502a GeForce 710M + 17aa 502b GeForce GT 720M + 17aa 502d GeForce 710M + 17aa 502e GeForce GT 720M + 17aa 502f GeForce GT 720M + 17aa 5030 GeForce 705M + 17aa 5031 GeForce 705M + 17aa 5032 GeForce 820M + 17aa 5033 GeForce 820M + 17aa 503e GeForce 710M + 17aa 503f GeForce 820M + 17aa 5040 GeForce 820M + 1854 0177 GeForce 710M + 1854 0180 GeForce 710M + 1854 0190 GeForce GT 720M + 1854 0192 GeForce GT 720M + 1854 0224 GeForce 820M + 1b0a 01c0 GeForce 820M + 1b0a 20dd GeForce GT 620M + 1b0a 20df GeForce GT 620M + 1b0a 210e GeForce 820M + 1b0a 2202 GeForce GT 720M + 1b0a 90d7 GeForce 820M + 1b0a 90dd GeForce 820M + 1b50 5530 GeForce 820M + 1b6c 5531 GeForce GT 720M + 1bab 0106 GeForce 820M + 1d05 1013 GeForce 810M + 1180 GK104 [GeForce GTX 680] + 1043 83f1 GTX680-DC2-2GD5 + 3842 3682 GeForce GTX 680 Mac Edition + 1182 GK104 [GeForce GTX 760 Ti] + 1183 GK104 [GeForce GTX 660 Ti] + 1184 GK104 [GeForce GTX 770] + 1185 GK104 [GeForce GTX 660 OEM] + 10de 106f GK104 [GeForce GTX 760 OEM] + 1186 GK104 [GeForce GTX 660 Ti] + 1187 GK104 [GeForce GTX 760] + 1188 GK104 [GeForce GTX 690] + 1189 GK104 [GeForce GTX 670] + 10de 1074 GK104 [GeForce GTX 760 Ti OEM] + 118a GK104GL [GRID K520] + 118b GK104GL [GRID K2 GeForce USM] + 118c GK104 [GRID K2 NVS USM] +# GRID K2 USM + 118d GK104GL [GRID K200 vGPU] + 10de 101d GRID K200 + 118e GK104 [GeForce GTX 760 OEM] + 118f GK104GL [Tesla K10] + 1191 GK104 [GeForce GTX 760 Rev. 2] + 1193 GK104 [GeForce GTX 760 Ti OEM] + 1194 GK104GL [Tesla K8] + 1195 GK104 [GeForce GTX 660 Rev. 2] + 1198 GK104M [GeForce GTX 880M] + 1199 GK104M [GeForce GTX 870M] + 119a GK104M [GeForce GTX 860M] + 119d GK104M [GeForce GTX 775M Mac Edition] + 119e GK104M [GeForce GTX 780M Mac Edition] + 119f GK104M [GeForce GTX 780M] + 11a0 GK104M [GeForce GTX 680M] + 11a1 GK104M [GeForce GTX 670MX] + 11a2 GK104M [GeForce GTX 675MX Mac Edition] + 11a3 GK104M [GeForce GTX 680MX] + 106b 010d iMac 13,2 + 11a7 GK104M [GeForce GTX 675MX] + 11a9 GK104M [GeForce GTX 870M] + 11af GK104GLM [GRID IceCube] + 11b0 GK104GL [GRID K240Q / K260Q vGPU] + 10de 101a GRID K240Q + 10de 101b GRID K260Q + 11b1 GK104GL [GRID K2 Tesla USM] + 11b4 GK104GL [Quadro K4200] + 11b6 GK104GLM [Quadro K3100M] + 11b7 GK104GLM [Quadro K4100M] + 11b8 GK104GLM [Quadro K5100M] + 11b9 GK104GLM + 11ba GK104GL [Quadro K5000] + 11bb GK104GL [Quadro 4100] + 11bc GK104GLM [Quadro K5000M] + 11bd GK104GLM [Quadro K4000M] + 11be GK104GLM [Quadro K3000M] + 11bf GK104GL [GRID K2] + 11c0 GK106 [GeForce GTX 660] + 11c2 GK106 [GeForce GTX 650 Ti Boost] + 1043 845b GeForce GTX 650 Ti Boost DirectCU II OC + 1462 2874 GeForce GTX 650 Ti Boost TwinFrozr II OC + 1569 11c2 GeForce GTX 650 Ti Boost OC + 19da 1281 GeForce GTX 650 Ti Boost OC + 3842 3657 GeForce GTX 650 Ti Boost + 3842 3658 GeForce GTX 650 Ti Boost Superclocked + 11c3 GK106 [GeForce GTX 650 Ti OEM] + 10de 1030 GeForce GTX 650 Ti OEM + 11c4 GK106 [GeForce GTX 645 OEM] + 11c5 GK106 [GeForce GT 740] + 11c6 GK106 [GeForce GTX 650 Ti] + 11c7 GK106 [GeForce GTX 750 Ti] + 11c8 GK106 [GeForce GTX 650 OEM] + 11cb GK106 [GeForce GT 740] + 11e0 GK106M [GeForce GTX 770M] + 11e1 GK106M [GeForce GTX 765M] + 11e2 GK106M [GeForce GTX 765M] + 11e3 GK106M [GeForce GTX 760M] + 17aa 3683 GeForce GTX 760A + 11e7 GK106M + 11fa GK106GL [Quadro K4000] + 11fc GK106GLM [Quadro K2100M] + 1200 GF114 [GeForce GTX 560 Ti] + 1201 GF114 [GeForce GTX 560] + 1202 GF114 [GeForce GTX 560 Ti OEM] + 1203 GF114 [GeForce GTX 460 SE v2] + 1205 GF114 [GeForce GTX 460 v2] + 1206 GF114 [GeForce GTX 555] + 1207 GF114 [GeForce GT 645 OEM] + 1208 GF114 [GeForce GTX 560 SE] + 1210 GF114M [GeForce GTX 570M] + 1211 GF114M [GeForce GTX 580M] + 1212 GF114M [GeForce GTX 675M] + 1213 GF114M [GeForce GTX 670M] + 1241 GF116 [GeForce GT 545 OEM] + 1243 GF116 [GeForce GT 545] + 1244 GF116 [GeForce GTX 550 Ti] + 1245 GF116 [GeForce GTS 450 Rev. 2] + 1246 GF116M [GeForce GT 550M] + 1247 GF116M [GeForce GT 555M/635M] + 1043 1752 GeForce GT 555M + 1043 2050 GeForce GT 555M + 1043 2051 GeForce GT 555M + 1043 212a GeForce GT 635M + 1043 212b GeForce GT 635M + 1043 212c GeForce GT 635M + 152d 0930 GeForce GT 635M + 1248 GF116M [GeForce GT 555M/635M] + 152d 0930 GeForce GT 635M + 17c0 10e7 GeForce GT 555M + 17c0 10e8 GeForce GT 555M + 17c0 10ea GeForce GT 555M + 1854 0890 GeForce GT 555M + 1854 0891 GeForce GT 555M + 1854 1795 GeForce GT 555M + 1854 1796 GeForce GT 555M + 1854 3005 GeForce GT 555M + 1249 GF116 [GeForce GTS 450 Rev. 3] + 124b GF116 [GeForce GT 640 OEM] + 124d GF116M [GeForce GT 555M/635M] + 1028 0491 GeForce GT 555M + 1028 0570 GeForce GT 555M + 1028 0571 GeForce GT 555M + 1462 108d GeForce GT 555M + 1462 10cc GeForce GT 635M + 1251 GF116M [GeForce GT 560M] + 1280 GK208 [GeForce GT 635] + 1281 GK208 [GeForce GT 710] + 1282 GK208 [GeForce GT 640 Rev. 2] + 1284 GK208 [GeForce GT 630 Rev. 2] + 1286 GK208 [GeForce GT 720] + 1287 GK208B [GeForce GT 730] + 1288 GK208B [GeForce GT 720] + 1289 GK208 [GeForce GT 710] + 128a GK208B + 128b GK208B [GeForce GT 710] + 1043 85f7 GT710-SL-1GD5 + 1043 8770 GT710-4H-SL-2GD5 + 128c GK208B + 1290 GK208M [GeForce GT 730M] + 103c 2afa GeForce GT 730A + 103c 2b04 GeForce GT 730A + 1043 13ad GeForce GT 730M + 1043 13cd GeForce GT 730M + 1291 GK208M [GeForce GT 735M] + 1292 GK208M [GeForce GT 740M] + 17aa 3675 GeForce GT 740A + 17aa 367c GeForce GT 740A + 17aa 3684 GeForce GT 740A + 1293 GK208M [GeForce GT 730M] + 1294 GK208M [GeForce GT 740M] + 1295 GK208M [GeForce 710M] + 103c 2b0d GeForce 710A + 103c 2b0f GeForce 710A + 103c 2b11 GeForce 710A + 103c 2b20 GeForce 810A + 103c 2b21 GeForce 810A + 103c 2b22 GeForce 810A + 17aa 367a GeForce 805A + 17aa 367c GeForce 710A + 1296 GK208M [GeForce 825M] + 1298 GK208M [GeForce GT 720M] + 1299 GK208BM [GeForce 920M] + 17aa 30bb GeForce 920A + 17aa 30df GeForce 920A + 17aa 36a7 GeForce 920A + 17aa 36af GeForce 920M + 129a GK208BM [GeForce 910M] + 12a0 GK208 + 12b9 GK208GLM [Quadro K610M] + 12ba GK208GLM [Quadro K510M] + 1340 GM108M [GeForce 830M] + 103c 2b2b GeForce 830A + 1341 GM108M [GeForce 840M] + 17aa 3697 GeForce 840A + 17aa 3699 GeForce 840A + 17aa 369c GeForce 840A + 1344 GM108M [GeForce 845M] + 1346 GM108M [GeForce 930M] + 1347 GM108M [GeForce 940M] + 1348 GM108M [GeForce 945M / 945A] + 1349 GM108M [GeForce 930M] + 134b GM108M [GeForce 940MX] + 134d GM108M [GeForce 940MX] + 17aa 2248 ThinkPad T570 + 134e GM108M [GeForce 930MX] + 134f GM108M [GeForce 920MX] + 137a GM108GLM [Quadro K620M / Quadro M500M] + 17aa 505a Quadro M500M + 137b GM108GLM [Quadro M520 Mobile] + 137d GM108M [GeForce 940A] + 1380 GM107 [GeForce GTX 750 Ti] + 1381 GM107 [GeForce GTX 750] + 1382 GM107 [GeForce GTX 745] + 1389 GM107GL [GRID M30] + 1390 GM107M [GeForce 845M] + 1391 GM107M [GeForce GTX 850M] + 17aa 3697 GeForce GTX 850A + 17aa a125 GeForce GTX 850A + 1392 GM107M [GeForce GTX 860M] + 1393 GM107M [GeForce 840M] + 1398 GM107M [GeForce 845M] + 1399 GM107M [GeForce 945M] + 139a GM107M [GeForce GTX 950M] + 17aa 362c GeForce GTX 950A + 17aa 362f GeForce GTX 950A + 17aa 363f GeForce GTX 950A + 17aa 3640 GeForce GTX 950A + 17aa 3647 GeForce GTX 950A + 17aa 36b9 GeForce GTX 950A + 139b GM107M [GeForce GTX 960M] + 1028 06e4 XPS 15 9550 + 103c 2b4c GeForce GTX 960A + 139c GM107M [GeForce 940M] + 139d GM107M [GeForce GTX 750 Ti] + 13b0 GM107GLM [Quadro M2000M] + 13b1 GM107GLM [Quadro M1000M] + 13b2 GM107GLM [Quadro M600M] + 13b3 GM107GLM [Quadro K2200M] + 13b4 GM107GLM [Quadro M620 Mobile] + 13b6 GM107GLM [Quadro M1200 Mobile] + 13b9 GM107GL [NVS 810] + 13ba GM107GL [Quadro K2200] + 13bb GM107GL [Quadro K620] + 13bc GM107GL [Quadro K1200] + 13bd GM107GL [Tesla M10] + 10de 110a GRID M40 + 10de 1160 Tesla M10 + 10de 11d2 GRID M10-8Q + 13c0 GM204 [GeForce GTX 980] + 1043 8504 GTX980-4GD5 + 13c1 GM204 + 13c2 GM204 [GeForce GTX 970] + 13c3 GM204 + 13d7 GM204M [GeForce GTX 980M] + 13d8 GM204M [GeForce GTX 970M] + 13d9 GM204M [GeForce GTX 965M] + 13da GM204M [GeForce GTX 980 Mobile] + 13e7 GM204GL [GeForce GTX 980 Engineering Sample] + 13f0 GM204GL [Quadro M5000] + 13f1 GM204GL [Quadro M4000] + 13f2 GM204GL [Tesla M60] + 10de 114d GRID M60-1Q + 10de 114e GRID M60-2Q + 10de 1150 GRID M60-8Q + 10de 11b0 GRID M60-4A + 13f3 GM204GL [Tesla M6] + 10de 1184 GRID M6-8Q + 13f8 GM204GLM [Quadro M5000M / M5000 SE] + 13f9 GM204GLM [Quadro M4000M] + 13fa GM204GLM [Quadro M3000M] + 10de 11c9 Quadro M3000 SE + 13fb GM204GLM [Quadro M5500] + 1401 GM206 [GeForce GTX 960] + 1402 GM206 [GeForce GTX 950] + 1404 GM206 [GeForce GTX 960 FAKE] + 1406 GM206 [GeForce GTX 960 OEM] + 1407 GM206 [GeForce GTX 750 v2] + 1427 GM206M [GeForce GTX 965M] + 103c 825b OMEN-17-w001nv + 1430 GM206GL [Quadro M2000] + 1431 GM206GL [Tesla M4] + 1436 GM206GLM [Quadro M2200 Mobile] + 15f0 GP100GL [Quadro GP100] + 15f1 GP100GL + 15f7 GP100GL [Tesla P100 PCIe 12GB] + 15f8 GP100GL [Tesla P100 PCIe 16GB] + 15f9 GP100GL [Tesla P100 SXM2 16GB] + 1617 GM204M [GeForce GTX 980M] + 1618 GM204M [GeForce GTX 970M] + 1619 GM204M [GeForce GTX 965M] + 161a GM204M [GeForce GTX 980 Mobile] + 1667 GM204M [GeForce GTX 965M] + 1725 GP100 + 172e GP100 + 172f GP100 + 174d GM108M [GeForce MX130] + 174e GM108M [GeForce MX110] + 1789 GM107GL [GRID M3-3020] + 179c GM107 [GeForce 940MX] + 1025 1094 Acer Aspire E5-575G + 17c2 GM200 [GeForce GTX TITAN X] + 17c8 GM200 [GeForce GTX 980 Ti] + 17f0 GM200GL [Quadro M6000] + 10de 1141 VCA 6000 + 17f1 GM200GL [Quadro M6000 24GB] + 17fd GM200GL [Tesla M40] + 1ad0 Tegra PCIe x8 Endpoint + 1ad1 Tegra PCIe x4/x8 Endpoint/Root Complex + 1ad2 Tegra PCIe x1 Root Complex + 1ad3 Xavier SATA Controller + 1ad6 TU102 USB 3.1 Host Controller + 1ad7 TU102 USB Type-C UCSI Controller + 1ad8 TU104 USB 3.1 Host Controller + 1ad9 TU104 USB Type-C UCSI Controller + 1ada TU106 USB 3.1 Host Controller + 1043 8673 TURBO-RTX2070-8G + 1adb TU106 USB Type-C UCSI Controller + 1043 8673 TURBO-RTX2070-8G + 1aeb TU116 High Definition Audio Controller + 1aec TU116 USB 3.1 Host Controller + 1aed TU116 USB Type-C UCSI Controller + 1aef GA102 High Definition Audio Controller + 1b00 GP102 [TITAN X] + 1b01 GP102 [GeForce GTX 1080 Ti 10GB] + 1b02 GP102 [TITAN Xp] + 1b04 GP102 + 1b06 GP102 [GeForce GTX 1080 Ti] + 1b07 GP102 [P102-100] + 1b30 GP102GL [Quadro P6000] + 1b38 GP102GL [Tesla P40] + 1b39 GP102GL [Tesla P10] + 1b70 GP102GL + 1b78 GP102GL + 1b80 GP104 [GeForce GTX 1080] + 1b81 GP104 [GeForce GTX 1070] + 1b82 GP104 [GeForce GTX 1070 Ti] + 1b83 GP104 [GeForce GTX 1060 6GB] + 1b84 GP104 [GeForce GTX 1060 3GB] + 1b87 GP104 [P104-100] + 1ba0 GP104M [GeForce GTX 1080 Mobile] + 1ba1 GP104M [GeForce GTX 1070 Mobile] + 1458 1651 GeForce GTX 1070 Max-Q + 1462 11e8 GeForce GTX 1070 Max-Q + 1462 11e9 GeForce GTX 1070 Max-Q + 1558 9501 GeForce GTX 1070 Max-Q + 1ba2 GP104M [GeForce GTX 1070 Mobile] + 1ba9 GP104M + 1baa GP104M + 1bad GP104 [GeForce GTX 1070 Engineering Sample] + 1bb0 GP104GL [Quadro P5000] + 1bb1 GP104GL [Quadro P4000] + 1bb3 GP104GL [Tesla P4] + 1bb4 GP104GL [Tesla P6] + 1bb5 GP104GLM [Quadro P5200 Mobile] + 103c 842f P5200 [Zbook 17 G5 mobile workstation] + 1bb6 GP104GLM [Quadro P5000 Mobile] + 1bb7 GP104GLM [Quadro P4000 Mobile] + 1462 11e9 Quadro P4000 Max-Q + 1bb8 GP104GLM [Quadro P3000 Mobile] + 1bb9 GP104GLM [Quadro P4200 Mobile] + 103c 842f P4200 [Zbook 17 G5 mobile workstation] + 1bbb GP104GLM [Quadro P3200 Mobile] + 103c 842f P3200 [Zbook 17 G5 moble workstation] + 1bc7 GP104 [P104-101] + 1be0 GP104BM [GeForce GTX 1080 Mobile] + 1028 07c0 GeForce GTX 1080 Max-Q + 1458 355b GeForce GTX 1080 Max-Q + 1be1 GP104BM [GeForce GTX 1070 Mobile] + 1c00 GP106 + 1c01 GP106 + 1c02 GP106 [GeForce GTX 1060 3GB] + 1c03 GP106 [GeForce GTX 1060 6GB] + 1043 85b6 DUAL-GTX1060-O6G [GeForce GTX 1060 6GB Dual] + 1c04 GP106 [GeForce GTX 1060 5GB] + 1c06 GP106 [GeForce GTX 1060 6GB Rev. 2] + 1c07 GP106 [P106-100] + 1c09 GP106 [P106-090] + 1c20 GP106M [GeForce GTX 1060 Mobile] + 17aa 39b9 GeForce GTX 1060 Max-Q 3GB + 1c21 GP106M [GeForce GTX 1050 Ti Mobile] + 1c22 GP106M [GeForce GTX 1050 Mobile] + 1c23 GP106M [GeForce GTX 1060 Mobile Rev. 2] + 1414 0020 GTX 1060 Mobile + 1c2d GP106M + 1c30 GP106GL [Quadro P2000] + 1c31 GP106GL [Quadro P2200] + 1c35 GP106M [Quadro P2000 Mobile] + 1c36 GP106 [P106M] + 1c60 GP106BM [GeForce GTX 1060 Mobile 6GB] + 103c 8390 GeForce GTX 1060 Max-Q 6GB + 1c61 GP106BM [GeForce GTX 1050 Ti Mobile] + 1c62 GP106BM [GeForce GTX 1050 Mobile] + 1c70 GP106GL + 1c81 GP107 [GeForce GTX 1050] + 1c82 GP107 [GeForce GTX 1050 Ti] + 1043 8613 PH-GTX1050TI-4G + 1458 3763 GV-N105TOC-4GD + 1c83 GP107 [GeForce GTX 1050 3GB] + 1c8c GP107M [GeForce GTX 1050 Ti Mobile] + 1c8d GP107M [GeForce GTX 1050 Mobile] + 1c8e GP107M + 1c8f GP107M [GeForce GTX 1050 Ti Max-Q] + 1c90 GP107M [GeForce MX150] + 1c91 GP107M [GeForce GTX 1050 3 GB Max-Q] + 1c92 GP107M [GeForce GTX 1050 Mobile] + 1c94 GP107M [GeForce MX350] + 1c96 GP107M [GeForce MX350] + 1ca7 GP107GL + 1ca8 GP107GL + 1caa GP107GL + 1cb1 GP107GL [Quadro P1000] + 1cb2 GP107GL [Quadro P600] + 1cb3 GP107GL [Quadro P400] + 1cb6 GP107GL [Quadro P620] + 1cba GP107GLM [Quadro P2000 Mobile] + 103c 842c P2000 [Zbook 15 G5 mobile workstation] + 103c 842f P2000 [Zbook 17 G5 mobile workstation] + 1cbb GP107GLM [Quadro P1000 Mobile] + 103c 8429 P1000 [Zbook Studio G5 mobile workstation] + 103c 842c P1000 [Zbook 15 G5 mobile workstation] + 103c 842f P1000 [Zbook 17 G5 mobile workstation] + 103c 8451 P1000 [Zbook Studio x360 G5 mobile workstation] + 1cbc GP107GLM [Quadro P600 Mobile] + 1cbd GP107GLM [Quadro P620] + 1ccc GP107BM [GeForce GTX 1050 Ti Mobile] + 1ccd GP107BM [GeForce GTX 1050 Mobile] + 1cfa GP107GL [Quadro P2000] + 1cfb GP107GL [Quadro P1000] + 1d01 GP108 [GeForce GT 1030] + 1d02 GP108 [GeForce GT 1010] + 1d10 GP108M [GeForce MX150] + 17aa 225e ThinkPad T480 + 1d11 GP108M [GeForce MX230] + 1d12 GP108M [GeForce MX150] + 1d72 1701 Mi Notebook Pro [GeForce MX150] + 1d13 GP108M [GeForce MX250] + 1d16 GP108M [GeForce MX330] + 1d33 GP108GLM [Quadro P500 Mobile] + 1d34 GP108GLM [Quadro P520] + 1d52 GP108BM [GeForce MX250] + 1d56 GP108BM [GeForce MX330] + 1d81 GV100 [TITAN V] + 1db1 GV100GL [Tesla V100 SXM2 16GB] + 1db2 GV100GL [Tesla V100 DGXS 16GB] + 1db3 GV100GL [Tesla V100 FHHL 16GB] + 1db4 GV100GL [Tesla V100 PCIe 16GB] + 1db5 GV100GL [Tesla V100 SXM2 32GB] + 1db6 GV100GL [Tesla V100 PCIe 32GB] + 1db7 GV100GL [Tesla V100 DGXS 32GB] + 1db8 GV100GL [Tesla V100 SXM3 32GB] + 10de 131d Tesla V100-SXM3-32GB-H + 1dba GV100GL [Quadro GV100] + 10de 12eb TITAN V CEO Edition + 1df0 GV100GL [Tesla PG500-216] + 1df2 GV100GL [Tesla PG503-216] + 1df5 GV100GL [Tesla V100 SXM2 16GB] + 1df6 GV100GL [Tesla V100S PCIe 32GB] + 1e02 TU102 [TITAN RTX] + 1e04 TU102 [GeForce RTX 2080 Ti] + 1e07 TU102 [GeForce RTX 2080 Ti Rev. A] + 1462 3715 RTX 2080 Ti GAMING X TRIO + 1e09 TU102 [CMP 50HX] + 1e2d TU102 [GeForce RTX 2080 Ti Engineering Sample] + 1e2e TU102 [GeForce RTX 2080 Ti 12GB Engineering Sample] + 1e30 TU102GL [Quadro RTX 6000/8000] + 10de 129e Quadro RTX 8000 + 10de 12ba Quadro RTX 6000 + 1e36 TU102GL [Quadro RTX 6000] + 1e37 TU102GL [GRID RTX T10-4/T10-8/T10-16] + 10de 1347 GRID RTX T10-8 + 10de 1348 GRID RTX T10-4 + 10de 1370 GRID RTX T10-16 + 1e38 TU102GL + 1e3c TU102GL + 1e3d TU102GL + 1e3e TU102GL + 1e78 TU102GL [Quadro RTX 6000/8000] + 10de 13d8 Quadro RTX 8000 + 10de 13d9 Quadro RTX 6000 + 1e81 TU104 [GeForce RTX 2080 SUPER] + 1e82 TU104 [GeForce RTX 2080] + 1e84 TU104 [GeForce RTX 2070 SUPER] + 1e87 TU104 [GeForce RTX 2080 Rev. A] + 1e89 TU104 [GeForce RTX 2060] + 1e90 TU104M [GeForce RTX 2080 Mobile] + 1e91 TU104M [GeForce RTX 2070 SUPER Mobile / Max-Q] + 1e93 TU104M [GeForce RTX 2080 SUPER Mobile / Max-Q] + 1eab TU104M + 1eae TU104M + 1eb0 TU104GL [Quadro RTX 5000] + 1eb1 TU104GL [Quadro RTX 4000] + 1eb4 TU104GL [T4G] + 1eb5 TU104GLM [Quadro RTX 5000 Mobile / Max-Q] + 1eb6 TU104GLM [Quadro RTX 4000 Mobile / Max-Q] + 1eb8 TU104GL [Tesla T4] + 1eb9 TU104GL + 1ebe TU104GL + 1ec2 TU104 [GeForce RTX 2070 SUPER] + 1ec7 TU104 [GeForce RTX 2070 SUPER] + 1ed0 TU104BM [GeForce RTX 2080 Mobile] + 1ed1 TU104BM [GeForce RTX 2070 SUPER Mobile / Max-Q] + 1ed3 TU104BM [GeForce RTX 2080 SUPER Mobile / Max-Q] + 1ef5 TU104GLM [Quadro RTX 5000 Mobile Refresh] + 1f02 TU106 [GeForce RTX 2070] + 1043 8673 TURBO RTX 2070 + 1f03 TU106 [GeForce RTX 2060 12GB] + 1f04 TU106 + 1f06 TU106 [GeForce RTX 2060 SUPER] + 1f07 TU106 [GeForce RTX 2070 Rev. A] + 1f08 TU106 [GeForce RTX 2060 Rev. A] + 1f09 TU106 [GeForce GTX 1660 SUPER] + 1f0a TU106 [GeForce GTX 1650] + 1f0b TU106 [CMP 40HX] + 1f10 TU106M [GeForce RTX 2070 Mobile] + 1f11 TU106M [GeForce RTX 2060 Mobile] + 1f12 TU106M [GeForce RTX 2060 Max-Q] + 1f14 TU106M [GeForce RTX 2070 Mobile / Max-Q Refresh] + 1f15 TU106M [GeForce RTX 2060 Mobile] + 1f2e TU106M + 1f36 TU106GLM [Quadro RTX 3000 Mobile / Max-Q] + 1f42 TU106 [GeForce RTX 2060 SUPER] + 1f47 TU106 [GeForce RTX 2060 SUPER] + 1f50 TU106BM [GeForce RTX 2070 Mobile / Max-Q] + 1f51 TU106BM [GeForce RTX 2060 Mobile] + 1f54 TU106BM [GeForce RTX 2070 Mobile] + 1f55 TU106BM [GeForce RTX 2060 Mobile] + 1f76 TU106GLM [Quadro RTX 3000 Mobile Refresh] + 1f81 TU117 + 1f82 TU117 [GeForce GTX 1650] + 1f91 TU117M [GeForce GTX 1650 Mobile / Max-Q] + 1f92 TU117M [GeForce GTX 1650 Mobile] + 1f94 TU117M [GeForce GTX 1650 Mobile] + 1f95 TU117M [GeForce GTX 1650 Ti Mobile] + 1f96 TU117M [GeForce GTX 1650 Mobile / Max-Q] + 1f97 TU117M [GeForce MX450] + 1f98 TU117M [GeForce MX450] + 1f99 TU117M + 1f9c TU117M [GeForce MX450] + 1f9d TU117M [GeForce GTX 1650 Mobile / Max-Q] +# via Lenovo 496.90 + 1f9f TU117M [GeForce MX550] + 1fa0 TU117M [GeForce MX550] + 1fae TU117GL + 1fb0 TU117GLM [Quadro T1000 Mobile] + 1fb1 TU117GL [T600] + 1fb2 TU117GLM [Quadro T400 Mobile] + 1fb6 TU117GLM [T600 Laptop GPU] + 1fb7 TU117GLM [T550 Laptop GPU] + 1fb8 TU117GLM [Quadro T2000 Mobile / Max-Q] + 1fb9 TU117GLM [Quadro T1000 Mobile] + 1fba TU117GLM [T600 Mobile] + 1fbb TU117GLM [Quadro T500 Mobile] + 1fbc TU117GLM [T1200 Laptop GPU] + 1fbf TU117GL + 1fd9 TU117BM [GeForce GTX 1650 Mobile Refresh] + 1fdd TU117BM [GeForce GTX 1650 Mobile Refresh] + 1ff0 TU117GL [T1000 8GB] + 1ff2 TU117GL [T400 4GB] + 1ff9 TU117GLM [Quadro T1000 Mobile] + 2082 GA100 [CMP 170HX] + 20b0 GA100 [A100 SXM4 40GB] + 20b1 GA100 [A100 PCIe 40GB] + 20b2 GA100 [A100 SXM4 80GB] +# 20B3 14A7 10DE PG506-242 / 20B3 14A8 10DE PG506-243 + 20b3 GA100 [PG506-242/243] + 20b5 GA100 [A100 PCIe 80GB] + 20b6 GA100GL [PG506-232] + 20b7 GA100GL [A30 PCIe] + 20b8 GA100 [A100X] + 20b9 GA100 [A30X] + 20bb GA100 [DRIVE A100 PROD] + 20be GA100 [GRID A100A] + 20bf GA100 [GRID A100B] + 20c2 GA100 [CMP 170HX] + 20f0 GA100 [A100-PG506-207] + 20f1 GA100 [A100 PCIe 40GB] + 20f2 GA100 [A100-PG506-217] + 2182 TU116 [GeForce GTX 1660 Ti] + 2183 TU116 + 2184 TU116 [GeForce GTX 1660] + 2187 TU116 [GeForce GTX 1650 SUPER] + 2188 TU116 [GeForce GTX 1650] + 2189 TU116 [CMP 30HX] + 2191 TU116M [GeForce GTX 1660 Ti Mobile] + 2192 TU116M [GeForce GTX 1650 Ti Mobile] + 21ae TU116GL + 21bf TU116GL + 21c2 TU116 + 21c4 TU116 [GeForce GTX 1660 SUPER] + 21d1 TU116BM [GeForce GTX 1660 Ti Mobile] + 2200 GA102 + 2203 GA102 [GeForce RTX 3090 Ti] + 2204 GA102 [GeForce RTX 3090] + 147d 10de NVIDIA Geforce RTX 3090 Founders Edition + 2205 GA102 [GeForce RTX 3080 Ti 20GB] + 2206 GA102 [GeForce RTX 3080] + 10de 1467 GA102 [GeForce RTX 3080] + 10de 146d GA102 [GeForce RTX 3080 20GB] + 1462 3892 RTX 3080 10GB GAMING X TRIO + 2208 GA102 [GeForce RTX 3080 Ti] + 220a GA102 [GeForce RTX 3080 12GB] + 220d GA102 [CMP 90HX] + 2216 GA102 [GeForce RTX 3080 Lite Hash Rate] + 222b GA102 [GeForce RTX 3090 Engineering Sample] + 222f GA102 [GeForce RTX 3080 11GB / 12GB Engineering Sample] + 2230 GA102GL [RTX A6000] + 2231 GA102GL [RTX A5000] + 2232 GA102GL [RTX A4500] + 2233 GA102GL [RTX A5500] + 2235 GA102GL [A40] + 2236 GA102GL [A10] + 2237 GA102GL [A10G] + 2238 GA102GL [A10M] + 223f GA102GL + 228b GA104 High Definition Audio Controller + 2296 Tegra PCIe Endpoint Virtual Network + 2302 GH100 + 2321 GH100 + 2336 GH100 [H100 96GB] + 2414 GA103 [GeForce RTX 3060 Ti] + 2420 GA103M [GeForce RTX 3080 Ti Mobile] + 2438 GA103GLM [RTX A5500 Laptop GPU] + 2460 GA103M [GeForce RTX 3080 Ti Laptop GPU] + 2482 GA104 [GeForce RTX 3070 Ti] + 2483 GA104 + 2484 GA104 [GeForce RTX 3070] + 10de 146b GA104 [GeForce RTX 3070] + 10de 14ae GA104 [GeForce RTX 3070 16GB] + 2486 GA104 [GeForce RTX 3060 Ti] + 2487 GA104 [GeForce RTX 3060] + 2488 GA104 [GeForce RTX 3070 Lite Hash Rate] + 2489 GA104 [GeForce RTX 3060 Ti Lite Hash Rate] + 248a GA104 [CMP 70HX] + 249c GA104M [GeForce RTX 3080 Mobile / Max-Q 8GB/16GB] + 249d GA104M [GeForce RTX 3070 Mobile / Max-Q] + 249f GA104M + 24a0 GA104 [Geforce RTX 3070 Ti Laptop GPU] + 24ac GA104 [GeForce RTX 30x0 Engineering Sample] + 24ad GA104 [GeForce RTX 3060 Engineering Sample] + 24af GA104 [GeForce RTX 3070 Engineering Sample] + 24b0 GA104GL [RTX A4000] + 24b1 GA104GL [RTX A4000H] + 24b6 GA104GLM [RTX A5000 Mobile] + 24b7 GA104GLM [RTX A4000 Mobile] + 24b8 GA104GLM [RTX A3000 Mobile] + 24b9 GA104GLM [RTX A3000 12GB Laptop GPU] + 24ba GA104GLM [RTX A4500 Laptop GPU] + 24bb GA104GLM [RTX A3000 Laptop GPU] + 24bf GA104 [GeForce RTX 3070 Engineering Sample] + 24dc GA104M [GeForce RTX 3080 Mobile / Max-Q 8GB/16GB] + 24dd GA104M [GeForce RTX 3070 Mobile / Max-Q] + 24e0 GA104M [Geforce RTX 3070 Ti Laptop GPU] + 24fa GA104 [RTX A4500 Embedded GPU ] + 2501 GA106 [GeForce RTX 3060] + 2503 GA106 [GeForce RTX 3060] + 2504 GA106 [GeForce RTX 3060 Lite Hash Rate] + 2505 GA106 + 2507 GA106 [Geforce RTX 3050] + 2508 GA106 [GeForce RTX 3050 OEM] + 2520 GA106M [GeForce RTX 3060 Mobile / Max-Q] + 2523 GA106M [GeForce RTX 3050 Ti Mobile / Max-Q] + 252f GA106 [GeForce RTX 3060 Engineering Sample] + 2531 GA106 [RTX A2000] + 2560 GA106M [GeForce RTX 3060 Mobile / Max-Q] + 2563 GA106M [GeForce RTX 3050 Ti Mobile / Max-Q] + 2571 GA106 [RTX A2000 12GB] + 2583 GA107 [GeForce RTX 3050] + 25a0 GA107M [GeForce RTX 3050 Ti Mobile] + 25a2 GA107M [GeForce RTX 3050 Mobile] + 25a3 GA107 + 25a4 GA107 + 25a5 GA107M [GeForce RTX 3050 Mobile] + 25a6 GA107M [GeForce MX570] + 25a7 GA107M [GeForce MX570] + 25a9 GA107M [GeForce RTX 2050] + 25aa GA107M [GeForce MX570 A] + 25af GA107 [GeForce RTX 3050 Engineering Sample] + 25b5 GA107GLM [RTX A4 Mobile] +# A16 - 25B6 10DE 14A9 / A2 - 25B6 10DE 157E + 25b6 GA107GL [A2 / A16] + 25b8 GA107GLM [RTX A2000 Mobile] + 25b9 GA107GLM [RTX A1000 Laptop GPU] + 25ba GA107GLM [RTX A2000 8GB Laptop GPU] + 25bb GA107GLM [RTX A500 Laptop GPU] + 25e0 GA107BM [GeForce RTX 3050 Ti Mobile] + 25e2 GA107BM [GeForce RTX 3050 Mobile] + 25e5 GA107BM [GeForce RTX 3050 Mobile] + 25f9 GA107 [RTX A1000 Embedded GPU ] + 25fa GA107 [RTX A2000 Embedded GPU] +10df Emulex Corporation + 0720 OneConnect NIC (Skyhawk) + 103c 1934 FlexFabric 20Gb 2-port 650M Adapter + 103c 1935 FlexFabric 20Gb 2-port 650FLB Adapter + 103c 21d4 StoreFabric CN1200E 10Gb Converged Network Adapter + 103c 220a FlexFabric 10Gb 2-port 556FLR-SFP+ Adapter + 103c 803f Ethernet 10Gb 2-port 557SFP+ Adapter + 103c 8144 FlexFabric 10GB 2-port 556FLR-T Adapter + 17aa 1056 ThinkServer OCm14102-UX-L AnyFabric + 17aa 1057 ThinkServer OCm14104-UX-L AnyFabric + 17aa 1059 ThinkServer OCm14104-UT-L AnyFabric + 17aa 4014 ThinkServer OCm14102-NX-L AnyFabric + 0722 OneConnect iSCSI Initiator (Skyhawk) + 0723 OneConnect iSCSI Initiator + Target (Skyhawk) + 0724 OneConnect FCoE Initiator (Skyhawk) + 0728 OneConnect NIC (Skyhawk-VF) + 072a OneConnect iSCSI Initiator (Skyhawk-VF) + 072b OneConnect iSCSI Initiator + Target (Skyhawk-VF) + 072c OneConnect FCoE Initiator (Skyhawk-VF) + 1ae5 LP6000 Fibre Channel Host Adapter + e100 Proteus-X: LightPulse IOV Fibre Channel Host Adapter + e131 LightPulse 8Gb/s PCIe Shared I/O Fibre Channel Adapter + e180 Proteus-X: LightPulse IOV Fibre Channel Host Adapter + e200 LPe15000/LPe16000 Series 8Gb/16Gb Fibre Channel Adapter + 1014 03f1 PCIe2 2-Port 16Gb Fibre Channel Adapter for POWER (FC EL5B; CCIN 577F) + 1014 04e3 PCIe3 4-Port 10GbE SR Adapter for POWER (FC EN15/EN16; CCIN 2CE3) + 1014 04e4 PCIe3 4-Port 10GbE SFP+ Adapter for POWER (FC EN18; CCIN 2CE4) + 10df e280 LPe16002B-M6 2-Port 16Gb Fibre Channel Adapter + 10df e281 LPe16000B-M6 1-Port 16Gb Fibre Channel Adapter + 10df e282 Flex System FC5054 4-port 16Gb FC Adapter + e208 LightPulse 16Gb Fibre Channel Host Adapter (Lancer-VF) + e220 OneConnect NIC (Lancer) + 17aa 1054 ThinkServer LPm16002B-M6-L AnyFabric + 17aa 1055 ThinkServer LPm16004B-M8-L AnyFabric + e240 OneConnect iSCSI Initiator (Lancer) + e260 OneConnect FCoE Initiator (Lancer) + e268 OneConnect 10Gb FCoE Converged Network Adapter (Lancer-VF) + e300 LPe31000/LPe32000 Series 16Gb/32Gb Fibre Channel Adapter + 1014 0614 PCIe3 4-Port 16Gb Fibre Channel Adapter for POWER (FC EN1C/EN1D; CCIN 578E) + 1014 0615 PCIe3 2-Port 32Gb Fibre Channel Adapter for POWER (FC EN1A/EN1B; CCIN 578F) + 1014 06a0 PCIe3 2-Port 16Gb Fibre Channel Adapter for POWER (FC EN1L/EN1M; CCIN 2CFC) + 10df e300 LPe32002-M2 2-Port 32Gb Fibre Channel Adapter + 10df e301 LPe32000-M2 1-Port 32Gb Fibre Channel Adapter + 10df e310 LPe31002-M6 2-Port 16Gb Fibre Channel Adapter + 10df e311 LPe31000-M6 1-Port 16Gb Fibre Channel Adapter + 10df e312 LPe31004-M6 4-Port 16Gb Fibre Channel Adapter + 10df e320 LPe32002-M2-D 2-Port 32Gb Fibre Channel Adapter + 10df e321 LPe32000-M2-D 1-Port 32Gb Fibre Channel Adapter + 10df e322 LPe31002-M6-D 2-Port 16Gb Fibre Channel Adapter + 10df e323 LPe31000-M6-D 1-Port 16Gb Fibre Channel Adapter + 10df e324 LPm32002-D 2-Port 32Gb Fibre Channel Mezz Card + 10df e325 LPm31002-D 2-Port 16Gb Fibre Channel Mezz Card + 10df e330 LPe32002-M2-L 2-Port 32Gb PCIe Fibre Channel Adapter + 10df e331 LPe32000-M2-L 1-Port 32Gb PCIe Fibre Channel Adapter + 10df e332 LPe31002-M6-L 2-Port 16Gb PCIe Fibre Channel Adapter + 10df e333 LPe31000-M6-L 1-Port 16Gb PCIe Fibre Channel Adapter + 1590 0201 StoreFabric SN1600E 1-Port 32Gb Fibre Channel Adapter + 1590 0202 StoreFabric SN1600E 2-Port 32Gb Fibre Channel Adapter + 1590 0213 StoreFabric SN1200E 1-Port 16Gb Fibre Channel Adapter + 1590 0214 StoreFabric SN1200E 2-Port 16Gb Fibre Channel Adapter + 1590 022e Synergy 5330C 2-Port 32Gb Fibre Channel Mezz Card + 193d 1060 NIC-FC730i-Mb-2P + f011 Saturn: LightPulse Fibre Channel Host Adapter + f015 Saturn: LightPulse Fibre Channel Host Adapter + f085 LP850 Fibre Channel Host Adapter + f095 LP952 Fibre Channel Host Adapter + f098 LP982 Fibre Channel Host Adapter + f0a1 Thor LightPulse Fibre Channel Host Adapter + f0a5 Thor LightPulse Fibre Channel Host Adapter + f0b5 Viper LightPulse Fibre Channel Host Adapter + f0d1 Helios LightPulse Fibre Channel Host Adapter + f0d5 Helios LightPulse Fibre Channel Host Adapter + f0e1 Zephyr LightPulse Fibre Channel Host Adapter + f0e5 Zephyr LightPulse Fibre Channel Host Adapter + f0f5 Neptune LightPulse Fibre Channel Host Adapter + f100 LPe12000 Series 8Gb Fibre Channel Adapter + 1014 038a 8Gb PCI Express Dual Port FC Adapter for POWER + 103c 3282 8Gb Dual-port PCI-e FC HBA + 10df f140 LPe12000-M8-L 1-Port 8Gb PCIe Fibre Channel Adapter + 10df f141 LPe12002-M8-L 2-Port 8Gb PCIe Fibre Channel Adapter + f111 Saturn-X LightPulse Fibre Channel Host Adapter + f112 Saturn-X LightPulse Fibre Channel Host Adapter + f180 LPSe12002 EmulexSecure Fibre Channel Adapter + f400 LPe35000/LPe36000 Series 32Gb/64Gb Fibre Channel Adapter + 10df f401 LPe35000-M2 1-Port 32Gb Fibre Channel Adapter + 10df f402 LPe35002-M2 2-Port 32Gb Fibre Channel Adapter + 10df f403 LPe36000-M64 1-Port 64Gb Fibre Channel Adapter + 10df f404 LPe36002-M64 2-Port 64Gb Fibre Channel Adapter + 10df f405 LPe35004-M2 4-Port 32Gb Fibre Channel Adapter + 10df f406 LPe35004-X6 4-Port Fibre Channel Adapter + 10df f410 LPe35002-M2-D 2-Port 32Gb Fibre Channel Adapter + 10df f411 LPe35000-M2-D 1-Port 32Gb Fibre Channel Adapter + 10df f418 LPe35000-M2-L 1-Port 32Gb PCIe Fibre Channel Adapter + 10df f419 LPe35002-M2-L 2-Port 32Gb PCIe Fibre Channel Adapter + 10df f421 LPe36002-M2-L 2-Port 64Gb PCIe Fibre Channel Adapter + 10df f422 LPe36002-M64-D 2-Port 64Gb Fibre Channel Adapter + 1590 02d5 StoreFabric SN1610E 1-Port 32Gb Fibre Channel Adapter + 1590 02d6 StoreFabric SN1610E 2-Port 32Gb Fibre Channel Adapter + f500 LPe37000/LPe38000 Series 32Gb/64Gb Fibre Channel Adapter + 1014 06c1 PCIe4 4-Port 32Gb Fibre Channel Adapter for POWER (FC EN1L/EN1M; CCIN 2CFC) + 1014 06c2 PCIe4 2-Port 64Gb Fibre Channel Adapter for POWER (FC EN1N/EN1P; CCIN 2CFD) + f700 LP7000 Fibre Channel Host Adapter + f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) + f800 LP8000 Fibre Channel Host Adapter + f801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) + f900 LP9000 Fibre Channel Host Adapter + f901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) + f980 LP9802 Fibre Channel Host Adapter + f981 LP9802 Fibre Channel Host Adapter Alternate ID + f982 LP9802 Fibre Channel Host Adapter Alternate ID + fa00 Thor-X LightPulse Fibre Channel Host Adapter + fb00 Viper LightPulse Fibre Channel Host Adapter + fc00 Thor-X LightPulse Fibre Channel Host Adapter + 10df fc00 LP10000 LightPulse Fibre Channel Host Adapter + fc10 Helios-X LightPulse Fibre Channel Host Adapter + fc20 Zephyr-X LightPulse Fibre Channel Host Adapter + fc40 Saturn-X: LightPulse Fibre Channel Host Adapter + fc50 Proteus-X: LightPulse IOV Fibre Channel Host Adapter + fd00 Helios-X LightPulse Fibre Channel Host Adapter +# Also IBM FC 5759 / FC 1910 for POWER + 10df fd02 LightPulse LP11002 Dual-port 4Gigabit PCI Fibre Channel Adapter + fd11 Helios-X LightPulse Fibre Channel Host Adapter + fd12 Helios-X LightPulse Fibre Channel Host Adapter + fe00 Zephyr-X LightPulse Fibre Channel Host Adapter + fe05 Zephyr-X: LightPulse FCoE Adapter + fe11 Zephyr-X LightPulse Fibre Channel Host Adapter + fe12 Zephyr-X LightPulse FCoE Adapter + ff00 Neptune LightPulse Fibre Channel Host Adapter +10e0 Integrated Micro Solutions Inc. + 5026 IMS5026/27/28 + 5027 IMS5027 + 5028 IMS5028 + 8849 IMS8849 + 8853 IMS8853 + 9128 IMS9128 [Twin turbo 128] +10e1 Tekram Technology Co.,Ltd. + 0391 TRM-S1040 + 10e1 0391 DC-315U SCSI-3 Host Adapter + 690c DC-690c + dc29 DC-290 +10e2 Aptix Corporation +10e3 Tundra Semiconductor Corp. + 0000 CA91C042 [Universe] + 0108 Tsi108 Host Bridge for Single PowerPC + 0148 Tsi148 [Tempe] + 1775 1100 VR11 Single Board Computer + 0860 CA91C860 [QSpan] + 0862 CA91C862A [QSpan-II] + 8111 Tsi381 PCIe to PCI Bridge + 8260 CA91L8200B [Dual PCI PowerSpan II] + 8261 CA91L8260B [Single PCI PowerSpan II] + a108 Tsi109 Host Bridge for Dual PowerPC +10e4 Tandem Computers + 8029 Realtek 8029 Network Card +10e5 Micro Industries Corporation +10e6 Gainbery Computer Products Inc. +10e7 Vadem +10e8 Applied Micro Circuits Corp. + 1072 INES GPIB-PCI (AMCC5920 based) + 2011 Q-Motion Video Capture/Edit board + 4750 S5930 [Matchmaker] + 5920 S5920 + 8043 LANai4.x [Myrinet LANai interface chip] + 8062 S5933_PARASTATION + 807d S5933 [Matchmaker] + 8088 Kongsberg Spacetec Format Synchronizer + 8089 Kongsberg Spacetec Serial Output Board + 809c S5933_HEPC3 + 80b9 Harmonix Hi-Card P8 (4x active ISDN BRI) + 80d7 PCI-9112 + 80d8 PCI-7200 + 80d9 PCI-9118 + 80da PCI-9812 + 80fc APCI1500 Signal processing controller (16 dig. inputs + 16 dig. outputs) + 811a PCI-IEEE1355-DS-DE Interface + 814c Fastcom ESCC-PCI (Commtech, Inc.) + 8170 S5933 [Matchmaker] (Chipset Development Tool) + 81e6 Multimedia video controller + 828d APCI3001 Signal processing controller (up to 16 analog inputs) + 8291 Fastcom 232/8-PCI (Commtech, Inc.) + 82c4 Fastcom 422/4-PCI (Commtech, Inc.) + 82c5 Fastcom 422/2-PCI (Commtech, Inc.) + 82c6 Fastcom IG422/1-PCI (Commtech, Inc.) + 82c7 Fastcom IG232/2-PCI (Commtech, Inc.) + 82ca Fastcom 232/4-PCI (Commtech, Inc.) + 82db AJA HDNTV HD SDI Framestore + 82e2 Fastcom DIO24H-PCI (Commtech, Inc.) + 8406 PCIcanx/PCIcan CAN interface [Kvaser AB] + 8407 PCIcan II CAN interface (A1021, PCB-07, PCB-08) [Kvaser AB] + 8851 S5933 on Innes Corp FM Radio Capture card + e004 X-Gene PCIe bridge +10e9 Alps Electric Co., Ltd. +10ea Integraphics + 1680 IGA-1680 + 1682 IGA-1682 + 1683 IGA-1683 + 2000 CyberPro 2000 + 2010 CyberPro 2000A + 5000 CyberPro 5000 + 5050 CyberPro 5050 + 5202 CyberPro 5202 +# CyberPro5202 Audio Function + 5252 CyberPro5252 +10eb Artists Graphics + 0101 3GA + 8111 Twist3 Frame Grabber +10ec Realtek Semiconductor Co., Ltd. + 0139 RTL-8139/8139C/8139C+ Ethernet Controller + 3000 Killer E3000 2.5GbE Controller + 5208 RTS5208 PCI Express Card Reader + 5209 RTS5209 PCI Express Card Reader + 5227 RTS5227 PCI Express Card Reader + 17aa 220e ThinkPad T440p + 17aa 2214 ThinkPad X240 + 5229 RTS5229 PCI Express Card Reader + 1025 0813 Aspire R7-571 + 103c 194e ProBook 455 G1 Notebook + 103c 1985 Pavilion 17-e163sg Notebook PC + 17aa 3832 Yoga 520 + 522a RTS522A PCI Express Card Reader + 103c 8079 EliteBook 840 G3 + 103c 825b OMEN-17-w001nv + 17aa 5124 ThinkPad E595 + 5249 RTS5249 PCI Express Card Reader + 103c 1909 ZBook 15 + 524a RTS524A PCI Express Card Reader + 5250 RTS5250 PCI Express Card Reader + 525a RTS525A PCI Express Card Reader + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e4 XPS 15 9550 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 09be Latitude 7410 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 5260 RTS5260 PCI Express Card Reader + 5261 RTS5261 PCI Express Card Reader + 5286 RTS5286 PCI Express Card Reader + 5287 RTL8411B PCI Express Card Reader + 1025 1094 Acer Aspire E5-575G + 5288 RTS5288 PCI Express Card Reader + 5289 RTL8411 PCI Express Card Reader + 1043 1457 K55A Laptop + 5762 RTS5763DL NVMe SSD Controller + 8029 RTL-8029(AS) + 10b8 2011 EZ-Card (SMC1208) + 10ec 8029 RTL-8029(AS) + 1113 1208 EN1208 + 1186 0300 DE-528 + 1259 2400 AT-2400 + 1af4 1100 QEMU Virtual Machine + 8125 RTL8125 2.5GbE Controller + 8129 RTL-8129 + 10ec 8129 RT8129 Fast Ethernet Adapter + 11ec 8129 RTL8111/8168 PCIe Gigabit Ethernet (misconfigured) + 8136 RTL810xE PCI Express Fast Ethernet controller + 103c 1985 RTL8106E on Pavilion 17-e163sg Notebook PC + 103c 2a8c Compaq 500B Microtower + 103c 2ab1 Pavilion p6774 + 103c 30cc Pavilion dv6700 + 1179 ff64 RTL8102E PCI-E Fast Ethernet NIC + 17c0 1053 RTL8101e Medion WIM 2210 Notebook PC [MD96850] + 8137 RTL8104E PCIe Fast Ethernet Controller + 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter + 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter + 8139 RTL-8100/8101L/8139 PCI Fast Ethernet Adapter + 0357 000a TTP-Monitoring Card V2.0 + 1025 005a TravelMate 290 + 1025 8920 ALN-325 + 1025 8921 ALN-325 + 103c 006a NX9500 + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 30d9 Presario C700 + 1043 1045 L8400B, L3C/S, X58LE notebook + 1043 8109 P5P800-MX Mainboard + 1071 8160 MIM2000 + 10bd 0320 EP-320X-R + 10ec 8139 RTL-8100/8101L/8139 PCI Fast Ethernet Adapter + 10f7 8338 Panasonic CF-Y5 laptop + 1113 ec01 LevelOne FNC-0107TX/FNC-0109TX + 1186 1104 DFE-520TX Fast Ethernet PCI Adapter (rev. D1) + 1186 1300 DFE-538TX + 1186 1320 SN5200 + 1186 8139 DRN-32TX + 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter + 1259 2500 AT-2500TX + 1259 2503 AT-2500TX/ACPI + 1385 f31d FA311 v2 + 1395 2100 AMB2100 + 1429 d010 ND010/ND012 + 1432 9130 EN-9130TX + 1436 8139 RT8139 + 144d c00c P30/P35 notebook + 1458 e000 GA-7VM400M/7VT600 Motherboard + 1462 0131 MS-1013 Notebook + 1462 217c Aspire L250 + 1462 788c 865PE Neo2-V Mainboard + 146c 1439 FE-1439TX + 1489 6001 GF100TXRII + 1489 6002 GF100TXRA + 149c 139a LFE-8139ATX + 149c 8139 LFE-8139TX + 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet + 1565 2300 P4TSV Onboard LAN (RTL8100B) + 1631 7003 Onboard RTL8111 on GA-8SIML Rev1.0 Mainboard + 1695 9001 Onboard RTL8101L 10/100 MBit + 16ec 00ff USR997900A + 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card + 1799 5010 F5D5010 CardBus Notebook Network Card + 187e 3303 FN312 + 1904 8139 RTL8139D Fast Ethernet Adapter + 1af4 1100 QEMU Virtual Machine + 2646 0001 KNE120TX + 8e2e 7000 KF-230TX + 8e2e 7100 KF-230TX/2 + a0a0 0007 ALN-325C + 8161 RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller + 10ec 8168 TP-Link TG-3468 v4.0 Gigabit PCI Express Network Adapter + 8167 RTL-8110SC/8169SC Gigabit Ethernet + 105b 0e10 RTL-8110SC-GR on a N15235/A74MX mainboard + 1458 e000 GA-MA69G-S3H Motherboard + 1462 235c P965 Neo MS-7235 mainboard + 1462 236c 945P Neo3-F motherboard + 8168 RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller + 1019 8168 RTL8111/8168 PCI Express Gigabit Ethernet controller + 1025 1094 Acer Aspire E5-575G + 1028 0283 Vostro 220 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 1028 05d7 Alienware X51 R2 + 1028 06f2 Latitude 3470 + 1028 06f3 Latitude 3570 + 1028 0869 Vostro 3470 + 103c 1611 Pavilion DM1Z-3000 + 103c 1950 ProBook 450/455 + 103c 2a6f Asus IPIBL-LB Motherboard + 103c 825b OMEN-17-w001nv + 103c 8615 Pavilion Laptop 15-cw1xxx +# Rev 29, uses r8169 Driver on Linux + 103c 8882 HP ProDesk 405 G8 Desktop Mini PC + 1043 11f5 Notebook motherboard (one of many models) + 1043 16d5 U6V/U31J laptop + 1043 81aa P5B + 1043 82c6 M3A78 Series Motherboard + 1043 83a3 M4A785/P7P55 Motherboard + 1043 8432 P8P67 and other motherboards + 1043 8505 P8 series motherboard + 1043 8554 H81M-C Motherboard + 1043 859e AM1I-A Motherboard + 1043 8677 PRIME B450M-A Motherboard + 105b 0d7c D270S/D250S Motherboard + 10ec 8168 RTL8111/8168 PCI Express Gigabit Ethernet controller + 144d c652 RTL8168 on a NP300E5C series laptop + 1458 e000 Onboard Ethernet + 1462 238c Onboard RTL8111b on MSI P965 Platinum Mainboard + 1462 345c RTL8111B on MS-7345 Motherboard + 1462 368c K9AG Neo2 + 1462 4180 Wind PC MS-7418 + 1462 7522 X58 Pro-E + 1462 7c37 X570-A PRO motherboard + 1775 11cc CC11/CL11 + 17aa 3098 ThinkCentre E73 + 17aa 3814 Z50-75 + 17aa 3823 Lenovo V130-15IGM Laptop - Type 81HL + 17aa 5124 ThinkPad E595 + 1849 8168 Motherboard (one of many) + 7470 3468 TG-3468 Gigabit PCI Express Network Adapter + 8086 2055 NUC Kit DN2820FYKH + 8086 d615 Desktop Board D510MO/D525MW + ea50 ce19 mCOM10-L1900 + 8169 RTL8169 PCI Gigabit Ethernet Controller + 1025 0079 Aspire 5024WLMi + 10bd 3202 EP-320G-TX1 32-bit PCI Gigabit Ethernet Adapter + 10ec 8169 RTL8169/8110 Family PCI Gigabit Ethernet NIC + 1259 c107 CG-LAPCIGT + 1371 434e ProG-2000L + 1385 311a GA311 + 1385 5200 GA511 Gigabit PC Card + 1458 e000 GA-8I915ME-G Mainboard + 1462 030c K8N Neo-FSR v2.0 mainboard + 1462 065c Hetis 865GV-E (MS-7065) + 1462 702c K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 16ec 011f USR997903 + 1734 1091 D2030-A1 + a0a0 0449 AK86-L motherboard + 816a RTL8111xP UART #1 + ea50 ce19 mCOM10-L1900 + 816b RTL8111xP UART #2 + ea50 ce19 mCOM10-L1900 + 816c RTL8111xP IPMI interface + ea50 ce19 mCOM10-L1900 + 816d RTL811x EHCI host controller + ea50 ce19 mCOM10-L1900 + 816e Realtek RealManage BMC + 8171 RTL8191SEvA Wireless LAN Controller + 8172 RTL8191SEvB Wireless LAN Controller + 8173 RTL8192SE Wireless LAN Controller + 8174 RTL8192SE Wireless LAN Controller + 8176 RTL8188CE 802.11b/g/n WiFi Adapter + 1043 84b5 PCE-N10 + 1a3b 1139 AW-NE139H Half-size Mini PCIe Card + 8177 RTL8191CE PCIe Wireless Network Adapter + 8178 RTL8192CE PCIe Wireless Network Adapter + 8179 RTL8188EE Wireless Network Adapter + 103c 197d RTL8188EE mini-PCIe card + 8180 RTL8180L 802.11b MAC + 1385 4700 MA521 802.11b Wireless PC Card + 1737 0019 WPC11v4 802.11b Wireless-B Notebook Adapter + 8185 RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller + 818b RTL8192EE PCIe Wireless Network Adapter + 8190 RTL8190 802.11n PCI Wireless Network Adapter + 8191 RTL8192CE PCIe Wireless Network Adapter + 8192 RTL8192E/RTL8192SE Wireless LAN Controller + 8193 RTL8192DE Wireless LAN Controller + 8196 RTL8196 Integrated PCI-e Bridge + 8197 SmartLAN56 56K Modem + 8199 RTL8187SE Wireless LAN Controller + 1462 6894 MN54G2 / MS-6894 Wireless Mini PCIe Card + 8723 RTL8723AE PCIe Wireless Network Adapter + 8812 RTL8812AE 802.11ac PCIe Wireless Network Adapter + 8813 RTL8813AE 802.11ac PCIe Wireless Network Adapter + 8821 RTL8821AE 802.11ac PCIe Wireless Network Adapter + 8852 RTL8852AE 802.11ax PCIe Wireless Network Adapter + b723 RTL8723BE PCIe Wireless Network Adapter + 10ec 8739 Dell Wireless 1801 + 17aa b736 Z50-75 + b822 RTL8822BE 802.11a/b/g/n/ac WiFi adapter + 103c 831b Realtek RTL8822BE 802.11ac 2 × 2 Wi-Fi + Bluetooth 4.2 Combo Adapter (MU-MIMO supported) + 17aa 5124 ThinkPad E595 + 17aa b023 ThinkPad E595 + c821 RTL8821CE 802.11ac PCIe Wireless Network Adapter + c822 RTL8822CE 802.11ac PCIe Wireless Network Adapter + c82f RTL8822CE 802.11ac PCIe Wireless Network Adapter + d723 RTL8723DE 802.11b/g/n PCIe Adapter +10ed Ascii Corporation + 7310 V7310 +10ee Xilinx Corporation + 0001 EUROCOM for PCI (ECOMP) + 0002 Octal E1/T1 for PCI ETP Card + 0007 Default PCIe endpoint ID + 0205 Wildcard TE205P + 0210 Wildcard TE210P + 0300 Spartan 3 Designs (Xilinx IP) + 0314 Wildcard TE405P/TE410P (1st Gen) + 0405 Wildcard TE405P (2nd Gen) + 0410 Wildcard TE410P (2nd Gen) + 0600 Xilinx 6 Designs (Xilinx IP) + 3fc0 RME Digi96 + 3fc1 RME Digi96/8 + 3fc2 RME Digi96/8 Pro + 3fc3 RME Digi96/8 Pad + 3fc4 RME Digi9652 (Hammerfall) + 3fc5 RME Hammerfall DSP + 3fc6 RME Hammerfall DSP MADI +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + 5000 Alveo U200 XDMA Platform +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + 5004 Alveo U250 XDMA Platform + 5005 Alveo U250 +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + 500c Alveo U280 XDMA Platform +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + 5020 Alveo U50 XMDA Platform +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + 505c Alveo U55C + 7038 FPGA Card XC7VX690T + 17aa 402f FPGA XC7VX690T-3FFG1157E + 8019 Memory controller + 1eec 0201 VSEC10232X Dual-port 100Gb/s Etherent PCIe + 8380 Ellips ProfiXpress Profibus Master + 8381 Ellips Santos Frame Grabber +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + d000 Alveo U200 Golden Image +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + d004 Alveo U250 Golden Image +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + d00c Alveo U280 Golden Image +# Reference: https://xilinx.github.io/Alveo-Cards/master/management-specification/appendix_a.html + d020 Alveo U50 Golden Image + d154 Copley Controls CAN card (PCI-CAN-02) +# SED is assigned Xilinx PCI device IDs ebf0 through ebff + ebf0 SED Systems Modulator/Demodulator + ebf1 SED Systems Audio Interface Card + ebf2 SED Systems Common PCI Interface + ebf3 SED Systems PCIe-AXI Bridge +10ef Racore Computer Products, Inc. + 8154 M815x Token Ring Adapter +10f0 Peritek Corporation +10f1 Tyan Computer + 2865 Tyan Thunder K8E S2865 + 5300 Tyan S5380 Mainboard +10f2 Achme Computer, Inc. +10f3 Alaris, Inc. +10f4 S-MOS Systems, Inc. +10f5 NKK Corporation + a001 NDR4000 [NR4600 Bridge] +10f6 Creative Electronic Systems SA +10f7 Matsushita Electric Industrial Co., Ltd. +10f8 Altos India Ltd +10f9 PC Direct +10fa Truevision + 000c TARGA 1000 +10fb Thesys Gesellschaft fuer Mikroelektronik mbH + 186f TH 6255 +10fc I-O Data Device, Inc. +# What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives + 0003 Cardbus IDE Controller + 0005 Cardbus SCSI CBSC II +10fd Soyo Computer, Inc +10fe Fast Multimedia AG +10ff NCube +1100 Jazz Multimedia +1101 Initio Corporation + 0002 INI-920 Ultra SCSI Adapter + 1060 INI-A100U2W + 1622 INI-1623 PCI SATA-II Controller + 9100 INI-9100/9100W + 9400 INI-940 Fast Wide SCSI Adapter + 9401 INI-935 Fast Wide SCSI Adapter + 9500 INI-950 SCSI Adapter + 9502 INI-950P Ultra Wide SCSI Adapter +1102 Creative Labs + 0002 EMU10k1 [Sound Blaster Live! Series] + 100a 1102 SB Live! 5.1 Digital OEM SB0220 EMU10K1-JFF + 1102 0020 CT4670/4850 SBLive! Value + 1102 0021 CT4620 SBLive! + 1102 002f M002/M003 Integrated SBLive! + 1102 100a SB0220/0229 SBLive! 5.1 Digital OEM + 1102 4001 E-mu APS + 1102 8022 CT4780 SBLive! Value + 1102 8023 CT4790 SoundBlaster PCI512 + 1102 8024 CT4760 SBLive! + 1102 8025 CT1140/SB0040 Integrated SBLive! + 1102 8026 CT4830 SBLive! Value + 1102 8027 CT4832 SBLive! Value + 1102 8028 CT4870 SBLive! Value + 1102 8029 CT4872 SBLive! Value + 1102 802a CT4890 SoundBlaster PCI256 + 1102 802b CT4891 SoundBlaster PCI256 + 1102 8031 CT4831 SBLive! Value + 1102 8032 CT4871 SBLive! Value + 1102 8033 CT4893 SoundBlaster PCI256 + 1102 8035 CT0060 SBLive! + 1102 8040 CT4760 SBLive! + 1102 8050 CT4750 SoundBlaster PCI512 + 1102 8051 CT4850 SBLive! Value + 1102 8061 SB060 SBLive! Player 5.1 + 1102 8062 SB0100 SBLive! 5.1 + 1102 8063 DXW Integrated SBLive! 5.1 + 1102 8064 SB0100/SB0102 SBLive! 5.1 + 1102 8065 SB0220/0222 SBLive! 5.1 Digital + 1102 8066 SB0228 SBLive! 5.1 Digital + 1102 8067 SB0220 SBLive! 5.1 + 1102 8068 CT0061 SBLive! + 1102 8069 SB0101 SBLive! 5.1 Value + 1102 806a SB0103 SBLive! 5.1 + 1102 806b SB0105 SBLive! 5.1 + 1102 806c SB0221 SBLive! 5.1 + 1102 8071 SB0150 SoundBlaster PCI512 +# EMU8008 PCI version of emu8000 chip + 0003 SB AWE64(D) + 1102 0010 CT4600 AWE64D + 1102 0030 CT4650 AWE64D + 1102 0031 CT4655 AWE64D + 0004 EMU10k2/CA0100/CA0102/CA10200 [Sound Blaster Audigy Series] + 1102 0040 SB0090 Audigy Player +# Probably an early engineering sample + 1102 0041 CT4820 SBLive!2 + 1102 0042 CT0070 Audigy + 1102 0043 CT0072 Audigy + 1102 0051 SB0090 Audigy Player/Platinum (EX) + 1102 0052 SB0162 Audigy ES + 1102 0053 CT0090/SB0092 Audigy Player/OEM + 1102 0054 SB0161 Audigy ES + 1102 0055 SB0192 Audigy + 1102 0056 SB0191 Audigy + 1102 0057 SB0091 Audigy + 1102 0058 SB0095 Audigy Player/OEM + 1102 0059 SB0230 Audigy + 1102 005a SB0231 Audigy + 1102 005b SB0232 Audigy + 1102 005c SB0238 Audigy + 1102 1002 SB0240 Audigy 2 Platinum 6.1 + 1102 1003 SB0350 Audigy 2 / SB0243 Audigy 2 OEM + 1102 1004 SB0242 Audigy 2 + 1102 1005 SB0280 Audigy 2 Platinum Ex + 1102 1006 SB0245 Audigy 2 OEM + 1102 1007 SB0240/SB0244 Audigy 2 Platinum + 1102 1008 SB0320 Audigy 2 + 1102 1009 SB0249 Audigy 2 OEM + 1102 100a SB0246 Audigy 2 + 1102 2001 SB0360 Audigy 2 ZS Platinum Pro + 1102 2002 SB0350 Audigy 2 ZS + 1102 2003 SB0352 Audigy 2 ZS + 1102 2004 SB0355 Audigy 2 ZS + 1102 2005 SB0359 Audigy 2 ZS + 1102 2006 SB035x Audigy 2 OEM + 1102 2007 SB0380 Audigy 4 Pro + 1102 4001 E-MU 1010 [MAEM8810] + 1102 4002 E-MU 0404 + 1102 4003 E-MU 1010 + 0005 EMU20k1 [Sound Blaster X-Fi Series] + 1102 0021 X-Fi Platinum + 1102 002c X-Fi XtremeGamer FATAL1TY PRO + 1102 1003 X-Fi XtremeMusic +# This chip is also known as CA0103 on Sound Blaster 5.1 SB0680 card. + 0006 EMU10k1X / CA0103 [SB Live! OEM / SB 5.1 / Ectiva 5.1] + 1102 1001 SB0680 Sound Blaster 5.1 + 1102 1003 SB0203 SB Live! 5.1 (Dell) + 1102 1004 TP0033 Ectiva Audio 5.1 + 0007 CA0106/CA0111 [SB Live!/Audigy/X-Fi Series] + 1102 0007 SBLive! 24bit + 1102 1001 SB0310 Audigy LS + 1102 1002 SB0312 Audigy LS + 1102 1006 SB0410 SBLive! 24-bit + 1102 100a SB0570 [SB Audigy SE] + 1102 1012 SB0790 X-Fi XA + 1102 1013 Soundblaster X-Fi Xtreme Audio + 1462 1009 K8N Diamond + 0008 CA0108/CA10300 [Sound Blaster Audigy Series] + 1102 0008 EMU0404 Digital Audio System + 1102 1001 SB0400 Audigy 2 Value + 1102 1021 SB0610 Audigy 4 Value + 1102 1022 SBxxx Audigy 2/4 Value + 1102 1023 SB0612 Audigy 2 LS + 1102 1024 SB1550 Audigy 5/Rx + 1102 1101 SBxxxx Audigy 2 SA + 1102 2001 SB0530 Audigy 2 ZS Notebook + 1102 2021 SBxxxx Audigy 4 Notebook + 1102 4002 E-MU 0404 + 1102 4003 E-MU 1010 + 1102 4004 EMU1010 Digital Audio System [MAEM8960] + 1102 4005 E-MU 0404 [MAEM8984] + 1102 4007 E-MU 1010 [MAEM8982] + 1102 4201 E-MU 0202 [MAEM8950] + 0009 CA0110 [Sound Blaster X-Fi Xtreme Audio] + 1102 0010 MB0820 Integrated + 1102 0018 SB1040 PCI Express + 000b EMU20k2 [Sound Blaster X-Fi Titanium Series] + 1102 0041 SB0880 [SoundBlaster X-Fi Titanium PCI-e] + 1102 0062 SB1270 [SoundBlaster X-Fi Titanium HD] + 0012 Sound Core3D [Sound Blaster Recon3D / Z-Series] + 1102 0010 SB1570 SB Audigy Fx + 4001 SB Audigy FireWire Port + 1102 0010 SB Audigy FireWire Port + 7002 SB Live! Game Port + 1102 0020 Gameport Joystick + 7003 SB Audigy Game Port + 1102 0040 SB Audigy Game Port + 1102 0060 SB Audigy2 MIDI/Game Port + 7004 [SB Live! Value] Input device controller + 7005 SB Audigy LS Game Port + 1102 1001 SB0310 Audigy LS MIDI/Game port + 1102 1002 SB0312 Audigy LS MIDI/Game port + 7006 [SB X-Fi Xtreme Audio] CA0110-IBG PCIe to PCI Bridge + 8938 Ectiva EV1938 + 1033 80e5 SlimTower-Jim (NEC) + 1071 7150 Mitac 7150 + 110a 5938 Siemens Scenic Mobile 510PIII + 13bd 100c Ceres-C (Sharp, Intel BX) + 13bd 100d Sharp, Intel Banister + 13bd 100e TwinHead P09S/P09S3 (Sharp) + 13bd f6f1 Marlin (Sharp) + 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp) + 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp) + 156d b400 G400 - Geo (AlphaTop (Taiwan)) + 156d b550 G560 (AlphaTop (Taiwan)) + 156d b560 G560 (AlphaTop (Taiwan)) + 156d b700 G700/U700 (AlphaTop (Taiwan)) + 156d b795 G795 (AlphaTop (Taiwan)) + 156d b797 G797 (AlphaTop (Taiwan)) +# nee Triones Technologies, Inc. +1103 HighPoint Technologies, Inc. + 0003 HPT343/345/346/363 + 0004 HPT366/368/370/370A/372/372N + 1103 0001 HPT370A + 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4) + 1103 0005 HPT370 UDMA100 + 1103 0006 HPT302/302N + 0005 HPT372A/372N + 0006 HPT302/302N + 0007 HPT371/371N + 0008 HPT374 + 0009 HPT372N + 0620 RocketRAID 620 2 Port SATA-III Controller + 0622 RocketRAID 622 2 Port SATA-III Controller + 0640 RocketRAID 640 4 Port SATA-III Controller + 0641 RocketRAID 640L 4 Port SATA-III Controller + 0642 RocketRAID 642L SATA-III Controller (2 eSATA ports + 2 internal SATA ports) + 0644 RocketRAID 644 4 Port SATA-III Controller (eSATA) + 0645 RocketRAID 644L 4 Port SATA-III Controller (eSATA) + 0646 RocketRAID 644LS SATA-III Controller (4 eSATA devices connected by 1 SAS cable) + 1720 RocketRAID 1720 (2x SATA II RAID Controller) + 1740 RocketRAID 1740 + 1742 RocketRAID 1742 + 2210 RocketRAID 2210 SATA-II Controller + 11ab 11ab 88SX6042 + 2300 RocketRAID 230x 4 Port SATA-II Controller + 2310 RocketRAID 2310 4 Port SATA-II Controller + 2320 RocketRAID 2320 SATA-II Controller + 2322 RocketRAID 2322 SATA-II Controller + 2340 RocketRAID 2340 16 Port SATA-II Controller + 2640 RocketRAID 2640 SAS/SATA Controller + 2722 RocketRAID 2722 +# SFF-8087 Mini-SAS 16 port internal + 2740 RocketRAID 2740 +# SFF-8088 Mini-SAS 16 port external + 2744 RocketRaid 2744 +# SFF-8088 8 port external / SFF-8087 24 port internal + 2782 RocketRAID 2782 + 3120 RocketRAID 3120 + 3220 RocketRAID 3220 + 3320 RocketRAID 3320 + 4310 RocketRaid 4310 + 7505 SSD7505 PCIe Gen4 x16 4-Port M.2 NVMe RAID Controller +1104 RasterOps Corp. +1105 Sigma Designs, Inc. + 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder + 8300 REALmagic Hollywood Plus DVD Decoder + 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder + 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder + 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder + 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder + 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder + 1105 0001 REALmagic X-Card + 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder + 127d 0000 CineView II + 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder + 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder +# Found in Cisco DMP-4305G + c621 EM8621L Digital Media Processor + c622 EM8622L MPEG-4.10 (H.264) and SMPTE 421M (VC-1) A/V Decoder +1106 VIA Technologies, Inc. + 0102 Embedded VIA Ethernet Controller + 0130 VT6305 1394.A Controller + 0198 P4X600 Host Bridge + 0204 K8M800 Host Bridge + 0208 PT890 Host Bridge + 0238 K8T890 Host Bridge + 0258 PT880 Host Bridge + 0259 CN333/CN400/PM880 Host Bridge + 0269 KT880 Host Bridge + 0282 K8T800Pro Host Bridge + 1043 80a3 A8V Deluxe + 0290 K8M890 Host Bridge + 0293 PM896 Host Bridge + 0296 P4M800 Host Bridge + 0305 VT8363/8365 [KT133/KM133] + 1019 0987 K7VZA Mainboard + 1043 8033 A7V Mainboard + 1043 803e A7V-E Mainboard + 1043 8042 A7V133/A7V133-C Mainboard + 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard + 0308 PT880 Ultra/PT894 Host Bridge + 1043 8199 P4V800D-X Mainboard + 1849 0308 Motherboard + 0314 CN700/VN800/P4M800CE/Pro Host Bridge + 0324 CX700/VX700 Host Bridge + 0327 P4M890 Host Bridge + 0336 K8M890CE Host Bridge + 0340 PT900 Host Bridge + 0351 K8T890CF Host Bridge + 0353 VX800/820-Series Chipset Host-Bridge Controller + 0364 CN896/VN896/P4M900 Host Bridge + 1043 81ce P5VD2-VM mothervoard + 0391 VT8371 [KX133] + 0409 VX855/VX875 Host Bridge: Host Control + 0410 VX900 Series Host Bridge: Host Control + 0415 VT6415 PATA IDE Host Controller + 1043 838f Motherboard + 0501 VT8501 [Apollo MVP4] + 0505 VT82C505 +# Shares chip with :0576. The VT82C576M has :1571 instead of :0561. + 0561 VT82C576MV + 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE + 1019 0985 P6VXA Motherboard + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1043 8052 VT8233A Bus Master ATA100/66/33 IDE + 1043 808c A7V8X / A7V333 motherboard + 1043 80a1 A7V8X-X motherboard rev. 1.01 + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE + 1179 0001 Magnia Z310 + 1297 f641 FX41 motherboard + 1458 5002 GA-7VAX Mainboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7120 KT4AV motherboard + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard +# probably all K7VT2/4*/6 + 1849 0571 K7VT series Motherboards + 0576 VT82C576 3V [Apollo Master] + 0581 CX700/VX700/VX800/820-Series Serial ATA RAID-Controller +# Upgrade bios to get correct ID: 5324 instead of 0581 + 1106 0581 Wrong IDE ID + 0585 VT82C585VP [Apollo VP1/VPX] + 0586 VT82C586/A/B PCI-to-ISA [Apollo VP] + 1106 0000 MVP3 ISA Bridge + 0591 VT8237A SATA 2-Port Controller + 0595 VT82C595 [Apollo VP2] + 0596 VT82C596 ISA [Mobile South] + 1106 0000 VT82C596/A/B PCI to ISA Bridge + 1458 0596 VT82C596/A/B PCI to ISA Bridge + 0597 VT82C597 [Apollo VP3] + 0598 VT82C598 [Apollo MVP3] + 0601 VT8601 [Apollo ProMedia] + 0605 VT8605 [ProSavage PM133] + 103c 1254 D9840-60001 [Brio BA410 Motherboard] + 1043 802c CUV4X mainboard + 0680 VT82C680 [Apollo P6] + 0686 VT82C686 [Apollo Super South] + 1019 0985 P6VXA Motherboard + 103c 1256 D9840-60001 [Brio BA410 Motherboard] + 1043 802c CUV4X mainboard + 1043 8033 A7V Mainboard + 1043 803e A7V-E Mainboard + 1043 8040 A7M266 Mainboard + 1043 8042 A7V133/A7V133-C Mainboard + 1106 0000 VT82C686/A PCI to ISA Bridge + 1106 0686 VT82C686/A PCI to ISA Bridge + 1179 0001 Magnia Z310 + 147b a702 KG7-Lite Mainboard + 0691 VT82C693A/694x [Apollo PRO133x] + 1019 0985 P6VXA Motherboard + 1179 0001 Magnia Z310 + 1458 0691 VT82C691 Apollo Pro System Controller + 0693 VT82C693 [Apollo Pro Plus] + 0698 VT82C693A [Apollo Pro133 AGP] + 0709 VX11 Standard Host Bridge + 070a VX11 PCI Express Root Port + 070b VX11 PCI Express Root Port + 070c VX11 PCI Express Root Port + 070d VX11 PCI Express Root Port + 070e VX11 PCI Express Root Port + 0926 VT82C926 [Amazon] + 1000 VT82C570MV + 1106 VT82C570MV + 1122 VX800/VX820 Chrome 9 HC3 Integrated Graphics + 1204 K8M800 Host Bridge + 1208 PT890 Host Bridge + 1238 K8T890 Host Bridge + 1258 PT880 Host Bridge + 1259 CN333/CN400/PM880 Host Bridge + 1269 KT880 Host Bridge + 1282 K8T800Pro Host Bridge + 1290 K8M890 Host Bridge + 1293 PM896 Host Bridge + 1296 P4M800 Host Bridge + 1308 PT894 Host Bridge + 1314 CN700/VN800/P4M800CE/Pro Host Bridge + 1324 CX700/VX700-Series Error Reporting + 1327 P4M890 Host Bridge + 1336 K8M890CE Host Bridge + 1340 PT900 Host Bridge + 1351 VT3351 Host Bridge + 1353 VX800/VX820 Error Reporting + 1364 CN896/VN896/P4M900 Host Bridge + 1409 VX855/VX875 Error Reporting + 1410 VX900 Series Error Reporting + 1571 VT82C576M/VT82C586 + 1595 VT82C595/97 [Apollo VP2/97] + 1732 VT1732 [Envy24 II] PCI Multi-Channel Audio Controller + 2106 VIA Rhine Family Fast Ethernet Adapter (VT6105) + 2204 K8M800 Host Bridge + 2208 PT890 Host Bridge + 2238 K8T890 Host Bridge + 2258 PT880 Host Bridge + 2259 CN333/CN400/PM880 CPU Host Bridge + 2269 KT880 Host Bridge + 2282 K8T800Pro Host Bridge + 2290 K8M890 Host Bridge + 2293 PM896 Host Bridge + 2296 P4M800 Host Bridge + 2308 PT894 Host Bridge + 2314 CN700/VN800/P4M800CE/Pro Host Bridge + 2324 CX700/VX700-Series Host Interface Control + 2327 P4M890 Host Bridge + 2336 K8M890CE Host Bridge + 2340 PT900 Host Bridge + 2351 VT3351 Host Bridge + 2353 VX800/VX820 Host Bus Control + 2364 CN896/VN896/P4M900 Host Bridge + 2409 VX855/VX875 Host Bus Control + 2410 VX900 Series CPU Bus Controller + 287a VT8251 PCI to PCI Bridge + 287b VT8251 Host Bridge + 287c VT8251 PCIE Root Port + 287d VT8251 PCIE Root Port + 287e VT8237/8251 Ultra VLINK Controller + 3022 CLE266 + 3038 VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller + 0925 1234 onboard UHCI USB 1.1 Controller + 1019 0985 P6VXA Motherboard + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1043 8080 A7V333 motherboard + 1043 808c VT62xx USB1.1 4 port controller + 1043 80a1 A7V8X-X motherboard + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1179 0001 Magnia Z310 + 1234 0925 MVP3 USB Controller + 1458 5004 GA-7VAX Mainboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7120 KT4AV motherboard + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 182d 201d CN-029 USB2.0 4 port PCI Card +# probably all K7VT2/4*/6 + 1849 3038 K7VT series Motherboards + 19da a179 ZBOX nano VD01 + 1af4 1100 QEMU Virtual Machine + 3040 VT82C586B ACPI + 3043 VT86C100A [Rhine] + 10bd 0000 VT86C100A Fast Ethernet Adapter + 1106 0100 VT86C100A Fast Ethernet Adapter + 1186 1400 DFE-530TX PCI Fast Ethernet Adapter (rev. A) + 3044 VT6306/7/8 [Fire II(M)] IEEE 1394 OHCI Controller + 0010 0001 IEEE 1394 4port DCST 1394-3+1B + 1025 005a TravelMate 290 + 103c 2a20 Pavilion t3030.de Desktop PC + 103c 2a3b Media Center PC m7590n + 1043 808a A8V/A8N/P4P800/P5SD2 series motherboard + 1043 81fe Motherboard + 1458 1000 GA-7VT600-1394 Motherboard + 1462 207d K8NGM2 series motherboard + 1462 217d Aspire L250 + 1462 590d KT6 Delta-FIS2R (MS-6590) + 1462 702d K8T NEO 2 motherboard + 1462 971d MS-6917 + 3050 VT82C596 Power Management + 3051 VT82C596 Power Management + 3053 VT6105M [Rhine-III] + 1186 1404 DFE-530TX PCI Fast Ethernet Adapter (rev. D) + 3057 VT82C686 [Apollo Super ACPI] + 1019 0985 P6VXA Motherboard + 1019 0987 K7VZA Motherboard + 1043 8033 A7V Mainboard + 1043 803e A7V-E Mainboard + 1043 8040 A7M266 Mainboard + 1043 8042 A7V133/A7V133-C Mainboard + 1179 0001 Magnia Z310 + 3058 VT82C686 AC97 Audio Controller + 0e11 0097 SoundMax Digital Integrated Audio + 0e11 b194 Soundmax integrated digital audio + 1019 0985 P6VXA Motherboard + 1019 0987 K7VZA Motherboard + 103c 1251 D9840-60001 [Brio BA410 Motherboard] + 1043 1106 A7V133/A7V133-C Mainboard + 1106 4511 Onboard Audio on EP7KXA + 1106 aa03 VT1612A AC'97 Audio Controller + 11d4 5348 AD1881A audio + 1458 7600 Onboard Audio + 1462 3091 MS-6309 Onboard Audio + 1462 3092 MS-6309 v2.x Mainboard (VIA VT1611A codec) + 1462 3300 MS-6330 Onboard Audio + 1462 3400 MS-6340 (VT8363) motherboard + 15dd 7609 Onboard Audio + 3059 VT8233/A/8235/8237 AC97 Audio Controller + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1019 1841 M811 (VT8367/VT8235/VT6103) [KT333] motherboard + 1019 1877 K8M800-M2 (V2.0) onboard audio + 1043 8095 A7V8X Motherboard (Realtek ALC650 codec) + 1043 80a1 A7V8X-X Motherboard + 1043 80b0 A7V600/K8V-X/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX]) + 1043 80f3 SK8V motherboard + 1043 810d P5VD1-X (AD1888 codec [SoundMax]) + 1043 812a A8V Deluxe motherboard (Realtek ALC850 codec) + 10ec 8168 High Definition Audio + 1106 3059 L7VMM2 Motherboard + 1106 4161 K7VT2 motherboard + 1106 4170 PCPartner P4M800-8237R Motherboard + 1106 4552 Soyo KT-600 Dragon Plus (Realtek ALC 650) + 1297 c160 FX41 motherboard (Realtek ALC650 codec) + 1413 147b KV8 Pro motherboard onboard audio + 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650) + 1462 0080 K8T NEO 2 motherboard + 1462 3800 KT266 onboard audio + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 1695 300c Realtek ALC655 audio on EP-8KRA series mainboard + 1849 0850 ASRock 775Dual-880 Pro onboard audio (Realtek ALC850) + 1849 9739 P4VT8 Mainboard (C-Media CMI9739A codec) +# probably all K7VT2/4*/6 + 1849 9761 K7VT series Motherboards + 4005 4710 MSI K7T266 Pro2-RU (MSI-6380 v2) onboard audio (Realtek/ALC 200/200P) + a0a0 01b6 AK77-8XN onboard audio + a0a0 0342 AK86-L motherboard + 3065 VT6102/VT6103 [Rhine-II] + 1043 80a1 A7V8X-X Motherboard + 1043 80ed A7V600-X Motherboard + 1106 0102 VT6102/6103 [Rhine II] Ethernet Controller + 1186 1400 DFE-530TX PCI Fast Ethernet Adapter (rev. A) + 1186 1401 DFE-530TX PCI Fast Ethernet Adapter (rev. B) + 1186 1402 DFE-530TX PCI Fast Ethernet Adapter (rev. B) + 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B) + 1462 7061 MS-7061 + 1462 7181 K8MM3-V mainboard + 147b 1c09 NV7 Motherboard + 1695 3005 VT6103 +# probably all K7VT2/4*/6 + 1849 3065 K7VT series Motherboards +# This hosts more than just the Intel 537 codec, it also hosts PCtel (SIL33) and SmartLink (SIL34) codecs + 3068 AC'97 Modem Controller + 1462 309e MS-6309 Saturn Motherboard + 3074 VT8233 PCI to ISA Bridge + 1043 8052 VT8233A + 3091 VT8633 [Apollo Pro266] + 3099 VT8366/A/7 [Apollo KT266/A/333] + 1019 1841 M811 (VT8367/VT8235/VT6103) [KT333] motherboard + 1043 8064 A7V266-E Mainboard + 1043 807f A7V333 Mainboard + 1849 3099 K7VT2 motherboard + 3101 VT8653 Host Bridge + 3102 VT8662 Host Bridge + 3103 VT8615 Host Bridge + 3104 USB 2.0 EHCI-Compliant Host-Controller + 0925 1234 onboard EHCI USB 2.0 Controller + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1043 808c A7V8X motherboard + 1043 80a1 A7V8X-X motherboard rev 1.01 + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1106 3104 USB 2.0 Controller + 1297 f641 FX41 motherboard + 1458 5004 GA-7VAX Mainboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T NEO 2 motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7120 KT4AV motherboard + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 182d 201d CN-029 USB 2.0 4 port PCI Card +# probably all K7VT2/4*/6 + 1849 3104 K7VT series Motherboards + 19da a179 ZBOX nano VD01 + 3106 VT6105/VT6106S [Rhine-III] + 1106 0105 VT6106S [Rhine-III] + 1186 1403 DFE-530TX PCI Fast Ethernet Adapter (rev. C) + 1186 1405 DFE-520TX Fast Ethernet PCI Adapter + 1186 1406 DFE-530TX+ rev F2 + 1186 1407 DFE-538TX + 3108 K8M800/K8N800/K8N800A [S3 UniChrome Pro] + 3109 VT8233C PCI to ISA Bridge + 3112 VT8361 [KLE133] Host Bridge + 3113 VPX/VPX2 PCI to PCI Bridge Controller + 3116 VT8375 [KM266/KL266] Host Bridge + 1297 f641 FX41 motherboard + 3118 CN400/PM800/PM880/PN800/PN880 [S3 UniChrome Pro] + 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter + 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics + 3123 VT8623 [Apollo CLE266] + 3128 VT8753 [P4X266 AGP] + 3133 VT3133 Host Bridge + 3142 VT6651 WiFi Adapter, 802.11b + 3147 VT8233A ISA Bridge + 1043 808c A7V333 motherboard + 3148 P4M266 Host Bridge + 3149 VIA VT6420 SATA RAID Controller + 1043 80ed A7V600/K8V Deluxe/K8V-X/A8V Deluxe motherboard + 1458 b003 GA-7VM400AM(F) Motherboard + 1462 5901 KT6 Delta-FIS2R (MS-6590) + 1462 7020 K8T Neo 2 Motherboard + 1462 7094 K8T Neo2-F V2.0 + 1462 7181 K8MM3-V mainboard + 147b 1407 KV8-MAX3 motherboard + 147b 1408 KV7 + 1849 3149 K7VT6 motherboard + a0a0 04ad AK86-L motherboard + 3156 P/KN266 Host Bridge + 3157 CX700/VX700 [S3 UniChrome Pro] + 3164 VT6410 ATA133 RAID controller + 1043 80f4 P4P800 Mainboard Deluxe ATX + 1462 7028 915P/G Neo2 + 3168 P4X333/P4X400/PT800 AGP Bridge + 1849 3168 P4VT8 Mainboard + 3177 VT8235 ISA Bridge + 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) + 1019 1841 M811 (VT8367/VT8235/VT6103) [KT333] motherboard + 1043 808c A7V8X motherboard + 1043 80a1 A7V8X-X motherboard + 1106 0000 KT4AV motherboard + 1297 f641 FX41 motherboard + 1458 5001 GA-7VAX Mainboard +# probably all K7VT2/4*/6 + 1849 3177 K7VT series Motherboards + 3178 ProSavageDDR P4N333 Host Bridge + 3188 VT8385 [K8T800 AGP] Host Bridge + 1043 80a3 K8V Deluxe/K8V-X motherboard + 147b 1407 KV8-MAX3 motherboard + 3189 VT8377 [KT400/KT600 AGP] Host Bridge + 1043 807f A7V8X motherboard + 1106 0000 KT4AV motherboard (KT400A) + 1458 5000 GA-7VAX Mainboard +# probably all K7VT2/4*/6 + 1849 3189 K7VT series Motherboards + 31b0 VX11 Standard Host Bridge + 31b1 VX11 Standard Host Bridge + 31b2 VX11 DRAM Controller + 31b3 VX11 Power Management Controller + 31b4 VX11 I/O APIC + 31b5 VX11 Scratch Device + 31b7 VX11 Standard Host Bridge + 31b8 VX11 PCI to PCI Bridge + 3204 K8M800 Host Bridge + 3205 VT8378 [KM400/A] Chipset Host Bridge + 1458 5000 GA-7VM400M Motherboard + 3208 PT890 Host Bridge + 3213 VPX/VPX2 PCI to PCI Bridge Controller + 3218 K8T800M Host Bridge + 3227 VT8237 ISA bridge [KT600/K8T800/K8T890 South] + 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard + 1106 3227 DFI KT600-AL / Soltek SL-B9D-FGR Motherboard + 1458 5001 GA-7VT600 Motherboard + 147b 1407 KV8-MAX3 motherboard + 1849 3227 K7VT4 motherboard + 3230 K8M890CE/K8N890CE [Chrome 9] + 3238 K8T890 Host Bridge + 3249 VT6421 IDE/SATA Controller + 1106 3249 VT6421 IDE/SATA Controller + 324a CX700/VX700 PCI to PCI Bridge + 324b CX700/VX700 Host Bridge + 324e CX700/VX700 Internal Module Bus + 3253 VT6655 WiFi Adapter, 802.11a/b/g + 3258 PT880 Host Bridge + 3259 CN333/CN400/PM880 Host Bridge + 3260 VIA Chrome9 HC IGP + 3269 KT880 Host Bridge + 3282 K8T800Pro Host Bridge + 3287 VT8251 PCI to ISA Bridge + 3288 VX900/VT8xxx High Definition Audio Controller + 19da a179 ZBOX VD01 + 3290 K8M890 Host Bridge + 3296 P4M800 Host Bridge + 3324 CX700/VX700-Series DRAM Bus Control + 3327 P4M890 Host Bridge + 3336 K8M890CE Host Bridge + 3337 VT8237A PCI to ISA Bridge + 3340 PT900 Host Bridge + 3343 P4M890 [S3 UniChrome Pro] + 3344 CN700/P4M800 Pro/P4M800 CE/VN800 Graphics [S3 UniChrome Pro] + 3349 VT8251 AHCI/SATA 4-Port Controller + 3351 VT3351 Host Bridge + 3353 VX800/820 PCI to PCI Bridge + 3364 CN896/VN896/P4M900 Host Bridge + 3365 VT630x IEEE 1394 Host Controller [Fire II/M] + 3371 CN896/VN896/P4M900 [Chrome 9 HC] + 3372 VT8237S PCI to ISA Bridge + 337a VT8237A PCI to PCI Bridge + 337b VT8237A Host Bridge + 3403 VT6315 Series Firewire Controller + 1043 8374 M5A88-V EVO + 1043 8384 P8P67 Deluxe Motherboard + 3409 VX855/VX875 DRAM Bus Control + 3410 VX900 Series DRAM Bus Control + 19da a179 ZBOX nano VD01 + 3432 VL800/801 xHCI USB 3.0 Controller + 3456 VX11 Standard Host Bridge + 345b VX11 Miscellaneous Bus + 3483 VL805/806 xHCI USB 3.0 Controller + 3a01 VX11 Graphics [Chrome 645/640] + 4149 VIA VT6420 (ATA133) Controller + 4204 K8M800 Host Bridge + 4208 PT890 Host Bridge + 4238 K8T890 Host Bridge + 4258 PT880 Host Bridge + 4259 CN333/CN400/PM880 Host Bridge + 4269 KT880 Host Bridge + 4282 K8T800Pro Host Bridge + 4290 K8M890 Host Bridge + 4293 PM896 Host Bridge + 4296 P4M800 Host Bridge + 4308 PT894 Host Bridge + 4314 CN700/VN800/P4M800CE/Pro Host Bridge + 4324 CX700/VX700-Series Power Management and Testing Control + 4327 P4M890 Host Bridge + 4336 K8M890CE Host Bridge + 4340 PT900 Host Bridge + 4351 VT3351 Host Bridge + 4353 VX800/VX820 Power Management Control + 4364 CN896/VN896/P4M900 Host Bridge + 4409 VX855/VX875 Power Management Control + 4410 VX900 Series Power Management and Chip Testing Control + 19da a179 ZBOX nano VD01 + 5030 VT82C596 ACPI [Apollo PRO] + 5122 VX855/VX875 Chrome 9 HCM Integrated Graphics + 5208 PT890 I/O APIC Interrupt Controller + 5238 K8T890 I/O APIC Interrupt Controller + 5287 VT8251 Serial ATA Controller + 5290 K8M890 I/O APIC Interrupt Controller + 5308 PT894 I/O APIC Interrupt Controller + 5324 CX700M2/VX700/VX800/820-Series Serial ATA & EIDE-Controller + 5327 P4M890 I/O APIC Interrupt Controller + 5336 K8M890CE I/O APIC Interrupt Controller + 5340 PT900 I/O APIC Interrupt Controller + 5351 VT3351 I/O APIC Interrupt Controller + 5353 VX800/VX820 APIC and Central Traffic Control + 5364 CN896/VN896/P4M900 I/O APIC Interrupt Controller + 5372 VT8237/8251 Serial ATA Controller + 5409 VX855/VX875 APIC and Central Traffic Control + 5410 VX900 Series APIC and Central Traffic Control + 6100 VT85C100A [Rhine II] + 6287 SATA RAID Controller + 6290 K8M890CE Host Bridge + 6327 P4M890 Security Device + 6353 VX800/VX820 Scratch Registers + 6364 CN896/VN896/P4M900 Security Device + 6409 VX855/VX875 Scratch Registers + 6410 VX900 Series Scratch Registers + 19da a179 ZBOX nano VD01 + 7122 VX900 Graphics [Chrome9 HD] + 7204 K8M800 Host Bridge + 7205 KM400/KN400/P4M800 [S3 UniChrome] + 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard + 1462 7061 MS-7061 + 7208 PT890 Host Bridge + 7238 K8T890 Host Bridge + 7258 PT880 Host Bridge + 7259 CN333/CN400/PM880 Host Bridge + 7269 KT880 Host Bridge + 7282 K8T800Pro Host Bridge + 7290 K8M890 Host Bridge + 7293 PM896 Host Bridge + 7296 P4M800 Host Bridge + 7308 PT894 Host Bridge + 7314 CN700/VN800/P4M800CE/Pro Host Bridge + 7324 CX700/VX700-Series North-South Module Interface Control + 7327 P4M890 Host Bridge + 7336 K8M890CE Host Bridge + 7340 PT900 Host Bridge + 7351 VT3351 Host Bridge + 7353 VX800/VX820 North-South Module Interface Control + 7364 CN896/VN896/P4M900 Host Bridge + 7409 VX855/VX875 North-South Module Interface Control + 7410 VX900 Series North-South Module Interface Control + 19da a179 ZBOX nano VD01 + 8231 VT8231 [PCI-to-ISA Bridge] + 8235 VT8235 ACPI + 8305 VT8363/8365 [KT133/KM133 AGP] + 8324 CX700/VX700-Series Bus Control and Power Management + 8353 VX800/VX820 Bus Control and Power Management + 8391 VT8371 [KX133 AGP] + 8400 MVP4 + 8409 VX855/VX875 Bus Control and Power Management + 8410 VX900 Series Bus Control and Power Management + 19da a179 ZBOX VD01 + 8500 KLE133/PLE133/PLE133T + 8501 VT8501 [Apollo MVP4 AGP] + 8596 VT82C596 [Apollo PRO AGP] + 8597 VT82C597 [Apollo VP3 AGP] + 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP] + 1019 0985 P6VXA Motherboard + 8601 VT8601 [Apollo ProMedia AGP] + 8605 VT8605 [PM133 AGP] + 8691 VT82C691 [Apollo Pro] + 8693 VT82C693 [Apollo Pro Plus] PCI Bridge + 8a25 PL133/PL133T [S3 ProSavage] + 8a26 KL133/KL133A/KM133/KM133A [S3 ProSavage] + 8d01 PN133/PN133T [S3 Twister] + 8d04 KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR] + 9001 VX900 Series Serial-ATA Controller + 9082 Standard AHCI 1.0 SATA Controller + 9140 HDMI Audio Device + 9201 USB3.0 Controller +# Centaur CNS Coprocessor + 9380 Ncore Coprocessor + 9530 VX800/820/900 Series Secure Digital Memory Card Controller + 95d0 VX800/820/900 Series SDIO Host Controller + a208 PT890 PCI to PCI Bridge Controller + a238 K8T890 PCI to PCI Bridge Controller + a327 P4M890 PCI to PCI Bridge Controller + a353 VX8xx/900 Series South-North Module Interface Control + a364 CN896/VN896/P4M900 PCI to PCI Bridge Controller + a409 VX855/VX875/VX900 Series USB Device Controller + a410 VX900 Series PCI Express Root Port 0 + b091 VT8633 [Apollo Pro266 AGP] + b099 VT8366/A/7 [Apollo KT266/A/333 AGP] + b101 VT8653 AGP Bridge + b102 VT8362 AGP Bridge + b103 VT8615 AGP Bridge + b112 VT8361 [KLE133] AGP Bridge + b113 VPX/VPX2 I/O APIC Interrupt Controller + b115 VT8363/8365 [KT133/KM133] PCI Bridge + b168 VT8235 PCI Bridge + b188 VT8237/8251 PCI bridge [K8M890/K8T800/K8T890 South] + 147b 1407 KV8-MAX3 motherboard + b198 VT8237/CX700/VX700-Series PCI to PCI Bridge + b213 VPX/VPX2 I/O APIC Interrupt Controller + b353 VX855/VX875/VX900 PCI to PCI Bridge + b410 VX900 Series PCI Express Root Port 1 + b999 [K8T890 North / VT8237 South] PCI Bridge + c208 PT890 PCI to PCI Bridge Controller + c238 K8T890 PCI to PCI Bridge Controller + c327 P4M890 PCI to PCI Bridge Controller + c340 PT900 PCI to PCI Bridge Controller + c353 VX800/820-Series PCI-Express Root (PCI-to-PCI Virtual Bridge) + c364 CN896/VN896/P4M900 PCI to PCI Bridge Controller + c409 VX855/VX875 EIDE Controller + c410 VX900 Series PCI Express Root Port 2 + d104 VT8237R USB UDCI Controller + d208 PT890 PCI to PCI Bridge Controller + d213 VPX/VPX2 PCI to PCI Bridge Controller + d238 K8T890 PCI to PCI Bridge Controller + d340 PT900 PCI to PCI Bridge Controller + d410 VX900 Series PCI Express Root Port 3 + e208 PT890 PCI to PCI Bridge Controller + e238 K8T890 PCI to PCI Bridge Controller + e340 PT900 PCI to PCI Bridge Controller + e353 VX800/820-Series PCI-Express Root Port 0 + e410 VX900 Series PCI Express Physical Layer Electrical Sub-block + f208 PT890 PCI to PCI Bridge Controller + f238 K8T890 PCI to PCI Bridge Controller + f340 PT900 PCI to PCI Bridge Controller + f353 VX800/820-Series PCI-Express Root Port 1 + f410 VX900 Series PCI UART Port 0-3 +1107 Stratus Computers + 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!) +1108 Proteon, Inc. + 0100 p1690plus_AA + 0101 p1690plus_AB + 0105 P1690Plus + 0108 P1690Plus + 0138 P1690Plus + 0139 P1690Plus + 013c P1690Plus + 013d P1690Plus +1109 Cogent Data Technologies, Inc. + 1400 EM110TX [EX110TX] +110a Siemens AG + 0002 Pirahna 2-port + 0005 Tulip controller, power management, switch extender + 0006 FSC PINC (I/O-APIC) + 0015 FSC Multiprocessor Interrupt Controller + 001d FSC Copernicus Management Controller + 007b FSC Remote Service Controller, mailbox device + 007c FSC Remote Service Controller, shared memory device + 007d FSC Remote Service Controller, SMIC device + 2101 HST SAPHIR V Primary PCI (ISDN/PMx) +# Superfastcom-PCI (Commtech, Inc.) or DSCC4 WAN Adapter + 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels + 2104 Eicon Diva 2.02 compatible passive ISDN card + 3141 SIMATIC NET CP 5611 / 5621 + 3142 SIMATIC NET CP 5613 / 5614 + 3143 SIMATIC NET CP 1613 + 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter) + 4029 SIMATIC NET CP 5613 A2 + 110a 4029 SIMATIC NET CP 5613 A2 + 110a c029 SIMATIC NET CP 5614 A2 + 4035 SIMATIC NET CP 1613 A2 + 4036 SIMATIC NET CP 1616 + 4038 SIMATIC NET CP 1604 + 4069 SIMATIC NET CP 5623 + 110a 4069 SIMATIC NET CP 5623 + 110a c069 SIMATIC NET CP 5624 + 407c SIMATIC NET CP 5612 + 407d SIMATIC NET CP 5613 A3 + 407e SIMATIC NET CP 5622 + 4083 SIMATIC NET CP 5614 A3 + 4084 SIMATIC NET CP 1626 + 4942 FPGA I-Bus Tracer for MBD + 6120 SZB6120 +110b Chromatic Research Inc. + 0001 Mpact Media Processor + 0004 Mpact 2 +110c Mini-Max Technology, Inc. +110d Znyx Advanced Systems +110e CPU Technology +110f Ross Technology +1110 Powerhouse Systems + 6037 Firepower Powerized SMP I/O ASIC + 6073 Firepower Powerized SMP I/O ASIC +1111 Santa Cruz Operation +# Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom +1112 Osicom Technologies Inc + 2200 FDDI Adapter + 2300 Fast Ethernet Adapter + 2340 4 Port Fast Ethernet Adapter + 2400 ATM Adapter +1113 Accton Technology Corporation + 1211 SMC2-1211TX + 103c 1207 EN-1207D Fast Ethernet Adapter + 1113 1211 EN-1207D Fast Ethernet Adapter + 1216 EN-1216 Ethernet Adapter + 1113 1216 EN1207F series PCI Fast Ethernet Adapter + 1113 2220 EN2220A Cardbus Fast Ethernet Adapter + 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card + 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?] + 1217 EN-1217 Ethernet Adapter + 5105 10Mbps Network card + 9211 EN-1207D Fast Ethernet Adapter + 1113 9211 EN-1207D Fast Ethernet Adapter + 9511 21x4x DEC-Tulip compatible Fast Ethernet + d301 CPWNA100 (Philips wireless PCMCIA) + ec02 SMC 1244TX v3 + ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter +1114 Atmel Corporation + 0506 at76c506 802.11b Wireless Network Adaptor +1115 3D Labs +1116 Data Translation + 0022 DT3001 + 0023 DT3002 + 0024 DT3003 + 0025 DT3004 + 0026 DT3005 + 0027 DT3001-PGL + 0028 DT3003-PGL + 0051 DT322 + 0060 DT340 + 0069 DT332 + 80c2 DT3162 +1117 Datacube, Inc + 9500 Max-1C SVGA card + 9501 Max-1C image processing +1118 Berg Electronics +1119 ICP Vortex Computersysteme GmbH + 0000 GDT 6000/6020/6050 + 0001 GDT 6000B/6010 + 0002 GDT 6110/6510 + 0003 GDT 6120/6520 + 0004 GDT 6530 + 0005 GDT 6550 + 0006 GDT 6117/6517 + 0007 GDT 6127/6527 + 0008 GDT 6537 + 0009 GDT 6557/6557-ECC + 000a GDT 6115/6515 + 000b GDT 6125/6525 + 000c GDT 6535 + 000d GDT 6555/6555-ECC + 0100 GDT 6117RP/6517RP + 0101 GDT 6127RP/6527RP + 0102 GDT 6537RP + 0103 GDT 6557RP + 0104 GDT 6111RP/6511RP + 0105 GDT 6121RP/6521RP + 0110 GDT 6117RD/6517RD + 0111 GDT 6127RD/6527RD + 0112 GDT 6537RD + 0113 GDT 6557RD + 0114 GDT 6111RD/6511RD + 0115 GDT 6121RD/6521RD + 0118 GDT 6118RD/6518RD/6618RD + 0119 GDT 6128RD/6528RD/6628RD + 011a GDT 6538RD/6638RD + 011b GDT 6558RD/6658RD + 0120 GDT 6117RP2/6517RP2 + 0121 GDT 6127RP2/6527RP2 + 0122 GDT 6537RP2 + 0123 GDT 6557RP2 + 0124 GDT 6111RP2/6511RP2 + 0125 GDT 6121RP2/6521RP2 + 0136 GDT 6113RS/6513RS + 0137 GDT 6123RS/6523RS + 0138 GDT 6118RS/6518RS/6618RS + 0139 GDT 6128RS/6528RS/6628RS + 013a GDT 6538RS/6638RS + 013b GDT 6558RS/6658RS + 013c GDT 6533RS/6633RS + 013d GDT 6543RS/6643RS + 013e GDT 6553RS/6653RS + 013f GDT 6563RS/6663RS + 0166 GDT 7113RN/7513RN/7613RN + 0167 GDT 7123RN/7523RN/7623RN + 0168 GDT 7118RN/7518RN/7518RN + 0169 GDT 7128RN/7528RN/7628RN + 016a GDT 7538RN/7638RN + 016b GDT 7558RN/7658RN + 016c GDT 7533RN/7633RN + 016d GDT 7543RN/7643RN + 016e GDT 7553RN/7653RN + 016f GDT 7563RN/7663RN + 01d6 GDT 4x13RZ + 01d7 GDT 4x23RZ + 01f6 GDT 8x13RZ + 01f7 GDT 8x23RZ + 01fc GDT 8x33RZ + 01fd GDT 8x43RZ + 01fe GDT 8x53RZ + 01ff GDT 8x63RZ + 0210 GDT 6519RD/6619RD + 0211 GDT 6529RD/6629RD + 0260 GDT 7519RN/7619RN + 0261 GDT 7529RN/7629RN + 02ff GDT MAXRP + 0300 GDT NEWRX + 0301 GDT NEWRX2 +111a Efficient Networks, Inc + 0000 155P-MF1 (FPGA) + 0002 155P-MF1 (ASIC) + 0003 ENI-25P ATM + 111a 0000 ENI-25p Miniport ATM Adapter + 0005 SpeedStream (LANAI) + 111a 0001 ENI-3010 ATM + 111a 0009 ENI-3060 ADSL (VPI=0) + 111a 0101 ENI-3010 ATM + 111a 0109 ENI-3060CO ADSL (VPI=0) + 111a 0809 ENI-3060 ADSL (VPI=0 or 8) + 111a 0909 ENI-3060CO ADSL (VPI=0 or 8) + 111a 0a09 ENI-3060 ADSL (VPI=<0..15>) + 0007 SpeedStream ADSL + 111a 1001 ENI-3061 ADSL [ASIC] + 1020 SpeedStream PCI 10/100 Network Card + 1203 SpeedStream 1023 Wireless PCI Adapter +111b Teledyne Electronic Systems +111c Tricord Systems Inc. + 0001 Powerbis Bridge +# now owned by Microchip Technology +111d Microsemi / PMC / IDT + 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR] + 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller + 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller + 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller + 8018 PES12N3A 12-lane 3-Port PCI Express Switch + 801c PES24N3A PCI Express Switch + 8028 PES4T4 PCI Express Switch + 802b PES8T5A PCI Express Switch + 802c PES16T4 PCI Express Switch + 802d PES16T7 PCI Express Switch + 802e PES24T6 PCI Express Switch + 802f PES32T8 PCI Express Switch + 8032 PES48T12 PCI Express Switch + 8034 PES16/22/34H16 PCI Express Switch + 8035 PES32H8 PCI Express Switch + 8036 PES48H12 PCI Express Switch + 8037 PES64H16 PCI Express Switch + 8039 PES3T3 PCI Express Switch + 803a PES4T4 PCI Express Switch + 803c PES5T5 PCI Express Switch + 803d PES6T5 PCI Express Switch + 8048 PES8NT2 PCI Express Switch + 8049 PES8NT2 PCI Express Switch + 804a PES8NT2 PCI Express Internal NTB + 804b PES8NT2 PCI Express External NTB + 804c PES16NT2 PCI Express Switch + 804d PES16NT2 PCI Express Switch + 804e PES16NT2 PCI Express Internal NTB + 804f PES16NT2 PCI Express External NTB + 8058 PES12NT3 PCI Express Switch + 8059 PES12NT3 PCI Express Switch + 805a PES12NT3 PCI Express Internal NTB + 805b PES12NT3 PCI Express External NTB + 805c PES24NT3 PCI Express Switch + 805d PES24NT3 PCI Express Switch + 805e PES24NT3 PCI Express Internal NTB + 805f PES24NT3 PCI Express External NTB + 8060 PES16T4G2 PCI Express Gen2 Switch + 8061 PES12T3G2 PCI Express Gen2 Switch + 8068 PES6T6G2 PCI Express Gen2 Switch + 806a PES24T3G2 PCI Express Gen2 Switch + 14c1 000c 10G-PCIE2-8B2 + 806c PES16T4A/4T4G2 PCI Express Gen2 Switch + 806e PES24T6G2 PCI Express Gen2 Switch + 806f HIO524G2 PCI Express Gen2 Switch + 8077 89HPES64H16G2 64-Lane 16-Port PCIe Gen2 System Interconnect Switch + 8088 PES32NT8BG2 PCI Express Switch + 1093 752f PXIe-8383mc Device + 1093 7543 PXIe-8383mc System Host + 1093 755c PXIe-8364 + 1093 755d PXIe-8374 + 1093 75ff PXIe-8383mc DMA + 1093 7600 PXIe-8383mc DMA + 1093 7602 PXIe-8384 +# 32-lanes 24-ports Gen.2 + 808a 89HPES32NT24BG2 PCI Express Switch +# 32-lanes 24-ports Gen.2 + 808c 89HPES32NT24AG2 PCI Express Switch + 808e PES24NT24G2 PCI Express Switch + 808f 89HPES32NT8AG2 32-Lane 8-Port PCIe Gen2 System Interconnect Switch with Non-Transparent Bridging + 8090 89HPES16NT16G2 16-Lane 16-Port PCIe Gen2 System Interconnect Switch + 8092 89HPES12NT12G2 12-Lane 12-Port PCIe Gen2 System Interconnect Switch + 80cf F32P08xG3 [PCIe boot mode] + 80d2 F32P08xG3 NVMe controller +111e Eldec +111f Precision Digital Images + 4a47 Precision MX Video engine interface + 5243 Frame capture bus interface +# formerly EMC Corporation +1120 Dell EMC + 2306 Unity Fibre Channel Controller + 2501 Unity Ethernet Controller + 2505 Unity Fibre Channel Controller +1121 Zilog +1122 Multi-tech Systems, Inc. +1123 Excellent Design, Inc. +1124 Leutron Vision AG + 2581 Picport Monochrome +1125 Eurocore +1126 Vigra +1127 FORE Systems Inc + 0200 ForeRunner PCA-200 ATM + 0210 PCA-200PC + 0250 ATM + 0300 ForeRunner PCA-200EPC ATM + 0310 ATM + 0400 ForeRunnerHE ATM Adapter + 1127 0400 ForeRunnerHE ATM +1129 Firmworks +112a Hermes Electronics Company, Ltd. +# nee Linotype - Hell AG +112b Heidelberger Druckmaschinen AGHeidelberger Druckmaschinen AG +112c Zenith Data Systems +112d Ravicad +112e Infomedia Microelectronics Inc. +112f Dalsa Inc. + 0000 MVC IC-PCI + 0001 MVC IM-PCI Video frame grabber/processor + 0004 PCDig Digital Image Capture + 0008 PC-CamLink PCI framegrabber +1130 Computervision +1131 Philips Semiconductors + 1561 USB 1.1 Host Controller + 1775 c200 C2K onboard USB 1.1 host controller + 1562 USB 2.0 Host Controller + 1775 c200 C2K onboard USB 2.0 host controller + 3400 SmartPCI56(UCB1500) 56K Modem + 5400 TriMedia TM1000/1100 + 12ca 0000 BlueICE + 5402 TriMedia TM1300 + 1244 0f00 Fritz!Card DSL + 15eb 1300 DT1300 + 15eb 1302 DT1302 + 15eb 1304 DT1304 + 15eb 1305 DT1305 + 15eb 1306 PMCDT1306 + 15eb 1308 DT1308 + 15eb 1331 DT1301 with SAA7121 + 15eb 1337 DT1301 with SAA7127 + 15eb 2d3d X3D + 15eb 7022 PTM1300 + 5405 TriMedia TM1500 + 1136 0005 LCP-1500 + 5406 TriMedia TM1700 + 540b PNX1005 Media Processor + 1131 0020 PNXLite PCI Demo Board + 7130 SAA7130 Video Broadcast Decoder + 0000 4016 Behold TV 401 + 0000 4051 Behold TV 405 FM + 0000 5051 Behold TV 505 RDS + 0000 505b Behold TV 505 RDS + 102b 48d0 Matrox CronosPlus + 1048 226b ELSA EX-VISION 300TV + 107d 6655 WinFast DTV1000S + 1131 0000 SAA7130-based TV tuner card + 1131 2001 10MOONS PCI TV CAPTURE CARD + 1131 2005 Techcom (India) TV Tuner Card (SSD-TV-670) + 1458 9006 GT-PS700 DVB-S tuner + 1461 050c Nagase Sangyo TransGear 3000TV + 1461 10ff AVerMedia DVD EZMaker + 1461 2108 AverMedia AverTV/305 + 1461 2115 AverMedia AverTV Studio 305 + 153b 1152 Terratec Cinergy 200 TV + 185b c100 Compro VideoMate TV PVR/FM + 185b c901 Videomate DVB-T200 + 5168 0138 LifeView FlyVIDEO2000 + 5ace 5010 Behold TV 501 + 5ace 5050 Behold TV 505 FM + 7133 SAA7131/SAA7133/SAA7135 Video Broadcast Decoder + 0000 4091 Beholder BeholdTV 409 FM + 0000 5071 Behold TV 507 RDS + 0000 507b Behold TV 507 RDS + 0000 5201 Behold TV Columbus + 0070 6701 WinTV HVR-1110 + 1019 4cb5 Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) + 1043 0210 FlyTV mini Asus Digimatrix + 1043 4843 TV-FM 7133 + 1043 4845 TV-FM 7135 + 1043 4862 P7131 Dual + 1043 4876 My Cinema-P7131 Hybrid + 1131 0000 SAA713x-based TV tuner card + 1131 2001 Proteus Pro [philips reference design] + 1131 2018 Tiger reference design + 1131 4ee9 MonsterTV Mobile + 1131 7133 Pinnacle PCTV 301i + 11bd 002b PCTV Stereo + 11bd 002e PCTV 110i (saa7133) + 12ab 0800 PURPLE TV + 13c2 2804 Technotrend Budget T-3000 Hybrid + 1421 0335 Instant TV DVB-T Cardbus + 1421 1370 Instant TV (saa7135) + 1435 7330 VFG7330 + 1435 7350 VFG7350 + 1458 9001 GC-PTV-TAF Hybrid TV card + 1458 9002 GT-PTV-TAF-RH DVB-T/Analog TV/FM tuner + 1458 9003 GT-PTV-AF-RH Analog TV/FM tuner + 1458 9004 GT-P8000 DVB-T/Analog TV/FM tuner + 1458 9005 GT-P6000 Analog TV/FM tuner + 1458 9008 GT-P5100 Analog TV tuner + 1461 1044 AVerTVHD MCE A180 + 1461 4836 M10D Hybrid DVBT + 1461 861e M105 PAL/SECAM/NTSC/FM Tuner + 1461 a14b AVerTV Studio 509 + 1461 a836 M115 DVB-T, PAL/SECAM/NTSC Tuner + 1461 f01d DVB-T Super 007 + 1461 f31f Avermedia AVerTV GO 007 FM + 1461 f936 Hybrid+FM PCI (rev A16D) + 1462 6231 TV@nywhere Plus + 1489 0214 LifeView FlyTV Platinum FM + 14c0 1212 LifeView FlyTV Platinum Mini2 + 153b 1160 Cinergy 250 PCI TV + 153b 1162 Terratec Cinergy 400 mobile + 17de 7256 PlusTV All In One PI610 card + 17de 7350 ATSC 110 Digital / Analog HDTV Tuner + 17de 7352 ATSC 115 Digital / Analog HDTV Tuner + 185b c100 VideoMate TV + 185b c900 VideoMate T750 + 5168 0306 LifeView FlyDVB-T DUO + 5168 0319 LifeView FlyDVB Trio + 5168 0502 LifeView FlyDVB-T Duo CardBus + 5168 0520 LifeView FlyDVB Trio CardBus + 5168 1502 LifeView FlyTV CardBus + 5168 2502 LifeView FlyDVB-T CardBus + 5168 2520 LifeView FlyDVB-S Duo CardBus + 5168 3502 LifeView FlyDVB-T Hybrid CardBus + 5168 3520 LifeView FlyDVB Trio N CardBus + 5ace 5030 Behold TV 503 FM + 5ace 5090 Behold TV 509 FM + 5ace 6090 Behold TV 609 FM + 5ace 6091 Behold TV 609 FM + 5ace 6092 Behold TV 609 RDS + 5ace 6093 Behold TV 609 RDS + 5ace 6190 Behold TV M6 + 5ace 6191 Behold TV M63 + 5ace 6193 Behold TV M6 Extra + 5ace 6290 Behold TV H6 + 5ace 7090 Behold TV A7 + 5ace 7150 Behold TV H75 + 5ace 7151 Behold TV H75 + 5ace 7190 Behold TV H7 + 5ace 7191 Behold TV H7 + 5ace 7290 Behold TV T7 + 5ace 7591 Behold TV X7 + 5ace 7595 Behold TV X7 + 7134 SAA7134/SAA7135HL Video Broadcast Decoder + 0000 4036 Behold TV 403 + 0000 4037 Behold TV 403 FM + 0000 4071 Behold TV 407 FM + 1019 4cb4 Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) + 1043 0210 Digimatrix TV + 1043 4840 TV-FM 7134 + 1043 4842 TV-FM 7134 + 1131 0000 SAA713x-based TV tuner card + 1131 2004 EUROPA V3 reference design + 1131 4e85 SKNet Monster TV + 1131 6752 EMPRESS + 11bd 002b PCTV Stereo + 11bd 002d PCTV 300i DVB-T + PAL + 1461 2c00 AverTV Hybrid+FM PCI + 1461 9715 AVerTV Studio 307 + 1461 a70a Avermedia AVerTV 307 + 1461 a70b AverMedia M156 / Medion 2819 + 1461 d6ee Cardbus TV/Radio (E500) + 1471 b7e9 AVerTV Cardbus plus + 153b 1142 Terratec Cinergy 400 TV + 153b 1143 Terratec Cinergy 600 TV + 153b 1158 Terratec Cinergy 600 TV MK3 + 1540 9524 ProVideo PV952 + 16be 0003 Medion 7134 + 185b c200 Compro VideoMate Gold+ Pal + 185b c900 Videomate DVB-T300 + 1894 a006 KNC One TV-Station DVR + 1894 fe01 KNC One TV-Station RDS / Typhoon TV Tuner RDS + 5168 0138 FLY TV PRIME 34FM + 5168 0300 FlyDVB-S + 5ace 5070 Behold TV 507 FM + 5ace 6070 Behold TV 607 FM + 5ace 6071 Behold TV 607 FM + 5ace 6072 Behold TV 607 RDS + 5ace 6073 Behold TV 607 RDS + 7145 SAA7145 + 7146 SAA7146 + 110a 0000 Fujitsu/Siemens DVB-C card rev1.5 + 110a ffff Fujitsu/Siemens DVB-C card rev1.5 + 1124 2581 Leutron Vision PicPort + 1131 4f56 KNC1 DVB-S Budget + 1131 4f60 Fujitsu-Siemens Activy DVB-S Budget Rev AL + 1131 4f61 Activy DVB-S Budget Rev GR + 1131 5f61 Activy DVB-T Budget + 114b 2003 DVRaptor Video Edit/Capture Card + 1159 0040 MuTech M-Vision 500 (MV-500 rev. E) + 1159 0050 MuTech M-Vision 500 (MV-500 rev. F) + 11bd 0006 DV500 Overlay + 11bd 000a DV500 Overlay + 11bd 000f DV500 Overlay + 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5 + 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 + 13c2 0002 Technotrend/Hauppauge DVB card rev2.1 + 13c2 0003 Technotrend/Hauppauge DVB card rev2.1 + 13c2 0004 Technotrend/Hauppauge DVB card rev2.1 + 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 + 13c2 0008 Technotrend/Hauppauge DVB-T + 13c2 000a Octal/Technotrend DVB-C for iTV + 13c2 000e Technotrend/Hauppauge DVB card rev2.3 + 13c2 1003 Technotrend-Budget/Hauppauge WinTV-NOVA-S DVB card + 13c2 1004 Technotrend-Budget/Hauppauge WinTV-NOVA-C DVB card + 13c2 1005 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card + 13c2 100c Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card + 13c2 100f Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card + 13c2 1010 DVB C-1500 + 13c2 1011 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card + 13c2 1012 DVB T-1500 + 13c2 1013 SATELCO Multimedia DVB + 13c2 1016 WinTV-NOVA-SE DVB card + 13c2 1018 DVB S-1401 + 13c2 1019 S2-3200 + 13c2 1102 Technotrend/Hauppauge DVB card rev2.1 + 153b 1155 Cinergy 1200 DVB-S + 153b 1156 Cinergy 1200 DVB-C + 153b 1157 Cinergy 1200 DVB-T + 153b 1176 Cinergy 1200 DVB-C (MK3) + 1894 0020 KNC One DVB-C V1.0 + 1894 0023 TVStation DVB-C plus +# http://www.knc1.com/gb.htm + 1894 0054 TV-Station DVB-S + 7160 SAA7160 + 1458 9009 E8000 DVB-T/Analog TV/FM tuner + 1461 1455 AVerTV Hybrid Speedy PCI-E (H788) + 7162 SAA7162 + 11bd 0101 Pinnacle PCTV 7010iX TV Card + 7164 SAA7164 + 0070 8800 WinTV HVR-2250 + 0070 8810 WinTV HVR-2250 + 0070 8851 WinTV HVR-2250 + 0070 8853 WinTV HVR-2250 + 0070 8880 WinTV HVR-2250 + 0070 8891 WinTV HVR-2250 + 0070 88a0 WinTV HVR-2250 + 0070 88a1 WinTV HVR-2250 + 0070 8900 WinTV HVR-2200 + 0070 8901 WinTV HVR-2200 + 0070 8940 WinTV HVR-2200 (submodel 89619) + 0070 8951 WinTV HVR-2200 + 0070 8953 WinTV HVR-2200 + 0070 8980 WinTV HVR-2200 + 0070 8991 WinTV HVR-2200 + 0070 8993 WinTV HVR-2200 + 0070 89a0 WinTV HVR-2200 + 0070 89a1 WinTV HVR-2200 + 0070 f120 WinTV HVR-2205 + 0070 f123 WinTV HVR-2215 + 7231 SAA7231 + 5ace 8000 Behold TV H8 + 5ace 8001 Behold TV H8 + 5ace 8050 Behold TV H85 + 5ace 8051 Behold TV H85 + 5ace 8100 Behold TV A8 + 5ace 8101 Behold TV A8 + 5ace 8150 Behold TV A85 + 5ace 8151 Behold TV A85 + 5ace 8201 Behold TV T8 + 9730 SAA9730 Integrated Multimedia and Peripheral Controller + 1131 0000 Integrated Multimedia and Peripheral Controller +1132 Mitel Corp. +1133 Dialogic Corporation + 7701 Eiconcard C90 + 7711 Eiconcard C91 + 7901 EiconCard S90 + 7902 EiconCard S90 + 7911 EiconCard S91 + 7912 EiconCard S91 + 7921 Eiconcard S92 + 7941 EiconCard S94 + 7942 EiconCard S94 + 7943 EiconCard S94 + 7944 EiconCard S94 + 7945 Eiconcard S94 + 7948 Eiconcard S94 64bit/66MHz + 9711 Eiconcard S91 V2 + 9911 Eiconcard S91 V2 + 9941 Eiconcard S94 V2 + 9a41 Eiconcard S94 PCIe + b921 EiconCard P92 + b922 EiconCard P92 + b923 EiconCard P92 + e001 Diva Pro 2.0 S/T + e002 Diva 2.0 S/T PCI + e003 Diva Pro 2.0 U + e004 Diva 2.0 U PCI + e005 Diva 2.01 S/T PCI + e006 Diva CT S/T PCI + e007 Diva CT U PCI + e008 Diva CT Lite S/T PCI + e009 Diva CT Lite U PCI + e00a Diva ISDN+V.90 PCI + e00b Diva ISDN PCI 2.02 + e00c Diva 2.02 PCI U + e00d Diva Pro 3.0 PCI + e00e Diva ISDN+CT S/T PCI Rev 2 + e010 Diva Server BRI-2M PCI + 110a 0021 Fujitsu Siemens ISDN S0 + e011 Diva Server BRI S/T Rev 2 + e012 Diva Server 4BRI-8M PCI + e013 4BRI + 1133 1300 Diva V-4BRI-8 PCI v2 + 1133 e013 Diva 4BRI-8 PCI v2 + e014 Diva Server PRI-30M PCI + e015 Diva PRI PCI v2 + e016 Diva Server Voice 4BRI PCI + e017 Diva Server Voice 4BRI Rev 2 + 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI + e018 BRI + 1133 1800 Diva V-BRI-2 PCI v2 + 1133 e018 Diva BRI-2 PCI v2 + e019 Diva Server Voice PRI Rev 2 + 1133 e019 Diva Server Voice PRI 2.0 PCI + e01a Diva BRI-2FX PCI v2 + e01b Diva Server Voice BRI-2M 2.0 PCI + 1133 e01b Diva Server Voice BRI-2M 2.0 PCI + e01c PRI + 1133 1c01 Diva PRI/E1/T1-8 PCI v3 + 1133 1c02 Diva PRI/T1-24 PCI(e) v3 + 1133 1c03 Diva PRI/E1-30 PCI(e) v3 + 1133 1c04 Diva PRI/E1/T1-CTI PCI(e) v3 + 1133 1c05 Diva V-PRI/T1-24 PCI(e) v3 + 1133 1c06 Diva V-PRI/E1-30 PCI(e) v3 + 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ + 1133 1c08 Diva Server PRI/T1-24 Cornet NQ + 1133 1c09 Diva Server PRI/E1-30 Cornet NQ + 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ + 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ + 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ + e01e 2PRI + 1133 1e01 Diva 2PRI/E1/T1-60 PCI v1 + 1133 e01e Diva V-2PRI/E1/T1-60 PCI v1 + e020 4PRI + 1133 2001 Diva 4PRI/E1/T1-120 PCI v1 + 1133 e020 Diva V-4PRI/E1/T1-120 PCI v1 + e022 Analog-2 + 1133 2200 Diva V-Analog-2 PCI v1 + 1133 e022 Diva Analog-2 PCI v1 + e024 Analog-4 + 1133 2400 Diva V-Analog-4 PCI v1 + 1133 e024 Diva Analog-4 PCI v1 + e028 Analog-8 + 1133 2800 Diva V-Analog-8 PCI v1 + 1133 e028 Diva Analog-8 PCI v1 + e02a Diva IPM-300 PCI v1 + e02c Diva IPM-600 PCI v1 + e02e 4BRI + 1133 2e01 Diva V-4BRI-8 PCIe v2 + 1133 e02e Diva 4BRI-8 PCIe v2 + e032 BRI + 1133 3201 Diva V-BRI-2 PCIe v2 + 1133 e032 Diva BRI-2 PCIe v2 + e034 Diva BRI-CTI PCI v2 +1134 Mercury Computer Systems + 0001 Raceway Bridge + 0002 Dual PCI to RapidIO Bridge + 000b POET Serial RapidIO Bridge + 000d POET PSDMS Device +1135 FUJIFILM Business Innovation Corp. + 0001 Printer controller +1136 Momentum Data Systems + 0002 PCI-JTAG +1137 Cisco Systems Inc + 0023 VIC 81 PCIe Upstream Port + 0040 VIC PCIe Upstream Port + 1137 004f VIC 1280 Dual 40Gb Mezzanine + 1137 0084 VIC 1240 Dual 40Gb MLOM + 1137 0085 VIC 1225 Dual 10Gb SFP+ PCIe + 1137 00cd VIC 1285 Dual 40Gb QSFP+ PCIe + 1137 00ce VIC 1225T Dual 10GBaseT PCIe + 1137 012a VIC M4308 Dual 40Gb + 1137 012c VIC 1340 Dual 40Gb MLOM + 1137 012e VIC 1227 Dual 10Gb SFP+ PCIe + 1137 0137 VIC 1380 Dual 40Gb Mezzanine + 1137 014d VIC 1385 Dual 40Gb PCIe + 0041 VIC PCIe Downstream Port + 0042 VIC Management Controller + 1137 0047 VIC P81E PCIe Management Controller + 1137 0085 VIC 1225 PCIe Management Controller + 1137 00cd VIC 1285 PCIe Management Controller + 1137 00ce VIC 1225T PCIe Management Controller + 1137 012e VIC 1227 PCIe Management Controller + 1137 014d VIC 1385 PCIe Management Controller + 1137 0217 VIC 1455 PCIe Management Controller + 1137 0218 VIC 1457 PCIe Management Controller + 0043 VIC Ethernet NIC + 1137 0047 VIC P81E PCIe Ethernet NIC + 1137 0048 VIC M81KR Mezzanine Ethernet NIC + 1137 004f VIC 1280 Mezzanine Ethernet NIC + 1137 0084 VIC 1240 MLOM Ethernet NIC + 1137 0085 VIC 1225 PCIe Ethernet NIC + 1137 00cd VIC 1285 PCIe Ethernet NIC + 1137 00ce VIC 1225T PCIe Ethernet NIC + 1137 012a VIC M4308 Ethernet NIC + 1137 012c VIC 1340 MLOM Ethernet NIC + 1137 012e VIC 1227 PCIe Ethernet NIC + 1137 0137 VIC 1380 Mezzanine Ethernet NIC + 1137 014d VIC 1385 PCIe Ethernet NIC + 1137 015d VIC 1387 MLOM Ethernet NIC + 1137 0215 VIC 1440 Mezzanine Ethernet NIC + 1137 0216 VIC 1480 MLOM Ethernet NIC + 1137 0217 VIC 1455 PCIe Ethernet NIC + 1137 0218 VIC 1457 MLOM Ethernet NIC + 1137 0219 VIC 1485 PCIe Ethernet NIC + 1137 021a VIC 1487 MLOM Ethernet NIC + 1137 024a VIC 1495 PCIe Ethernet NIC + 1137 024b VIC 1497 MLOM Ethernet NIC + 0044 VIC Ethernet NIC Dynamic + 1137 0047 VIC P81E PCIe Ethernet NIC Dynamic + 1137 0048 VIC M81KR Mezzanine Ethernet NIC Dynamic + 1137 004f VIC 1280 Mezzanine Ethernet NIC Dynamic + 1137 0084 VIC 1240 MLOM Ethernet NIC Dynamic + 1137 0085 VIC 1225 PCIe Ethernet NIC Dynamic + 1137 00cd VIC 1285 PCIe Ethernet NIC Dynamic + 1137 00ce VIC 1225T PCIe Ethernet NIC Dynamic + 1137 012a VIC M4308 Ethernet NIC Dynamic + 1137 012c VIC 1340 MLOM Ethernet NIC Dynamic + 1137 012e VIC 1227 PCIe Ethernet NIC Dynamic + 1137 0137 VIC 1380 Mezzanine Ethernet NIC Dynamic + 1137 014d VIC 1385 PCIe Ethernet NIC Dynamic + 0045 VIC FCoE HBA + 1137 0047 VIC P81E PCIe FCoE HBA + 1137 0048 VIC M81KR Mezzanine FCoE HBA + 1137 004f VIC 1280 Mezzanine FCoE HBA + 1137 0084 VIC 1240 MLOM FCoE HBA + 1137 0085 VIC 1225 PCIe FCoE HBA + 1137 00cd VIC 1285 PCIe FCoE HBA + 1137 00ce VIC 1225T PCIe FCoE HBA + 1137 012a VIC M4308 FCoE HBA + 1137 012c VIC 1340 MLOM FCoE HBA + 1137 012e VIC 1227 PCIe FCoE HBA + 1137 0137 VIC 1380 Mezzanine FCoE HBA + 1137 014d VIC 1385 PCIe FCoE HBA + 0046 VIC SCSI Controller + 1137 012a VIC M4308 SCSI Controller + 004e VIC 82 PCIe Upstream Port + 0071 VIC SR-IOV VF + 007a VIC 1300 PCIe Upstream Port + 1137 012a VIC M4308 Dual 40Gb + 1137 012c VIC 1340 Dual 40Gb MLOM + 1137 0137 VIC 1380 Dual 40Gb Mezzanine + 1137 014d VIC 1385 Dual 40Gb PCIe + 00cf VIC Userspace NIC + 1137 004f VIC 1280 Mezzanine Userspace NIC + 1137 0084 VIC 1240 MLOM Userspace NIC + 1137 0085 VIC 1225 PCIe Userspace NIC + 1137 00cd VIC 1285 PCIe Userspace NIC + 1137 00ce VIC 1225T PCIe Userspace NIC + 1137 012a VIC M4308 Userspace NIC + 1137 012c VIC 1340 MLOM Userspace NIC + 1137 012e VIC 1227 PCIe Userspace NIC + 1137 0137 VIC 1380 Mezzanine Userspace NIC + 023e 1GigE I350 LOM +1138 Ziatech Corporation + 8905 8905 [STD 32 Bridge] +1139 Dynamic Pictures, Inc + 0001 VGA Compatible 3D Graphics +113a FWB Inc +113b Network Computing Devices +113c Cyclone Microsystems, Inc. + 0000 PCI-9060 i960 Bridge + 0001 PCI-SDK [PCI i960 Evaluation Platform] + 0911 PCI-911 [i960Jx-based Intelligent I/O Controller] + 0912 PCI-912 [i960CF-based Intelligent I/O Controller] + 0913 PCI-913 + 0914 PCI-914 [I/O Controller w/ secondary PCI bus] +113d Leading Edge Products Inc +113e Sanyo Electric Co - Computer Engineering Dept +113f Equinox Systems, Inc. + 0808 SST-64P Adapter + 1010 SST-128P Adapter + 80c0 SST-16P DB Adapter + 80c4 SST-16P RJ Adapter + 80c8 SST-16P Adapter + 8888 SST-4P Adapter + 9090 SST-8P Adapter +1140 Intervoice Inc +1141 Crest Microsystem Inc +1142 Alliance Semiconductor Corporation + 3210 AP6410 + 6422 ProVideo 6422 + 6424 ProVideo 6424 + 6425 ProMotion AT25 + 643d ProMotion AT3D +1143 NetPower, Inc +1144 Cincinnati Milacron + 0001 Noservo controller +1145 Workbit Corporation + 8007 NinjaSCSI-32 Workbit + f007 NinjaSCSI-32 KME + f010 NinjaSCSI-32 Workbit + f012 NinjaSCSI-32 Logitec + f013 NinjaSCSI-32 Logitec + f015 NinjaSCSI-32 Melco + f020 NinjaSCSI-32 Sony PCGA-DVD51 + f021 NinjaPATA-32 Delkin Cardbus UDMA + f024 NinjaPATA-32 Delkin Cardbus UDMA + f103 NinjaPATA-32 Delkin Cardbus UDMA +1146 Force Computers +1147 Interface Corp +# Nee Schneider & Koch +1148 SysKonnect + 4000 FDDI Adapter + 0e11 b03b Netelligent 100 FDDI DAS Fibre SC + 0e11 b03c Netelligent 100 FDDI SAS Fibre SC + 0e11 b03d Netelligent 100 FDDI DAS UTP + 0e11 b03e Netelligent 100 FDDI SAS UTP + 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC + 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP) + 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS) + 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP) + 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP) + 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS) + 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64) + 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS) + 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64) + 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64) + 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS) + 4200 Token Ring adapter + 4300 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) + 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T) + 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link) + 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX) + 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link) + 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX) + 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link) + 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition) + 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link) + 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) + 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) + 1259 2970 AT-2970SX Gigabit Ethernet Adapter + 1259 2971 AT-2970LX Gigabit Ethernet Adapter + 1259 2972 AT-2970TX Gigabit Ethernet Adapter + 1259 2973 AT-2971SX Gigabit Ethernet Adapter + 1259 2974 AT-2971T Gigabit Ethernet Adapter + 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter + 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter + 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter + 4320 SK-98xx V2.0 Gigabit Ethernet Adapter [Marvell 88E8001] + 1148 0121 Marvell RDK-8001 Adapter + 1148 0221 Marvell RDK-8002 Adapter + 1148 0321 Marvell RDK-8003 Adapter + 1148 0421 Marvell RDK-8004 Adapter + 1148 0621 Marvell RDK-8006 Adapter + 1148 0721 Marvell RDK-8007 Adapter + 1148 0821 Marvell RDK-8008 Adapter + 1148 0921 Marvell RDK-8009 Adapter + 1148 1121 Marvell RDK-8011 Adapter + 1148 1221 Marvell RDK-8012 Adapter + 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter + 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter + 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter + 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter + 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter + 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter + 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter + 1148 9521 SK-9521 10/100/1000Base-T Adapter + 1259 2916 AT-2916T + 4400 SK-9Dxx Gigabit Ethernet Adapter + 4500 SK-9Mxx Gigabit Ethernet Adapter + 9000 SK-9Sxx Gigabit Ethernet Server Adapter PCI-X [Marvell 88E8022] + 1148 2100 SK-9S21 10/100/1000Base-T Server Adapter, PCI-X, Copper RJ-45 + 1148 2200 SK-9S22 10/100/1000Base-T Dual Port Server Adapter, PCI-X, 2 Copper RJ-45 + 1148 2210 SK-9P22 10/100/1000 Base-T Dual Port PMC card + 1148 2220 TPMC-GBE-CO + 1148 8100 SK-9S81 1000Base-SX Server Adapter,PCI-X, Fiber SX/LC + 1148 8200 SK-9S82 1000Base-SX Dual Port Server Adapter, PCI-X, 2 Fiber SX/LC + 1148 8210 SK-9P82 1000 Base-SX Dual Port PMC card + 1148 8220 TPMC-GBE-FI + 1148 9100 SK-9S91 1000Base-LX Server Adapter,PCI-X, Fiber LX/LC + 1148 9200 SK-9S92 1000Base-LX Dual Port Server Adapter, PCI-X, 2 Fiber LX/LC + 1259 2973 AT-2971SX v2 Gigabit Adapter + 1259 2974 AT-2971T v2 Gigabit Adapter + 1259 2978 AT-2971LX Gigabit Adapter + 9843 [Fujitsu] Gigabit Ethernet + 9e00 SK-9E21D 10/100/1000Base-T Adapter, Copper RJ-45 + 1148 2100 SK-9E21 Server Adapter + 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter + 1148 2200 SK-9E22 Server Adapter + 1148 8100 SK-9E81 Server Adapter + 1148 8200 SK-9E82 Server Adapter + 1148 9100 SK-9E91 Server Adapter + 1148 9200 SK-9E92 Server Adapter + 9e01 SK-9E21M 10/100/1000Base-T Adapter +1149 Win System Corporation +114a VMIC + 5565 GE-IP PCI5565,PMC5565 Reflective Memory Node + 5579 VMIPCI-5579 (Reflective Memory Card) + 5587 VMIPCI-5587 (Reflective Memory Card) + 6504 VMIC PCI 7755 FPGA + 7587 VMIVME-7587 +114b Canopus Co., Ltd +114c Annabooks +114d IC Corporation +114e Nikon Systems Inc +114f Digi International + 0002 AccelePort EPC + 0003 RightSwitch SE-6 + 0004 AccelePort Xem + 0005 AccelePort Xr + 0006 AccelePort Xr,C/X + 0009 AccelePort Xr/J + 000a AccelePort EPC/J + 000c DataFirePRIme T1 (1-port) + 000d SyncPort 2-Port (x.25/FR) + 0011 AccelePort 8r EIA-232 (IBM) + 0012 AccelePort 8r EIA-422 + 0013 AccelePort Xr + 0014 AccelePort 8r EIA-422 + 0015 AccelePort Xem + 0016 AccelePort EPC/X + 0017 AccelePort C/X + 001a DataFirePRIme E1 (1-port) + 001b AccelePort C/X (IBM) + 001c AccelePort Xr (SAIP) + 001d DataFire RAS T1/E1/PRI + 114f 0050 DataFire RAS E1 Adapter + 114f 0051 DataFire RAS Dual E1 Adapter + 114f 0052 DataFire RAS T1 Adapter + 114f 0053 DataFire RAS Dual T1 Adapter + 0023 AccelePort RAS + 0024 DataFire RAS B4 ST/U + 114f 0030 DataFire RAS BRI U Adapter + 114f 0031 DataFire RAS BRI S/T Adapter + 0026 AccelePort 4r 920 + 0027 AccelePort Xr 920 + 0028 ClassicBoard 4 + 0029 ClassicBoard 8 + 0034 AccelePort 2r 920 + 0035 DataFire DSP T1/E1/PRI cPCI + 0040 AccelePort Xp + 114f 0042 AccelePort 2p PCI + 114f 0043 AccelePort 4p PCI + 114f 0044 AccelePort 8p PCI + 114f 0045 AccelePort 16p PCI + 114f 004e AccelePort 32p PCI + 0042 AccelePort 2p + 0043 AccelePort 4p + 0044 AccelePort 8p + 0045 AccelePort 16p + 004e AccelePort 32p + 0070 Datafire Micro V IOM2 (Europe) + 0071 Datafire Micro V (Europe) + 0072 Datafire Micro V IOM2 (North America) + 0073 Datafire Micro V (North America) + 00b0 Digi Neo 4 + 00b1 Digi Neo 8 + 00c8 Digi Neo 2 DB9 + 00c9 Digi Neo 2 DB9 PRI + 00ca Digi Neo 2 RJ45 + 00cb Digi Neo 2 RJ45 PRI + 00cc Digi Neo 1 422 + 00cd Digi Neo 1 422 485 + 00ce Digi Neo 2 422 485 + 00d0 ClassicBoard 4 422 + 00d1 ClassicBoard 8 422 + 00f1 Digi Neo PCI-E 4 port + 00f4 Digi Neo 4 (IBM version) + 6001 Avanstar +1150 Thinking Machines Corp +1151 JAE Electronics Inc. +1152 Megatek +1153 Land Win Electronic Corp +1154 Melco Inc +1155 Pine Technology Ltd +1156 Periscope Engineering +1157 Avsys Corporation +1158 Voarx R & D Inc + 3011 Tokenet/vg 1001/10m anylan + 9050 Lanfleet/Truevalue + 9051 Lanfleet/Truevalue +1159 MuTech Corporation + 0001 MV-1000 + 0002 MV-1500 +115a Harlequin Ltd +115b Parallax Graphics +115c Photron Ltd. +115d Xircom + 0003 Cardbus Ethernet 10/100 + 1014 0181 10/100 EtherJet Cardbus Adapter + 1014 1181 10/100 EtherJet Cardbus Adapter + 1014 8181 10/100 EtherJet Cardbus Adapter + 1014 9181 10/100 EtherJet Cardbus Adapter + 115d 0181 Cardbus Ethernet 10/100 + 115d 0182 RealPort2 CardBus Ethernet 10/100 (R2BE-100) + 115d 1181 Cardbus Ethernet 10/100 + 1179 0181 Cardbus Ethernet 10/100 + 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter + 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter + 0005 Cardbus Ethernet 10/100 + 1014 0182 10/100 EtherJet Cardbus Adapter + 1014 1182 10/100 EtherJet Cardbus Adapter + 115d 0182 Cardbus Ethernet 10/100 + 115d 1182 Cardbus Ethernet 10/100 + 0007 Cardbus Ethernet 10/100 + 1014 0182 10/100 EtherJet Cardbus Adapter + 1014 1182 10/100 EtherJet Cardbus Adapter + 115d 0182 Cardbus Ethernet 10/100 + 115d 1182 Cardbus Ethernet 10/100 + 000b Cardbus Ethernet 10/100 + 1014 0183 10/100 EtherJet Cardbus Adapter + 115d 0183 Cardbus Ethernet 10/100 + 000c Mini-PCI V.90 56k Modem + 000f Cardbus Ethernet 10/100 + 1014 0183 10/100 EtherJet Cardbus Adapter + 115d 0183 Cardbus Ethernet 10/100 + 00d4 Mini-PCI K56Flex Modem + 0101 Cardbus 56k modem + 115d 1081 Cardbus 56k Modem + 0103 Cardbus Ethernet + 56k Modem + 1014 9181 Cardbus 56k Modem + 1115 1181 Cardbus Ethernet 100 + 56k Modem + 115d 1181 CBEM56G-100 Ethernet + 56k Modem + 8086 9181 PRO/100 LAN + Modem56 CardBus +115e Peer Protocols Inc +115f Maxtor Corporation +1160 Megasoft Inc +1161 PFU Limited +1162 OA Laboratory Co Ltd +1163 Rendition + 0001 Verite 1000 + 2000 Verite V2000/V2100/V2200 + 1092 2000 Stealth II S220 +1164 Advanced Peripherals Technologies +1165 Imagraph Corporation + 0001 Motion TPEG Recorder/Player with audio +# nee ServerWorks +1166 Broadcom + 0000 CMIC-LE + 0005 CNB20-LE Host Bridge + 0006 CNB20HE Host Bridge + 0007 CNB20-LE Host Bridge + 0008 CNB20HE Host Bridge + 0009 CNB20LE Host Bridge + 0010 CIOB30 + 0011 CMIC-HE + 0012 CMIC-WS Host Bridge (GC-LE chipset) + 0013 CNB20-HE Host Bridge + 0014 CMIC-LE Host Bridge (GC-LE chipset) + 0015 CMIC-GC Host Bridge + 0016 CMIC-GC Host Bridge + 0017 GCNB-LE Host Bridge + 0031 HT1100 HPX0 HT Host Bridge + 0036 BCM5785 [HT1000] PCI/PCI-X Bridge + 0101 CIOB-X2 PCI-X I/O Bridge + 0103 EPB PCI-Express to PCI-X Bridge + 0104 BCM5785 [HT1000] PCI/PCI-X Bridge + 0110 CIOB-E I/O Bridge with Gigabit Ethernet + 0130 BCM5780 [HT2000] PCI-X bridge + 0132 BCM5780 [HT2000] PCI-Express Bridge + 1166 0132 HT2000 PCI-Express bridge + 0140 HT2100 PCI-Express Bridge + 0141 HT2100 PCI-Express Bridge + 0142 HT2100 PCI-Express Bridge + 0144 HT2100 PCI-Express Bridge + 0200 OSB4 South Bridge + 0201 CSB5 South Bridge + 4c53 1080 CT8 mainboard + 0203 CSB6 South Bridge + 1734 1012 PRIMERGY RX/TX series + 0205 BCM5785 [HT1000] Legacy South Bridge + 0211 OSB4 IDE Controller + 0212 CSB5 IDE Controller + 1028 014a PowerEdge 1750 + 1028 810b PowerEdge 1650/2550 + 4c53 1080 CT8 mainboard + 0213 CSB6 RAID/IDE Controller + 1028 4134 PowerEdge 600SC + 1028 c134 Poweredge SC600 + 1734 1012 PRIMERGY RX/TX series onboard IDE + 0214 BCM5785 [HT1000] IDE + 1028 0205 PowerEdge 2970 HT1000 IDE + 0217 CSB6 IDE Controller + 1028 4134 Poweredge SC600 + 021b HT1100 HD Audio + 0220 OSB4/CSB5 OHCI USB Controller + 4c53 1080 CT8 mainboard + 0221 CSB6 OHCI USB Controller + 1734 1012 PRIMERGY RX/TX series onboard OHCI + 0223 BCM5785 [HT1000] USB + 1028 0205 PowerEdge 2970 HT1000 USB Controller + 1028 020b PowerEdge T605 HT1000 USB Controller + 0225 CSB5 LPC bridge + 0227 GCLE-2 Host Bridge + 1734 1012 PRIMERGY RX/TX series + 0230 CSB5 LPC bridge + 4c53 1080 CT8 mainboard + 0234 BCM5785 [HT1000] LPC + 1028 0205 PowerEdge 2970 HT1000 LPC + 1028 020b PowerEdge T605 HT1000 LPC + 0235 BCM5785 [HT1000] XIOAPIC0-2 + 0238 BCM5785 [HT1000] WDTimer + 0240 K2 SATA + 0241 RAIDCore RC4000 + 0242 RAIDCore BC4000 + 024a BCM5785 [HT1000] SATA (Native SATA Mode) + 1028 020b PowerEdge T605 onboard SATA Controller +# The device starts as 024A, and changes to 024B if set to PATA mode in BIOS + 024b BCM5785 [HT1000] SATA (PATA/IDE Mode) + 1028 0205 PowerEdge 2970 HT1000 SATA controller + 0406 HT1100 PCI-X Bridge + 0408 HT1100 Legacy Device + 040a HT1100 ISA-LPC Bridge + 1028 0223 PowerEdge R905 HT1100 ISA-LPC Bridge + 0410 HT1100 SATA Controller (Native SATA Mode) + 0411 HT1100 SATA Controller (PATA / IDE Mode) + 0412 HT1100 USB OHCI Controller + 0414 HT1100 USB EHCI Controller + 0416 HT1100 USB EHCI Controller (with Debug Port) + 0420 HT1100 PCI-Express Bridge + 0421 HT1100 SAS/SATA Controller + 0422 HT1100 PCI-Express Bridge +1167 Mutoh Industries Inc +1168 Thine Electronics Inc +1169 Centre for Development of Advanced Computing +# nee Polaris Communications +116a Luminex Software, Inc. + 6100 Bus/Tag Channel + 6800 Escon Channel + 7100 Bus/Tag Channel + 7800 Escon Channel +116b Connectware Inc +116c Intelligent Resources Integrated Systems +116d Martin-Marietta +116e Electronics for Imaging +116f Workstation Technology +1170 Inventec Corporation +1171 Loughborough Sound Images Plc +1172 Altera Corporation + 00a7 Stratix V + 0530 Stratix IV + 646c KT-500/KT-521 board +1173 Adobe Systems, Inc +1174 Bridgeport Machines +1175 Mitron Computer Inc. +1176 SBE Incorporated +1177 Silicon Engineering +1178 Alfa, Inc. + afa1 Fast Ethernet Adapter +1179 Toshiba Corporation + 0102 Extended IDE Controller + 0103 EX-IDE Type-B + 010e PXP04 NVMe SSD + 010f NVMe Controller + 0110 NVMe SSD Controller Cx5 + 1028 1ffb Express Flash NVMe 960G (RI) U.2 (CD5) + 1028 1ffc Express Flash NVMe 1.92T (RI) U.2 (CD5) + 1028 1ffd Express Flash NVMe 3.84T (RI) U.2 (CD5) + 1028 1ffe Express Flash NVMe 7.68T (RI) U.2 (CD5) + 1179 0001 KIOXIA CM5-R series SSD + 1179 0021 KIOXIA CD5 series SSD + 1d49 4039 Thinksystem U.2 CM5 NVMe SSD + 1d49 403a Thinksystem AIC CM5 NVMe SSD + 0113 BG3 NVMe SSD Controller + 1179 0001 Toshiba KBG30ZMS128G 128GB NVMe SSD + 0115 XG4 NVMe SSD Controller + 011a XG6 NVMe SSD Controller + 0404 DVD Decoder card + 0406 Tecra Video Capture device + 0407 DVD Decoder card (Version 2) + 0601 CPU to PCI bridge + 1179 0001 Satellite Pro + 0602 PCI to ISA bridge + 0603 ToPIC95 PCI to CardBus Bridge for Notebooks + 0604 PCI-Docking Host bridge + 060a ToPIC95 + 1179 0001 Satellite Pro + 060f ToPIC97 + 1179 0001 Satellite 4010 + 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support + 0618 CPU to PCI and PCI to ISA bridge + 0701 FIR Port Type-O + 0803 TC6371AF SD Host Controller + 0804 TC6371AF SmartMedia Controller + 0805 SD TypA Controller + 0d01 FIR Port Type-DO + 1179 0001 FIR Port Type-DO +117a A-Trend Technology +117b L G Electronics, Inc. +117c ATTO Technology, Inc. + 002c ExpressSAS R380 + 002d ExpressSAS R348 + 0030 Ultra320 SCSI Host Adapter + 117c 8013 ExpressPCI UL4D + 117c 8014 ExpressPCI UL4S + 117c 8027 ExpressPCI UL5D + 117c 802f ExpressPCI UL5D Low Profile + 0033 SAS Adapter + 0041 ExpressSAS R30F + 0042 ExpressSAS 6Gb/s SAS/SATA HBA + 117c 0042 ExpressSAS H680 + 117c 0043 ExpressSAS H608 + 117c 0044 ExpressSAS H60F + 117c 0045 ExpressSAS H6F0 + 117c 0046 ExpressSAS H644 + 117c 004f ExpressSAS M608 + 117c 0057 ExpressSAS M680 + 117c 0058 ExpressSAS M644 + 117c 0059 ExpressSAS W608 + 117c 005a ExpressSAS W680 + 117c 005b ExpressSAS W644 + 0049 ExpressSAS 6Gb SAS/SATA RAID Adapter + 117c 0049 ExpressSAS R680 + 117c 004a ExpressSAS R608 + 117c 004b ExpressSAS R60F + 117c 004c ExpressSAS R6F0 + 117c 004d ExpressSAS R644 + 117c 004e ExpressSAS R648 + 0064 Celerity FC 16Gb/s Gen 5 Fibre Channel HBA + 117c 0063 Celerity FC-161E + 117c 0064 Celerity FC-162E + 117c 0065 Celerity FC-164E + 0094 Celerity FC 16/32Gb/s Gen 6 Fibre Channel HBA + 117c 0094 Celerity FC-162P + 117c 00a0 Celerity FC-161P + 117c 00a1 Celerity FC-164P + 117c 00a2 Celerity FC-321E + 117c 00a3 Celerity FC-322E + 117c 00ac Celerity FC-324E + 00bb Celerity FC 32/64Gb/s Gen 7 Fibre Channel HBA + 117c 00bc Celerity FC-321P + 117c 00bd Celerity FC-322P + 117c 00be Celerity FC-324P + 00c5 ExpressNVM PCIe Gen4 Switch + 117c 00c6 ExpressNVM S48F PCIe Gen4 + 117c 00c7 ExpressNVM S468 PCIe Gen4 + 00e6 ExpressSAS GT 12Gb/s SAS/SATA HBA + 117c 00c0 ExpressSAS H1280 GT + 117c 00c1 ExpressSAS H1208 GT + 117c 00c2 ExpressSAS H1244 GT + 117c 00c3 ExpressSAS H12F0 GT + 117c 00c4 ExpressSAS H120F GT + 8013 ExpressPCI UL4D + 8014 ExpressPCI UL4S + 8027 ExpressPCI UL5D + 8070 ExpressSAS 12Gb/s SAS/SATA HBA + 117c 0070 ExpressSAS H1280 + 117c 0071 ExpressSAS H1208 + 117c 0080 ExpressSAS H1244 + 8072 ExpressSAS 12Gb/s SAS/SATA HBA + 117c 0072 ExpressSAS H12F0 + 117c 0073 ExpressSAS H120F + 117c 0082 ExpressSAS H1288 +117d Becton & Dickinson +117e T/R Systems +117f Integrated Circuit Systems +1180 Ricoh Co Ltd + 0465 RL5c465 + 0466 RL5c466 + 0475 RL5c475 + 144d c006 vpr Matrix 170B4 CardBus bridge + 0476 RL5c476 II + 1014 0185 ThinkPad A/T/X Series + 1014 0555 ThinkPad X41 + 1014 056c ThinkPad Z60t + 1028 014f Latitude X300 laptop + 1028 0188 Inspiron 6000 laptop + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 1043 1017 X58LE + 1043 1237 A6J-Q008 + 1043 1967 V6800V + 1043 1987 A4K and Z81K notebooks, possibly others ( mid-2005 machines ) + 104d 80df Vaio PCG-FX403 + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 104d 814e VAIO GRZ390Z + 10f7 8338 Panasonic CF-Y5 laptop + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 14ef 0220 PCD-RP-220S + 17aa 201c ThinkPad X60/X60s + 17aa 20c4 ThinkPad T61/R61 + 17aa 20c6 ThinkPad R61/T400 + 0477 RL5c477 + 0478 RL5c478 + 1014 0184 ThinkPad A30p + 0511 R5C511 + 0522 R5C522 IEEE 1394 Controller + 1014 01cf ThinkPad A30p + 1043 1967 V6800V + 0551 R5C551 IEEE 1394 Controller + 144d c006 vpr Matrix 170B4 + 0552 R5C552 IEEE 1394 Controller + 1014 0511 ThinkPad A/T/X Series + 1028 014f Latitude X300 laptop + 1028 0188 Inspiron 6000 laptop + 1043 1237 A6J-Q008 + 1043 1757 M2400N laptop + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 17aa 201e ThinkPad X60/X60s + 0554 R5C554 + 0575 R5C575 SD Bus Host Adapter + 0576 R5C576 SD Bus Host Adapter + 0592 R5C592 Memory Stick Bus Host Adapter + 1025 0121 Aspire 5920G + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 1521 HP EliteBook 8540w + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 103c 30cc Pavilion dv6700 + 103c 30cf Pavilion dv95xx/96xx/97xx/98xx series + 1043 1017 X58LE + 1043 1237 A6J-Q008 + 1043 1967 V6800V + 104d 9035 VAIO VGN-FW11ZRU + 144d c018 X20 IV + 17aa 20ca ThinkPad T61/T400 + 0811 R5C811 + 0822 R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter + 1014 0556 ThinkPad X40 / X41 / X60s / Z60t + 1014 0598 ThinkPad Z60m + 1025 0121 Aspire 5920G + 1028 0188 Inspiron 6000 laptop + 1028 01a2 Inspiron 9200 + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 03b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30cf Pavilion dv9668eg Laptop + 1043 1017 X58LE + 1043 1237 A6J-Q008 + 1043 1967 V6800V + 10f7 8338 Panasonic CF-Y5 laptop + 144d c018 X20 IV + 17aa 201d ThinkPad X60/X60s + 17aa 20c7 ThinkPad T61 + 17aa 20c8 ThinkPad T400/W500 + 0832 R5C832 IEEE 1394 Controller + 1025 0121 Aspire 5920G + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 1028 024d Latitude E4300 + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30cf Pavilion dv9668eg Laptop + 17aa 20c5 ThinkPad R61 + 17aa 20c7 ThinkPad R61 + 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394 + 0843 R5C843 MMC Host Controller + 1025 0121 Aspire 5920G + 1028 01d7 XPS M1210 + 1028 01f3 Inspiron 1420 + 1028 01f5 Inspiron 1501 + 1028 024f Latitude e6500 + 103c 03b5 Presario V3242AU + 103c 1521 HP EliteBook 8540w + 103c 30b7 Presario V6133CL + 103c 30cf Pavilion dv9500/9600/9700 series + 1043 1017 X58LE + 1183 0843 Alienware Aurora m9700 + 0852 xD-Picture Card Controller + 1025 0121 Aspire 5920G + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30b5 Presario V3242AU + 103c 30b7 Presario V6133CL + 103c 30cc Pavilion dv6700 + 103c 30cf Pavilion dv9668eg Laptop + 1043 1967 V6800V + 1180 0852 Pavilion 2410us + 1324 10cf P7120 + 17aa 20cb ThinkPad T400 + e230 R5U2xx (R5U230 / R5U231 / R5U241) [Memory Stick Host Controller] + e476 CardBus bridge + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + e822 MMC/SD Host Controller + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 17aa 21cf ThinkPad T520 + e823 PCIe SDXC/MMC Host Controller + 17aa 21cf ThinkPad T520 + e832 R5C832 PCIe IEEE 1394 Controller + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 17aa 21cf ThinkPad T520 + e852 PCIe xD-Picture Card Controller +1181 Telmatics International +1183 Fujikura Ltd +1184 Forks Inc +1185 Dataworld International Ltd +1186 D-Link System Inc + 1002 DL10050 Sundance Ethernet + 1186 1002 DFE-550TX/FX + 1186 1012 DFE-580TX + 1025 AirPlus Xtreme G DWL-G650 Adapter + 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter + 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter + 1300 RTL8139 Ethernet + 1186 1300 DFE-538TX 10/100 Ethernet Adapter + 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter + 1186 1303 DFE-528TX 10/100 Fast Ethernet PCI Adapter + 1340 DFE-690TXD CardBus PC Card + 1540 DFE-680TX + 1541 DFE-680TXD CardBus PC Card + 1561 DRP-32TXD Cardbus PC Card + 3300 DWL-510 / DWL-610 802.11b [Realtek RTL8180L] + 1186 3300 DWL-610 Wireless Cardbus Adapter + 1186 3301 DWL-510 Wireless PCI Adapter + 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B) + 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B) + 4000 DL2000-based Gigabit Ethernet + 4001 DGE-550SX PCI-X Gigabit Ethernet Adapter + 4200 DFE-520TX Fast Ethernet PCI Adapter + 1186 1103 DFE-520TX Fast Ethernet PCI Adapter (rev. C1) + 4300 DGE-528T Gigabit Ethernet Adapter + 1186 4300 DGE-528T PCI Gigabit Ethernet Adapter +# rev. B1; RealTek RTL8168E. + 1186 4b10 DGE-560T PCI Express (x1) Gigabit Ethernet Adapter + 4302 DGE-530T Gigabit Ethernet Adapter (rev.C1) [Realtek RTL8169] + 4b00 DGE-560T PCI Express Gigabit Ethernet Adapter + 4b01 DGE-530T Gigabit Ethernet Adapter (rev 11) + 4b02 DGE-560SX PCI Express Gigabit Ethernet Adapter + 4b03 DGE-550T Gigabit Ethernet Adapter V.B1 + 4c00 Gigabit Ethernet Adapter + 1186 4c00 DGE-530T Gigabit Ethernet Adapter + 8400 D-Link DWL-650+ CardBus PC Card +1187 Advanced Technology Laboratories, Inc. +1188 Shima Seiki Manufacturing Ltd. +1189 Matsushita Electronics Co Ltd +118a Hilevel Technology +118b Hypertec Pty Limited +118c Corollary, Inc + 0014 PCIB [C-bus II to PCI bus host bridge chip] + 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter] +118d BitFlow Inc + 0001 Raptor-PCI framegrabber + 0012 Model 12 Road Runner Frame Grabber + 0014 Model 14 Road Runner Frame Grabber + 0024 Model 24 Road Runner Frame Grabber + 0044 Model 44 Road Runner Frame Grabber + 0112 Model 12 Road Runner Frame Grabber + 0114 Model 14 Road Runner Frame Grabber + 0124 Model 24 Road Runner Frame Grabber + 0144 Model 44 Road Runner Frame Grabber + 0212 Model 12 Road Runner Frame Grabber + 0214 Model 14 Road Runner Frame Grabber + 0224 Model 24 Road Runner Frame Grabber + 0244 Model 44 Road Runner Frame Grabber + 0312 Model 12 Road Runner Frame Grabber + 0314 Model 14 Road Runner Frame Grabber + 0324 Model 24 Road Runner Frame Grabber + 0344 Model 44 Road Runner Frame Grabber + b04e Claxon CXP4 CoaXPress frame grabber +118e Hermstedt GmbH +118f Green Logic +1190 Tripace + c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter +1191 Artop Electronic Corp + 0003 SCSI Cache Host Adapter + 0004 ATP8400 + 0005 ATP850UF + 0006 ATP860 NO-BIOS + 0007 ATP860 + 0008 ATP865 NO-ROM + 0009 ATP865 + 000a ATP867-A + 000b ATP867-B + 000d ATP8620 + 000e ATP8620 + 8002 AEC6710 SCSI-2 Host Adapter + 8010 AEC6712UW SCSI + 8020 AEC6712U SCSI + 8030 AEC6712S SCSI + 8040 AEC6712D SCSI + 8050 AEC6712SUW SCSI + 8060 AEC6712 SCSI + 8080 AEC67160 SCSI + 8081 AEC67160S SCSI + 808a AEC67162 2-ch. LVD SCSI +1192 Densan Company Ltd +1193 Zeitnet Inc. + 0001 1221 + 0002 1225 +1194 Toucan Technology +1195 Ratoc System Inc +1196 Hytec Electronics Ltd +1197 Gage Applied Sciences, Inc. + 010c CompuScope 82G 8bit 2GS/s Analog Input Card +1198 Lambda Systems Inc +1199 Attachmate Corporation + 0101 Advanced ISCA/PCI Adapter +119a Mind Share, Inc. +119b Omega Micro Inc. + 1221 82C092G +119c Information Technology Inst. +119d Bug, Inc. Sapporo Japan +119e Fujitsu Microelectronics Ltd. + 0001 FireStream 155 + 0003 FireStream 50 +119f Bull HN Information Systems + 1081 BXI Host Channel Adapter +# BXI stands for Bull eXascale Interconnect + 1101 BXI Host Channel Adapter v1.2 +# BXI stands for Bull eXascale Interconnect + 1121 BXI Host Channel Adapter v1.3 +11a0 Convex Computer Corporation +11a1 Hamamatsu Photonics K.K. +11a2 Sierra Research and Technology +11a3 Deuretzbacher GmbH & Co. Eng. KG +11a4 Barco Graphics NV +11a5 Microunity Systems Eng. Inc +11a6 Pure Data Ltd. +11a7 Power Computing Corp. +11a8 Systech Corp. +11a9 InnoSys Inc. + 4240 AMCC S933Q Intelligent Serial Card +11aa Actel +# Nee Galileo Technology, Inc. +11ab Marvell Technology Group Ltd. + 0100 88F3700 [Armada 3700 Family] ARM SoC + 0110 88F60x0/88F70x0/88F80x0/CN913x ARM SoC + 0146 GT-64010/64010A System Controller + 0f53 88E6318 Link Street network controller + 11ab MV88SE614x SATA II PCI-E controller + 138f W8300 802.11 Adapter (rev 07) + 1fa6 Marvell W8300 802.11 Adapter + 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.A1) + 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset + 1faa 88w8335 [Libertas] 802.11b/g Wireless + 1385 4e00 WG511v2 54 Mbps Wireless PC Card + 1385 6b00 WG311v3 802.11g Wireless PCI Adapter + 1737 0040 WPC54G v5 802.11g Wireless-G Notebook Adapter + 2211 88SB2211 PCI Express to PCI Bridge + 2a01 88W8335 [Libertas] 802.11b/g Wireless + 2a02 88W8361 [TopDog] 802.11n Wireless + 07d1 3b02 DIR-615 rev. A1 Mini PCI Wireless Module + 1385 7c00 WN511T RangeMax Next 300 Mbps Wireless PC Card + 1385 7c01 WN511T RangeMax Next 300 Mbps Wireless Notebook Adapter + 1385 7e00 WN311T RangeMax Next 300 Mbps Wireless PCI Adapter + 1799 801b F5D8011 v2 802.11n N1 Wireless Notebook Card + 2a08 88W8362e [TopDog] 802.11a/b/g/n Wireless + 2a0a 88W8363 [TopDog] 802.11n Wireless + 2a0c 88W8363 [TopDog] 802.11n Wireless + 2a24 88W8363 [TopDog] 802.11n Wireless + 2a2b 88W8687 [TopDog] 802.11b/g Wireless + 2a30 88W8687 [TopDog] 802.11b/g Wireless + 2a40 88W8366 [TopDog] 802.11n Wireless + 2a41 88W8366 [TopDog] 802.11n Wireless + 2a42 88W8366 [TopDog] 802.11n Wireless + 2a43 88W8366 [TopDog] 802.11n Wireless + 2a55 88W8864 [Avastar] 802.11ac Wireless + 2b36 88W8764 [Avastar] 802.11n Wireless + 2b38 88W8897 [AVASTAR] 802.11ac Wireless + 2b40 88W8964 [Avastar] 802.11ac Wireless + 4101 OLPC Cafe Controller Secure Digital Controller + 4146 GT-64111 System Controller + 4320 88E8001 Gigabit Ethernet Controller + 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS) + 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS) + 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus) + 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus) + 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn) + 10b8 b452 EZ Card 1000 (SMC9452TXV.2) + 11ab 0121 Marvell RDK-8001 + 11ab 0321 Marvell RDK-8003 + 11ab 1021 Marvell RDK-8010 + 11ab 4320 Marvell Yukon Gigabit Ethernet 10/100/1000Baset-T Constroller (Asus) + 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit) + 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit) + 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte) + 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit) + 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill) + 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox) + 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron) + 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech) + 4340 88E8021 PCI-X IPMI Gigabit Ethernet Controller + 4341 88E8022 PCI-X IPMI Gigabit Ethernet Controller + 4342 88E8061 PCI-E IPMI Gigabit Ethernet Controller + 4343 88E8062 PCI-E IPMI Gigabit Ethernet Controller + 4344 88E8021 PCI-X IPMI Gigabit Ethernet Controller + 4345 88E8022 PCI-X IPMI Gigabit Ethernet Controller + 4346 88E8061 PCI-E IPMI Gigabit Ethernet Controller + 4347 88E8062 PCI-E IPMI Gigabit Ethernet Controller + 4c53 10d0 Telum ASLP10 PrAMC Gigabit Ethernet + 4350 88E8035 PCI-E Fast Ethernet Controller + 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba) + 11ab 3521 Marvell RDK-8035 + 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE) + 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE) + 4351 88E8036 PCI-E Fast Ethernet Controller + 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron) + 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic) + 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba) + 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal) + 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec) + 11ab 3621 Marvell RDK-8036 + 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard + 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima) + 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE) + 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE) + 4352 88E8038 PCI-E Fast Ethernet Controller + 4353 88E8039 PCI-E Fast Ethernet Controller + 104d 902d VAIO VGN-NR120E + 4354 88E8040 PCI-E Fast Ethernet Controller + 1028 022f Inspiron 1525 + 144d c06a R730 Laptop + 144d c072 Notebook N150P + 4355 88E8040T PCI-E Fast Ethernet Controller + 1179 ff50 Satellite P305D-S8995E + 4356 88EC033 PCI-E Fast Ethernet Controller + 4357 88E8042 PCI-E Fast Ethernet Controller + 435a 88E8048 PCI-E Fast Ethernet Controller + 4360 88E8052 PCI-E ASF Gigabit Ethernet Controller + 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus) + 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron) + 11ab 5221 Marvell RDK-8052 + 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte) + 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI) + 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock) + a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen) + 4361 88E8050 PCI-E ASF Gigabit Ethernet Controller + 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway) + 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel) + 8086 3063 D925XCVLK mainboard + 8086 3439 Marvell 88E8050 Gigabit Ethernet Controller (Intel) + 4362 88E8053 PCI-E Gigabit Ethernet Controller + 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus) + 1043 8142 Marvell 88E8053 Gigabit Ethernet controller PCIe (Asus) + 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem) + 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic) + 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO) + 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba) + 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal) + 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec) + 11ab 5321 Marvell RDK-8053 + 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) + 13d1 ac11 EGE5K - Giga Ethernet Expresscard + 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte) + 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI) + 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal) + 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo) + 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI) + 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima) + 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima) + 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox) + 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron) + 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta) + 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock) + 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE) + 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech) + a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen) + 4363 88E8055 PCI-E Gigabit Ethernet Controller + 4364 88E8056 PCI-E Gigabit Ethernet Controller + 1043 81f8 Motherboard + 11ba 00ba 8056 Gigabit Ethernet Controller + 4365 88E8070 based Ethernet Controller + 4366 88EC036 PCI-E Gigabit Ethernet Controller + 4367 88EC032 Ethernet Controller + 4368 88EC034 Ethernet Controller + 4369 88EC042 Ethernet Controller + 436a 88E8058 PCI-E Gigabit Ethernet Controller + 11ab 00ba Imac 8,1 Wired Ethernet Adapter + 436b 88E8071 PCI-E Gigabit Ethernet Controller + 436c 88E8072 PCI-E Gigabit Ethernet Controller + 436d 88E8055 PCI-E Gigabit Ethernet Controller + 4370 88E8075 PCI-E Gigabit Ethernet Controller + 4380 88E8057 PCI-E Gigabit Ethernet Controller +# AVB = "Audio Video Bridging" + 4381 Yukon Optima 88E8059 [PCIe Gigabit Ethernet Controller with AVB] + 1259 2803 AT-2814FX + 1259 2804 AT-2874xx + 4611 GT-64115 System Controller + 4620 GT-64120/64120A/64121A System Controller + 4801 GT-48001 + 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card + 5040 MV88SX5040 4-port SATA I PCI-X Controller + 5041 MV88SX5041 4-port SATA I PCI-X Controller + 5080 MV88SX5080 8-port SATA I PCI-X Controller + 5081 MV88SX5081 8-port SATA I PCI-X Controller + 5181 88f5181 [Orion-1] ARM SoC + 5182 88f5182 [Orion-NAS] ARM SoC + 5281 88f5281 [Orion-2] ARM SoC + 6041 MV88SX6041 4-port SATA II PCI-X Controller + 6042 88SX6042 PCI-X 4-Port SATA-II + 6081 MV88SX6081 8-port SATA II PCI-X Controller + 6101 88SE6101/6102 single-port PATA133 interface + 1043 82e0 P5K PRO Motherboard + 6121 88SE6111/6121 SATA II / PATA Controller +# 6111: 1 SATA port; 6121: 2 SATA ports + 11ab 6121 88SE6111/6121 1/2 port SATA II + 1 port PATA Controller + 6141 88SE614x SATA II PCI-E controller + 6145 88SE6145 SATA II PCI-E controller + 6180 88F6180 [Kirkwood] ARM SoC + 6192 88F6190/6192 [Kirkwood] ARM SoC + 6281 88F6281 [Kirkwood] ARM SoC +# This device ID was used for earlier chips. + 6381 MV78xx0 [Discovery Innovation] ARM SoC + 6440 88SE6440 SAS/SATA PCIe controller + 6450 64560 System Controller + 6460 MV64360/64361/64362 System Controller + 6480 MV64460/64461/64462 System Controller + 1775 c200 C2K CompactPCI single board computer + 6485 MV64460/64461/64462 System Controller, Revision B + 6560 88F6560 [Avanta] ARM SoC + 6710 88F6710 [Armada 370] ARM SoC + 6820 88F6820 [Armada 385] ARM SoC + 6828 88F6828 [Armada 388] ARM SoC + 6920 88F6920 [Armada 390] ARM SoC + 7042 88SX7042 PCI-e 4-port SATA-II + 16b8 434b Tempo SATA E4P + 7810 MV78100 [Discovery Innovation] ARM SoC + 7820 MV78200 [Discovery Innovation] ARM SoC + 7823 MV78230 [Armada XP] ARM SoC + 7846 MV78460 [Armada XP] ARM SoC + d40f Bobcat3 Ethernet Switch + f003 GT-64010 Primary Image Piranha Image Generator +11ac Canon Information Systems Research Aust. +11ad Lite-On Communications Inc + 0002 LNE100TX + 11ad 0002 LNE100TX + 11ad 0003 LNE100TX + 11ad f003 LNE100TX + 11ad ffff LNE100TX + 1385 f004 FA310/TX LAN 10/100 PCI Ethernet Adapter + 2646 f002 KNE110TX EtheRx Fast Ethernet + c115 LNE100TX [Linksys EtherFast 10/100] + 11ad c001 LNE100TX [ver 2.0] + 2646 000b KNE111TX +11ae Aztech System Ltd +11af Avid Technology Inc. + 0001 Cinema + ee40 Digidesign Audiomedia III +11b0 V3 Semiconductor Inc. + 0002 V300PSC + 0292 V292PBC [Am29030/40 Bridge] + 0960 V96xPBC + 880a Deltacast Delta-HD-22 + c960 V96DPC +11b1 Apricot Computers +11b2 Eastman Kodak +11b3 Barr Systems Inc. +11b4 Leitch Technology International +11b5 Radstone Technology Plc +11b6 United Video Corp +11b7 Motorola +11b8 XPoint Technologies, Inc + 0001 Quad PeerMaster +11b9 Pathlight Technology Inc. + c0ed SSA Controller +11ba Videotron Corp +11bb Pyramid Technology +11bc Network Peripherals Inc + 0001 NP-PCI +11bd Pinnacle Systems Inc. + 002e PCTV 40i + 0040 Royal TS Function 1 + 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 1 + 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 1 + 0041 RoyalTS Function 2 + 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Tuner 2 + 11bd 0045 PCTV Dual Sat Pro PCI 4000i Tuner 2 + 0042 Royal TS Function 3 + 11bd 0044 PCTV 2000i Dual DVB-T Pro PCI Common + 11bd 0045 PCTV Dual Sat Pro PCI 4000i Common + 0051 PCTV HD 800i + bede AV/DV Studio Capture Card +11be International Microcircuits Inc +11bf Astrodesign, Inc. +11c0 Hewlett Packard +# nee Agere Systems nee Lucent Microelectronics +11c1 LSI Corporation + 0440 56k WinModem + 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd + 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd + 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd + 10cf 102c LB LT Modem V.90 56k + 10cf 104a BIBLO LT Modem 56k + 10cf 105f LB2 LT Modem V.90 56k + 1179 0001 Internal V.90 Modem + 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd + 122d 4101 MDP7800-U Modem + 122d 4102 MDP7800SP-U Modem + 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd + 144d 2101 LT56PV Modem + 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd + 0441 56k WinModem + 1033 804d LT WinModem 56k Data+Fax + 1033 8065 LT WinModem 56k Data+Fax + 1092 0440 Supra 56i + 1179 0001 Internal V.90 Modem + 11c1 0440 LT WinModem 56k Data+Fax + 11c1 0441 LT WinModem 56k Data+Fax + 122d 4100 MDP7800-U Modem + 13e0 0040 LT WinModem 56k Data+Fax + 13e0 0100 LT WinModem 56k Data+Fax + 13e0 0410 LT WinModem 56k Data+Fax + 13e0 0420 TelePath Internet 56k WinModem + 13e0 0440 LT WinModem 56k Data+Fax + 13e0 0443 LT WinModem 56k Data+Fax + 13e0 f102 LT WinModem 56k Data+Fax + 1416 9804 CommWave 56k Modem + 141d 0440 LT WinModem 56k Data+Fax + 144f 0441 Lucent 56k V.90 DF Modem + 144f 0449 Lucent 56k V.90 DF Modem + 144f 110d Lucent Win Modem + 1468 0441 Presario 56k V.90 DF Modem + 1668 0440 Lucent Win Modem + 0442 56k WinModem + 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 144d 2104 LT56PT Modem + 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 0443 LT WinModem + 0444 LT WinModem + 0445 LT WinModem + 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card) + 8086 2204 PRO/100+ MiniPCI on Armada E500 + 0446 LT WinModem + 0447 LT WinModem + 0448 WinModem 56k + 1014 0131 Lucent Win Modem + 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd + 13e0 0030 56k Voice Modem + 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd +# Actiontech eth+modem card as used by Dell &c. + 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem) + 0449 L56xM+S [Mars-2] WinModem 56k + 0e11 b14d 56k V.90 Modem + 1014 018c ThinkPad 600X + 13e0 0020 LT WinModem 56k Data+Fax + 13e0 0041 TelePath Internet 56k WinModem + 1436 0440 Lucent Win Modem + 144f 0449 Lucent 56k V.90 DFi Modem + 1468 0410 IBM ThinkPad T23 + 1468 0440 Lucent Win Modem + 1468 0449 Presario 56k V.90 DFi Modem + 044a F-1156IV WinModem (V90, 56KFlex) + 10cf 1072 LB Global LT Modem + 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd + 044b LT WinModem + 044c LT WinModem + 044d LT WinModem + 044e LT WinModem + 044f V90 WildWire Modem + 0450 LT WinModem + 1033 80a8 Versa Note Vxi + 144f 4005 Magnia SG20 + 1468 0450 Evo N600c + 0451 LT WinModem + 0452 LT WinModem + 0453 LT WinModem + 0454 LT WinModem + 0455 LT WinModem + 0456 LT WinModem + 0457 LT WinModem + 0458 LT WinModem + 0459 LT WinModem + 045a LT WinModem + 045c LT WinModem + 0461 V90 WildWire Modem + 0462 V90 WildWire Modem + 0480 Venus Modem (V90, 56KFlex) + 048c V.92 56K WinModem +# InPorte Home Internal 56k Modem/fax/answering machine/SMS Features + 048f V.92 56k WinModem + 0620 Lucent V.92 Data/Fax Modem + 2600 StarPro26XX family (SP2601, SP2603, SP2612) DSP + 5400 OR3TP12 FPSC + 5656 Venus Modem + 5801 USB + 5802 USS-312 USB Controller + 5803 USS-344S USB Controller + 5811 FW322/323 [TrueFire] 1394a Controller + 103c 2a34 Pavilion a1677c + 103c 2a6f Asus IPIBL-LB Motherboard + 103c 2a9e Pavilion p6310f + 1043 8294 LSI FW322/323 IEEE 1394a FireWire Controller + 11bd 000e LSI FW323 + 8086 524c D865PERL mainboard + 9005 0033 Adaptec AFW-2100 (HP) 2102900-R + dead 0800 FireWire Host Bus Adapter + 5901 FW643 [TrueFire] PCIe 1394b Controller + 11c1 5900 FW643 [TrueFire] PCIe 1394b Controller + 1443 0643 FireBoard800-e V.2 + 1546 0643 FWB-PCIE1X2x + 5903 FW533 [TrueFire] PCIe 1394a Controller + 8110 T8110 H.100/H.110 TDM switch + 12d9 000c E1/T1 PMXc cPCI carrier card + ab10 WL60010 Wireless LAN MAC + ab11 WL60040 Multimode Wireles LAN MAC + 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102) + 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512) + 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106) + 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516) + ab20 ORiNOCO PCI Adapter + ab21 Agere Wireless PCI Adapter + ab30 Hermes2 Mini-PCI WaveLAN a/b/g + 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g + ed00 ET-131x PCI-E Ethernet Controller + ed01 ET-131x PCI-E Ethernet Controller +11c2 Sand Microelectronics +11c3 NEC Corporation +11c4 Document Technologies, Inc +11c5 Shiva Corporation +11c6 Dainippon Screen Mfg. Co. Ltd +11c7 D.C.M. Data Systems +11c8 Dolphin Interconnect Solutions AS + 0658 PSB32 SCI-Adapter D31x + d665 PSB64 SCI-Adapter D32x + d667 PSB66 SCI-Adapter D33x +11c9 Magma + 0010 16-line serial port w/- DMA + 0011 4-line serial port w/- DMA +11ca LSI Systems, Inc +11cb Specialix Research Ltd. + 2000 PCI_9050 + 11cb 0200 SX + 11cb b008 I/O8+ + 4000 SUPI_1 + 8000 T225 +11cc Michels & Kleberhoff Computer GmbH +11cd HAL Computer Systems, Inc. +11ce Netaccess +11cf Pioneer Electronic Corporation +11d0 Lockheed Martin Federal Systems-Manassas +11d1 Auravision + 01f7 VxP524 + 01f9 VxP951 +11d2 Intercom Inc. +11d3 Trancell Systems Inc +11d4 Analog Devices + 1535 Blackfin BF535 processor + 1805 SM56 PCI modem +11d5 Ikon Corporation + 0115 10115 + 0117 10117 +11d6 Tekelec Telecom +11d7 Trenton Technology, Inc. +11d8 Image Technologies Development +11d9 TEC Corporation +11da Novell +11db Sega Enterprises Ltd +11dc Questra Corporation +11dd Crosfield Electronics Limited +11de Zoran Corporation + 6017 miroVIDEO DC30 + 6057 ZR36057PQC Video cutting chipset + 1031 7efe DC10 Plus + 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board + 12f8 8a02 Tekram Video Kit + 13ca 4231 JPEG/TV Card + 6120 ZR36120 + 1328 f001 Cinemaster C DVD Decoder + 13c2 0000 MediaFocus Satellite TV Card + 1de1 9fff Video Kit C210 +11df New Wave PDG +11e0 Cray Communications A/S +11e1 GEC Plessey Semi Inc. +11e2 Samsung Information Systems America +11e3 Quicklogic Corporation + 0001 COM-ON-AIR Dosch&Amand DECT + 0560 QL5064 Companion Design Demo Board + 5030 PC Watchdog + 8417 QL5064 [QuickPCI] PCI v2.2 bridge for SMT417 Dual TMS320C6416T PMC Module +11e4 Second Wave Inc +11e5 IIX Consulting +11e6 Mitsui-Zosen System Research +11e7 Toshiba America, Elec. Company +11e8 Digital Processing Systems Inc. +11e9 Highwater Designs Ltd. +11ea Elsag Bailey +11eb Formation Inc. +11ec Coreco Inc + 000d Oculus-F/64P + 1800 Cobra/C6 +11ed Mediamatics +11ee Dome Imaging Systems Inc +11ef Nicolet Technologies B.V. +11f0 Compu-Shack + 4231 FDDI + 4232 FASTline UTP Quattro + 4233 FASTline FO + 4234 FASTline UTP + 4235 FASTline-II UTP + 4236 FASTline-II FO + 4731 GIGAline +11f1 Symbios Logic Inc +11f2 Picture Tel Japan K.K. +11f3 Keithley Metrabyte + 0011 KPCI-PIO24 +11f4 Kinetic Systems Corporation + 2915 CAMAC controller +11f5 Computing Devices International +11f6 Compex + 0112 ENet100VG4 + 0113 FreedomLine 100 + 1401 ReadyLink 2000 + 2011 RL100-ATX 10/100 + 11f6 2011 RL100-ATX + 2201 ReadyLink 100TX (Winbond W89C840) + 11f6 2011 ReadyLink 100TX + 9881 RL100TX Fast Ethernet +11f7 Scientific Atlanta +11f8 PMC-Sierra Inc. + 5220 BR522x [PMC-Sierra maxRAID SAS Controller] + 7364 PM7364 [FREEDM - 32 Frame Engine & Datalink Mgr] + 7375 PM7375 [LASAR-155 ATM SAR] + 7384 PM7384 [FREEDM - 84P672 Frm Engine & Datalink Mgr] + 8000 PM8000 [SPC - SAS Protocol Controller] + 8009 PM8009 SPCve 8x6G + 8018 PM8018 Adaptec SAS Adaptor ASA-70165H PCIe Gen3 x8 6 Gbps 16-lane 4x SFF-8644 + 8032 PM8032 Tachyon QE8 + 117c 003a Celerity FC-81EN Fibre Channel Adapter + 117c 003b Celerity FC-82EN Fibre Channel Adapter + 117c 003c Celerity FC-84EN Fibre Channel Adapter + 117c 403b ThunderLink FC 1082 Fibre Channel Adapter + 8053 PM8053 SXP 12G 24-port SAS/SATA expander + 8054 PM8054 SXP 12G 36-port SAS/SATA expander + 8055 PM8055 SXP 12G 48-port SAS/SATA expander + 8056 PM8056 SXP 12G 68-port SAS/SATA expander + 8060 PM8060 SRCv 12G eight-port SAS/SATA RoC + 8063 PM8063 SRCv 12G 16-port SAS/SATA RoC + 8070 PM8070 Tachyon SPCv 12G eight-port SAS/SATA controller + 8071 PM8071 Tachyon SPCve 12G eight-port SAS/SATA controller + 8072 PM8072 Tachyon SPCv 12G 16-port SAS/SATA controller + 8073 PM8073 Tachyon SPCve 12G 16-port SAS/SATA controller + 8531 PM8531 PFX 24xG3 PCIe Fanout Switch + 8532 PM8532 PFX 32xG3 PCIe Fanout Switch + 8533 PM8533 PFX 48xG3 PCIe Fanout Switch + 8534 PM8534 PFX 64xG3 PCIe Fanout Switch + 8535 PM8535 PFX 80xG3 PCIe Fanout Switch + 8536 PM8536 PFX 96xG3 PCIe Fanout Switch + 1bd4 0081 PM8536 PFX 96xG3 PCIe Fanout Switch + 8546 PM8546 B-FEIP PSX 96xG3 PCIe Storage Switch + 8562 PM8562 Switchtec PFX-L 32xG3 Fanout-Lite PCIe Gen3 Switch +11f9 I-Cube Inc +11fa Kasan Electronics Company, Ltd. +11fb Datel Inc +11fc Silicon Magic +11fd High Street Consultants +# nee Comtrol, Inc. +11fe Pepperl+Fuchs + 0001 RocketPort PCI 32-port w/external I/F + 0002 RocketPort PCI 8-port w/external I/F + 0003 RocketPort PCI 16-port w/external I/F + 0004 RocketPort PCI 4-port w/Quad Cable + 0005 RocketPort PCI 8-port w/Octa Cable + 0006 RocketPort PCI 8-port w/RJ11 connectors + 0007 RocketPort PCI 4-port w/RJ45 connectors + 0008 RocketPort PCI 8-port w/DB78 SNI connector (Siemens) + 0009 RocketPort PCI 16-port w/DB78 SNI connector (Siemens) + 000a RocketPort PCI Plus 4-port w/Quad Cable + 000b RocketPort PCI Plus 8-port w/Octa Cable + 000c RocketModem II 6-port + 000d RocketModem 4-port + 000e RocketPort PCI Plus 2-port RS-232 w/DB9 connectors + 000f RocketPort PCI Plus 2-port SMPTE w/DB9 connectors + 0040 RocketPort INFINITY 8-port w/Octa Cable RJ45 + 0041 RocketPort INFINITY 32-port w/external I/F + 0042 RocketPort INFINITY 8-port w/external I/F + 0043 RocketPort INFINITY 16-port w/external I/F + 0044 RocketPort INFINITY 4-port w/Quad Cable DB + 0045 RocketPort INFINITY 8-port w/Octa Cable DB + 0046 RocketPort INFINITY 4-port w/external I/F + 0047 RocketPort INFINITY 4J (4-port) w/RJ45 connectors + 0048 RocketPort INFINITY 4J (4-port) w/RJ45 connectors + 004a RocketPort INFINITY Plus 4-port + 004b RocketPort INFINITY Plus 8-port + 004c RocketModem INFINITY III 8-port + 004d RocketModem INFINITY III 4-port + 004e RocketPort INFINITY Plus 2-port + 004f RocketPort INFINITY 2-port SMPTE w/DB9 connectors + 0050 RocketPort INFINITY Plus 4-port RJ45 + 0051 RocketPort INFINITY Plus 8-port RJ11 + 0052 RocketPort INFINITY 8-port SMPTE w/DB9 Connectors + 0060 RocketPort EXPRESS 8-port w/Octa Cable + 0061 RocketPort EXPRESS 32-port w/external I/F + 0062 RocketPort EXPRESS 8-Port w/external I/F + 0063 RocketPort EXPRESS 16-port w/external I/F + 0064 RocketPort EXPRESS 4-port w/Quad Cable + 0065 RocketPort EXPRESS 8-port w/Octa Cable + 0066 RocketPort EXPRESS 4-port w/external I/F + 0067 RocketPort EXPRESS 4J (4-port) w/RJ45 connectors + 0068 RocketPort EXPRESS 8J (8-port) w/RJ11 connectors + 006f RocketPort EXPRESS SMPTE 2-port + 0072 RocketPort EXPRESS SMPTE 8-port w/external I/F + 0801 RocketPort uPCI 32-port w/external I/F + 0802 RocketPort uPCI 8-port w/external I/F + 0803 RocketPort uPCI 16-port w/external I/F + 0805 RocketPort uPCI 8-port w/Octa Cable + 080b RocketPort Plus uPCI 8-port w/Octa Cable + 080c RocketModem III 8-port + 080d RocketModem III 4-port + 080e RocketPort uPCI 2-port RS232 w/DB9 connectors + 080f RocketPort uPCI SMPTE 2-port + 0810 RocketPort Plus uPCI 4J (4-port) w/RJ45 connectors + 0811 RocketPort Plus uPCI 8J (8-port) w/RJ11 connectors + 0812 RocketPort Plus uPCI 422 8-port + 0813 RocketModem IV uPCI 8-port + 0814 RocketModem IV uPCI 4-port + 0903 RocketPort Compact PCI 16 port w/external I/F +# 16954 UART + 8015 RocketPort 550 4-port + 8805 RocketPort uPCI 4-port w/Quad Cable + 880b RocketPort Plus uPCI 4-port w/Quad Cable + 8812 RocketPort Plus uPCI 4-port RS422 w/Quad Cable +11ff Scion Corporation + 0003 AG-5 +1200 CSS Corporation +1201 Vista Controls Corp +1202 Network General Corp. + 4300 Gigabit Ethernet Adapter + 1202 9841 SK-9841 LX + 1202 9842 SK-9841 LX dual link + 1202 9843 SK-9843 SX + 1202 9844 SK-9843 SX dual link +1203 Bayer Corporation, Agfa Division +1204 Lattice Semiconductor Corporation + 1965 SB6501 802.11ad Wireless Network Adapter +1205 Array Corporation +1206 Amdahl Corporation +1208 Parsytec GmbH + 4853 HS-Link Device +1209 SCI Systems Inc +120a Synaptel +120b Adaptive Solutions +120c Technical Corp. +120d Compression Labs, Inc. +120e Cyclades Corporation + 0100 Cyclom-Y below first megabyte + 0101 Cyclom-Y above first megabyte + 0102 Cyclom-4Y below first megabyte + 0103 Cyclom-4Y above first megabyte + 0104 Cyclom-8Y below first megabyte + 0105 Cyclom-8Y above first megabyte + 0200 Cyclades-Z below first megabyte + 0201 Cyclades-Z above first megabyte + 0300 PC300/RSV or /X21 (2 ports) + 0301 PC300/RSV or /X21 (1 port) + 0310 PC300/TE (2 ports) + 0311 PC300/TE (1 port) + 0320 PC300/TE-M (2 ports) + 0321 PC300/TE-M (1 port) + 0400 PC400 +120f Essential Communications + 0001 Roadrunner serial HIPPI +1210 Hyperparallel Technologies +1211 Braintech Inc +1213 Applied Intelligent Systems, Inc. +1214 Performance Technologies, Inc. +1215 Interware Co., Ltd +1216 Purup Prepress A/S +1217 O2 Micro, Inc. + 00f7 Firewire (IEEE 1394) + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 1179 ff50 Satellite P305D-S8995E + 10f7 1394 OHCI Compliant Host Controller + 11f7 OZ600 1394a-2000 Controller + 1028 04a3 Precision M4600 + 13f7 1394 OHCI Compliant Host Controller + 6729 OZ6729 + 673a OZ6730 + 6832 OZ6832/6833 CardBus Controller + 6836 OZ6836/6860 CardBus Controller + 6872 OZ6812 CardBus Controller + 6925 OZ6922 CardBus Controller + 6933 OZ6933/711E1 CardBus/SmartCardBus Controller + 1025 1016 Travelmate 612 TX + 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller + 1014 020c ThinkPad R30 + 1028 0152 Latitude D500 + 1179 0001 Magnia Z310 + 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 1734 106c Amilo A1645 + 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller + 7113 OZ711EC1 SmartCardBus Controller + 1025 0035 TravelMate 660 + 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller + 7120 Integrated MMC/SD Controller + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 1179 ff50 Satellite P305D-S8995E + 7130 Integrated MS/xD Controller + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 1179 ff50 Satellite P305D-S8995E + 7134 OZ711MP1/MS1 MemoryCardBus Controller + 7135 Cardbus bridge + 7136 OZ711SP1 Memory CardBus Controller + 71e2 OZ711E2 SmartCardBus Controller + 7212 OZ711M2 4-in-1 MemoryCardBus Controller + 7213 OZ6933E CardBus Controller + 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 10cf 11c4 Lifebook P5020D Laptop + 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller + 8120 Integrated MMC/SD Controller + 8130 Integrated MS/MSPRO/xD Controller + 8220 OZ600FJ1/OZ900FJ1 SD/MMC Card Reader Controller + 8221 OZ600FJ0/OZ900FJ0/OZ600FJS SD/MMC Card Reader Controller + 8320 OZ600RJ1/OZ900RJ1 SD/MMC Card Reader Controller + 1028 04a3 Precision M4600 + 8321 OZ600RJ0/OZ900RJ0/OZ600RJS SD/MMC Card Reader Controller + 8330 OZ600 MS/xD Controller + 1028 04a3 Precision M4600 + 8331 O2 Flash Memory Card + 8520 SD/MMC Card Reader Controller + 8621 SD/MMC Card Reader Controller +1218 Hybricon Corp. +1219 First Virtual Corporation +121a 3Dfx Interactive, Inc. + 0001 Voodoo + 0002 Voodoo 2 + 0003 Voodoo Banshee + 1092 0003 Monster Fusion + 1092 4000 Monster Fusion + 1092 4002 Monster Fusion + 1092 4801 Monster Fusion AGP + 1092 4803 Monster Fusion AGP + 1092 8030 Monster Fusion + 1092 8035 Monster Fusion AGP + 10b0 0001 Dragon 4000 + 1102 1017 3D Blaster Banshee PCI (CT6760) + 1102 1018 3D Blaster Banshee VE + 121a 0001 Voodoo Banshee AGP + 121a 0003 Voodoo Banshee AGP SGRAM + 121a 0004 Voodoo Banshee + 139c 0016 Raven + 139c 0017 Raven + 14af 0002 Maxi Gamer Phoenix + 0004 Voodoo Banshee [Velocity 100] + 0005 Voodoo 3 + 121a 0004 Voodoo3 AGP + 121a 0030 Voodoo3 AGP + 121a 0031 Voodoo3 AGP + 121a 0034 Voodoo3 AGP + 121a 0036 Voodoo3 2000 PCI + 121a 0037 Voodoo3 AGP + 121a 0038 Voodoo3 AGP + 121a 003a Voodoo3 AGP + 121a 0044 Voodoo3 + 121a 004b Velocity 100 + 121a 004c Velocity 200 + 121a 004d Voodoo3 AGP + 121a 004e Voodoo3 AGP + 121a 0051 Voodoo3 AGP + 121a 0052 Voodoo3 AGP + 121a 0057 Voodoo3 3000 PCI + 121a 0060 Voodoo3 3500 TV (NTSC) + 121a 0061 Voodoo3 3500 TV (PAL) + 121a 0062 Voodoo3 3500 TV (SECAM) + 0009 Voodoo 4 / Voodoo 5 + 121a 0003 Voodoo5 PCI 5500 + 121a 0009 Voodoo5 AGP 5500/6000 + 0057 Voodoo 3/3000 [Avenger] +121b Advanced Telecommunications Modules +121c Nippon Texaco., Ltd +121d LiPPERT ADLINK Technology GmbH +121e CSPI + 0201 Myrinet 2000 Scalable Cluster Interconnect +121f Arcus Technology, Inc. +1220 Ariel Corporation + 1220 AMCC 5933 TMS320C80 DSP/Imaging board +1221 Contec Co., Ltd + 9172 PO-64L(PCI)H [Isolated Digital Output Board for PCI] + 91a2 PO-32L(PCI)H [Isolated Digital Output Board for PCI] + 91c3 DA16-16(LPCI)L [Un-insulated highly precise analog output board for Low Profile PCI] + b152 DIO-96D2-LPCI + c103 ADA16-32/2(PCI)F [High-Speed Analog I/O Board for PCI] +1222 Ancor Communications, Inc. +1223 Artesyn Communication Products + 0003 PM/Link + 0004 PM/T1 + 0005 PM/E1 + 0008 PM/SLS + 0009 BajaSpan Resource Target + 000a BajaSpan Section 0 + 000b BajaSpan Section 1 + 000c BajaSpan Section 2 + 000d BajaSpan Section 3 + 000e PM/PPC +1224 Interactive Images +1225 Power I/O, Inc. +1227 EIZO Rugged Solutions + 0006 Raptor GFX 8P + 0023 Raptor GFX [1100T] + 0045 Raptor 4000-L [Linux version] + 004a Raptor 4000-LR-L [Linux version] +1228 Norsk Elektro Optikk A/S +1229 Data Kinesis Inc. +122a Integrated Telecom +122b LG Industrial Systems Co., Ltd +122c Sican GmbH +122d Aztech System Ltd + 1206 368DSP + 1400 Trident PCI288-Q3DII (NX) + 50dc 3328 Audio + 122d 0001 3328 Audio + 80da 3328 Audio + 122d 0001 3328 Audio +122e Xyratex + 7722 Napatech XL1 + 7724 Napatech XL2/XA + 7729 Napatech XD +122f Andrew Corporation +1230 Fishcamp Engineering +1231 Woodward McCoach, Inc. + 04e1 Desktop PCI Telephony 4 + 05e1 Desktop PCI Telephony 5/6 + 0d00 LightParser + 0d02 LightParser 2 + 0d13 Desktop PCI L1/L3 Telephony +1232 GPT Limited +1233 Bus-Tech, Inc. +# nee Risq Modular Systems, Inc. +1235 SMART Modular Technologies +1236 Sigma Designs Corporation + 0000 RealMagic64/GX + 6401 REALmagic 64/GX (SD 6425) +1237 Alta Technology Corporation +1238 Adtran +1239 3DO Company +123a Visicom Laboratories, Inc. +123b Seeq Technology, Inc. +123c Century Systems, Inc. +123d Engineering Design Team, Inc. + 0000 EasyConnect 8/32 + 0002 EasyConnect 8/64 + 0003 EasyIO +123e Simutech, Inc. +# nee C-Cube Microsystems / acquired by Magnum Semiconductor +123f LSI Logic + 00e4 MPEG + 8120 DVxplore Codec + 10de 01e1 NVTV PAL + 10de 01e2 NVTV NTSC + 10de 01e3 NVTV PAL + 10de 0248 NVTV NTSC + 10de 0249 NVTV PAL + 11bd 0006 DV500 E4 + 11bd 000a DV500 E4 + 11bd 000f DV500 E4 + 1809 0016 Emuzed MAUI-III PCI PVR FM TV + 8888 Cinemaster C 3.0 DVD Decoder + 1002 0001 Cinemaster C 3.0 DVD Decoder + 1002 0002 Cinemaster C 3.0 DVD Decoder + 1328 0001 Cinemaster C 3.0 DVD Decoder +1240 Marathon Technologies Corp. +1241 DSC Communications +# Formerly Jaycor Networks, Inc. +1242 JNI Corporation + 1560 JNIC-1560 PCI-X Fibre Channel Controller + 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter + 1242 656a FCX-6562 PCI-X Fibre Channel Adapter + 4643 FCI-1063 Fibre Channel Adapter + 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter + 656a FCX-6562 PCI-X Fibre Channel Adapter +1243 Delphax +# Audio-Visuelles Marketing und Computersysteme +1244 AVM GmbH + 0700 B1 ISDN + 0800 C4 ISDN + 0a00 A1 ISDN [Fritz] + 1244 0a00 FRITZ!Card ISDN Controller + 0e00 Fritz!Card PCI v2.0 ISDN + 0e80 Fritz!Card PCI v2.1 ISDN + 1244 0e00 PSB 3100F (AVM KAFKA) [Fritz!Card PCI v2.1] + 1100 C2 ISDN + 1200 T1 ISDN + 2700 Fritz!Card DSL SL + 2900 Fritz!Card DSL v2.0 +1245 A.P.D., S.A. +1246 Dipix Technologies, Inc. +1247 Xylon Research, Inc. +1248 Central Data Corporation +1249 Samsung Electronics Co., Ltd. +124a AEG Electrocom GmbH +124b SBS/Greenspring Modular I/O + 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier + 124b 9080 PCI9080 Bridge +124c Solitron Technologies, Inc. +124d Stallion Technologies, Inc. + 0000 EasyConnection 8/32 + 0002 EasyConnection 8/64 + 0003 EasyIO + 0004 EasyConnection/RA +124e Cylink +124f Infortrend Technology, Inc. + 0041 IFT-2000 Series RAID Controller +1250 Hitachi Microcomputer System Ltd +1251 VLSI Solutions Oy +1253 Guzik Technical Enterprises +1254 Linear Systems Ltd. + 0065 DVB Master FD + 007c DVB Master Quad/o +1255 Optibase Ltd + 1110 MPEG Forge + 1210 MPEG Fusion + 2110 VideoPlex + 2120 VideoPlex CC + 2130 VideoQuest +1256 Perceptive Solutions, Inc. + 4201 PCI-2220I + 4401 PCI-2240I + 5201 PCI-2000 +1257 Vertex Networks, Inc. +1258 Gilbarco, Inc. +# nee Allied Telesyn International +1259 Allied Telesis + 2560 AT-2560 Fast Ethernet Adapter (i82557B) + 2801 AT-2801FX (RTL-8139) + a117 RTL81xx Fast Ethernet + a11e RTL81xx Fast Ethernet + a120 21x4x DEC-Tulip compatible 10/100 Ethernet +125a ABB Power Systems +125b Asix Electronics Corporation + 1400 AX88141 Fast Ethernet Controller + 1186 1100 AX8814X Based PCI Fast Ethernet Adapter + 9100 AX99100 PCIe to Multi I/O Controller + a000 1000 Serial Port + a000 2000 Parallel Port + a000 6000 SPI + a000 7000 Local Bus + ea50 1c10 RXi2-BP +125c Aurora Technologies, Inc. + 0101 Saturn 4520P + 0640 Aries 16000P +125d ESS Technology + 0000 ES336H Fax Modem (Early Model) + 1948 ES1948 Maestro-1 + 1968 ES1968 Maestro 2 + 1028 0085 ES1968 Maestro-2 PCI + 1033 8051 ES1968 Maestro-2 Audiodrive + 1969 ES1938/ES1946/ES1969 Solo-1 Audiodrive + 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard + 125d 8888 Solo-1 Audio Adapter + 125d 8898 ES1938S TTSOLO1-SL [TerraTec 128i PCI] + 153b 111b Terratec 128i PCI + 1978 ES1978 Maestro 2E + 0e11 b112 Armada M700/E500 + 1033 803c ES1978 Maestro-2E Audiodrive + 1033 8058 ES1978 Maestro-2E Audiodrive + 1092 4000 Monster Sound MX400 + 1179 0001 ES1978 Maestro-2E Audiodrive + 1988 ES1988 Allegro-1 + 0e11 0098 Evo N600c + 1092 4100 Sonic Impact S100 + 125d 0431 Allegro AudioDrive + 125d 1988 ESS Allegro-1 Audiodrive + 125d 1998 Allegro AudioDrive + 125d 1999 Allegro-1 AudioDrive + 1989 ESS Modem + 125d 1989 ESS Modem + 1998 ES1983S Maestro-3i PCI Audio Accelerator + 1028 00b1 Latitude C600 + 1028 00e5 Latitude C810 + 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100) + 1999 ES1983S Maestro-3i PCI Modem Accelerator + 199a ES1983S Maestro-3i PCI Audio Accelerator + 199b ES1983S Maestro-3i PCI Modem Accelerator + 2808 ES336H Fax Modem (Later Model) + 2838 ES2838/2839 SuperLink Modem + 2898 ES2898 Modem + 125d 0424 ES56-PI Data Fax Modem + 125d 0425 ES56T-PI Data Fax Modem + 125d 0426 ES56V-PI Data Fax Modem + 125d 0427 VW-PI Data Fax Modem + 125d 0428 ES56ST-PI Data Fax Modem + 125d 0429 ES56SV-PI Data Fax Modem + 147a c001 ES56-PI Data Fax Modem + 148d 1030 HCF WV-PI56 [ESS ES56-PI Data Fax Modem] + 14fe 0428 ES56-PI Data Fax Modem + 14fe 0429 ES56-PI Data Fax Modem +125e Specialvideo Engineering SRL +125f Concurrent Technologies, Inc. +# 4 x serial ports, 2 x printer ports + 2071 CC PMC/232 +# 4 x serial ports, 2 x printer ports + 2084 CC PMC/23P +# 4 x serial ports, RS422 + 2091 CC PMC/422 +1260 Intersil Corporation + 3872 ISL3872 [Prism 3] + 1468 0202 LAN-Express IEEE 802.11b Wireless LAN + 3873 ISL3874 [Prism 2.5]/ISL3872 [Prism 3] + 10cf 1169 MBH7WM01-8734 802.11b Wireless Mini PCI Card [ISL3874] + 1186 3501 DWL-520 Wireless PCI Adapter (rev A or B) [ISL3874] + 1186 3700 DWL-520 Wireless PCI Adapter (rev E1) [ISL3872] + 1385 4105 MA311 802.11b wireless adapter [ISL3874] + 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter + 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter + 1737 3874 WMP11 v1 802.11b Wireless-B PCI Adapter [ISL3874] + 4033 7033 PCW200 802.11b Wireless PCI Adapter [ISL3874] + 8086 2510 M3AWEB Wireless 802.11b MiniPCI Adapter + 8086 2513 Wireless 802.11b MiniPCI Adapter + 3877 ISL3877 [Prism Indigo] + 3886 ISL3886 [Prism Javelin/Prism Xbow] + 17cf 0037 XG-901 and clones Wireless Adapter + 3890 ISL3890 [Prism GT/Prism Duette]/ISL3886 [Prism Javelin/Prism Xbow] + 10b8 2802 SMC2802W V1 Wireless PCI Adapter [ISL3890] + 10b8 2835 SMC2835W Wireless Cardbus Adapter + 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter + 1113 4203 WN4201B + 1113 8201 T-Com T-Sinus 154pcicard Wireless PCI Adapter + 1113 b301 T-Sinus 154card Cardbus + 1113 ee03 SMC2802W V2 Wireless PCI Adapter [ISL3886] + 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter + 1186 3202 DWL-G650 A1 Wireless Adapter + 1259 c104 CG-WLCB54GT Wireless Adapter + 1260 0000 WG511 v1 54 Mbps Wireless PC Card + 1385 4800 WG511 v2/v3 54 Mbps Wireless PC Card + 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter + 17cf 0014 XG-600 and clones Wireless Adapter + 17cf 0020 XG-900 and clones Wireless Adapter + 187e 3403 G-110 802.11g Wireless Cardbus Adapter + 8130 HMP8130 NTSC/PAL Video Decoder + 8131 HMP8131 NTSC/PAL Video Decoder +# This is probably more likely a HW fault, but I am keeping it for now --mj + ffff ISL3886IK + 1260 0000 Senao 3054MP+ (J) mini-PCI WLAN 802.11g adapter +1261 Matsushita-Kotobuki Electronics Industries, Ltd. +1262 ES Computer Company, Ltd. +1263 Sonic Solutions +1264 Aval Nagasaki Corporation +1265 Casio Computer Co., Ltd. +1266 Microdyne Corporation + 0001 NE10/100 Adapter (i82557B) + 1910 NE2000Plus (RT8029) Ethernet Adapter + 1266 1910 NE2000Plus Ethernet Adapter +1267 S. A. Telecommunications + 5352 PCR2101 + 5a4b Telsat Turbo +1268 Tektronix +1269 Thomson-CSF/TTM +# MBIM on top of MHI + 00b3 5G Data Card [Cinterion MV31-W] +126a Lexmark International, Inc. +126b Adax, Inc. +126c Northern Telecom + 1211 10/100BaseTX [RTL81xx] + 126c 802.11b Wireless Ethernet Adapter +126d Splash Technology, Inc. +126e Sumitomo Metal Industries, Ltd. +126f Silicon Motion, Inc. + 0501 SM501 VoyagerGX Rev. AA + 0510 SM501 VoyagerGX Rev. B + 0710 SM710 LynxEM + 0712 SM712 LynxEM+ + 0718 SM718 LynxSE+ + 0720 SM720 Lynx3DM + 0730 SM731 Cougar3DR + 0750 SM750 + 0810 SM810 LynxE + 0811 SM811 LynxE + 0820 SM820 Lynx3D + 0910 SM910 + 2262 SM2262/SM2262EN SSD Controller + 2263 SM2263EN/SM2263XT SSD Controller +1270 Olympus Optical Co., Ltd. +1271 GW Instruments +1272 Telematics International +1273 Hughes Network Systems + 0002 DirecPC +1274 Ensoniq + 1171 ES1373 / Creative Labs CT5803 [AudioPCI] + 1371 ES1371/ES1373 / Creative Labs CT2518 + 0e11 0024 AudioPCI on Motherboard Compaq Deskpro + 0e11 b1a7 ES1371, ES1373 AudioPCI + 1033 80ac ES1371, ES1373 AudioPCI + 1042 1854 Tazer + 107b 8054 Tabor2 + 1274 1371 Audio PCI 64V/128/5200 / Creative CT4810/CT5803/CT5806 [Sound Blaster PCI] + 1274 8001 CT4751 board + 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A + 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10 + 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A + 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A + 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A + 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A + 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00 + 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A + 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00 + 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00 + 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00 + 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191 + 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193 + 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A + 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A + 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639 + 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800 + 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801 + 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739 + 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11 + 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31 + 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11 + 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13 + 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E + 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810 + 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E + 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S + 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S + 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR + 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX + 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV + 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2 + 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV + 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2 + 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX + 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX + 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX + 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman + 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod + 8086 4541 D815EEA Motherboard + 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island + 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX + 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal + 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX + 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX + 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver + 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver + 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX + 5000 ES1370 [AudioPCI] + 5880 5880B / Creative Labs CT5880 + 1274 2000 Creative CT4810 [Sound Blaster AudioPCI 128] + 1274 2003 Creative SoundBlaster AudioPCI 128 + 1274 5880 Creative CT4750 [Sound Blaster PCI 128] + 1274 8001 Sound Blaster 16PCI 4.1ch + 1458 a000 5880 AudioPCI On Motherboard 6OXET + 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00 + 270f 2001 5880 AudioPCI On Motherboard 6CTR + 270f 2200 5880 AudioPCI On Motherboard 6WTX + 270f 7040 5880 AudioPCI On Motherboard 6ATA4 + 8001 CT5880 [AudioPCI] + 8002 5880A [AudioPCI] +1275 Network Appliance Corporation +1276 Switched Network Technologies, Inc. +1277 Comstream +1278 Transtech Parallel Systems Ltd. + 0701 TPE3/TM3 PowerPC Node + 0710 TPE5 PowerPC PCI board + 1100 PMC-FPGA02 + 1101 TS-C43 card with 4 ADSP-TS101 processors +1279 Transmeta Corporation + 0060 TM8000 Northbridge + 0061 TM8000 AGP bridge + 0295 Northbridge + 0395 LongRun Northbridge + 0396 SDRAM controller + 0397 BIOS scratchpad +127a Rockwell International + 1002 HCF 56k Data/Fax Modem + 1092 094c SupraExpress 56i PRO [Diamond SUP2380] + 122d 4002 HPG / MDP3858-U + 122d 4005 MDP3858-E + 122d 4007 MDP3858-A/-NZ + 122d 4012 MDP3858-SA + 122d 4017 MDP3858-W + 122d 4018 MDP3858-W + 127a 1002 Rockwell 56K D/F HCF Modem + 1003 HCF 56k Data/Fax Modem + 0e11 b0bc 229-DF Zephyr + 0e11 b114 229-DF Cheetah + 1033 802b 229-DF + 13df 1003 PCI56RX Modem + 13e0 0117 IBM + 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem + 13e0 0197 IBM + 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem + 13e0 01f7 IBM + 1436 1003 IBM + 1436 1103 IBM 5614PM3G V.90 Modem + 1436 1602 Compaq 229-DF Ducati + 1004 HCF 56k Data/Fax/Voice Modem + 1048 1500 MicroLink 56k Modem + 10cf 1059 Fujitsu 229-DFRT + 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1005 127a AOpen FM56-P + 1033 8029 229-DFSV + 1033 8054 Modem + 10cf 103c Fujitsu + 10cf 1055 Fujitsu 229-DFSV + 10cf 1056 Fujitsu 229-DFSV + 122d 4003 MDP3858SP-U + 122d 4006 Packard Bell MDP3858V-E + 122d 4008 MDP3858SP-A/SP-NZ + 122d 4009 MDP3858SP-E + 122d 4010 MDP3858V-U + 122d 4011 MDP3858SP-SA + 122d 4013 MDP3858V-A/V-NZ + 122d 4015 MDP3858SP-W + 122d 4016 MDP3858V-W + 122d 4019 MDP3858V-SA + 13df 1005 PCI56RVP Modem + 13e0 0187 IBM + 13e0 01a7 IBM + 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem + 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem + 1436 1005 IBM + 1436 1105 IBM + 1437 1105 IBM 5614PS3G V.90 Modem + 1022 HCF 56k Modem + 1436 1303 M3-5614PM3G V.90 Modem + 1023 HCF 56k Data/Fax Modem + 122d 4020 Packard Bell MDP3858-WE + 122d 4023 MDP3858-UE + 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem + 13e0 0297 IBM + 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem + 1436 1203 IBM + 1436 1303 IBM + 1024 HCF 56k Data/Fax/Voice Modem + 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 10cf 106a Fujitsu 235-DFSV + 122d 4021 Packard Bell MDP3858V-WE + 122d 4022 MDP3858SP-WE + 122d 4024 MDP3858V-UE + 122d 4025 MDP3858SP-UE + 1026 HCF 56k PCI Speakerphone Modem + 1032 HCF 56k Modem + 1033 HCF 56k Modem + 1034 HCF 56k Modem + 1035 HCF 56k PCI Speakerphone Modem + 1036 HCF 56k Modem + 1085 HCF 56k Volcano PCI Modem + 2004 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 2005 HCF 56k Data/Fax Modem + 104d 8044 229-DFSV + 104d 8045 229-DFSV + 104d 8055 PBE/Aztech 235W-DFSV + 104d 8056 235-DFSV + 104d 805a Modem + 104d 805f Modem + 104d 8074 Modem + 2013 HSF 56k Data/Fax Modem + 1179 0001 Modem + 1179 ff00 Modem + 2014 HSF 56k Data/Fax/Voice Modem + 10cf 1057 Fujitsu Citicorp III + 122d 4050 MSP3880-U + 122d 4055 MSP3880-W + 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 10cf 1063 Fujitsu + 10cf 1064 Fujitsu + 1468 2015 Fujitsu + 2016 HSF 56k Data/Fax/Voice/Spkp Modem + 122d 4051 MSP3880V-W + 122d 4052 MSP3880SP-W + 122d 4054 MSP3880V-U + 122d 4056 MSP3880SP-U + 122d 4057 MSP3880SP-A + 4311 Riptide HSF 56k PCI Modem + 127a 4311 Ring Modular? Riptide HSF RT HP Dom + 13e0 0210 HP-GVC + 4320 Riptide PCI Audio Controller + 1235 4320 Riptide PCI Audio Controller + 4321 Riptide HCF 56k PCI Modem + 1235 4321 Hewlett Packard DF + 1235 4324 Hewlett Packard DF + 13e0 0210 Hewlett Packard DF + 144d 2321 Riptide + 4322 Riptide PCI Game Controller + 1235 4322 Riptide PCI Game Controller + 8234 RapidFire 616X ATM155 Adapter + 108d 0022 RapidFire 616X ATM155 Adapter + 108d 0027 RapidFire 616X ATM155 Adapter +127b Pixera Corporation +127c Crosspoint Solutions, Inc. +127d Vela Research +127e Winnov, L.P. + 0010 Videum 1000 Plus +127f Fujifilm +1280 Photoscript Group Ltd. +1281 Yokogawa Electric Corporation +1282 Davicom Semiconductor, Inc. + 6585 DM562P V90 Modem + 9009 DM9009 Ethernet Controller + 9100 21x4x DEC-Tulip compatible 10/100 Ethernet + 9102 DM9102 Fast Ethernet Controller +# Subsystem ID is main ID reveresed. + 0291 8212 DM9102A (DM9102AE, SM9102AF) Ethernet 100/10 MBit + 9132 Ethernet 100/10 MBit +1283 Integrated Technology Express, Inc. + 673a IT8330G + 8152 IT8152F/G Advanced RISC-to-PCI Companion Chip + 8211 ITE 8211F Single Channel UDMA 133 + 1043 8138 P5GD1-VW Mainboard + 8212 IT8212 Dual channel ATA RAID controller + 1283 0001 IT/ITE8212 Dual channel ATA RAID controller + 8213 IT8213 IDE Controller + 1458 b000 GA-EG45M-DS2H Mainboard + 8330 IT8330G + 8872 IT887xF PCI to ISA I/O chip with SMB, GPIO, Serial or Parallel Port + 8888 IT8888F/G PCI to ISA Bridge with SMB [Golden Gate] + 8889 IT8889F PCI to ISA Bridge + 8892 IT8892E PCIe to PCI Bridge + 8086 200d DH61CR motherboard + 8893 IT8893E PCIe to PCI Bridge + e886 IT8330G +1284 Sahara Networks, Inc. +1285 Platform Technologies, Inc. + 0100 AGOGO sound chip (aka ESS Maestro 1) +1286 Mazet GmbH +1287 M-Pact, Inc. + 001e LS220D DVD Decoder + 001f LS220C DVD Decoder +1288 Timestep Corporation +1289 AVC Technology, Inc. +128a Asante Technologies, Inc. +128b Transwitch Corporation +128c Retix Corporation +128d G2 Networks, Inc. + 0021 ATM155 Adapter +128e Hoontech Corporation/Samho Multi Tech Ltd. + 0008 ST128 WSS/SB + 0009 ST128 SAM9407 + 000a ST128 Game Port + 000b ST128 MPU Port + 000c ST128 Ctrl Port +128f Tateno Dennou, Inc. +1290 Sord Computer Corporation +1291 NCS Computer Italia +1292 Tritech Microelectronics Inc + fc02 Pyramid3D TR25202 +1293 Media Reality Technology +1294 Rhetorex, Inc. +1295 Imagenation Corporation + 0800 PXR800 + 1000 PXD1000 +1296 Kofax Image Products +1297 Holco Enterprise Co, Ltd/Shuttle Computer +1298 Spellcaster Telecommunications Inc. +1299 Knowledge Technology Lab. +129a VMetro, inc. + 0615 PBT-615 PCI-X Bus Analyzer + 1100 PMC-FPGA05 + 1106 XMC-FPGA05F, PCI interface + 1107 XMC-FPGA05F, PCIe interface + 1108 XMC-FPGA05D, PCI interface + 1109 XMC-FPGA05D, PCIe interface +129b Image Access +129c Jaycor +129d Compcore Multimedia, Inc. +129e Victor Company of Japan, Ltd. +129f OEC Medical Systems, Inc. +12a0 Allen-Bradley Company +12a1 Simpact Associates, Inc. +12a2 Newgen Systems Corporation +12a3 Lucent Technologies + 8105 T8105 H100 Digital Switch +12a4 NTT Electronics Corporation +12a5 Vision Dynamics Ltd. +12a6 Scalable Networks, Inc. +12a7 AMO GmbH +12a8 News Datacom +12a9 Xiotech Corporation +12aa SDL Communications, Inc. +12ab YUAN High-Tech Development Co., Ltd. + 0000 MPG160/Kuroutoshikou ITVC15-STVLP + 0002 AU8830 [Vortex2] Based Sound Card With A3D Support + 0003 T507 (DVB-T) TV tuner/capture device + 2300 Club-3D Zap TV2100 + 3000 MPG-200C PCI DVD Decoder Card + 4789 MPC788 MiniPCI Hybrid TV Tuner + fff3 MPG600/Kuroutoshikou ITVC16-STVLP + ffff MPG600/Kuroutoshikou ITVC16-STVLP +12ac Measurex Corporation +12ad Multidata GmbH +12ae Alteon Networks Inc. + 0001 AceNIC Gigabit Ethernet + 1014 0104 Gigabit Ethernet-SX PCI Adapter + 12ae 0001 Gigabit Ethernet-SX (Universal) + 0002 AceNIC Gigabit Ethernet (Copper) + 10a9 8002 Acenic Gigabit Ethernet + 12ae 0002 Gigabit Ethernet-T (3C986-T) + 00fa Farallon PN9100-T Gigabit Ethernet +12af TDK USA Corp +12b0 Jorge Scientific Corp +12b1 GammaLink +12b2 General Signal Networks +12b3 Inter-Face Co Ltd +12b4 FutureTel Inc +12b5 Granite Systems Inc. +12b6 Natural Microsystems +12b7 Cognex Corporation +12b8 Korg +# Nee US Robotics +12b9 3Com Corp, Modem Division + 1006 WinModem + 12b9 005c USR 56k Internal Voice WinModem (Model 3472) + 12b9 005e USR 56k Internal WinModem (Models 662975) + 12b9 0062 USR 56k Internal Voice WinModem (Model 662978) + 12b9 0068 USR 56k Internal Voice WinModem (Model 5690) + 12b9 007a USR 56k Internal Voice WinModem (Model 662974) + 12b9 007f USR 56k Internal WinModem (Models 5698, 5699) + 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528) + 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529) + 12b9 0091 USR 56k Internal Voice WinModem (Model 2978) + 1007 USR 56k Internal WinModem + 12b9 00a3 USR 56k Internal WinModem (Model 3595) + 12b9 00c4 U.S. Robotics V.92 Voice Faxmodem (2884A/B/C) + 1008 56K FaxModem Model 5610 + 12b9 00a2 USR 56k Internal FAX Modem (Model 2977) + 12b9 00aa USR 56k Internal Voice Modem (Model 2976) + 12b9 00ab USR 56k Internal Voice Modem (Model 5609) + 12b9 00ac USR 56k Internal Voice Modem (Model 3298) + 12b9 00ad USR 56k Internal FAX Modem (Model 5610) + 12b9 00d3 USR 56K Internal V92 FAX Modem (Model 5610) + 12b9 baba USR 56K Internal Voice Modem 3CP3298-DEL (Model 5601) [Hawk] +12ba BittWare, Inc. +12bb Nippon Unisoft Corporation +12bc Array Microsystems +12bd Computerm Corp. +12be Anchor Chips Inc. + 3041 AN3041Q CO-MEM + 3042 AN3042Q CO-MEM Lite + 12be 3042 Anchor Chips Lite Evaluation Board +12bf Fujifilm Microdevices +12c0 Infimed +12c1 GMM Research Corp +12c2 Mentec Limited +12c3 Holtek Microelectronics Inc + 0058 PCI NE2K Ethernet + 5598 PCI NE2K Ethernet +12c4 Connect Tech Inc + 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11) + 0002 Blue HEAT/PCI 4 (RS232) + 0003 Blue HEAT/PCI 2 (RS232) + 0004 Blue HEAT/PCI 8 (UNIV, RS485) + 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485) + 0006 Blue HEAT/PCI 4 (OPTO, RS485) + 0007 Blue HEAT/PCI 2+2 (RS232/485) + 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485) + 0009 Blue HEAT/PCI 2+6 (RS232/485) + 000a Blue HEAT/PCI 8 (Tx, RS485) + 000b Blue HEAT/PCI 4 (Tx, RS485) + 000c Blue HEAT/PCI 2 (20 MHz, RS485) + 000d Blue HEAT/PCI 2 PTM + 0100 NT960/PCI + 0201 cPCI Titan - 2 Port + 0202 cPCI Titan - 4 Port + 0300 CTI PCI UART 2 (RS232) + 0301 CTI PCI UART 4 (RS232) + 0302 CTI PCI UART 8 (RS232) + 0310 CTI PCI UART 1+1 (RS232/485) + 0311 CTI PCI UART 2+2 (RS232/485) + 0312 CTI PCI UART 4+4 (RS232/485) + 0320 CTI PCI UART 2 + 0321 CTI PCI UART 4 + 0322 CTI PCI UART 8 + 0330 CTI PCI UART 2 (RS485) + 0331 CTI PCI UART 4 (RS485) + 0332 CTI PCI UART 8 (RS485) +12c5 Picture Elements Incorporated + 007e Imaging/Scanning Subsystem Engine + 007f Imaging/Scanning Subsystem Engine + 0081 PCIVST [Grayscale Thresholding Engine] + 0085 Video Simulator/Sender + 0086 THR2 Multi-scale Thresholder +12c6 Mitani Corporation +12c7 Dialogic Corp +# 12 Line, 6 port, CT-BUS/SC-BUS, loopstart FXO adaptor. + 0546 Springware D/120JCT-LS +# 24 Channel, 1 Port, CT-BUS/SC-BUS, T1/PRI adaptor. + 0647 Springware D/240JCT-T1 +# 4 Line, 4 port, CT-BUS/SC-BUS, loopstart FXO adaptor. Revision 01 + 0676 Springware D/41JCT-LS +# 48 Channel, 2 Port, CT-BUS/SC-BUS, T1/PRI adaptor. + 0685 Springware D/480JCT-2T1 +12c8 G Force Co, Ltd +12c9 Gigi Operations +12ca Integrated Computing Engines +12cb Antex Electronics Corporation + 0027 SC4 (StudioCard) + 002e StudioCard 2000 +12cc Pluto Technologies International +12cd Aims Lab +12ce Netspeed Inc. +12cf Prophet Systems, Inc. +12d0 GDE Systems, Inc. +12d1 PSITech +12d2 NVidia / SGS Thomson (Joint Venture) + 0008 NV1 + 0009 DAC64 + 0018 Riva128 + 1048 0c10 VICTORY Erazor + 107b 8030 STB Velocity 128 + 1092 0350 Viper V330 + 1092 1092 Viper V330 + 10b4 1b1b STB Velocity 128 + 10b4 1b1d STB Velocity 128 + 10b4 1b1e STB Velocity 128, PAL TV-Out + 10b4 1b20 STB Velocity 128 Sapphire + 10b4 1b21 STB Velocity 128 + 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out + 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out + 10b4 1b27 STB Velocity 128 DVD + 10b4 1b88 MVP Pro 128 + 10b4 222a STB Velocity 128 AGP + 10b4 2230 STB Velocity 128 + 10b4 2232 STB Velocity 128 + 10b4 2235 STB Velocity 128 AGP + 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000 + 0019 Riva128ZX + 0020 TNT + 0028 TNT2 + 0029 UTNT2 + 002c VTNT2 + 00a0 ITNT2 +12d3 Vingmed Sound A/S +12d4 Ulticom (Formerly DGM&S) + 0200 T1 Card +12d5 Equator Technologies Inc + 0003 BSP16 + 1000 BSP15 +12d6 Analogic Corp +12d7 Biotronic SRL +# acquired by Diodes Inc. +12d8 Pericom Semiconductor + 01a7 7C21P100 2-port PCI-X to PCI-X Bridge +# 3Port-3Lane PCI Express Switch GreenPacket Family + 0303 PCI Express Switch 3-3 +# PI7C9X20508GP 5Port-8Lane PCI Express Switch GreenPacket Family + 0508 PI7C9X20508GP PCI Express Switch 5Port-8Lane + 2304 PI7C9X2G304 EL/SL PCIe2 3-Port/4-Lane Packet Switch + 2308 PI7C9X2G308GP 8-lane PCI Express 2.0 Switch with 3 PCI Express ports + 2404 PI7C9X2G404 EL/SL PCIe2 4-Port/4-Lane Packet Switch + 2608 PI7C9X2G608GP PCIe2 6-Port/8-Lane Packet Switch + ea50 cc10 RXi2-BP + 400a PI7C9X442SL PCI Express Bridge Port + 400e PI7C9X442SL USB OHCI Controller + 400f PI7C9X442SL USB EHCI Controller + 71e2 PI7C7300A/PI7C7300D PCI-to-PCI Bridge + 71e3 PI7C7300A/PI7C7300D PCI-to-PCI Bridge (Secondary Bus 2) + 8140 PI7C8140A PCI-to-PCI Bridge + 8148 PI7C8148A/PI7C8148B PCI-to-PCI Bridge + 8150 PCI to PCI Bridge + 8152 PI7C8152A/PI7C8152B/PI7C8152BI PCI-to-PCI Bridge + 8154 PI7C8154A/PI7C8154B/PI7C8154BI PCI-to-PCI Bridge + 8619 PI7C9X2G1616PR PCIe2 16-Port/16-Lane Packet Switch + e110 PI7C9X110 PCI Express to PCI bridge + 1775 11cc CC11/CL11 CompactPCI Bridge + e111 PI7C9X111SL PCIe-to-PCI Reversible Bridge + e130 PCI Express to PCI-XPI7C9X130 PCI-X Bridge +12d9 Aculab PLC + 0002 PCI Prosody + 0004 cPCI Prosody + 0005 Aculab E1/T1 PCI card + 1078 Prosody X class e1000 device + 12d9 000d Prosody X PCI + 12d9 000e Prosody X cPCI +12da True Time Inc. +12db Annapolis Micro Systems, Inc +12dc Symicron Computer Communication Ltd. +12dd Management Graphics +12de Rainbow Technologies + 0200 CryptoSwift CS200 +12df SBS Technologies Inc +12e0 Chase Research + 0010 ST16C654 Quad UART + 0020 ST16C654 Quad UART + 0030 ST16C654 Quad UART +12e1 Nintendo Co, Ltd +12e2 Datum Inc. Bancomm-Timing Division +12e3 Imation Corp - Medical Imaging Systems +12e4 Brooktrout Technology Inc +12e5 Apex Semiconductor Inc +12e6 Cirel Systems +12e7 Sunsgroup Corporation +12e8 Crisc Corp +12e9 GE Spacenet +12ea Zuken +12eb Aureal Semiconductor + 0001 Vortex 1 + 0000 0300 Terasound A3D PCI + 104d 8036 AU8820 Vortex Digital Audio Processor + 1092 2000 Sonic Impact A3D + 1092 2100 Sonic Impact A3D + 1092 2110 Sonic Impact A3D + 1092 2200 Sonic Impact A3D + 122d 1002 SC 338-A3D + 12eb 0001 AU8820 Vortex Digital Audio Processor + 5053 3355 Montego + 50b2 1111 XLerate + 0002 Vortex 2 + 104d 8049 AU8830 Vortex 3D Digital Audio Processor + 104d 807b AU8830 Vortex 3D Digital Audio Processor + 1092 3000 Monster Sound II + 1092 3001 Monster Sound II + 1092 3002 Monster Sound II + 1092 3003 Monster Sound II + 1092 3004 Monster Sound II + 12eb 0002 AU8830 Vortex 3D Digital Audio Processor + 12eb 0088 AU8830 Vortex 3D Digital Audio Processor + 144d 3510 AU8830 Vortex 3D Digital Audio Processor + 5053 3356 Montego II + 0003 AU8810 Vortex Digital Audio Processor + 104d 8049 AU8810 Vortex Digital Audio Processor + 104d 8077 AU8810 Vortex Digital Audio Processor + 109f 1000 AU8810 Vortex Digital Audio Processor + 12eb 0003 AU8810 Vortex Digital Audio Processor + 1462 6780 AU8810 Vortex Digital Audio Processor + 14a4 2073 AU8810 Vortex Digital Audio Processor + 14a4 2091 AU8810 Vortex Digital Audio Processor + 14a4 2104 AU8810 Vortex Digital Audio Processor + 14a4 2106 AU8810 Vortex Digital Audio Processor + 8803 Vortex 56k Software Modem + 12eb 8803 Vortex 56k Software Modem +12ec 3A International, Inc. +12ed Optivision Inc. +12ee Orange Micro +12ef Vienna Systems +12f0 Pentek +12f1 Sorenson Vision Inc +12f2 Gammagraphx, Inc. +12f3 Radstone Technology +12f4 Megatel +12f5 Forks +12f6 Dawson France +12f7 Cognex +12f8 Electronic Design GmbH + 0002 VideoMaker +12f9 Four Fold Ltd +12fb Spectrum Signal Processing + 0001 PMC-MAI + 00f5 F5 Dakar + 02ad PMC-2MAI + 2adc ePMC-2ADC + 3100 PRO-3100 + 3500 PRO-3500 + 4d4f Modena + 8120 ePMC-8120 + da62 Daytona C6201 PCI (Hurricane) + db62 Ingliston XBIF + dc62 Ingliston PLX9054 + dd62 Ingliston JTAG/ISP + eddc ePMC-MSDDC + fa01 ePMC-FPGA +12fc Capital Equipment Corp +12fd I2S +12fe ESD Electronic System Design GmbH +12ff Lexicon +1300 Harman International Industries Inc +1302 Computer Sciences Corp +1303 Innovative Integration + 0030 X3-SDF 4-channel XMC acquisition board +1304 Juniper Networks +1305 Netphone, Inc +1306 Duet Technologies +# Nee ComputerBoards +1307 Measurement Computing + 0001 PCI-DAS1602/16 + 000b PCI-DIO48H + 000c PCI-PDISO8 + 000d PCI-PDISO16 + 000f PCI-DAS1200 + 0010 PCI-DAS1602/12 + 0014 PCI-DIO24H + 0015 PCI-DIO24H/CTR3 + 0016 PCI-DIO48H/CTR15 + 0017 PCI-DIO96H + 0018 PCI-CTR05 + 0019 PCI-DAS1200/JR + 001a PCI-DAS1001 + 001b PCI-DAS1002 + 001c PCI-DAS1602JR/16 + 001d PCI-DAS6402/16 + 001e PCI-DAS6402/12 + 001f PCI-DAS16/M1 + 0020 PCI-DDA02/12 + 0021 PCI-DDA04/12 + 0022 PCI-DDA08/12 + 0023 PCI-DDA02/16 + 0024 PCI-DDA04/16 + 0025 PCI-DDA08/16 + 0026 PCI-DAC04/12-HS + 0027 PCI-DAC04/16-HS + 0028 PCI-DIO24 + 0029 PCI-DAS08 + 002c PCI-INT32 + 0033 PCI-DUAL-AC5 + 0034 PCI-DAS-TC + 0035 PCI-DAS64/M1/16 + 0036 PCI-DAS64/M2/16 + 0037 PCI-DAS64/M3/16 + 004c PCI-DAS1000 + 004d PCI-QUAD04 + 0052 PCI-DAS4020/12 + 0053 PCIM-DDA06/16 + 0054 PCI-DIO96 + 005d PCI-DAS6023 + 005e PCI-DAS6025 + 005f PCI-DAS6030 + 0060 PCI-DAS6031 + 0061 PCI-DAS6032 + 0062 PCI-DAS6033 + 0063 PCI-DAS6034 + 0064 PCI-DAS6035 + 0065 PCI-DAS6040 + 0066 PCI-DAS6052 + 0067 PCI-DAS6070 + 0068 PCI-DAS6071 + 006f PCI-DAS6036 + 0070 PCI-DAC6702 + 0078 PCI-DAS6013 + 0079 PCI-DAS6014 + 0115 PCIe-DAS1602/16 +1308 Jato Technologies Inc. + 0001 NetCelerator Adapter + 1308 0001 NetCelerator Adapter +1309 AB Semiconductor Ltd +130a Mitsubishi Electric Microcomputer +130b Colorgraphic Communications Corp +130c Ambex Technologies, Inc +130d Accelerix Inc +130e Yamatake-Honeywell Co. Ltd +130f Advanet Inc +1310 Gespac +1311 Videoserver, Inc +1312 Acuity Imaging, Inc +1313 Yaskawa Electric Co. +1315 Wavesat +1316 Teradyne Inc +1317 ADMtek + 0981 21x4x DEC-Tulip compatible 10/100 Ethernet + 0985 NC100 Network Everywhere Fast Ethernet 10/100 + 1734 100c Scenic N300 ADMtek AN983 10/100 Mbps PCI Adapter + 1985 21x4x DEC-Tulip compatible 10/100 Ethernet + 1385 511a FA511 + 1395 2103 CB100-EZ (4-LED version) + 2850 HSP MicroModem 56 + 5120 ADM5120 OpenGate System-on-Chip + 8201 ADM8211 802.11b Wireless Interface + 10b8 2635 SMC2635W v1 802.11b Wireless Cardbus Adapter + 1317 8201 SMC2635W v2 802.11b Wireless Cardbus Adapter + 8211 ADM8211 802.11b Wireless Interface + 9511 21x4x DEC-Tulip compatible 10/100 Ethernet +1318 Packet Engines Inc. + 0911 GNIC-II PCI Gigabit Ethernet [Hamachi] +1319 Fortemedia, Inc + 0801 Xwave QS3000A [FM801] + 1319 1319 FM801 PCI Audio + 0802 Xwave QS3000A [FM801 game port] + 1319 1319 FM801 PCI Joystick + 1000 FM801 PCI Audio + 1001 FM801 PCI Joystick +131a Finisar Corp. +131c Nippon Electro-Sensory Devices Corp +131d Sysmic, Inc. +131e Xinex Networks Inc +131f Siig Inc + 1000 CyberSerial (1-port) 16550 + 1001 CyberSerial (1-port) 16650 + 1002 CyberSerial (1-port) 16850 + 1010 Duet 1S(16550)+1P + 1011 Duet 1S(16650)+1P + 1012 Duet 1S(16850)+1P + 1020 CyberParallel (1-port) + 1021 CyberParallel (2-port) + 1030 CyberSerial (2-port) 16550 + 1031 CyberSerial (2-port) 16650 + 1032 CyberSerial (2-port) 16850 + 1034 Trio 2S(16550)+1P + 1035 Trio 2S(16650)+1P + 1036 Trio 2S(16850)+1P + 1050 CyberSerial (4-port) 16550 + 1051 CyberSerial (4-port) 16650 + 1052 CyberSerial (4-port) 16850 + 2000 CyberSerial (1-port) 16550 + 2001 CyberSerial (1-port) 16650 + 2002 CyberSerial (1-port) 16850 + 2010 Duet 1S(16550)+1P + 2011 Duet 1S(16650)+1P + 2012 Duet 1S(16850)+1P + 2020 CyberParallel (1-port) + 2021 CyberParallel (2-port) + 2030 CyberSerial (2-port) 16550 + 131f 2030 PCI Serial Card + 2031 CyberSerial (2-port) 16650 + 2032 CyberSerial (2-port) 16850 + 2040 Trio 1S(16550)+2P + 2041 Trio 1S(16650)+2P + 2042 Trio 1S(16850)+2P + 2050 CyberSerial (4-port) 16550 + 2051 CyberSerial (4-port) 16650 + 2052 CyberSerial (4-port) 16850 + 2060 Trio 2S(16550)+1P + 2061 Trio 2S(16650)+1P + 2062 Trio 2S(16850)+1P + 2081 CyberSerial (8-port) ST16654 +1320 Crypto AG +1321 Arcobel Graphics BV +1322 MTT Co., Ltd +1323 Dome Inc +1324 Sphere Communications +1325 Salix Technologies, Inc +1326 Seachange international +1327 Voss scientific +1328 quadrant international +1329 Productivity Enhancement +132a Microcom Inc. +132b Broadband Technologies +132c Micrel Inc +132d Integrated Silicon Solution, Inc. +1330 MMC Networks +1331 RadiSys Corporation + 0030 ENP-2611 + 8200 82600 Host Bridge + 8201 82600 IDE + 8202 82600 USB + 8210 82600 PCI Bridge +1332 Micro Memory + 5415 MM-5415CN PCI Memory Module with Battery Backup + 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup + 6140 MM-6140D +1334 Redcreek Communications, Inc +1335 Videomail, Inc +1337 Third Planet Publishing +1338 BT Electronics +133a Vtel Corp +133b Softcom Microsystems +133c Holontech Corp +133d SS Technologies +133e Virtual Computer Corp +133f SCM Microsystems +1340 Atalla Corp +1341 Kyoto Microcomputer Co +1342 Promax Systems Inc +1343 Phylon Communications Inc +# nee Crucial Technology +1344 Micron Technology Inc + 5150 RealSSD P320h + 5151 RealSSD P320m + 5152 RealSSD P320s + 5153 RealSSD P325m + 5160 RealSSD P420h + 5161 RealSSD P420m + 5163 RealSSD P425m + 5180 9100 PRO NVMe SSD + 5181 9100 MAX NVMe SSD + 5190 9200 ECO NVMe SSD + 5191 9200 PRO NVMe SSD + 5192 9200 MAX NVMe SSD + 51a2 7300 PRO NVMe SSD + 51a3 7300 MAX NVMe SSD + 51b1 9300 PRO NVMe SSD + 1344 4000 3.84TB U.2 + 1344 5000 7.68TB U.2 + 1344 6000 15.36TB U.2 + 51b2 9300 MAX NVMe SSD + 1344 4000 3.2TB U.2 + 1344 5000 6.4 TB U.2 + 1344 6000 12.8TB U.2 + 51c0 7400 PRO NVMe SSD + 1344 1100 M.2 480GB + 1344 2000 U.3 960GB + 1344 2100 M.2 960GB + 1344 2600 E1.S 960GB + 1344 2b00 M.2 1920GB + 1344 2d00 E1.2 1920GB + 1344 3000 U.3 1920GB + 1344 3e00 M.2 3840GB + 1344 3f00 E1.S 3840GB + 1344 4000 U.3 3840GB + 1344 5000 U.3 7680GB + 51c1 7400 MAX NVMe SSD + 1344 1100 M.2 400GB + 1344 2000 U.3 800GB + 1344 2100 M.2 800GB + 1344 2600 E1.S 800GB + 1344 2b00 M.2 1600GB + 1344 2d00 E1.S 1600GB + 1344 3000 U.3 1600GB + 1344 3e00 M.2 3200GB + 1344 3f00 E1.S 3200GB + 1344 4000 U.3 3200GB + 1344 5000 U.3 6400GB + 51c3 7450 PRO NVMe SSD + 51c4 7450 MAX NVMe SSD +1345 Arescom Inc +1347 Odetics +1349 Sumitomo Electric Industries, Ltd. +134a DTC Technology Corp. + 0001 Domex 536 + 0002 Domex DMX3194UP SCSI Adapter +134b ARK Research Corp. +134c Chori Joho System Co. Ltd +134d PCTel Inc + 2189 HSP56 MicroModem + 2486 2304WT V.92 MDC Modem + 7890 HSP MicroModem 56 + 134d 0001 PCT789 adapter + 7891 HSP MicroModem 56 + 134d 0001 HSP MicroModem 56 + 7892 HSP MicroModem 56 + 7893 HSP MicroModem 56 + 7894 HSP MicroModem 56 + 7895 HSP MicroModem 56 + 7896 HSP MicroModem 56 + 7897 HSP MicroModem 56 +134e CSTI +134f Algo System Co Ltd +1350 Systec Co. Ltd +1351 Sonix Inc +# nee Vierling Communication SAS, nee Thales Idatys +1353 dbeeSet Technology + 0002 Proserver + 0003 PCI-FUT + 0004 PCI-S0 + 0005 PCI-FUT-S0 + 0006 OTDU-1U (FPGA Zynq-7000) + 0007 OTDU-EX +1354 Dwave System Inc +1355 Kratos Analytical Ltd +1356 The Logical Co +1359 Prisa Networks +135a Brain Boxes + 0a61 UC-324 [VELOCITY RS422/485] +135b Giganet Inc +135c Quatech Inc + 0010 QSC-100 + 0020 DSC-100 + 0030 DSC-200/300 + 0040 QSC-200/300 + 0050 ESC-100D + 0060 ESC-100M + 00f0 MPAC-100 Synchronous Serial Card (Zilog 85230) + 0170 QSCLP-100 + 0180 DSCLP-100 + 0190 SSCLP-100 + 01a0 QSCLP-200/300 + 01b0 DSCLP-200/300 + 01c0 SSCLP-200/300 + 0258 DSPSX-200/300 +135d ABB Network Partner AB +135e Sealevel Systems Inc + 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32) + 7101 Single Port RS-232/422/485/530 + 7201 Dual Port RS-232/422/485 Interface + 7202 Dual Port RS-232 Interface + 7401 Four Port RS-232 Interface + 7402 Four Port RS-422/485 Interface + 7801 Eight Port RS-232 Interface + 7804 Eight Port RS-232/422/485 Interface + 8001 8001 Digital I/O Adapter +135f I-Data International A-S +1360 Meinberg Funkuhren + 0101 PCI32 DCF77 Radio Clock + 0102 PCI509 DCF77 Radio Clock + 0103 PCI510 DCF77 Radio Clock + 0104 PCI511 DCF77 Radio Clock + 0105 PEX511 DCF77 Radio Clock (PCI Express) + 0106 PZF180PEX High Precision DCF77 Radio Clock (PCI Express) + 0201 GPS167PCI GPS Receiver + 0202 GPS168PCI GPS Receiver + 0203 GPS169PCI GPS Receiver + 0204 GPS170PCI GPS Receiver + 0205 GPS170PEX GPS Receiver (PCI Express) + 0206 GPS180PEX GPS Receiver (PCI Express) + 0207 GLN180PEX GPS/GLONASS receiver (PCI Express) + 0208 GPS180AMC GPS Receiver (PCI Express / MicroTCA / AdvancedMC) + 0209 GNS181PEX GPS/Galileo/GLONASS/BEIDOU receiver (PCI Express) + 0301 TCR510PCI IRIG Timecode Reader + 0302 TCR167PCI IRIG Timecode Reader + 0303 TCR511PCI IRIG Timecode Reader + 0304 TCR511PEX IRIG Timecode Reader (PCI Express) + 0305 TCR170PEX IRIG Timecode Reader (PCI Express) + 0306 TCR180PEX IRIG Timecode Reader (PCI Express) + 0501 PTP270PEX PTP/IEEE1588 slave card (PCI Express) + 0601 FRC511PEX Free Running Clock (PCI Express) +1361 Soliton Systems K.K. +1362 Fujifacom Corporation +1363 Phoenix Technology Ltd +1364 ATM Communications Inc +1365 Hypercope GmbH +1366 Teijin Seiki Co. Ltd +1367 Hitachi Zosen Corporation +1368 Skyware Corporation +1369 Digigram +136a High Soft Tech + 0004 HST Saphir VII mini PCI + 0007 HST Saphir III E MultiLink 4 + 0008 HST Saphir III E MultiLink 8 + 000a HST Saphir III E MultiLink 2 +136b Kawasaki Steel Corporation + ff01 KL5A72002 Motion JPEG +136c Adtek System Science Co Ltd +136d Gigalabs Inc +136f Applied Magic Inc +1370 ATL Products +1371 CNet Technology Inc + 434e GigaCard Network Adapter + 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) +1373 Silicon Vision Inc +1374 Silicom Ltd. + 0024 Silicom Dual port Giga Ethernet BGE Bypass Server Adapter + 0025 Silicom Quad port Giga Ethernet BGE Bypass Server Adapter + 0026 Silicom Dual port Fiber Giga Ethernet 546 Bypass Server Adapter + 0027 Silicom Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter + 0029 Silicom Dual port Copper Giga Ethernet 546GB Bypass Server Adapter + 002a Silicom Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter + 002b Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter (PXE2TBI) + 002c Silicom Quad port Copper Giga Ethernet 546GB Bypass Server Adapter (PXG4BPI) + 002d Silicom Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI) + 002e Silicom Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI-LX) + 002f Silicom Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter (PXG2BPFIL) + 0030 Silicom Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter + 0031 Silicom Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter + 0032 Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter + 0034 Silicom Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter + 0035 Silicom Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter + 0036 Silicom Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter + 0037 Silicom Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter + 0038 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter + 0039 Silicom Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter + 003a Silicom Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter + 003b Silicom Dual port Fiber Ethernet PMC Intel based Bypass Server Adapter (PMCX2BPFI) + 003c Silicom Dual port Copper Ethernet PCI-X BGE based Bypass Server Adapter (PXG2BPRB) + 003d 2-port Copper GBE Bypass with Caviume 1010 PCI-X + 003e Silicom Dual port Fiber Giga Ethernet PCI-E 571 TAP/Bypass Server Adapter (PEG2TBFI) + 003f Silicom Dual port Copper Giga Ethernet PCI-X 546 TAP/Bypass Server Adapter (PXG2TBI) + 0040 Silicom Quad port Fiber-SX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI) + 0042 4-port Copper GBE PMC-X Bypass + 0043 Silicom Quad port Fiber-SX Giga Ethernet 546 Bypass Server Adapter (PXG4BPFID) + 0045 Silicom 6 port Copper Giga Ethernet 546 Bypass Server Adapter (PXG6BPI) + 0046 4-port bypass PCI-E w disconnect low profile + 0047 Silicom Dual port Fiber-SX Giga Ethernet 571 Bypass Disconnect Server Adapter (PEG2BPFID) + 004a Silicom Quad port Fiber-LX Giga Ethernet 571 Bypass Server Adapter (PEG4BPFI-LX) + 004d Dual port Copper Giga Ethernet PCI-E Bypass Server Adapter + 0401 Gigabit Ethernet ExpressModule Bypass Server Adapter + 0420 Gigabit Ethernet ExpressModule Bypass Server Adapter + 0460 Gigabit Ethernet Express Module Bypass Server Adapter + 0461 Gigabit Ethernet ExpressModule Bypass Server Adapter + 0462 Gigabit Ethernet ExpressModule Bypass Server Adapter + 0470 Octal-port Copper Gigabit Ethernet Express Module Bypass Server Adapter + 0482 Dual-port Fiber (SR) 10 Gigabit Ethernet ExpressModule Bypass Server Adapter + 0483 Dual-port Fiber (LR) 10 Gigabit Ethernet ExpressModule Bypass Server Adapter +1375 Argosystems Inc +1376 LMC +1377 Electronic Equipment Production & Distribution GmbH +1378 Telemann Co. Ltd +1379 Asahi Kasei Microsystems Co Ltd +137a Mark of the Unicorn Inc + 0001 PCI-324 Audiowire Interface +137b PPT Vision +137c Iwatsu Electric Co Ltd +137d Dynachip Corporation +137e Patriot Scientific Corporation +137f Japan Satellite Systems Inc +1380 Sanritz Automation Co Ltd +1381 Brains Co. Ltd +1382 Marian - Electronic & Software + 0001 ARC88 audio recording card + 2008 Prodif 96 Pro sound system + 2048 Prodif Plus sound system + 2088 Marc 8 Midi sound system + 20c8 Marc A sound system + 4008 Marc 2 sound system + 4010 Marc 2 Pro sound system + 4048 Marc 4 MIDI sound system + 4088 Marc 4 Digi sound system + 4248 Marc X sound system + 4424 TRACE D4 Sound System +1383 Controlnet Inc +1384 Reality Simulation Systems Inc +1385 Netgear + 006b WA301 802.11b Wireless PCI Adapter + 4100 MA301 802.11b Wireless PCI Adapter + 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card + 620a GA620 Gigabit Ethernet + 630a GA630 Gigabit Ethernet +1386 Video Domain Technologies +1387 Systran Corp +1388 Hitachi Information Technology Co Ltd +1389 Applicom International + 0001 PCI1500PFB [Intelligent fieldbus adaptor] +138a Fusion Micromedia Corp + 003d VFS491 Validity Sensor +138b Tokimec Inc +138c Silicon Reality +138d Future Techno Designs pte Ltd +138e Basler GmbH +138f Patapsco Designs Inc +1390 Concept Development Inc +1391 Development Concepts Inc +1392 Medialight Inc +1393 Moxa Technologies Co Ltd + 0001 UC7000 Serial + 1020 CP-102 (2-port RS-232 PCI) + 1021 CP-102UL (2-port RS-232 Universal PCI) + 1022 CP-102U (2-port RS-232 Universal PCI) + 1023 CP-102UF + 1024 CP-102E (2-port RS-232 Smart PCI Express Serial Board) + 1025 CP-102EL (2-port RS-232 Smart PCI Express Serial Board) + 1040 Smartio C104H/PCI + 1041 CP104U (4-port RS-232 Universal PCI) + 1042 CP104JU (4-port RS-232 Universal PCI) + 1043 CP104EL (4-port RS-232 Smart PCI Express) + 1044 POS104UL (4-port RS-232 Universal PCI) + 1045 CP-104EL-A (4-port RS-232 PCI Express Serial Board) + 1080 CB108 (8-port RS-232 PC/104-plus Module) + 1140 CT-114 series + 1141 Industrio CP-114 + 1142 CB114 (4-port RS-232/422/485 PC/104-plus Module) + 1143 CP-114UL (4-port RS-232/422/485 Smart Universal PCI Serial Board) + 1144 CP-114EL (4-port RS-232/422/485 Smart PCI Express Serial Board) + 1180 CP118U (8-port RS-232/422/485 Smart Universal PCI) + 1181 CP118EL (8-port RS-232/422/485 Smart PCI Express) + 1182 CP-118EL-A (8-port RS-232/422/485 PCI Express Serial Board) + 1320 CP132 (2-port RS-422/485 PCI) + 1321 CP132U (2-Port RS-422/485 Universal PCI) + 1322 CP-132EL (2-port RS-422/485 Smart PCI Express Serial Board) + 1340 CP134U (4-Port RS-422/485 Universal PCI) + 1341 CB134I (4-port RS-422/485 PC/104-plus Module) + 1380 CP138U (8-port RS-232/422/485 Smart Universal PCI) + 1680 Smartio C168H/PCI + 1681 CP-168U V2 Smart Serial Board (8-port RS-232) + 1682 CP-168EL (8-port RS-232 Smart PCI Express) + 1683 CP-168EL-A (8-port RS-232 PCI Express Serial Board) + 2040 Intellio CP-204J + 2180 Intellio C218 Turbo PCI + 3200 Intellio C320 Turbo PCI +1394 Level One Communications + 0001 LXT1001 Gigabit Ethernet + 1186 4800 DGE-500SX + 1394 0001 NetCelerator Adapter +1395 Ambicom Inc +1396 Cipher Systems Inc +1397 Cologne Chip Designs GmbH + 08b4 ISDN network Controller [HFC-4S] + 1397 08b4 HFC-4S [Cologne Chip HFC-4S Eval. Board] + 1397 b51a HFC-4S [Allo.com BRI card] + 1397 b520 HFC-4S [IOB4ST] + 1397 b540 HFC-4S [Swyx SX2 QuadBri] + 1397 b550 HFC-4S [Junghanns.NET quadBRI] + 1397 b556 HFC-4S [Junghanns.NET duoBRI] + 1397 b559 HFC-4S [Junghanns.NET duoBRI miniPCI] + 1397 b560 HFC-4S [BeroNet BN4S0] + 1397 b566 HFC-4S [BeroNet BN2S0] + 1397 b567 HFC-4S [BeroNet BN1S0 miniPCI] + 1397 b568 HFC-4S [BeroNet BN4S0 miniPCI] + 1397 b569 HFC-4S [BeroNet BN2S0 miniPCI] + 1397 b620 HFC-4S + 1397 b752 HFC-4S [Junghanns.NET quadBRI PCIe] + 1397 b761 HFC-4S [BeroNet BN2S0 PCIe] + 1397 b762 HFC-4S [BeroNet BN4S0 PCIe] + 1397 e884 HFC-4S [OpenVox B200P] + 1397 e888 HFC-4S [OpenVox B200P / B400P] + 16b8 ISDN network Controller [HFC-8S] + 1397 16b8 HFC-8S [Cologne Chip HFC-8S Eval. Board] + 1397 b521 HFC-8S [IOB4ST Recording] + 1397 b522 HFC-8S [IOB8ST] + 1397 b552 HFC-8S [Junghanns.NET octoBRI] + 1397 b55b HFC-8S [Junghanns.NET octoBRI] + 1397 b562 HFC-8S [BeroNet BN8S0] + 1397 b56b HFC-8S [BeroNet BN8S0+] + 1397 b622 HFC-8S + 1397 e998 HFC-8S [OpenVox B800P] + 2bd0 ISDN network controller [HFC-PCI] + 0675 1704 ISDN Adapter (PCI Bus, D, C) + 0675 1708 ISDN Adapter (PCI Bus, D, C, ACPI) + 1397 2bd0 ISDN Board + e4bf 1000 CI1-1-Harp + 30b1 ISDN network Controller [HFC-E1] + 1397 30b1 HFC-E1 [Cologne Chip HFC-E1 Eval. Board] + 1397 b523 HFC-E1 [IOB1E1] + 1397 b543 HFC-E1 [Swyx SX2 SinglePRI V2] + 1397 b544 HFC-E1 [Swyx SX2 DualPRI V2] + 1397 b553 HFC-E1 [Junghanns.NET singleE1] + 1397 b554 HFC-E1 [Junghanns.NET doubleE1] + 1397 b555 HFC-E1 [Junghanns.NET doubleE1 2.0] + 1397 b55a HFC-E1 [Junghanns.NET singleE1 miniPCI] + 1397 b563 HFC-E1 [beroNet BN1E1] + 1397 b564 HFC-E1 [beroNet BN2E1] + 1397 b565 HFC-E1 [beroNet BN2E1+] + 1397 b56a HFC-E1 [beroNet BN1E1 miniPCI] + b700 ISDN network controller PrimuX S0 [HFC-PCI] + f001 GSM Network Controller [HFC-4GSM] +1398 Clarion co. Ltd +1399 Rios systems Co Ltd +139a Alacritech Inc + 0001 Quad Port 10/100 Server Accelerator + 0003 Single Port 10/100 Server Accelerator + 0005 Single Port Gigabit Server Accelerator +139b Mediasonic Multimedia Systems Ltd +139c Quantum 3d Inc +139d EPL limited +139e Media4 +139f Aethra s.r.l. +13a0 Crystal Group Inc +13a1 Kawasaki Heavy Industries Ltd +13a2 Ositech Communications Inc +13a3 Hifn Inc. + 0005 7751 Security Processor + 0006 6500 Public Key Processor + 0007 7811 Security Processor + 0012 7951 Security Processor + 0014 78XX Security Processor + 0016 8065 Security Processor + 0017 8165 Security Processor + 0018 8154 Security Processor + 001d 7956 Security Processor + 001f 7855 Security Processor + 0020 7955 Security Processor + 0026 8155 Security Processor + 002e 9630 Compression Processor + 002f 9725 Compression and Security Processor + 13a3 1600 DR1600 Acceleration Card + 13a3 1605 DR1605 Acceleration Card + 13a3 1610 DR1610 Acceleration Card + 13a3 1615 DR1615 Acceleration Card + 13a3 1620 DR1620 Acceleration Card + 13a3 1625 DR1625 Acceleration Card + 0033 8201 Acceleration Processor + 13a3 0036 DX1710 Acceleration Card + 0034 8202 Acceleration Processor + 13a3 0036 DX1720 Acceleration Card + 0035 8203 Acceleration Processor + 13a3 0036 DX1730 Acceleration Card + 0037 8204 Acceleration Processor + 13a3 0036 DX1740 Acceleration Card + 9240 XR9240 Compression and Security Coprocessor [Panther II] + 13a3 9200 DX2040 Compression and Security Acceleration Card [Panther II] +13a4 Rascom Inc +13a5 Audio Digital Imaging Inc +13a6 Videonics Inc +13a7 Teles AG +13a8 Exar Corp. + 0152 XR17C/D152 Dual PCI UART + 0154 XR17C154 Quad UART + 0158 XR17C158 Octal UART + 0252 XR17V252 Dual UART PCI controller + 0254 XR17V254 Quad UART PCI controller + 0258 XR17V258 Octal UART PCI controller + 0352 XR17V3521 Dual PCIe UART +13a9 Siemens Medical Systems, Ultrasound Group +13aa Broadband Networks Inc +13ab Arcom Control Systems Ltd +13ac Motion Media Technology Ltd +13ad Nexus Inc +13ae ALD Technology Ltd +13af T.Sqware +13b0 Maxspeed Corp +13b1 Tamura corporation +13b2 Techno Chips Co. Ltd +13b3 Lanart Corporation +13b4 Wellbean Co Inc +13b5 ARM +13b6 Dlog GmbH +13b7 Logic Devices Inc +13b8 Nokia Telecommunications oy +13b9 Elecom Co Ltd +13ba Oxford Instruments +13bb Sanyo Technosound Co Ltd +13bc Bitran Corporation +13bd Sharp corporation +13be Miroku Jyoho Service Co. Ltd +13bf Sharewave Inc +13c0 Microgate Corporation + 0010 SyncLink Adapter v1 + 0020 SyncLink SCC Adapter + 0030 SyncLink Multiport Adapter + 0070 SyncLink GT Adapter + 0080 SyncLink GT4 Adapter + 00a0 SyncLink GT2 Adapter + 0210 SyncLink Adapter v2 +13c1 3ware Inc + 1000 5xxx/6xxx-series PATA-RAID + 1001 7xxx/8xxx-series PATA/SATA-RAID + 13c1 1001 7xxx/8xxx-series PATA/SATA-RAID + 1002 9xxx-series SATA-RAID + 1003 9550SX SATA-II RAID PCI-X + 1004 9650SE SATA-II RAID PCIe + 1005 9690SA SAS/SATA-II RAID PCIe + 1010 9750 SAS2/SATA-II RAID PCIe +13c2 Technotrend Systemtechnik GmbH + 000e Technotrend/Hauppauge DVB card rev2.3 + 1019 TTechnoTrend-budget DVB S2-3200 +13c3 Janz Computer AG +13c4 Phase Metrics +13c5 Alphi Technology Corp +13c6 Condor Engineering Inc + 0520 CEI-520 A429 Card + 0620 CEI-620 A429 Card + 0820 CEI-820 A429 Card + 0830 CEI-830 A429 Card + 1004 P-SER Multi-channel PMC to RS-485/422/232 adapter +13c7 Blue Chip Technology Ltd + 0adc PCI-ADC + 0b10 PCI-PIO + 0d10 PCI-DIO + 524c PCI-RLY + 5744 PCI-WDT +13c8 Apptech Inc +13c9 Eaton Corporation +13ca Iomega Corporation +13cb Yano Electric Co Ltd +13cc BARCO +13cd Compatible Systems Corporation +13ce Cocom A/S +13cf Studio Audio & Video Ltd +13d0 Techsan Electronics Co Ltd + 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card + 2104 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card (rev 01) + 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card +13d1 Abocom Systems Inc + ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter + ab03 21x4x DEC-Tulip compatible 10/100 Ethernet + ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter + ab08 21x4x DEC-Tulip compatible 10/100 Ethernet +13d2 Shark Multimedia Inc +13d4 Graphics Microsystems Inc +13d5 Media 100 Inc +13d6 K.I. Technology Co Ltd +13d7 Toshiba Engineering Corporation +13d8 Phobos corporation +13d9 Apex PC Solutions Inc +13da Intresource Systems pte Ltd +13db Janich & Klass Computertechnik GmbH +13dc Netboost Corporation +13dd Multimedia Bundle Inc +13de ABB Robotics Products AB +13df E-Tech Inc + 0001 PCI56RVP Modem + 13df 0001 PCI56RVP Modem +13e0 GVC Corporation +13e1 Silicom Multimedia Systems Inc +13e2 Dynamics Research Corporation +13e3 Nest Inc +13e4 Calculex Inc +13e5 Telesoft Design Ltd +13e6 Argosy research Inc +13e7 NAC Incorporated +13e8 Chip Express Corporation +13e9 Intraserver Technology Inc +13ea Dallas Semiconductor +13eb Hauppauge Computer Works Inc +13ec Zydacron Inc + 000a NPC-RC01 Remote control receiver +13ed Raytheion E-Systems +13ee Hayes Microcomputer Products Inc +13ef Coppercom Inc +13f0 Sundance Technology Inc / IC Plus Corp + 0200 IC Plus IP100A Integrated 10/100 Ethernet MAC + PHY + 1043 8213 NX1001 + 0201 ST201 Sundance Ethernet + 1021 TC902x Gigabit Ethernet + 1023 IP1000 Family Gigabit Ethernet + 1043 8180 NX1101 +13f1 Oce' - Technologies B.V. +13f2 Ford Microelectronics Inc +13f3 Mcdata Corporation +13f4 Troika Networks, Inc. + 1401 Zentai Fibre Channel Adapter +13f5 Kansai Electric Co. Ltd +13f6 C-Media Electronics Inc + 0011 CMI8738 + 0100 CM8338A + 13f6 ffff CMI8338/C3DX PCI Audio Device + 0101 CM8338B + 13f6 0101 CMI8338-031 PCI Audio Device + 0111 CMI8738/CMI8768 PCI Audio + 1019 0970 P6STP-FL motherboard + 1043 8035 CUSI-FX motherboard + 1043 8077 CMI8738 6-channel audio controller + 1043 80e2 CMI8738 6ch-MX + 13f6 0111 CMI8738/C3DX PCI Audio Device + 13f6 9761 Theatron Agrippa + 153b 1144 Aureon 5.1 + 153b 1170 Aureon 7.1 + 1681 a000 Gamesurround MUSE XL + 17ab 0604 PSC604 Dynamic Edge + 17ab 0605 PSC605 Sonic Edge + 17ab 7777 PSC605 Sonic Edge + 270f 1103 CT-7NJS Ultra motherboard + 270f f462 7NJL1 motherboard + 584d 3731 Digital X-Mystique + 584d 3741 X-Plosion 7.1 + 584d 3751 X-Raider 7.1 + 584d 3761 X-Mystique 7.1 LP + 584d 3771 X-Mystique 7.1 LP Value + 7284 8384 Striker 7.1 + 0211 CM8738 + 5011 CM8888 [Oxygen Express] + 13f6 5011 HDA Controller + 8788 CMI8788 [Oxygen HD Audio] + 1043 8269 Virtuoso 200 (Xonar D2) + 1043 8275 Virtuoso 100 (Xonar DX) + 1043 82b7 Virtuoso 200 (Xonar D2X) + 1043 8314 Virtuoso 200 (Xonar HDAV1.3) + 1043 8327 Virtuoso 100 (Xonar DX) + 1043 834f Virtuoso 100 (Xonar D1) + 1043 835c Virtuoso 100 (Xonar Essence STX) + 1043 835d Virtuoso 100 (Xonar ST) + 1043 835e Virtuoso 200 (Xonar HDAV1.3 Slim) + 1043 838e Virtuoso 66 (Xonar DS) + 1043 8428 Virtuoso 100 (Xonar Xense) + 1043 8467 CMI8786 (Xonar DG) + 1043 8521 CMI8786 (Xonar DGX) + 1043 8522 Xonar DSX + 1043 85f4 Virtuoso 100 (Xonar Essence STX II) + 13f6 8782 PCI 2.0 HD Audio + 13f6 ffff CMI8787-HG2PCI + 14c3 1710 HiFier Fantasia + 14c3 1711 HiFier Serenade + 14c3 1713 HiFier Serenade III + 1a58 0910 Barracuda AC-1 + 415a 5431 X-Meridian 7.1 + 5431 017a X-Meridian 7.1 2G + 584d 3781 HDA X-Purity 7.1 Platinum + 7284 9761 CLARO + 7284 9781 CLARO halo + 7284 9783 eCLARO + 7284 9787 CLARO II +13f7 Wildfire Communications +13f8 Ad Lib Multimedia Inc +13f9 NTT Advanced Technology Corp. +13fa Pentland Systems Ltd +13fb Aydin Corp +13fc Computer Peripherals International +13fd Micro Science Inc +13fe Advantech Co. Ltd + 1240 PCI-1240 4-channel stepper motor controller card + 1600 PCI-16xx series PCI multiport serial board (function 0) +# This board has two PCI functions, appears as two PCI devices + 1601 0002 PCI-1601 2-port unisolated RS-422/485 +# This board has two PCI functions, appears as two PCI devices + 1602 0002 PCI-1602 2-port isolated RS-422/485 + 1612 0004 PCI-1612 4-port RS-232/422/485 + 1603 PCI-1603 2-port isolated RS-232/current loop + 1604 PCI-1604 2-port RS-232 + 1680 PCI-1680 Rev.A1 2-port CAN-bus with isolation protection + 16ff PCI-16xx series PCI multiport serial board (function 1: RX/TX steering CPLD) + 1601 0000 PCI-1601 2-port unisolated RS-422/485 PCI communications card + 1602 0000 PCI-1602 2-port isolated RS-422/485 + 1612 0000 PCI-1612 4-port RS-232/422/485 + 1711 PCI-1711 16-channel data acquisition card 12-bit, 100kS/s + 1713 PCI-1713 32-channel isolated analog input card + 1733 PCI-1733 32-channel isolated digital input card + 1734 PCI-1734 32-channel isolated digital output card + 1752 PCI-1752 64-channel Isolated Digital Output Card + 1754 PCI-1754 64-channel Isolated Digital Input Card + 1756 PCI-1756 64-ch Isolated Digital I/O PCI Card + a004 PCI-1612 4-port RS-232/422/485 +# FPGA bridge to two SJA1000 + c302 MIOe-3680 2-Port CAN-Bus MIOe Module with Isolation Protection +13ff Silicon Spice Inc +1400 Artx Inc + 1401 9432 TX +1401 CR-Systems A/S +1402 Meilhaus Electronic GmbH + 0630 ME-630 + 0940 ME-94 + 0950 ME-95 + 0960 ME-96 + 1000 ME-1000 + 100a ME-1000 + 100b ME-1000 + 1400 ME-1400 + 140a ME-1400A + 140b ME-1400B + 140c ME-1400C + 140d ME-1400D + 140e ME-1400E + 14ea ME-1400EA + 14eb ME-1400EB + 1604 ME-1600/4U + 1608 ME-1600/8U + 160c ME-1600/12U + 160f ME-1600/16U + 168f ME-1600/16U8I + 4610 ME-4610 + 4650 ME-4650 + 4660 ME-4660 + 4661 ME-4660I + 4662 ME-4660 + 4663 ME-4660I + 4670 ME-4670 + 4671 ME-4670I + 4672 ME-4670S + 4673 ME-4670IS + 4680 ME-4680 + 4681 ME-4680I + 4682 ME-4680S + 4683 ME-4680IS + 6004 ME-6000/4 + 6008 ME-6000/8 + 600f ME-6000/16 + 6014 ME-6000I/4 + 6018 ME-6000I/8 + 601f ME-6000I/16 + 6034 ME-6000ISLE/4 + 6038 ME-6000ISLE/8 + 603f ME-6000ISLE/16 + 6044 ME-6000/4/DIO + 6048 ME-6000/8/DIO + 604f ME-6000/16/DIO + 6054 ME-6000I/4/DIO + 6058 ME-6000I/8/DIO + 605f ME-6000I/16/DIO + 6074 ME-6000ISLE/4/DIO + 6078 ME-6000ISLE/8/DIO + 607f ME-6000ISLE/16/DIO + 6104 ME-6100/4 + 6108 ME-6100/8 + 610f ME-6100/16 + 6114 ME-6100I/4 + 6118 ME-6100I/8 + 611f ME-6100I/16 + 6134 ME-6100ISLE/4 + 6138 ME-6100ISLE/8 + 613f ME-6100ISLE/16 + 6144 ME-6100/4/DIO + 6148 ME-6100/8/DIO + 614f ME-6100/16/DIO + 6154 ME-6100I/4/DIO + 6158 ME-6100I/8/DIO + 615f ME-6100I/16/DIO + 6174 ME-6100ISLE/4/DIO + 6178 ME-6100ISLE/8/DIO + 617f ME-6100ISLE/16/DIO + 6259 ME-6200I/9/DIO + 6359 ME-6300I/9/DIO + 810a ME-8100A + 810b ME-8100B + 820a ME-8200A + 820b ME-8200B +1403 Ascor Inc +1404 Fundamental Software Inc +1405 Excalibur Systems Inc +1406 Oce' Printing Systems GmbH +1407 Lava Computer mfg Inc + 0100 Lava Dual Serial + 0101 Lava Quatro A + 0102 Lava Quatro B + 0110 Lava DSerial-PCI Port A + 0111 Lava DSerial-PCI Port B + 0120 Quattro-PCI A + 0121 Quattro-PCI B + 0180 Lava Octo A + 0181 Lava Octo B + 0200 Lava Port Plus + 0201 Lava Quad A + 0202 Lava Quad B + 0220 Lava Quattro PCI Ports A/B + 0221 Lava Quattro PCI Ports C/D + 0400 Lava 8255-PIO-PCI + 0500 Lava Single Serial + 0520 Lava RS422-SS-PCI + 0600 Lava Port 650 + 8000 Lava Parallel + 8001 Dual parallel port controller A + 8002 Lava Dual Parallel port A + 8003 Lava Dual Parallel port B + 8800 BOCA Research IOPPAR +1408 Aloka Co. Ltd +1409 Timedia Technology Co Ltd + 7168 PCI2S550 (Dual 16550 UART) + 1409 0002 SER4036A3V (2x RS232 port) + 1409 4027 SER4027A (1x RS232 port) + 1409 4037 SER4037A(L) [SUNIX SUN1889] (2x RS232 port) +# Single DC-37 connector + 1409 4056 SER4056A (4x RS232) + 1409 5027 SER4027D + 1409 5037 SER4037D (2x RS232 port) +# Single DC-62 connector + 1409 5066 SER4066R (8x RS232) +# 4x 8p8c connectors + 1409 6056 SER4056D (4x RS232 port) + 7268 SUN1888 (Dual IEEE1284 parallel port) + 1409 0103 PAR4008A + 1409 0104 PAR4018A +140a DSP Research Inc +# Formerly RAMiX, GE Fanuc, GE Intelligent Platforms +140b Abaco Systems, Inc. +140c Elmic Systems Inc +140d Matsushita Electric Works Ltd +140e Goepel Electronic GmbH +140f Salient Systems Corp +1410 Midas lab Inc +1411 Ikos Systems Inc +# Nee IC Ensemble Inc. +1412 VIA Technologies Inc. + 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller + 1412 1712 Hoontech ST Audio DSP 24 + 1412 d630 M-Audio Delta 1010 + 1412 d631 M-Audio Delta DiO + 1412 d632 M-Audio Delta 66 + 1412 d633 M-Audio Delta 44 + 1412 d634 M-Audio Delta Audiophile 2496 + 1412 d635 M-Audio Delta TDIF + 1412 d637 M-Audio Delta RBUS + 1412 d638 M-Audio Delta 410 + 1412 d63b M-Audio Delta 1010LT + 1412 d63c Digigram VX442 + 1416 1712 Hoontech ST Audio DSP 24 Media 7.1 + 153b 1115 EWS88 MT + 153b 1125 EWS88 MT (Master) + 153b 112b EWS88 D + 153b 112c EWS88 D (Master) + 153b 1130 EWX 24/96 + 153b 1138 DMX 6fire 24/96 + 153b 1151 PHASE88 + 16ce 1040 Edirol DA-2496 + 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller + 10b0 0200 Hollywood@Home 7.1 + 1412 1724 Albatron PX865PE 7.1 + 1412 3630 M-Audio Revolution 7.1 + 1412 3631 M-Audio Revolution 5.1 + 1412 3632 M-Audio Audiophile 192 + 153b 1145 Aureon 7.1 Space + 153b 1147 Aureon 5.1 Sky + 153b 1150 PHASE 22 + 153b 1153 Aureon 7.1 Universe + 17ab 1906 PSC 724 [Ultimate Edge] + 270f f641 ZNF3-150 + 270f f645 ZNF3-250 + 3130 4154 MAYA 44 MKII +1413 Addonics +1414 Microsoft Corporation + 0001 MN-120 (ADMtek Centaur-C based) + 0002 MN-130 (ADMtek Centaur-P based) +# Virtual Video Card Device for Windows Remote Desktop (RDP) + 008c Basic Render Driver + 5353 Hyper-V virtual VGA + 5801 XMA Decoder (Xenon) + 5802 SATA Controller - CdRom (Xenon) + 5803 SATA Controller - Disk (Xenon) + 5804 OHCI Controller 0 (Xenon) + 5805 EHCI Controller 0 (Xenon) + 5806 OHCI Controller 1 (Xenon) + 5807 EHCI Controller 1 (Xenon) + 580a Fast Ethernet Adapter (Xenon) + 580b Secure Flash Controller (Xenon) + 580d System Management Controller (Xenon) + 5811 Xenos GPU (Xenon) +1415 Oxford Semiconductor Ltd + 8401 OX9162 Mode 1 (8-bit bus) + 8403 OX9162 Mode 0 (parallel port) + 9500 OX16PCI954 (Quad 16950 UART) function 0 (Disabled) + 9501 OX16PCI954 (Quad 16950 UART) function 0 (Uart) + 12c4 0201 Titan/cPCI (2 port) + 12c4 0202 Titan/cPCI (4 port) + 12c4 0203 Titan/cPCI (8 port) + 12c4 0210 Titan/104-Plus (8 port, p1-4) + 131f 2050 CyberPro (4-port) +# Model IO1085, Part No: JJ-P46012 + 131f 2051 CyberSerial 4S Plus + 15ed 2000 MCCR Serial p0-3 of 8 + 15ed 2001 MCCR Serial p0-3 of 16 + 9505 OXuPCI952 (Dual 16C950 UART) + 950a EXSYS EX-41092 Dual 16950 Serial adapter + 950b OXCB950 Cardbus 16950 UART + 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled) + 12c4 0200 Titan/cPCI (Unused) + 9511 OX16PCI954 (Quad 16950 UART) function 1 (8bit bus) + 12c4 0211 Titan/104-Plus (8 port, p5-8) + 15ed 2000 MCCR Serial p4-7 of 8 + 15ed 2001 MCCR Serial p4-15 of 16 + 9512 OX16PCI954 (Quad 16950 UART) function 1 (32bit bus) + 9513 OX16PCI954 (Quad 16950 UART) function 1 (parallel port) + 9521 OX16PCI952 (Dual 16950 UART) + 9523 OX16PCI952 Integrated Parallel Port +# Multifunction device with 3 function bits in ID + c000 OXPCIe840 Parallel Port + c004 OXPCIe840 Parallel Port + c006 OXPCIe840 GPIO +# Multifunction device with reset straps and function bits in ID + c100 OXPCIe952 Parallel Port + c101 OXPCIe952 Legacy 950 UART + c104 OXPCIe952 Parallel Port + c105 OXPCIe952 Legacy 950 UART + c106 OXPCIe952 GPIO + c108 OXPCIe952 Parallel Port + c109 OXPCIe952 Legacy 950 UART + c10c OXPCIe952 Parallel Port + c10d OXPCIe952 Legacy 950 UART + c10e OXPCIe952 GPIO + c110 OXPCIe952 Parallel Port + c114 OXPCIe952 Parallel Port + c118 OXPCIe952 Parallel Port + c11b OXPCIe952 Native 950 UART + c11c OXPCIe952 Parallel Port + c11e OXPCIe952 GPIO + c11f OXPCIe952 Native 950 UART + c120 OXPCIe952 Legacy 950 UART + c124 OXPCIe952 Legacy 950 UART + c126 OXPCIe952 GPIO + c128 OXPCIe952 Legacy 950 UART + c12c OXPCIe952 Legacy 950 UART + c12e OXPCIe952 GPIO + c134 OXPCIe952 GPIO + c138 OXPCIe952 Native 950 UART + c13c OXPCIe952 GPIO + c13d OXPCIe952 Native 950 UART + c140 OXPCIe952 Legacy 950 UART #1 + c141 OXPCIe952 Legacy 950 UART #2 + c144 OXPCIe952 Legacy 950 UART #1 + c145 OXPCIe952 Legacy 950 UART #2 + c146 OXPCIe952 GPIO + c148 OXPCIe952 Legacy 950 UART #1 + c149 OXPCIe952 Legacy 950 UART #2 + c14c OXPCIe952 Legacy 950 UART #1 + c14d OXPCIe952 Legacy 950 UART #2 + c14e OXPCIe952 GPIO + c154 OXPCIe952 GPIO + c158 OXPCIe952 Dual Native 950 UART + e4bf c504 CP4-SCAT Wireless Technologies Carrier Board + e4bf d551 DU1-MUSTANG Dual-Port RS-485 Interface + c15c OXPCIe952 GPIO + c15d OXPCIe952 Dual Native 950 UART +# Multifunction device with 4 function bits in ID + c204 OXPCIe954 GPIO + c208 OXPCIe954 Quad Native 950 UART + c20c OXPCIe954 GPIO + c20d OXPCIe954 Quad Native 950 UART +# Multifunction device with 4 function bits in ID + c304 OXPCIe958 GPIO + c308 OXPCIe958 Quad Native 950 UART + c30c OXPCIe958 GPIO + c30d OXPCIe958 Quad Native 950 UART +# Multifunction device with 8 function bits in ID + c530 OXPCIe200 Dual OHCI USB Controller (ULPI/R-ULPI) + c531 OXPCIe200 Dual EHCI USB Controller (ULPI/R-ULPI) + c534 OXPCIe200 Dual OHCI USB Controller (ULPI/R-ULPI) + c535 OXPCIe200 Dual EHCI USB Controller (ULPI/R-ULPI) + c536 OXPCIe200 GPIO + c538 OXPCIe200 Dual OHCI USB Controller (ULPI/R-ULPI) + c539 OXPCIe200 Dual EHCI USB Controller (ULPI/R-ULPI) + c53b OXPCIe200 Native 950 UART + c53c OXPCIe200 Dual OHCI USB Controller (ULPI/R-ULPI) + c53d OXPCIe200 Dual EHCI USB Controller (ULPI/R-ULPI) + c53e OXPCIe200 GPIO + c53f OXPCIe200 Native 950 UART + c540 OXPCIe200 Dual OHCI USB Controller (R-ULPI) + c541 OXPCIe200 Dual EHCI USB Controller (R-ULPI) + c544 OXPCIe200 Dual OHCI USB Controller (R-ULPI) + c545 OXPCIe200 Dual EHCI USB Controller (R-ULPI) + c546 OXPCIe200 GPIO + c548 OXPCIe200 Dual OHCI USB Controller (R-ULPI) + c549 OXPCIe200 Dual EHCI USB Controller (R-ULPI) + c54b OXPCIe200 Native 950 UART + c54c OXPCIe200 Dual OHCI USB Controller (R-ULPI) + c54d OXPCIe200 Dual EHCI USB Controller (R-ULPI) + c54e OXPCIe200 Dual GPIO + c54f OXPCIe200 Native 950 UART + c560 OXPCIe200 Dual OHCI USB Controller (ULPI/analog) + c561 OXPCIe200 EHCI USB Controller (ULPI) + c564 OXPCIe200 Dual OHCI USB Controller (ULPI/analog) + c565 OXPCIe200 EHCI USB Controller (ULPI) + c566 OXPCIe200 GPIO + c568 OXPCIe200 Dual OHCI USB Controller (ULPI/analog) + c569 OXPCIe200 EHCI USB Controller (ULPI) + c56b OXPCIe200 Native 950 UART + c56c OXPCIe200 Dual OHCI USB Controller (ULPI/analog) + c56d OXPCIe200 EHCI USB Controller (ULPI) + c56e OXPCIe200 GPIO + c56f OXPCIe200 Native 950 UART + c570 OXPCIe200 Dual OHCI USB Controller (R-ULPI/analog) + c571 OXPCIe200 EHCI USB Controller (R-ULPI) + c574 OXPCIe200 Dual OHCI USB Controller (R-ULPI/analog) + c575 OXPCIe200 EHCI USB Controller (R-ULPI) + c576 OXPCIe200 GPIO + c578 OXPCIe200 Dual OHCI USB Controller (R-ULPI/analog) + c579 OXPCIe200 EHCI USB Controller (R-ULPI) + c57b OXPCIe200 Native 950 UART + c57c OXPCIe200 Dual OHCI USB Controller (R-ULPI/analog) + c57d OXPCIe200 EHCI USB Controller (R-ULPI) + c57e OXPCIe200 GPIO + c57f OXPCIe200 Native 950 UART + c5a0 OXPCIe200 OHCI USB Controller (ULPI) + c5a1 OXPCIe200 EHCI USB Controller (ULPI) + c5a2 OXPCIe200 Programmable Memory Interface + c5a4 OXPCIe200 OHCI USB Controller (ULPI) + c5a5 OXPCIe200 EHCI USB Controller (ULPI) + c5a6 OXPCIe200 Programmable Memory Interface & GPIO + c5a8 OXPCIe200 OHCI USB Controller (ULPI) + c5a9 OXPCIe200 EHCI USB Controller (ULPI) + c5aa OXPCIe200 Programmable Memory Interface + c5ab OXPCIe200 Native 950 UART + c5ac OXPCIe200 OHCI USB Controller (ULPI) + c5ad OXPCIe200 EHCI USB Controller (ULPI) + c5ae OXPCIe200 Programmable Memory Interface & GPIO + c5af OXPCIe200 Native 950 UART + c5b0 OXPCIe200 OHCI USB Controller (R-ULPI) + c5b1 OXPCIe200 EHCI USB Controller (R-ULPI) + c5b2 OXPCIe200 Programmable Memory Interface + c5b4 OXPCIe200 OHCI USB Controller (R-ULPI) + c5b5 OXPCIe200 EHCI USB Controller (R-ULPI) + c5b6 OXPCIe200 Programmable Memory Interface & GPIO + c5b8 OXPCIe200 OHCI USB Controller (R-ULPI) + c5b9 OXPCIe200 EHCI USB Controller (R-ULPI) + c5ba OXPCIe200 Programmable Memory Interface + c5bb OXPCIe200 Native 950 UART + c5bc OXPCIe200 OHCI USB Controller (R-ULPI) + c5bd OXPCIe200 EHCI USB Controller (R-ULPI) + c5be OXPCIe200 Programmable Memory Interface & GPIO + c5bf OXPCIe200 Native 950 UART + c5c0 OXPCIe200 OHCI USB Controller (analog) + c5c2 OXPCIe200 Programmable Memory Interface + c5c4 OXPCIe200 OHCI USB Controller (analog) + c5c6 OXPCIe200 Programmable Memory Interface & GPIO + c5c8 OXPCIe200 OHCI USB Controller (analog) + c5ca OXPCIe200 Programmable Memory Interface + c5cb OXPCIe200 Native 950 UART + c5cc OXPCIe200 OHCI USB Controller (analog) + c5ce OXPCIe200 Programmable Memory Interface & GPIO + c5cf OXPCIe200 Native 950 UART +1416 Multiwave Innovation pte Ltd +1417 Convergenet Technologies Inc +1418 Kyushu electronics systems Inc +1419 Excel Switching Corp +141a Apache Micro Peripherals Inc +141b Zoom Telephonics Inc +141d Digitan Systems Inc +141e Fanuc Ltd +141f Visiontech Ltd +1420 Psion Dacom plc + 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part) + 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part) +1421 Ads Technologies Inc +1422 Ygrec Systems Co Ltd +1423 Custom Technology Corp. +1424 Videoserver Connections +1425 Chelsio Communications Inc + 000b T210 Protocol Engine + 000c T204 Protocol Engine + 0022 10GbE Ethernet Adapter + 0030 T310 10GbE Single Port Adapter + 103c 705e PCIe 10GBase-SR [AD386A] + 0031 T320 10GbE Dual Port Adapter + 0032 T302 1GbE Dual Port Adapter + 0033 T304 1GbE Quad Port Adapter + 0034 B320 10GbE Dual Port Adapter + 0035 S310-CR 10GbE Single Port Adapter + 0036 S320-LP-CR 10GbE Dual Port Adapter + 0037 N320-G2-CR 10GbE Dual Port Adapter + 4001 T420-CR Unified Wire Ethernet Controller + 4002 T422-CR Unified Wire Ethernet Controller + 4003 T440-CR Unified Wire Ethernet Controller + 4004 T420-BCH Unified Wire Ethernet Controller + 4005 T440-BCH Unified Wire Ethernet Controller + 4006 T440-CH Unified Wire Ethernet Controller + 4007 T420-SO Unified Wire Ethernet Controller + 4008 T420-CX Unified Wire Ethernet Controller + 4009 T420-BT Unified Wire Ethernet Controller + 400a T404-BT Unified Wire Ethernet Controller + 400b B420-SR Unified Wire Ethernet Controller + 400c B404-BT Unified Wire Ethernet Controller + 400d T480 Unified Wire Ethernet Controller + 400e T440-LP-CR Unified Wire Ethernet Controller + 400f T440 [Amsterdam] Unified Wire Ethernet Controller + 4080 T480-4080 T480 Unified Wire Ethernet Controller + 4081 T440F-4081 T440-FCoE Unified Wire Ethernet Controller + 4082 T420-4082 Unified Wire Ethernet Controller + 4083 T420X-4083 Unified Wire Ethernet Controller + 4084 T440-4084 Unified Wire Ethernet Controller + 4085 T420-4085 SFP+ Unified Wire Ethernet Controller + 4086 T440-4086 10Gbase-T Unified Wire Ethernet Controller + 4087 T440T-4087 Unified Wire Ethernet Controller + 4088 T440-4088 Unified Wire Ethernet Controller + 4401 T420-CR Unified Wire Ethernet Controller + 4402 T422-CR Unified Wire Ethernet Controller + 4403 T440-CR Unified Wire Ethernet Controller + 4404 T420-BCH Unified Wire Ethernet Controller + 4405 T440-BCH Unified Wire Ethernet Controller + 4406 T440-CH Unified Wire Ethernet Controller + 4407 T420-SO Unified Wire Ethernet Controller + 4408 T420-CX Unified Wire Ethernet Controller + 4409 T420-BT Unified Wire Ethernet Controller + 440a T404-BT Unified Wire Ethernet Controller + 440b B420-SR Unified Wire Ethernet Controller + 440c B404-BT Unified Wire Ethernet Controller + 440d T480 Unified Wire Ethernet Controller + 440e T440-LP-CR Unified Wire Ethernet Controller + 440f T440 [Amsterdam] Unified Wire Ethernet Controller + 4480 T480-4080 T480 Unified Wire Ethernet Controller + 4481 T440F-4081 T440-FCoE Unified Wire Ethernet Controller + 4482 T420-4082 Unified Wire Ethernet Controller + 4483 T420X-4083 Unified Wire Ethernet Controller + 4484 T440-4084 Unified Wire Ethernet Controller + 4485 T420-4085 SFP+ Unified Wire Ethernet Controller + 4486 T440-4086 10Gbase-T Unified Wire Ethernet Controller + 4487 T440T-4087 Unified Wire Ethernet Controller + 4488 T440-4088 Unified Wire Ethernet Controller + 4501 T420-CR Unified Wire Storage Controller + 4502 T422-CR Unified Wire Storage Controller + 4503 T440-CR Unified Wire Storage Controller + 4504 T420-BCH Unified Wire Storage Controller + 4505 T440-BCH Unified Wire Storage Controller + 4506 T440-CH Unified Wire Storage Controller + 4507 T420-SO Unified Wire Storage Controller + 4508 T420-CX Unified Wire Storage Controller + 4509 T420-BT Unified Wire Storage Controller + 450a T404-BT Unified Wire Storage Controller + 450b B420-SR Unified Wire Storage Controller + 450c B404-BT Unified Wire Storage Controller + 450d T480 Unified Wire Storage Controller + 450e T440-LP-CR Unified Wire Storage Controller + 450f T440 [Amsterdam] Unified Wire Storage Controller + 4580 T480-4080 T480 Unified Wire Storage Controller + 4581 T440F-4081 T440-FCoE Unified Wire Storage Controller + 4582 T420-4082 Unified Wire Storage Controller + 4583 T420X-4083 Unified Wire Storage Controller + 4584 T440-4084 Unified Wire Storage Controller + 4585 T420-4085 SFP+ Unified Wire Storage Controller + 4586 T440-4086 10Gbase-T Unified Wire Storage Controller + 4587 T440T-4087 Unified Wire Storage Controller + 4588 T440-4088 Unified Wire Storage Controller + 4601 T420-CR Unified Wire Storage Controller + 4602 T422-CR Unified Wire Storage Controller + 4603 T440-CR Unified Wire Storage Controller + 4604 T420-BCH Unified Wire Storage Controller + 4605 T440-BCH Unified Wire Storage Controller + 4606 T440-CH Unified Wire Storage Controller + 4607 T420-SO Unified Wire Storage Controller + 4608 T420-CX Unified Wire Storage Controller + 4609 T420-BT Unified Wire Storage Controller + 460a T404-BT Unified Wire Storage Controller + 460b B420-SR Unified Wire Storage Controller + 460c B404-BT Unified Wire Storage Controller + 460d T480 Unified Wire Storage Controller + 460e T440-LP-CR Unified Wire Storage Controller + 460f T440 [Amsterdam] Unified Wire Storage Controller + 4680 T480-4080 T480 Unified Wire Storage Controller + 4681 T440F-4081 T440-FCoE Unified Wire Storage Controller + 4682 T420-4082 Unified Wire Storage Controller + 4683 T420X-4083 Unified Wire Storage Controller + 4684 T440-4084 Unified Wire Storage Controller + 4685 T420-4085 SFP+ Unified Wire Storage Controller + 4686 T440-4086 10Gbase-T Unified Wire Storage Controller + 4687 T440T-4087 Unified Wire Storage Controller + 4688 T440-4088 Unified Wire Storage Controller + 4701 T420-CR Unified Wire Ethernet Controller + 4702 T422-CR Unified Wire Ethernet Controller + 4703 T440-CR Unified Wire Ethernet Controller + 4704 T420-BCH Unified Wire Ethernet Controller + 4705 T440-BCH Unified Wire Ethernet Controller + 4706 T440-CH Unified Wire Ethernet Controller + 4707 T420-SO Unified Wire Ethernet Controller + 4708 T420-CX Unified Wire Ethernet Controller + 4709 T420-BT Unified Wire Ethernet Controller + 470a T404-BT Unified Wire Ethernet Controller + 470b B420-SR Unified Wire Ethernet Controller + 470c B404-BT Unified Wire Ethernet Controller + 470d T480 Unified Wire Ethernet Controller + 470e T440-LP-CR Unified Wire Ethernet Controller + 470f T440 [Amsterdam] Unified Wire Ethernet Controller + 4780 T480-4080 T480 Unified Wire Ethernet Controller + 4781 T440F-4081 T440-FCoE Unified Wire Ethernet Controller + 4782 T420-4082 Unified Wire Ethernet Controller + 4783 T420X-4083 Unified Wire Ethernet Controller + 4784 T440-4084 Unified Wire Ethernet Controller + 4785 T420-4085 SFP+ Unified Wire Ethernet Controller + 4786 T440-4086 10Gbase-T Unified Wire Ethernet Controller + 4787 T440T-4087 Unified Wire Ethernet Controller + 4788 T440-4088 Unified Wire Ethernet Controller + 4801 T420-CR Unified Wire Ethernet Controller [VF] + 4802 T422-CR Unified Wire Ethernet Controller [VF] + 4803 T440-CR Unified Wire Ethernet Controller [VF] + 4804 T420-BCH Unified Wire Ethernet Controller [VF] + 4805 T440-BCH Unified Wire Ethernet Controller [VF] + 4806 T440-CH Unified Wire Ethernet Controller [VF] + 4807 T420-SO Unified Wire Ethernet Controller [VF] + 4808 T420-CX Unified Wire Ethernet Controller [VF] + 4809 T420-BT Unified Wire Ethernet Controller [VF] + 480a T404-BT Unified Wire Ethernet Controller [VF] + 480b B420-SR Unified Wire Ethernet Controller [VF] + 480c B404-BT Unified Wire Ethernet Controller [VF] + 480d T480 Unified Wire Ethernet Controller [VF] + 480e T440-LP-CR Unified Wire Ethernet Controller [VF] + 480f T440 [Amsterdam] Unified Wire Ethernet Controller [VF] + 4880 T480-4080 T480 Unified Wire Ethernet Controller [VF] + 4881 T440F-4081 T440-FCoE Unified Wire Ethernet Controller [VF] + 4882 T420-4082 Unified Wire Ethernet Controller [VF] + 4883 T420X-4083 Unified Wire Ethernet Controller [VF] + 4884 T440-4084 Unified Wire Ethernet Controller [VF] + 4885 T420-4085 SFP+ Unified Wire Ethernet Controller [VF] + 4886 T440-4086 10Gbase-T Unified Wire Ethernet Controller [VF] + 4887 T440T-4087 Unified Wire Ethernet Controller [VF] + 4888 T440-4088 Unified Wire Ethernet Controller [VF] + 5001 T520-CR Unified Wire Ethernet Controller + 193d 1001 510F-B + 5002 T522-CR Unified Wire Ethernet Controller + 5003 T540-CR Unified Wire Ethernet Controller + 5004 T520-BCH Unified Wire Ethernet Controller + 5005 T540-BCH Unified Wire Ethernet Controller + 5006 T540-CH Unified Wire Ethernet Controller + 5007 T520-SO Unified Wire Ethernet Controller + 5008 T520-CX Unified Wire Ethernet Controller + 5009 T520-BT Unified Wire Ethernet Controller + 500a T504-BT Unified Wire Ethernet Controller + 500b B520-SR Unified Wire Ethernet Controller + 500c B504-BT Unified Wire Ethernet Controller + 500d T580-CR Unified Wire Ethernet Controller + 500e T540-LP-CR Unified Wire Ethernet Controller + 500f T540 [Amsterdam] Unified Wire Ethernet Controller + 5010 T580-LP-CR Unified Wire Ethernet Controller + 5011 T520-LL-CR Unified Wire Ethernet Controller + 5012 T560-CR Unified Wire Ethernet Controller + 5013 T580-CHR Unified Wire Ethernet Controller + 5014 T580-SO-CR Unified Wire Ethernet Controller + 5015 T502-BT Unified Wire Ethernet Controller + 5016 T580-OCP-SO Unified Wire Ethernet Controller + 5017 T520-OCP-SO Unified Wire Ethernet Controller + 5018 T540-BT Unified Wire Ethernet Controller + 5019 T540-LP-BT Unified Wire Ethernet Controller + 501a T540-SO-BT Unified Wire Ethernet Controller + 501b T540-SO-CR Unified Wire Ethernet Controller + 5080 T540-5080 Unified Wire Ethernet Controller + 5081 T540-5081 Unified Wire Ethernet Controller + 5082 T504-5082 Unified Wire Ethernet Controller + 5083 T540-5083 Unified Wire Ethernet Controller + 5084 T540-5084 Unified Wire Ethernet Controller + 5085 T580-5085 Unified Wire Ethernet Controller + 5086 T580-5086 Unified Wire Ethernet Controller + 5087 T580-5087 Unified Wire Ethernet Controller + 5088 T570-5088 Unified Wire Ethernet Controller + 5089 T520-5089 Unified Wire Ethernet Controller + 5090 T540-5090 Unified Wire Ethernet Controller + 5091 T522-5091 Unified Wire Ethernet Controller + 5092 T520-5092 Unified Wire Ethernet Controller + 5093 T580-5093 Unified Wire Ethernet Controller + 5094 T540-5094 Unified Wire Ethernet Controller + 5095 T540-5095 Unified Wire Ethernet Controller + 5096 T580-5096 Unified Wire Ethernet Controller + 5097 T520-5097 Unified Wire Ethernet Controller + 5098 T580-5098 Unified Wire Ethernet Controller + 5099 T580-5099 Unified Wire Ethernet Controller + 509a T520-509A Unified Wire Ethernet Controller + 509b T540-509B Unified Wire Ethernet Controller + 509c T520-509C Unified Wire Ethernet Controller + 509d T540-509D Unified Wire Ethernet Controller + 509e T520-509E Unified Wire Ethernet Controller + 509f T540-509F Unified Wire Ethernet Controller + 50a0 T540-50A0 Unified Wire Ethernet Controller + 50a1 T540-50A1 Unified Wire Ethernet Controller + 50a2 T580-50A2 Unified Wire Ethernet Controller + 50a3 T580-50A3 Unified Wire Ethernet Controller + 50a4 T540-50A4 Unified Wire Ethernet Controller + 50a5 T522-50A5 Unified Wire Ethernet Controller + 50a6 T522-50A6 Unified Wire Ethernet Controller + 50a7 T580-50A7 Unified Wire Ethernet Controller + 50a8 T580-50A8 Unified Wire Ethernet Controller + 50a9 T580-50A9 Unified Wire Ethernet Controller + 50aa T580-50AA Unified Wire Ethernet Controller + 50ab T520-50AB Unified Wire Ethernet Controller + 50ac T540-50AC Unified Wire Ethernet Controller + 50ad T520-50AD Unified Wire Ethernet Controller + 50ae T540-50AE Unified Wire Ethernet Controller + 50af T580-50AF Unified Wire Ethernet Controller + 50b0 T520-50B0 Unified Wire Ethernet Controller + 5401 T520-CR Unified Wire Ethernet Controller + 5402 T522-CR Unified Wire Ethernet Controller + 5403 T540-CR Unified Wire Ethernet Controller + 5404 T520-BCH Unified Wire Ethernet Controller + 5405 T540-BCH Unified Wire Ethernet Controller + 5406 T540-CH Unified Wire Ethernet Controller + 5407 T520-SO Unified Wire Ethernet Controller + 5408 T520-CX Unified Wire Ethernet Controller + 5409 T520-BT Unified Wire Ethernet Controller + 540a T504-BT Unified Wire Ethernet Controller + 540b B520-SR Unified Wire Ethernet Controller + 540c B504-BT Unified Wire Ethernet Controller + 540d T580-CR Unified Wire Ethernet Controller + 540e T540-LP-CR Unified Wire Ethernet Controller + 540f T540 [Amsterdam] Unified Wire Ethernet Controller + 5410 T580-LP-CR Unified Wire Ethernet Controller + 5411 T520-LL-CR Unified Wire Ethernet Controller + 5412 T560-CR Unified Wire Ethernet Controller + 5413 T580-CHR Unified Wire Ethernet Controller + 5414 T580-SO-CR Unified Wire Ethernet Controller + 5415 T502-BT Unified Wire Ethernet Controller + 5416 T580-OCP-SO Unified Wire Ethernet Controller + 5417 T520-OCP-SO Unified Wire Ethernet Controller + 5418 T540-BT Unified Wire Ethernet Controller + 5419 T540-LP-BT Unified Wire Ethernet Controller + 541a T540-SO-BT Unified Wire Ethernet Controller + 541b T540-SO-CR Unified Wire Ethernet Controller + 5480 T540-5080 Unified Wire Ethernet Controller + 5481 T540-5081 Unified Wire Ethernet Controller + 5482 T504-5082 Unified Wire Ethernet Controller + 5483 T540-5083 Unified Wire Ethernet Controller + 5484 T540-5084 Unified Wire Ethernet Controller + 5485 T580-5085 Unified Wire Ethernet Controller + 5486 T580-5086 Unified Wire Ethernet Controller + 5487 T580-5087 Unified Wire Ethernet Controller + 5488 T570-5088 Unified Wire Ethernet Controller + 5489 T520-5089 Unified Wire Ethernet Controller + 5490 T540-5090 Unified Wire Ethernet Controller + 5491 T522-5091 Unified Wire Ethernet Controller + 5492 T520-5092 Unified Wire Ethernet Controller + 5493 T580-5093 Unified Wire Ethernet Controller + 5494 T540-5094 Unified Wire Ethernet Controller + 5495 T540-5095 Unified Wire Ethernet Controller + 5496 T580-5096 Unified Wire Ethernet Controller + 5497 T520-5097 Unified Wire Ethernet Controller + 5498 T580-5098 Unified Wire Ethernet Controller + 5499 T580-5099 Unified Wire Ethernet Controller + 549a T520-509A Unified Wire Ethernet Controller + 549b T540-509B Unified Wire Ethernet Controller + 549c T520-509C Unified Wire Ethernet Controller + 549d T540-509D Unified Wire Ethernet Controller + 549e T520-509E Unified Wire Ethernet Controller + 549f T540-509F Unified Wire Ethernet Controller + 54a0 T540-50A0 Unified Wire Ethernet Controller + 54a1 T540-50A1 Unified Wire Ethernet Controller + 54a2 T580-50A2 Unified Wire Ethernet Controller + 54a3 T580-50A3 Unified Wire Ethernet Controller + 54a4 T540-50A4 Unified Wire Ethernet Controller + 54a5 T522-50A5 Unified Wire Ethernet Controller + 54a6 T522-50A6 Unified Wire Ethernet Controller + 54a7 T580-50A7 Unified Wire Ethernet Controller + 54a8 T580-50A8 Unified Wire Ethernet Controller + 54a9 T580-50A9 Unified Wire Ethernet Controller + 54aa T580-50AA Unified Wire Ethernet Controller + 54ab T520-50AB Unified Wire Ethernet Controller + 54ac T540-50AC Unified Wire Ethernet Controller + 54ad T520-50AD Unified Wire Ethernet Controller + 54ae T540-50AE Unified Wire Ethernet Controller + 54af T580-50AF Unified Wire Ethernet Controller + 54b0 T520-50B0 Unified Wire Ethernet Controller + 5501 T520-CR Unified Wire Storage Controller + 5502 T522-CR Unified Wire Storage Controller + 5503 T540-CR Unified Wire Storage Controller + 5504 T520-BCH Unified Wire Storage Controller + 5505 T540-BCH Unified Wire Storage Controller + 5506 T540-CH Unified Wire Storage Controller + 5507 T520-SO Unified Wire Storage Controller + 5508 T520-CX Unified Wire Storage Controller + 5509 T520-BT Unified Wire Storage Controller + 550a T504-BT Unified Wire Storage Controller + 550b B520-SR Unified Wire Storage Controller + 550c B504-BT Unified Wire Storage Controller + 550d T580-CR Unified Wire Storage Controller + 550e T540-LP-CR Unified Wire Storage Controller + 550f T540 [Amsterdam] Unified Wire Storage Controller + 5510 T580-LP-CR Unified Wire Storage Controller + 5511 T520-LL-CR Unified Wire Storage Controller + 5512 T560-CR Unified Wire Storage Controller + 5513 T580-CHR Unified Wire Storage Controller + 5514 T580-SO-CR Unified Wire Storage Controller + 5515 T502-BT Unified Wire Storage Controller + 5516 T580-OCP-SO Unified Wire Storage Controller + 5517 T520-OCP-SO Unified Wire Storage Controller + 5518 T540-BT Unified Wire Storage Controller + 5519 T540-LP-BT Unified Wire Storage Controller + 551a T540-SO-BT Unified Wire Storage Controller + 551b T540-SO-CR Unified Wire Storage Controller + 5580 T540-5080 Unified Wire Storage Controller + 5581 T540-5081 Unified Wire Storage Controller + 5582 T504-5082 Unified Wire Storage Controller + 5583 T540-5083 Unified Wire Storage Controller + 5584 T540-5084 Unified Wire Storage Controller + 5585 T580-5085 Unified Wire Storage Controller + 5586 T580-5086 Unified Wire Storage Controller + 5587 T580-5087 Unified Wire Storage Controller + 5588 T570-5088 Unified Wire Storage Controller + 5589 T520-5089 Unified Wire Storage Controller + 5590 T540-5090 Unified Wire Storage Controller + 5591 T522-5091 Unified Wire Storage Controller + 5592 T520-5092 Unified Wire Storage Controller + 5593 T580-5093 Unified Wire Storage Controller + 5594 T540-5094 Unified Wire Storage Controller + 5595 T540-5095 Unified Wire Storage Controller + 5596 T580-5096 Unified Wire Storage Controller + 5597 T520-5097 Unified Wire Storage Controller + 5598 T580-5098 Unified Wire Storage Controller + 5599 T580-5099 Unified Wire Storage Controller + 559a T520-509A Unified Wire Storage Controller + 559b T540-509B Unified Wire Storage Controller + 559c T520-509C Unified Wire Storage Controller + 559d T540-509D Unified Wire Storage Controller + 559e T520-509E Unified Wire Storage Controller + 559f T540-509F Unified Wire Storage Controller + 55a0 T540-50A0 Unified Wire Storage Controller + 55a1 T540-50A1 Unified Wire Storage Controller + 55a2 T580-50A2 Unified Wire Storage Controller + 55a3 T580-50A3 Unified Wire Storage Controller + 55a4 T540-50A4 Unified Wire Storage Controller + 55a5 T522-50A5 Unified Wire Storage Controller + 55a6 T522-50A6 Unified Wire Storage Controller + 55a7 T580-50A7 Unified Wire Storage Controller + 55a8 T580-50A8 Unified Wire Storage Controller + 55a9 T580-50A9 Unified Wire Storage Controller + 55aa T580-50AA Unified Wire Storage Controller + 55ab T520-50AB Unified Wire Storage Controller + 55ac T540-50AC Unified Wire Storage Controller + 55ad T520-50AD Unified Wire Storage Controller + 55ae T540-50AE Unified Wire Storage Controller + 55af T580-50AF Unified Wire Storage Controller + 55b0 T520-50B0 Unified Wire Storage Controller + 5601 T520-CR Unified Wire Storage Controller + 5602 T522-CR Unified Wire Storage Controller + 5603 T540-CR Unified Wire Storage Controller + 5604 T520-BCH Unified Wire Storage Controller + 5605 T540-BCH Unified Wire Storage Controller + 5606 T540-CH Unified Wire Storage Controller + 5607 T520-SO Unified Wire Storage Controller + 5608 T520-CX Unified Wire Storage Controller + 5609 T520-BT Unified Wire Storage Controller + 560a T504-BT Unified Wire Storage Controller + 560b B520-SR Unified Wire Storage Controller + 560c B504-BT Unified Wire Storage Controller + 560d T580-CR Unified Wire Storage Controller + 560e T540-LP-CR Unified Wire Storage Controller + 560f T540 [Amsterdam] Unified Wire Storage Controller + 5610 T580-LP-CR Unified Wire Storage Controller + 5611 T520-LL-CR Unified Wire Storage Controller + 5612 T560-CR Unified Wire Storage Controller + 5613 T580-CHR Unified Wire Storage Controller + 5614 T580-SO-CR Unified Wire Storage Controller + 5615 T502-BT Unified Wire Storage Controller + 5616 T580-OCP-SO Unified Wire Storage Controller + 5617 T520-OCP-SO Unified Wire Storage Controller + 5618 T540-BT Unified Wire Storage Controller + 5619 T540-LP-BT Unified Wire Storage Controller + 561a T540-SO-BT Unified Wire Storage Controller + 561b T540-SO-CR Unified Wire Storage Controller + 5680 T540-5080 Unified Wire Storage Controller + 5681 T540-5081 Unified Wire Storage Controller + 5682 T504-5082 Unified Wire Storage Controller + 5683 T540-5083 Unified Wire Storage Controller + 5684 T540-5084 Unified Wire Storage Controller + 5685 T580-5085 Unified Wire Storage Controller + 5686 T580-5086 Unified Wire Storage Controller + 5687 T580-5087 Unified Wire Storage Controller + 5688 T570-5088 Unified Wire Storage Controller + 5689 T520-5089 Unified Wire Storage Controller + 5690 T540-5090 Unified Wire Storage Controller + 5691 T522-5091 Unified Wire Storage Controller + 5692 T520-5092 Unified Wire Storage Controller + 5693 T580-5093 Unified Wire Storage Controller + 5694 T540-5094 Unified Wire Storage Controller + 5695 T540-5095 Unified Wire Storage Controller + 5696 T580-5096 Unified Wire Storage Controller + 5697 T520-5097 Unified Wire Storage Controller + 5698 T580-5098 Unified Wire Storage Controller + 5699 T580-5099 Unified Wire Storage Controller + 569a T520-509A Unified Wire Storage Controller + 569b T540-509B Unified Wire Storage Controller + 569c T520-509C Unified Wire Storage Controller + 569d T540-509D Unified Wire Storage Controller + 569e T520-509E Unified Wire Storage Controller + 569f T540-509F Unified Wire Storage Controller + 56a0 T540-50A0 Unified Wire Storage Controller + 56a1 T540-50A1 Unified Wire Storage Controller + 56a2 T580-50A2 Unified Wire Storage Controller + 56a3 T580-50A3 Unified Wire Storage Controller + 56a4 T540-50A4 Unified Wire Storage Controller + 56a5 T522-50A5 Unified Wire Storage Controller + 56a6 T522-50A6 Unified Wire Storage Controller + 56a7 T580-50A7 Unified Wire Storage Controller + 56a8 T580-50A8 Unified Wire Storage Controller + 56a9 T580-50A9 Unified Wire Storage Controller + 56aa T580-50AA Unified Wire Storage Controller + 56ab T520-50AB Unified Wire Storage Controller + 56ac T540-50AC Unified Wire Storage Controller + 56ad T520-50AD Unified Wire Storage Controller + 56ae T540-50AE Unified Wire Storage Controller + 56af T580-50AF Unified Wire Storage Controller + 56b0 T520-50B0 Unified Wire Storage Controller + 5701 T520-CR Unified Wire Ethernet Controller + 5702 T522-CR Unified Wire Ethernet Controller + 5703 T540-CR Unified Wire Ethernet Controller + 5704 T520-BCH Unified Wire Ethernet Controller + 5705 T540-BCH Unified Wire Ethernet Controller + 5706 T540-CH Unified Wire Ethernet Controller + 5707 T520-SO Unified Wire Ethernet Controller + 5708 T520-CX Unified Wire Ethernet Controller + 5709 T520-BT Unified Wire Ethernet Controller + 570a T504-BT Unified Wire Ethernet Controller + 570b B520-SR Unified Wire Ethernet Controller + 570c B504-BT Unified Wire Ethernet Controller + 570d T580-CR Unified Wire Ethernet Controller + 570e T540-LP-CR Unified Wire Ethernet Controller + 570f T540 [Amsterdam] Unified Wire Ethernet Controller + 5710 T580-LP-CR Unified Wire Ethernet Controller + 5711 T520-LL-CR Unified Wire Ethernet Controller + 5712 T560-CR Unified Wire Ethernet Controller + 5713 T580-CR Unified Wire Ethernet Controller + 5714 T580-SO-CR Unified Wire Ethernet Controller + 5715 T502-BT Unified Wire Ethernet Controller + 5780 T540-5080 Unified Wire Ethernet Controller + 5781 T540-5081 Unified Wire Ethernet Controller + 5782 T504-5082 Unified Wire Ethernet Controller + 5783 T540-5083 Unified Wire Ethernet Controller + 5784 T580-5084 Unified Wire Ethernet Controller + 5785 T580-5085 Unified Wire Ethernet Controller + 5786 T580-5086 Unified Wire Ethernet Controller + 5787 T580-5087 Unified Wire Ethernet Controller + 5788 T570-5088 Unified Wire Ethernet Controller + 5789 T520-5089 Unified Wire Ethernet Controller + 5790 T540-5090 Unified Wire Ethernet Controller + 5791 T522-5091 Unified Wire Ethernet Controller + 5792 T520-5092 Unified Wire Ethernet Controller + 5793 T580-5093 Unified Wire Ethernet Controller + 5794 T540-5094 Unified Wire Ethernet Controller + 5795 T540-5095 Unified Wire Ethernet Controller + 5796 T580-5096 Unified Wire Ethernet Controller + 5797 T520-5097 Unified Wire Ethernet Controller + 5801 T520-CR Unified Wire Ethernet Controller [VF] + 5802 T522-CR Unified Wire Ethernet Controller [VF] + 5803 T540-CR Unified Wire Ethernet Controller [VF] + 5804 T520-BCH Unified Wire Ethernet Controller [VF] + 5805 T540-BCH Unified Wire Ethernet Controller [VF] + 5806 T540-CH Unified Wire Ethernet Controller [VF] + 5807 T520-SO Unified Wire Ethernet Controller [VF] + 5808 T520-CX Unified Wire Ethernet Controller [VF] + 5809 T520-BT Unified Wire Ethernet Controller [VF] + 580a T504-BT Unified Wire Ethernet Controller [VF] + 580b B520-SR Unified Wire Ethernet Controller [VF] + 580c B504-BT Unified Wire Ethernet Controller [VF] + 580d T580-CR Unified Wire Ethernet Controller [VF] + 580e T540-LP-CR Unified Wire Ethernet Controller [VF] + 580f T540 [Amsterdam] Unified Wire Ethernet Controller [VF] + 5810 T580-LP-CR Unified Wire Ethernet Controller [VF] + 5811 T520-LL-CR Unified Wire Ethernet Controller [VF] + 5812 T560-CR Unified Wire Ethernet Controller [VF] + 5813 T580-CHR Unified Wire Ethernet Controller [VF] + 5814 T580-SO-CR Unified Wire Ethernet Controller [VF] + 5815 T502-BT Unified Wire Ethernet Controller [VF] + 5816 T580-OCP-SO Unified Wire Ethernet Controller [VF] + 5817 T520-OCP-SO Unified Wire Ethernet Controller [VF] + 5818 T540-BT Unified Wire Ethernet Controller [VF] + 5819 T540-LP-BT Unified Wire Ethernet Controller [VF] + 581a T540-SO-BT Unified Wire Ethernet Controller [VF] + 581b T540-SO-CR Unified Wire Ethernet Controller [VF] + 5880 T540-5080 Unified Wire Ethernet Controller [VF] + 5881 T540-5081 Unified Wire Ethernet Controller [VF] + 5882 T504-5082 Unified Wire Ethernet Controller [VF] + 5883 T540-5083 Unified Wire Ethernet Controller [VF] + 5884 T540-5084 Unified Wire Ethernet Controller [VF] + 5885 T580-5085 Unified Wire Ethernet Controller [VF] + 5886 T580-5086 Unified Wire Ethernet Controller [VF] + 5887 T580-5087 Unified Wire Ethernet Controller [VF] + 5888 T570-5088 Unified Wire Ethernet Controller [VF] + 5889 T520-5089 Unified Wire Ethernet Controller [VF] + 5890 T540-5090 Unified Wire Ethernet Controller [VF] + 5891 T522-5091 Unified Wire Ethernet Controller [VF] + 5892 T520-5092 Unified Wire Ethernet Controller [VF] + 5893 T580-5093 Unified Wire Ethernet Controller [VF] + 5894 T540-5094 Unified Wire Ethernet Controller [VF] + 5895 T540-5095 Unified Wire Ethernet Controller [VF] + 5896 T580-5096 Unified Wire Ethernet Controller [VF] + 5897 T520-5097 Unified Wire Ethernet Controller [VF] + 5898 T580-5098 Unified Wire Ethernet Controller [VF] + 5899 T580-5099 Unified Wire Ethernet Controller [VF] + 589a T520-509A Unified Wire Ethernet Controller [VF] + 589b T540-509B Unified Wire Ethernet Controller [VF] + 589c T520-509C Unified Wire Ethernet Controller [VF] + 589d T540-509D Unified Wire Ethernet Controller [VF] + 589e T520-509E Unified Wire Ethernet Controller [VF] + 589f T540-509F Unified Wire Ethernet Controller [VF] + 58a0 T540-50A0 Unified Wire Ethernet Controller [VF] + 58a1 T540-50A1 Unified Wire Ethernet Controller [VF] + 58a2 T580-50A2 Unified Wire Ethernet Controller [VF] + 58a3 T580-50A3 Unified Wire Ethernet Controller [VF] + 58a4 T540-50A4 Unified Wire Ethernet Controller [VF] + 58a5 T522-50A5 Unified Wire Ethernet Controller [VF] + 58a6 T522-50A6 Unified Wire Ethernet Controller [VF] + 58a7 T580-50A7 Unified Wire Ethernet Controller [VF] + 58a8 T580-50A8 Unified Wire Ethernet Controller [VF] + 58a9 T580-50A9 Unified Wire Ethernet Controller [VF] + 58aa T580-50AA Unified Wire Ethernet Controller [VF] + 58ab T520-50AB Unified Wire Ethernet Controller [VF] + 58ac T540-50AC Unified Wire Ethernet Controller [VF] + 58ad T520-50AD Unified Wire Ethernet Controller [VF] + 58ae T540-50AE Unified Wire Ethernet Controller [VF] + 58af T580-50AF Unified Wire Ethernet Controller [VF] + 58b0 T520-50B0 Unified Wire Ethernet Controller [VF] + 6001 T6225-CR Unified Wire Ethernet Controller + 6002 T6225-SO-CR Unified Wire Ethernet Controller + 6003 T6425-CR Unified Wire Ethernet Controller + 6004 T6425-SO-CR Unified Wire Ethernet Controller + 6005 T6225-OCP-SO Unified Wire Ethernet Controller + 6006 T62100-OCP-SO Unified Wire Ethernet Controller + 6007 T62100-LP-CR Unified Wire Ethernet Controller + 6008 T62100-SO-CR Unified Wire Ethernet Controller + 6009 T6210-BT Unified Wire Ethernet Controller + 600d T62100-CR Unified Wire Ethernet Controller + 6011 T6225-LL-CR Unified Wire Ethernet Controller + 6014 T61100-OCP-SO Unified Wire Ethernet Controller + 6015 T6201-BT Unified Wire Ethernet Controller + 6080 T6225-6080 Unified Wire Ethernet Controller + 6081 T62100-6081 Unified Wire Ethernet Controller + 6082 T6225-6082 Unified Wire Ethernet Controller + 6083 T62100-6083 Unified Wire Ethernet Controller + 6084 T64100-6084 Unified Wire Ethernet Controller + 6085 T6240-6085 Unified Wire Ethernet Controller + 6086 T6225-6086 Unified Wire Ethernet Controller + 6087 T6225-6087 Unified Wire Ethernet Controller + 6088 T62100-6088 Unified Wire Ethernet Controller + 6089 T62100-6089 Unified Wire Ethernet Controller + 608a T62100-608a Unified Wire Ethernet Controller + 6092 T62100-KR Unified Wire Ethernet Controller + 01de fff9 Gimlet Baseboard + 6401 T6225-CR Unified Wire Ethernet Controller + 6402 T6225-SO-CR Unified Wire Ethernet Controller + 6403 T6425-CR Unified Wire Ethernet Controller + 6404 T6425-SO-CR Unified Wire Ethernet Controller + 6405 T6225-OCP-SO Unified Wire Ethernet Controller + 6406 T62100-OCP-SO Unified Wire Ethernet Controller + 6407 T62100-LP-CR Unified Wire Ethernet Controller + 6408 T62100-SO-CR Unified Wire Ethernet Controller + 6409 T6210-BT Unified Wire Ethernet Controller + 640d T62100-CR Unified Wire Ethernet Controller + 6411 T6225-LL-CR Unified Wire Ethernet Controller + 6414 T61100-OCP-SO Unified Wire Ethernet Controller + 6415 T6201-BT Unified Wire Ethernet Controller + 6480 T6225-6080 Unified Wire Ethernet Controller + 6481 T62100-6081 Unified Wire Ethernet Controller + 6482 T6225-6082 Unified Wire Ethernet Controller + 6483 T62100-6083 Unified Wire Ethernet Controller + 6484 T64100-6084 Unified Wire Ethernet Controller + 6485 T6240-6085 Unified Wire Ethernet Controller + 6486 T6225-6086 Unified Wire Ethernet Controller + 6487 T6225-6087 Unified Wire Ethernet Controller + 6488 T62100-6088 Unified Wire Ethernet Controller + 6489 T62100-6089 Unified Wire Ethernet Controller + 648a T62100-608a Unified Wire Ethernet Controller + 6492 T62100-KR Unified Wire Ethernet Controller + 01de fff9 Gimlet Baseboard + 6501 T6225-CR Unified Wire Storage Controller + 6502 T6225-SO-CR Unified Wire Storage Controller + 6503 T6425-CR Unified Wire Storage Controller + 6504 T6425-SO-CR Unified Wire Storage Controller + 6505 T6225-OCP-SO Unified Wire Storage Controller + 6506 T62100-OCP-SO Unified Wire Storage Controller + 6507 T62100-LP-CR Unified Wire Storage Controller + 6508 T62100-SO-CR Unified Wire Storage Controller + 6509 T6210-BT Unified Wire Storage Controller + 650d T62100-CR Unified Wire Storage Controller + 6511 T6225-LL-CR Unified Wire Storage Controller + 6514 T61100-OCP-SO Unified Wire Storage Controller + 6515 T6201-BT Unified Wire Storage Controller + 6580 T6225-6080 Unified Wire Storage Controller + 6581 T62100-6081 Unified Wire Storage Controller + 6582 T6225-6082 Unified Wire Storage Controller + 6583 T62100-6083 Unified Wire Storage Controller + 6584 T64100-6084 Unified Wire Storage Controller + 6585 T6240-6085 Unified Wire Storage Controller + 6586 T6225-6086 Unified Wire Storage Controller + 6587 T6225-6087 Unified Wire Storage Controller + 6588 T62100-6088 Unified Wire Storage Controller + 6589 T62100-6089 Unified Wire Storage Controller + 658a T62100-608a Unified Wire Storage Controller + 6592 T62100-KR Unified Wire Storage Controller + 6601 T6225-CR Unified Wire Storage Controller + 6602 T6225-SO-CR Unified Wire Storage Controller + 6603 T6425-CR Unified Wire Storage Controller + 6604 T6425-SO-CR Unified Wire Storage Controller + 6605 T6225-OCP-SO Unified Wire Storage Controller + 6606 T62100-OCP-SO Unified Wire Storage Controller + 6607 T62100-LP-CR Unified Wire Storage Controller + 6608 T62100-SO-CR Unified Wire Storage Controller + 6609 T6210-BT Unified Wire Storage Controller + 660d T62100-CR Unified Wire Storage Controller + 6611 T6225-LL-CR Unified Wire Storage Controller + 6614 T61100-OCP-SO Unified Wire Storage Controller + 6615 T6201-BT Unified Wire Storage Controller + 6680 T6225-6080 Unified Wire Storage Controller + 6681 T62100-6081 Unified Wire Storage Controller + 6682 T6225-6082 Unified Wire Storage Controller + 6683 T62100-6083 Unified Wire Storage Controller + 6684 T64100-6084 Unified Wire Storage Controller + 6685 T6240-6085 Unified Wire Storage Controller + 6686 T6225-6086 Unified Wire Storage Controller + 6687 T6225-6087 Unified Wire Storage Controller + 6688 T62100-6088 Unified Wire Storage Controller + 6689 T62100-6089 Unified Wire Storage Controller + 668a T62100-608a Unified Wire Storage Controller + 6692 T62100-KR Unified Wire Storage Controller + 6801 T6225-CR Unified Wire Ethernet Controller [VF] + 6802 T6225-SO-CR Unified Wire Ethernet Controller [VF] + 6803 T6425-CR Unified Wire Ethernet Controller [VF] + 6804 T6425-SO-CR Unified Wire Ethernet Controller [VF] + 6805 T6225-OCP-SO Unified Wire Ethernet Controller [VF] + 6806 T62100-OCP-SO Unified Wire Ethernet Controller [VF] + 6807 T62100-LP-CR Unified Wire Ethernet Controller [VF] + 6808 T62100-SO-CR Unified Wire Ethernet Controller [VF] + 6809 T6210-BT Unified Wire Ethernet Controller [VF] + 680d T62100-CR Unified Wire Ethernet Controller [VF] + 6811 T6225-LL-CR Unified Wire Ethernet Controller [VF] + 6814 T61100-OCP-SO Unified Wire Ethernet Controller [VF] + 6815 T6201-BT Unified Wire Ethernet Controller [VF] + 6880 T6225-6080 Unified Wire Ethernet Controller [VF] + 6881 T62100-6081 Unified Wire Ethernet Controller [VF] + 6882 T6225-6082 Unified Wire Ethernet Controller [VF] + 6883 T62100-6083 Unified Wire Ethernet Controller [VF] + 6884 T64100-6084 Unified Wire Ethernet Controller [VF] + 6885 T6240-6085 Unified Wire Ethernet Controller [VF] + 6886 T6225-6086 Unified Wire Ethernet Controller [VF] + 6887 T6225-6087 Unified Wire Ethernet Controller [VF] + 6888 T62100-6088 Unified Wire Ethernet Controller [VF] + 6889 T62100-6089 Unified Wire Ethernet Controller [VF] + 688a T62100-608a Unified Wire Ethernet Controller [VF] + a000 PE10K Unified Wire Ethernet Controller +1426 Storage Technology Corp. +1427 Better On-Line Solutions +1428 Edec Co Ltd +1429 Unex Technology Corp. +142a Kingmax Technology Inc +142b Radiolan +142c Minton Optic Industry Co Ltd +142d Pix stream Inc +142e Vitec Multimedia + 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder + 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder +142f Radicom Research Inc +1430 ITT Aerospace/Communications Division +1431 Gilat Satellite Networks +1432 Edimax Computer Co. + 9130 RTL81xx Fast Ethernet +1433 Eltec Elektronik GmbH +# Nee Real Time Devices US Inc. +1435 RTD Embedded Technologies, Inc. + 4520 PCI4520 + 6020 SPM6020 + 6030 SPM6030 + 6420 SPM186420 + 6430 SPM176430 + 6431 SPM176431 + 7520 DM7520 + 7540 SDM7540 + 7820 DM7820 +1436 CIS Technology Inc +1437 Nissin Inc Co +1438 Atmel-dream +1439 Outsource Engineering & Mfg. Inc +143a Stargate Solutions Inc +143b Canon Research Center, America +143c Amlogic Inc +143d Tamarack Microelectronics Inc +143e Jones Futurex Inc +143f Lightwell Co Ltd - Zax Division +1440 ALGOL Corp. +1441 AGIE Ltd +1442 Phoenix Contact GmbH & Co. +1443 Unibrain S.A. +1444 TRW +1445 Logical DO Ltd +1446 Graphin Co Ltd +1447 AIM GmBH +1448 Alesis Studio Electronics +1449 TUT Systems Inc +144a Adlink Technology + 6208 PCI-6208V + 7250 PCI-7250 + 7296 PCI-7296 + 7432 PCI-7432 + 7433 PCI-7433 + 7434 PCI-7434 + 7841 PCI-7841 + 8133 PCI-8133 + 8164 PCI-8164 + 8554 PCI-8554 + 9111 PCI-9111 + 9113 PCI-9113 + 9114 PCI-9114 +# 2-16 MB SRAM, 4x UART, I2C, misc I/O + a001 ADi-BSEC +# nee Loronix Information Systems Inc. +144b Verint Systems Inc. +144c Catalina Research Inc +144d Samsung Electronics Co Ltd + 1600 Apple PCIe SSD + a544 Exynos 8890 PCIe Root Complex + a800 XP941 PCIe SSD + a802 NVMe SSD Controller SM951/PM951 + 144d a801 PM963 2.5" NVMe PCIe SSD + a804 NVMe SSD Controller SM961/PM961/SM963 + 144d a801 SM963 2.5" NVMe PCIe SSD + a808 NVMe SSD Controller SM981/PM981/PM983 + 144d a801 SSD 970 EVO Plus 1TB + 1d49 403b Thinksystem U.2 PM983 NVMe SSD + a809 NVMe SSD Controller 980 + a80a NVMe SSD Controller PM9A1/PM9A3/980PRO + 0128 215a DC NVMe PM9A3 RI U.2 960GB + 0128 215b DC NVMe PM9A3 RI U.2 1.92TB + 0128 215c DC NVMe PM9A3 RI U.2 3.84TB + 0128 215d DC NVMe PM9A3 RI U.2 7.68TB + 0128 2166 DC NVMe PM9A3 RI 110M.2 960GB + 0128 2167 DC NVMe PM9A3 RI 110M.2 1.92TB + 0128 2168 DC NVMe PM9A3 RI 80M.2 480GB + 0128 2169 DC NVMe PM9A3 RI 80M.2 960GB + 144d a813 General DC NVMe PM9A3 + a820 NVMe SSD Controller 171X + 1028 1f95 Express Flash NVMe XS1715 SSD 400GB + 1028 1f96 Express Flash NVMe XS1715 SSD 800GB + 1028 1f97 Express Flash NVMe XS1715 SSD 1600GB + 1028 1fa4 Express Flash NVMe SM1715 3.2TB SFF + 1028 1fa6 Express Flash NVMe SM1715 3.2TB AIC + 1028 1fba Express Flash NVMe SM1715 800GB SFF + 1028 1fbb Express Flash NVMe SM1715 1.6TB SFF + 1028 1fbc Express Flash NVMe SM1715 1.6TB AIC + a821 NVMe SSD Controller 172X + 1028 1fb7 Express Flash NVMe PM1725 3.2TB SFF + 1028 1fb8 Express Flash NVMe PM1725 3.2TB AIC + 1028 1fb9 Express Flash NVMe PM1725 6.4TB AIC + 1028 1fc1 Express Flash NVMe PM1725 800GB SFF + 1028 1fc2 Express Flash NVMe PM1725 1.6TB SFF + 1028 1fc4 Express Flash NVMe PM1725 1.6TB AIC + a822 NVMe SSD Controller 172Xa/172Xb + 1014 0621 PCIe3 1.6TB NVMe Flash Adapter II x8 + 1014 0622 PCIe3 3.2TB NVMe Flash Adapter II x8 + 1014 0629 PCIe3 6.4TB NVMe Flash Adapter II x8 + 1014 064a PCIe3 1.6TB NVMe Flash Adapter III x8 + 1014 064b PCIe3 3.2TB NVMe Flash Adapter III x8 + 1014 064c PCIe3 6.4TB NVMe Flash Adapter III x8 + 1028 1fd9 Express Flash PM1725a 800GB SFF + 1028 1fda Express Flash PM1725a 1.6TB SFF + 1028 1fdb Express Flash PM1725a 3.2TB SFF + 1028 1fdc Express Flash PM1725a 6.4TB SFF + 1028 1fdd Express Flash PM1725a 1.6TB AIC + 1028 1fde Express Flash PM1725a 3.2TB AIC + 1028 1fdf Express Flash PM1725a 6.4TB AIC + 1028 1ff3 Express Flash PM1725b 1.6TB SFF + 1028 1ff4 Express Flash PM1725b 3.2TB SFF + 1028 1ff5 Express Flash PM1725b 6.4TB SFF + 1028 1ff6 Express Flash PM1725b 12.8TB SFF + 1028 1ff7 Express Flash PM1725b 1.6TB AIC + 1028 1ff8 Express Flash PM1725b 3.2TB AIC + 1028 1ff9 Express Flash PM1725b 6.4TB AIC + 1028 1ffa Express Flash PM1725b 12.8TB AIC + a824 NVMe SSD Controller PM173X + 1028 2040 EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 1.6TB + 1028 2041 EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 3.2TB + 1028 2042 EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 6.4TB + 1028 2043 EMC PowerEdge Express Flash Ent NVMe AGN MU U.2 Gen4 12.8TB + 1028 2044 EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 1.6TB + 1028 2045 EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 3.2TB + 1028 2046 EMC PowerEdge Express Flash Ent NVMe AGN MU AIC Gen4 6.4TB + 1028 2070 EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 1.92TB + 1028 2071 EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 3.84TB + 1028 2072 EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 7.68TB + 1028 2073 EMC PowerEdge Express Flash Ent NVMe AGN RI U.2 Gen4 15.36TB + 1028 2074 EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 1.92TB + 1028 2075 EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 3.84TB + 1028 2076 EMC PowerEdge Express Flash Ent NVMe AGN RI AIC Gen4 7.68TB + 1028 2090 EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 1.6TB + 1028 2091 EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 3.2TB + 1028 2092 EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 6.4TB + 1028 2093 EMC PowerEdge Express Flash Ent NVMe AGN SED MU U.2 Gen4 12.8TB + 1028 2094 EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 1.6TB + 1028 2095 EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 3.2TB + 1028 2096 EMC PowerEdge Express Flash Ent NVMe AGN SED MU AIC Gen4 6.4TB + 1028 2097 EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 1.92TB + 1028 2098 EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 3.84TB + 1028 2099 EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 7.68TB + 1028 2118 Ent NVMe v2 AGN FIPS MU U.2 1.6TB + 1028 2119 Ent NVMe v2 AGN MU U.2 1.6TB + 1028 2120 Ent NVMe v2 AGN FIPS MU U.2 3.2T + 1028 2121 Ent NVMe v2 AGN MU U.2 3.2TB + 1028 2122 Ent NVMe v2 AGN FIPS MU U.2 6.4TB + 1028 2123 Ent NVMe v2 AGN MU U.2 6.4TB + 1028 2124 Ent NVMe v2 AGN FIPS MU U.2 6.4TB + 1028 2125 Ent NVMe v2 AGN MU U.2 12.8TB + 1028 2126 Ent NVMe v2 AGN FIPS RI U.2 1.92TB + 1028 2127 Ent NVMe v2 AGN RI U.2 1.92TB + 1028 2128 Ent NVMe v2 AGN FIPS RI U.2 3.84TB + 1028 2129 Ent NVMe v2 AGN RI U.2 3.84TB + 1028 2130 Ent NVMe v2 AGN FIPS RI U.2 7.68TB + 1028 2131 Ent NVMe v2 AGN RI U.2 7.68TB + 1028 2132 Ent NVMe v2 AGN FIPS RI U.2 15.36TB + 1028 2133 Ent NVMe v2 AGN RI U.2 15.36TB + a825 NVMe SSD Controller PM173Xa + a826 NVMe SSD Controller PM174X + ecec Exynos 8895 PCIe Root Complex +144e OLITEC +144f Askey Computer Corp. +1450 Octave Communications Ind. +1451 SP3D Chip Design GmBH +1453 MYCOM Inc +1454 Altiga Networks +1455 Logic Plus Plus Inc +1456 Advanced Hardware Architectures +1457 Nuera Communications Inc +1458 Gigabyte Technology Co., Ltd + 22e8 Ellesmere [Radeon RX 480] + 3483 USB 3.0 Controller (VIA VL80x-based xHCI Controller) +1459 DOOIN Electronics +145a Escalate Networks Inc +145b PRAIM SRL +145c Cryptek +145d Gallant Computer Inc +145e Aashima Technology B.V. +145f Baldor Electric Company + 0001 NextMove PCI +1460 DYNARC INC +1461 Avermedia Technologies Inc + a3ce M179 + a3cf M179 + a836 M115 DVB-T, PAL/SECAM/NTSC Tuner + e836 M115S Hybrid Analog/DVB PAL/SECAM/NTSC Tuner + f436 AVerTV Hybrid+FM +1462 Micro-Star International Co., Ltd. [MSI] +# VIA Driver-inf + 3483 MSI USB 3.0 (VIA VL80x-based xHCI USB Controller) + 7c56 Realtek Ethernet controller RTL8111H + aaf0 Radeon RX 580 Gaming X 8G +1463 Fast Corporation +1464 Interactive Circuits & Systems Ltd +1465 GN NETTEST Telecom DIV. +1466 Designpro Inc. +1467 DIGICOM SPA +1468 AMBIT Microsystem Corp. +1469 Cleveland Motion Controls +# formerly IFR. +146a Aeroflex +# 1.5 GHz to 3.0 GHz x 1Hz + 3010 3010 RF Synthesizer + 3a11 3011A PXI RF Synthesizer +146b Parascan Technologies Ltd +146c Ruby Tech Corp. + 1430 FE-1430TX Fast Ethernet PCI Adapter +146d Tachyon, INC. +146e Williams Electronics Games, Inc. +146f Multi Dimensional Consulting Inc +1470 Bay Networks +1471 Integrated Telecom Express Inc +1472 DAIKIN Industries, Ltd +1473 ZAPEX Technologies Inc +1474 Doug Carson & Associates +1475 PICAZO Communications +1476 MORTARA Instrument Inc +1477 Net Insight +1478 DIATREND Corporation +1479 TORAY Industries Inc +147a FORMOSA Industrial Computing +147b ABIT Computer Corp. + 1084 IP35 [Dark Raider] +147c AWARE, Inc. +147d Interworks Computer Products +147e Matsushita Graphic Communication Systems, Inc. +147f NIHON UNISYS, Ltd. +1480 SCII Telecom +1481 BIOPAC Systems Inc +1482 ISYTEC - Integrierte Systemtechnik GmBH + 0001 PCI-16 Host Interface for ITC-16 +1483 LABWAY Corporation +1484 Logic Corporation +1485 ERMA - Electronic GmBH +1486 L3 Communications Telemetry & Instrumentation +1487 MARQUETTE Medical Systems +1489 KYE Systems Corporation +148a OPTO +148b INNOMEDIALOGIC Inc. +148c Tul Corporation / PowerColor + 2391 Radeon RX 590 [Red Devil] +148d DIGICOM Systems, Inc. + 1003 HCF 56k Data/Fax Modem +148e OSI Plus Corporation +148f Plant Equipment, Inc. +1490 Stone Microsystems PTY Ltd. +1491 ZEAL Corporation +1492 Time Logic Corporation +1493 MAKER Communications +1494 WINTOP Technology, Inc. +1495 TOKAI Communications Industry Co. Ltd +1496 JOYTECH Computer Co., Ltd. +1497 SMA Regelsysteme GmBH + 1497 SMA Technologie AG +1498 TEWS Technologies GmbH + 0330 TPMC816 2 Channel CAN bus controller. + 035d TPMC861 4-Channel Isolated Serial Interface RS422/RS485 + 0385 TPMC901 Extended CAN bus with 2/4/6 CAN controller + 21cc TCP460 CompactPCI 16 Channel Serial Interface RS232/RS422 + 21cd TCP461 CompactPCI 8 Channel Serial Interface RS232/RS422 + 3064 TPCI100 (2 Slot IndustryPack PCI Carrier) + 30c8 TPCI200 4 Slot IndustryPack PCI Carrier + 70c8 TPCE200 4 Slot IndustryPack PCIe Carrier + 9177 TXMC375 8 channel RS232/RS422/RS485 programmable serial interface +1499 EMTEC CO., Ltd +149a ANDOR Technology Ltd +149b SEIKO Instruments Inc +149c OVISLINK Corp. +149d NEWTEK Inc + 0001 Video Toaster for PC +149e Mapletree Networks Inc. +149f LECTRON Co Ltd +14a0 SOFTING GmBH +14a1 Systembase Co Ltd +14a2 Millennium Engineering Inc +14a3 Maverick Networks +14a4 Lite-On Technology Corporation + 22f1 M8Pe Series NVMe SSD +# Wrong vendor ID used + 4318 Broadcom BCM4318 [AirForce One 54g] 802.11g WLAN Controller +14a5 XIONICS Document Technologies Inc +14a6 INOVA Computers GmBH & Co KG +14a7 MYTHOS Systems Inc +14a8 FEATRON Technologies Corporation +14a9 HIVERTEC Inc +14aa Advanced MOS Technology Inc +# nee Mentor Graphics Corp. +14ab Siemens Industry Software Inc. +14ac Novaweb Technologies Inc +14ad Time Space Radio AB +14ae CTI, Inc +14af Guillemot Corporation + 7102 3D Prophet II MX +14b0 BST Communication Technology Ltd +14b1 Nextcom K.K. +14b2 ENNOVATE Networks Inc +14b3 XPEED Inc + 0000 DSL NIC +14b4 PHILIPS Business Electronics B.V. +14b5 Creamware GmBH + 0200 Scope + 0300 Pulsar + 0400 PulsarSRB + 0600 Pulsar2 + 0800 DSP-Board + 0900 DSP-Board + 0a00 DSP-Board + 0b00 DSP-Board +14b6 Quantum Data Corp. +14b7 PROXIM Inc + 0001 Symphony 4110 +14b8 Techsoft Technology Co Ltd +14b9 Cisco Aironet Wireless Communications + 0001 PC4800 + 0340 PC4800 + 0350 350 series 802.11b Wireless LAN Adapter + 4500 PC4500 + 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800 + a504 Cisco Aironet Wireless 802.11b + a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter + a506 Cisco Aironet Mini PCI b/g +14ba INTERNIX Inc. +# ARCNET interface card based on SMSC COM20022 chip and manufactured for SMSC Japan + 0600 ARC-PCI/22 +14bb SEMTECH Corporation +14bc Globespan Semiconductor Inc. + d002 Pulsar [PCI ADSL Card] + d00f Pulsar [PCI ADSL Card] +14bd CARDIO Control N.V. +14be L3 Communications +14bf SPIDER Communications Inc. +14c0 COMPAL Electronics Inc + 1201 X550 10Gb 2P RJ45 OCP Mezz +# now owned by CSP, Inc. +14c1 MYRICOM Inc. + 0008 Myri-10G Dual-Protocol NIC + 14c1 0008 10G-PCIE-8A + 14c1 0009 10G-PCIE-8A (MSI-X firmware) + 14c1 000a 10G-PCIE-8B + 8043 Myrinet 2000 Scalable Cluster Interconnect + 103c 1240 Myrinet M2L-PCI64/2-3.0 LANai 7.4 (HP OEM) +14c2 DTK Computer +14c3 MEDIATEK Corp. + 0608 MT7921K (RZ608) Wi-Fi 6E 80MHz + 0616 MT7922 802.11ax PCI Express Wireless Network Adapter + 7612 MT7612E 802.11acbgn PCI Express Wireless Network Adapter + 7615 MT7615E 802.11ac PCI Express Wireless Network Adapter + 7630 MT7630e 802.11bgn Wireless Network Adapter +# MT7612E too? + 7662 MT7662E 802.11ac PCI Express Wireless Network Adapter + 7915 MT7915E 802.11ax PCI Express Wireless Network Adapter + 7961 MT7921 802.11ax PCI Express Wireless Network Adapter +14c4 IWASAKI Information Systems Co Ltd +14c5 Automation Products AB +14c6 Data Race Inc +14c7 Modular Technology Holdings Ltd +14c8 Turbocomm Tech. Inc. +14c9 ODIN Telesystems Inc +14ca PE Logic Corp. +14cb Billionton Systems Inc +14cc NAKAYO Telecommunications Inc +14cd Universal Global Scientific Industrial Co.,Ltd + 0001 USI-1514-1GbaseT [OCP1] + 0002 USI-4227-SFP [OCP2] + 0003 USI-X557-10GbaseT [OCP3] +14ce Whistle Communications +14cf TEK Microsystems Inc. +14d0 Ericsson Axe R & D +14d1 Computer Hi-Tech Co Ltd +14d2 Titan Electronics Inc + 8001 VScom 010L 1 port parallel adaptor + 8002 VScom 020L 2 port parallel adaptor + 8010 VScom 100L 1 port serial adaptor + 8011 VScom 110L 1 port serial and 1 port parallel adaptor + 8020 VScom 200L 1 or 2 port serial adaptor + 8021 VScom 210L 2 port serial and 1 port parallel adaptor + 8028 VScom 200I/200I-SI 2-port serial adapter + 8040 VScom 400L 4 port serial adaptor + 8043 VScom 430L 4-port serial and 3-port parallel adapter + 8048 VScom 400I 4-port serial adapter + 8080 VScom 800L 8 port serial adaptor + 8088 VScom 800I 8-port serial adapter + a000 VScom 010H 1 port parallel adaptor + a001 VScom 100H 1 port serial adaptor + a003 VScom 400H 4 port serial adaptor + a004 VScom 400HF1 4 port serial adaptor + a005 VScom 200H 2 port serial adaptor + a007 VScom PCI800EH (PCIe) 8-port serial adapter Port 1-4 + a008 VScom PCI800EH (PCIe) 8-port serial adapter Port 5-8 + a009 VScom PCI400EH (PCIe) 4-port serial adapter + e001 VScom 010HV2 1 port parallel adaptor + e010 VScom 100HV2 1 port serial adaptor + e020 VScom 200HV2 2 port serial adaptor +14d3 CIRTECH (UK) Ltd + 0002 DTL-T14000 Rev. 1 [PS2 TOOL CD/DVD Emulator] + 0003 DTL-T14000 Rev. 2 [PS2 TOOL CD/DVD Emulator] + 0004 DTL-T14000 Rev. 3 [PS2 TOOL CD/DVD Emulator] +14d4 Panacom Technology Corp +14d5 Nitsuko Corporation +14d6 Accusys Inc + 6101 ACS-61xxx, PCIe to SAS/SATA RAID HBA + 6201 ACS-62xxx, External PCIe to SAS/SATA RAID controller +14d7 Hirakawa Hewtech Corp +14d8 HOPF Elektronik GmBH +# Formerly SiPackets, Inc., formerly API NetWorks, Inc., formerly Alpha Processor, Inc. +14d9 Alliance Semiconductor Corporation + 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon] + 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge +14da National Aerospace Laboratories +14db AFAVLAB Technology Inc + 2120 TK9902 + 2182 AFAVLAB Technology Inc. 8-port serial card +14dc Amplicon Liveline Ltd + 0000 PCI230 + 0001 PCI242 + 0002 PCI244 + 0003 PCI247 + 0004 PCI248 + 0005 PCI249 + 0006 PCI260 + 0007 PCI224 + 0008 PCI234 + 0009 PCI236 + 000a PCI272 + 000b PCI215 +14dd Boulder Design Labs Inc +14de Applied Integration Corporation +14df ASIC Communications Corp +14e1 INVERTEX +14e2 INFOLIBRIA +14e3 AMTELCO +14e4 Broadcom Inc. and subsidiaries + 0576 BCM43224 802.11a/b/g/n + 0800 Sentry5 Chipcommon I/O Controller + 0804 Sentry5 PCI Bridge + 0805 Sentry5 MIPS32 CPU + 0806 Sentry5 Ethernet Controller + 080b Sentry5 Crypto Accelerator + 080f Sentry5 DDR/SDR RAM Controller + 0811 Sentry5 External Interface Core + 0816 BCM3302 Sentry5 MIPS32 CPU + 1570 720p FaceTime HD Camera + 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express + 1028 01c1 Precision 490 + 1028 01c2 Latitude D620 + 103c 3015 PCIe LAN on Motherboard + 107b 5048 E4500 Onboard + 1259 2705 AT-2711FX + 1601 NetXtreme BCM5752M Gigabit Ethernet PCI Express + 1604 BCM5745X NetXtreme-E Ethernet Partition + 1605 BCM5745X NetXtreme-E RDMA Partition + 1606 BCM5745X NetXtreme-E RDMA Virtual Function + 1609 BCM5745X NetXtreme-E Ethernet Virtual Function + 1612 BCM70012 Video Decoder [Crystal HD] + 1614 BCM57454 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb Ethernet + 1615 BCM70015 Video Decoder [Crystal HD] + 1639 NetXtreme II BCM5709 Gigabit Ethernet + 1028 0235 PowerEdge R710 BCM5709 Gigabit Ethernet + 1028 0236 PowerEdge R610 BCM5709 Gigabit Ethernet + 1028 0237 PowerEdge T610 BCM5709 Gigabit Ethernet + 103c 7055 NC382i Integrated Multi-port PCI Express Gigabit Server Adapter + 103c 7059 NC382T PCIe Dual Port Multifunction Gigabit Server Adapter + 10a9 8027 Quad port Gigabit Ethernet Controller + 163a NetXtreme II BCM5709S Gigabit Ethernet + 1028 027b PowerEdge M805 Broadcom NetXtreme II BCM5709S + 1028 029c PowerEdge M710 BCM5709S Gigabit Ethernet + 103c 171d NC382m Dual Port 1GbE Multifunction BL-c Adapter + 103c 7056 NC382i Integrated Quad Port PCI Express Gigabit Server Adapter + 1259 2984 AT-2973SX + 163b NetXtreme II BCM5716 Gigabit Ethernet + 1028 028c PowerEdge R410 BCM5716 Gigabit Ethernet + 1028 028d PowerEdge T410 BCM5716 Gigabit Ethernet + 1028 02f1 PowerEdge R510 BCM5716 Gigabit Ethernet + 163c NetXtreme II BCM5716S Gigabit Ethernet + 163d NetXtreme II BCM57811 10-Gigabit Ethernet + 1043 858a PEB-10G/57811-1S + 163e NetXtreme II BCM57811 10 Gigabit Ethernet Multi Function + 163f NetXtreme II BCM57811 10-Gigabit Ethernet Virtual Function + 1641 NetXtreme BCM57787 Gigabit Ethernet PCIe + 1642 NetXtreme BCM57764 Gigabit Ethernet PCIe + 1643 NetXtreme BCM5725 Gigabit Ethernet PCIe + 1644 NetXtreme BCM5700 Gigabit Ethernet + 1014 0277 Broadcom Vigil B5700 1000Base-T + 1028 00d1 Broadcom BCM5700 + 1028 0106 Broadcom BCM5700 + 1028 0109 Broadcom BCM5700 1000Base-T + 1028 010a Broadcom BCM5700 1000BaseTX + 10b7 1000 3C996-T 1000Base-T + 10b7 1001 3C996B-T 1000Base-T + 10b7 1002 3C996C-T 1000Base-T + 10b7 1003 3C997-T 1000Base-T Dual Port + 10b7 1004 3C996-SX 1000Base-SX + 10b7 1005 3C997-SX 1000Base-SX Dual Port + 10b7 1008 3C942 Gigabit LOM (31X31) + 14e4 0002 NetXtreme 1000Base-SX + 14e4 0003 NetXtreme 1000Base-SX + 14e4 0004 NetXtreme 1000Base-T + 14e4 1028 NetXtreme 1000BaseTX + 14e4 1644 BCM5700 1000Base-T + 1645 NetXtreme BCM5701 Gigabit Ethernet + 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) + 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) + 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL) + 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL) + 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) + 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) + 1028 0121 Broadcom BCM5701 1000Base-T + 103c 128a BCM5701 1000Base-T (HP, OEM 3COM) + 103c 128b 1000Base-SX (PCI) [A7073A] + 103c 12a4 Core Lan 1000Base-T + 103c 12c1 IOX Core Lan 1000Base-T [A7109AX] + 103c 1300 Core LAN/SCSI Combo [A6794A] + 10a9 8010 IO9/IO10 Gigabit Ethernet (Copper) + 10a9 8011 Gigabit Ethernet (Copper) + 10a9 8012 Gigabit Ethernet (Fiber) + 10b7 1004 3C996-SX 1000Base-SX + 10b7 1006 3C996B-T 1000Base-T + 10b7 1007 3C1000-T 1000Base-T + 10b7 1008 3C940-BR01 1000Base-T + 14e4 0001 BCM5701 1000Base-T + 14e4 0005 BCM5701 1000Base-T + 14e4 0006 BCM5701 1000Base-T + 14e4 0007 BCM5701 1000Base-SX + 14e4 0008 BCM5701 1000Base-T + 14e4 1645 NetXtreme BCM5701 Gigabit Ethernet + 14e4 8008 BCM5701 1000Base-T + 1646 NetXtreme BCM5702 Gigabit Ethernet + 0e11 00bb NC7760 1000BaseTX + 1028 0126 Broadcom BCM5702 1000BaseTX + 14e4 8009 BCM5702 1000BaseTX + 1647 NetXtreme BCM5703 Gigabit Ethernet + 0e11 0099 NC7780 1000BaseTX + 0e11 009a NC7770 1000BaseTX + 10a9 8010 IO9 Gigabit Ethernet (Copper) + 14e4 0009 BCM5703 1000BaseTX + 14e4 000a BCM5703 1000BaseSX + 14e4 000b BCM5703 1000BaseTX + 14e4 8009 BCM5703 1000BaseTX + 14e4 800a BCM5703 1000BaseTX + 1648 NetXtreme BCM5704 Gigabit Ethernet + 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 1028 014a PowerEdge 1750 + 1028 0170 PowerEdge 6850 Broadcom NetXtreme BCM5704 + 103c 310f NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 10a9 8013 Dual Port Gigabit Ethernet (PCI-X,Copper) + 10a9 8018 Dual Port Gigabit Ethernet (A330) + 10a9 801a Dual Port Gigabit Ethernet (IA-blade) + 10a9 801b Quad Port Gigabit Ethernet (PCI-E,Copper) + 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X + 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X + 1166 1648 NetXtreme CIOB-E 1000Base-T + 1734 100b PRIMERGY RX/TX series onboard LAN + 1649 NetXtreme BCM5704S_2 Gigabit Ethernet + 164a NetXtreme II BCM5706 Gigabit Ethernet + 103c 1709 NC371i Integrated PCI-X Multifunction Gigabit Server Adapter + 103c 3070 NC380T PCI Express Dual Port Multifunction Gigabit Server Adapter + 103c 3101 NC370T MultifuNCtion Gigabit Server Adapter + 103c 3106 NC370i Multifunction Gigabit Server Adapter + 164c NetXtreme II BCM5708 Gigabit Ethernet + 1028 01f0 PowerEdge R900 Broadcom NetXtreme II BCM5708 + 1028 0205 PowerEdge 2970 Broadcom NetXtreme II BCM5708 + 1028 020b PowerEdge T605 Broadcom NetXtreme II BCM5708 + 1028 0221 PowerEdge R805 Broadcom NetXtreme II BCM5708 + 1028 0223 PowerEdge R905 Broadcom NetXtreme II BCM5708 + 1028 1f12 PowerEdge R805/R905 Broadcom NetXtreme II BCM5708 + 103c 7037 NC373T PCI Express Multifunction Gigabit Server Adapter + 103c 7038 NC373i Integrated Multifunction Gigabit Server Adapter + 103c 7045 NC374m PCI Express Dual Port Multifunction Gigabit Server Adapter + 164d NetXtreme BCM5702FE Gigabit Ethernet + 164e NetXtreme II BCM57710 10-Gigabit PCIe [Everest] + 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter + 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter + 164f NetXtreme II BCM57711 10-Gigabit PCIe + 1650 NetXtreme II BCM57711E 10-Gigabit PCIe + 103c 171c NC532m Dual Port 10GbE Multifunction BL-C Adapter + 103c 7058 NC532i Dual Port 10GbE Multifunction BL-C Adapter + 1653 NetXtreme BCM5705 Gigabit Ethernet + 0e11 00e3 NC7761 Gigabit Server Adapter + 1734 1073 Primergy Econel 200 D2020 mainboard + 1654 NetXtreme BCM5705_2 Gigabit Ethernet + 0e11 00e3 NC7761 Gigabit Server Adapter + 103c 3100 NC1020 ProLiant Gigabit Server Adapter 32 PCI + 103c 3226 NC150T 4-port Gigabit Combo Switch & Adapter + 1655 NetXtreme BCM5717 Gigabit Ethernet PCIe + 1656 NetXtreme BCM5718 Gigabit Ethernet PCIe + 1657 NetXtreme BCM5719 Gigabit Ethernet PCIe + 1014 0420 FC 5260/5899 4-port 1 GbE Adapter for Power + 103c 169d Ethernet 1Gb 4-port 331FLR Adapter + 103c 22be Ethernet 1Gb 4-port 331i Adapter + 103c 3383 Ethernet 1Gb 4-port 331T Adapter + 14e4 1904 4-port 1Gb Ethernet Adapter + 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express + 1014 02c6 eServer xSeries server mainboard + 1028 01e6 PowerEdge 860 + 1028 023c PowerEdge R200 Broadcom NetXtreme BCM5721 + 103c 170b NC320m PCI Express Dual Port Gigabit Server Adapter + 103c 7031 NC320T PCIe Gigabit Server Adapter + 103c 7032 NC320i PCIe Gigabit Server Adapter + 1734 1061 PRIMERGY RX/TX S2 series onboard LAN + 165a NetXtreme BCM5722 Gigabit Ethernet PCI Express +# Dual NIC server + 1014 0378 System x3350 (Machine type 4192) + 1028 020f PowerEdge R300 Broadcom NetXtreme 5722 + 1028 0210 PowerEdge T300 Broadcom NetXtreme 5722 + 1028 0225 PowerEdge T105 Broadcom NetXtreme 5722 + 103c 7051 NC105i PCIe Gigabit Server Adapter + 103c 7052 NC105T PCIe Gigabit Server Adapter + 165b NetXtreme BCM5723 Gigabit Ethernet PCIe + 103c 705d NC107i Integrated PCI Express Gigabit Server Adapter + 165c NetXtreme BCM5724 Gigabit Ethernet PCIe + 165d NetXtreme BCM5705M Gigabit Ethernet + 1028 865d Latitude D400 + 14e4 165d Dell Latitude D600 + 165e NetXtreme BCM5705M_2 Gigabit Ethernet + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 099c NX6110/NC6120 + 10cf 1279 LifeBook E8010D + 165f NetXtreme BCM5720 Gigabit Ethernet PCIe + 1028 04f7 PowerEdge R320 server + 1028 08fd PowerEdge R6515/R7515 LOM + 1028 08ff PowerEdge Rx5xx LOM Board + 1028 0900 PowerEdge C6525 LOM +# Dell 5720 LOM + 1028 0917 PowerEdge C6520 LOM + 103c 1786 NC332T Adapter + 103c 193d NC332i Adapter + 103c 2133 NC332i Adapter + 103c 22e8 NC332i Adapter + 103c 22eb NC332i Adapter + 15d9 165f H12SSL-i + 1662 NetXtreme II BCM57712 10 Gigabit Ethernet + 1663 NetXtreme II BCM57712 10 Gigabit Ethernet Multi Function + 1665 NetXtreme BCM5717 Gigabit Ethernet PCIe + 1668 NetXtreme BCM5714 Gigabit Ethernet + 103c 7039 NC324i PCIe Dual Port Gigabit Server Adapter + 1669 NetXtreme 5714S Gigabit Ethernet + 166a NetXtreme BCM5780 Gigabit Ethernet + 103c 7035 NC325i Integrated Dual port PCIe Express Gigabit Server Adapter + 166b NetXtreme BCM5780S Gigabit Ethernet + 166e 570x 10/100 Integrated Controller + 166f NetXtreme II BCM57712 10 Gigabit Ethernet Virtual Function + 1672 NetXtreme BCM5754M Gigabit Ethernet PCI Express + 1673 NetXtreme BCM5755M Gigabit Ethernet PCI Express + 1674 NetXtreme BCM5756ME Gigabit Ethernet PCI Express + 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express + 1028 0176 Dimension XPS Gen 4 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 1028 0182 Latitude D610 + 1028 0187 Precision M70 + 1028 01a3 Latitude X1 + 1028 01a8 Precision 380 + 1028 01ad OptiPlex GX620 + 103c 3006 DC7100 SFF(DX878AV) + 1462 028c 915P/G Neo2 + 1734 105d Scenic W620 + 1678 NetXtreme BCM5715 Gigabit Ethernet + 103c 703e NC326i PCIe Dual Port Gigabit Server Adapter + 1679 NetXtreme BCM5715S Gigabit Ethernet + 103c 1707 NC326m PCIe Dual Port Adapter + 103c 170c NC325m PCIe Quad Port Adapter + 103c 703c NC326i PCIe Dual Port Gigabit Server Adapter + 167a NetXtreme BCM5754 Gigabit Ethernet PCI Express + 1028 01da OptiPlex 745 + 1028 01de Precision 390 + 1028 01df PowerEdge SC440 + 1028 0214 Precision T3400 + 1028 021e Precision T5400 + 167b NetXtreme BCM5755 Gigabit Ethernet PCI Express + 103c 280a DC5750 Microtower + 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express + 1014 0577 ThinkPad X41 / Z60t + 103c 0934 nx8220 + 103c 0940 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC + 17aa 2081 ThinkPad R60e + 167e NetXtreme BCM5751F Fast Ethernet PCI Express + 167f NetLink BCM5787F Fast Ethernet PCI Express + 1680 NetXtreme BCM5761e Gigabit Ethernet PCIe + 1681 NetXtreme BCM5761 Gigabit Ethernet PCIe + 1682 NetXtreme BCM57762 Gigabit Ethernet PCIe + 106b 00f6 Thunderbolt to Gigabit Ethernet Adapter + 1683 NetXtreme BCM57767 Gigabit Ethernet PCIe + 1684 NetXtreme BCM5764M Gigabit Ethernet PCIe + 1685 NetXtreme II BCM57500S Gigabit Ethernet + 1686 NetXtreme BCM57766 Gigabit Ethernet PCIe + 1687 NetXtreme BCM5762 Gigabit Ethernet PCIe + 1688 NetXtreme BCM5761 10/100/1000BASE-T Ethernet + 1259 2708 AT-2712 FX +# The Broadcom 57800 device has two 1Gig ports and two 10Gig ports. The subsystem information can be used to differentiate. + 168a NetXtreme II BCM57800 1/10 Gigabit Ethernet +# SFP+ ports + 1014 0493 PCIe2 LP 4-Port (10Gb+1GbE) SR+RJ45 Adapter (FC EN0T; CCIN 2CC3) +# RJ-45 ports + 1014 0494 PCIe2 LP 4-Port (10Gb+1GbE) SR+RJ45 Adapter (FC EN0T; CCIN 2CC3) + 1028 1f5c BCM57800 10-Gigabit Ethernet + 1028 1f5d BCM57800 10-Gigabit Ethernet + 1028 1f67 BCM57800 1-Gigabit Ethernet + 1028 1f68 BCM57800 1-Gigabit Ethernet + 168d NetXtreme II BCM57840 10/20 Gigabit Ethernet + 168e NetXtreme II BCM57810 10 Gigabit Ethernet + 1014 0492 PCIe2 2-port 10 GbE BaseT RJ45 Adapter (FC EN0W; CCIN 2CC4) + 103c 1798 Flex-10 10Gb 2-port 530FLB Adapter [Meru] + 103c 17a5 Flex-10 10Gb 2-port 530M Adapter + 103c 18d3 Ethernet 10Gb 2-port 530T Adapter + 103c 1930 FlexFabric 10Gb 2-port 534FLR-SFP+ Adapter + 103c 1931 StoreFabric CN1100R Dual Port Converged Network Adapter + 103c 1932 FlexFabric 10Gb 2-port 534FLB Adapter + 103c 1933 FlexFabric 10Gb 2-port 534M Adapter + 103c 193a FlexFabric 10Gb 2-port 533FLR-T Adapter + 103c 3382 Ethernet 10Gb 2-port 530FLR-SFP+ Adapter + 103c 339d Ethernet 10Gb 2-port 530SFP+ Adapter + 193d 1003 530F-B + 193d 1006 530F-L + 193d 100f NIC-ETH522i-Mb-2x10G + 1690 NetXtreme BCM57760 Gigabit Ethernet PCIe + 1691 NetLink BCM57788 Gigabit Ethernet PCIe + 1028 04aa XPS 8300 + 1692 NetLink BCM57780 Gigabit Ethernet PCIe + 1025 033d Aspire 7740G + 1693 NetLink BCM5787M Gigabit Ethernet PCI Express + 1025 0121 Aspire 5920G + 103c 30c0 6710b + 17aa 20d5 ThinkPad R61 + 1694 NetLink BCM57790 Gigabit Ethernet PCIe + 1696 NetXtreme BCM5782 Gigabit Ethernet + 103c 12bc d530 CMT (DG746A) + 14e4 000d NetXtreme BCM5782 1000Base-T + 1698 NetLink BCM5784M Gigabit Ethernet PCIe + 1699 NetLink BCM5785 Gigabit Ethernet + 169a NetLink BCM5786 Gigabit Ethernet PCI Express + 169b NetLink BCM5787 Gigabit Ethernet PCI Express + 169c NetXtreme BCM5788 Gigabit Ethernet + 103c 308b MX6125 + 103c 30a1 NC2400 + 144d c018 X20 + 1462 590c KT6 Delta-FIS2R (MS-6590) + 169d NetLink BCM5789 Gigabit Ethernet PCI Express + 16a0 NetLink BCM5785 Fast Ethernet + 16a1 BCM57840 NetXtreme II 10 Gigabit Ethernet + 1043 866e PEB-10G/57840-2T 10GBase-T Network Adapter + 193d 100b NIC-ETH521i-Mb-4x10G + 16a2 BCM57840 NetXtreme II 10/20-Gigabit Ethernet + 103c 1916 FlexFabric 20Gb 2-port 630FLB Adapter + 103c 1917 FlexFabric 20Gb 2-port 630M Adapter + 103c 2231 3820C 10/20Gb Converged Network Adapter + 103c 22fa FlexFabric 10Gb 2-port 536FLB Adapter + 16a3 NetXtreme BCM57786 Gigabit Ethernet PCIe + 16a4 BCM57840 NetXtreme II Ethernet Multi Function + 103c 1916 NPAR 20Gb 2-port 630FLB Adapter + 103c 1917 NPAR 20Gb 2-port 630M Adapter + 103c 2231 3820C 10/20Gb Converged Network Adapter (NPAR 1.5) + 103c 22fa FlexFabric 10Gb 2-port 536FLB Adapter (NPAR 1.5) +# The Broadcom 57800 device has two 1Gig ports and two 10Gig ports. The subsystem information can be used to differentiate. + 16a5 NetXtreme II BCM57800 1/10 Gigabit Ethernet Multi Function + 1028 1f5c NetXtreme II BCM57800 10-Gigabit Ethernet Multi Function + 1028 1f5d NetXtreme II BCM57800 10-Gigabit Ethernet Multi Function + 1028 1f67 NetXtreme II BCM57800 1-Gigabit Ethernet Multi Function + 1028 1f68 NetXtreme II BCM57800 1-Gigabit Ethernet Multi Function + 16a6 NetXtreme BCM5702X Gigabit Ethernet + 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T) + 1028 0126 BCM5702 1000Base-T + 14e4 000c BCM5702 1000Base-T + 14e4 8009 BCM5702 1000Base-T + 16a7 NetXtreme BCM5703X Gigabit Ethernet + 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 1014 026f eServer xSeries server mainboard + 14e4 0009 NetXtreme BCM5703 1000Base-T + 14e4 000a NetXtreme BCM5703 1000Base-SX + 14e4 000b NetXtreme BCM5703 1000Base-T + 14e4 800a NetXtreme BCM5703 1000Base-T + 16a8 NetXtreme BCM5704S Gigabit Ethernet + 103c 132b PCI-X 1000Mbps Dual-port Built-in + 10a9 8014 Dual Port Gigabit Ethernet (PCI-X,Fiber) + 10a9 801c Quad Port Gigabit Ethernet (PCI-E,Fiber) + 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X +# The Broadcom 57800 device has two 1Gig ports and two 10Gig ports. The subsystem information can be used to differentiate. + 16a9 NetXtreme II BCM57800 1/10 Gigabit Ethernet Virtual Function + 1028 1f5c NetXtreme II BCM57800 10-Gigabit Ethernet Virtual Function + 1028 1f5d NetXtreme II BCM57800 10-Gigabit Ethernet Virtual Function + 1028 1f67 NetXtreme II BCM57800 1-Gigabit Ethernet Virtual Function + 1028 1f68 NetXtreme II BCM57800 1-Gigabit Ethernet Virtual Function + 16aa NetXtreme II BCM5706S Gigabit Ethernet + 103c 3102 NC370F MultifuNCtion Gigabit Server Adapter + 103c 310c NC370i Multifunction Gigabit Server Adapter + 16ab NetXtreme II BCM57840 10/20 Gigabit Ethernet Multi Function + 16ac NetXtreme II BCM5708S Gigabit Ethernet + 1014 0304 NetXtreme II BCM5708S Gigabit Ethernet + 1028 01bb PowerEdge 1955 Broadcom NetXtreme II BCM5708S + 1028 020c PowerEdge M605 Broadcom NetXtreme II BCM5708S + 103c 1706 NC373m Multifunction Gigabit Server Adapter + 103c 7038 NC373i PCI Express Multifunction Gigabit Server Adapter + 103c 703b NC373i Integrated Multifunction Gigabit Server Adapter + 103c 703d NC373F PCI Express Multifunction Gigabit Server Adapter + 16ad NetXtreme II BCM57840 10/20 Gigabit Ethernet Virtual Function + 103c 1916 FlexFabric 20Gb 2-port 630FLB Adapter + 103c 1917 FlexFabric 20Gb 2-port 630M Adapter + 103c 2231 3820C 10/20Gb Converged Network Adapter (SR-IOV VF) + 103c 22fa FlexFabric 10Gb 2-port 536FLB Adapter (SR-IOV VF) + 16ae NetXtreme II BCM57810 10 Gigabit Ethernet Multi Function + 103c 1798 NPAR 10Gb 2-port 530FLB Adapter + 103c 17a5 NPAR 10Gb 2-port 530M Adapter + 103c 18d3 NPAR 10Gb 2-port 530T Adapter + 103c 1930 NPAR 10Gb 2-port 534FLR-SFP+ Adapter + 103c 1931 NPAR CN1100R Dual Port Converged Network Adapter + 103c 1932 NPAR 10Gb 2-port 534FLB Adapter + 103c 1933 NPAR 10Gb 2-port 534M Adapter + 103c 193a NPAR 10Gb 2-port 533FLR-T Adapter + 103c 3382 NPAR 10Gb 2-port 530FLR-SFP+ Adapter + 103c 339d NPAR 10Gb 2-port 530SFP+ Adapter + 16af NetXtreme II BCM57810 10 Gigabit Ethernet Virtual Function + 103c 1798 Flex-10 10Gb 2-port 530FLB Adapter + 103c 17a5 Flex-10 10Gb 2-port 530M Adapter + 103c 18d3 Ethernet 10Gb 2-port 530T Adapter + 103c 1930 FlexFabric 10Gb 2-port 534FLR-SFP+ Adapter + 103c 1931 StoreFabric CN1100R Dual Port Converged Network Adapter + 103c 1932 FlexFabric 10Gb 2-port 534FLB Adapter + 103c 1933 FlexFabric 10Gb 2-port 534M Adapter + 103c 193a FlexFabric 10Gb 2-port 533FLR-T Adapter + 103c 3382 Ethernet 10Gb 2-port 530FLR-SFP+ Adapter + 103c 339d Ethernet 10Gb 2-port 530SFP+ Adapter + 16b0 NetXtreme BCM57761 Gigabit Ethernet PCIe + 16b1 NetLink BCM57781 Gigabit Ethernet PCIe + 1849 96b1 Z77 Extreme4 motherboard + 16b2 NetLink BCM57791 Gigabit Ethernet PCIe + 16b3 NetXtreme BCM57786 Gigabit Ethernet PCIe + 16b4 NetXtreme BCM57765 Gigabit Ethernet PCIe + 16b5 NetLink BCM57785 Gigabit Ethernet PCIe + 16b6 NetLink BCM57795 Gigabit Ethernet PCIe + 16b7 NetXtreme BCM57782 Gigabit Ethernet PCIe + 16bc BCM57765/57785 SDXC/MMC Card Reader + 16be BCM57765/57785 MS Card Reader + 16bf BCM57765/57785 xD-Picture Card Reader + 16c1 NetXtreme-E RDMA Virtual Function + 16c6 NetXtreme BCM5702A3 Gigabit Ethernet + 10b7 1100 3C1000B-T 10/100/1000 PCI + 14e4 000c BCM5702 1000Base-T + 14e4 8009 BCM5702 1000Base-T + 16c7 NetXtreme BCM5703 Gigabit Ethernet + 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) + 103c 12c3 Combo FC/GigE-SX [A9782A] + 103c 12ca Combo FC/GigE-T [A9784A] + 103c 1321 Core I/O LAN/SCSI Combo [AB314A] + 14e4 0009 NetXtreme BCM5703 1000Base-T + 14e4 000a NetXtreme BCM5703 1000Base-SX + 16c8 BCM57301 NetXtreme-C 10Gb Ethernet Controller + 16c9 BCM57302 NetXtreme-C 10Gb/25Gb Ethernet Controller + 16ca BCM57304 NetXtreme-C 10Gb/25Gb/40Gb/50Gb Ethernet Controller + 16cb NetXtreme-C Ethernet Virtual Function + 16cc BCM57417 NetXtreme-E Ethernet Partition + 16ce BCM57311 NetXtreme-C 10Gb RDMA Ethernet Controller + 16cf BCM57312 NetXtreme-C 10Gb/25Gb RDMA Ethernet Controller + 16d0 BCM57402 NetXtreme-E 10Gb Ethernet Controller + 16d1 BCM57404 NetXtreme-E 10Gb/25Gb Ethernet Controller + 16d2 BCM57406 NetXtreme-E 10GBASE-T Ethernet Controller + 16d3 NetXtreme-E Ethernet Virtual Function + 16d4 BCM57402 NetXtreme-E Ethernet Partition + 16d5 BCM57407 NetXtreme-E 10GBase-T Ethernet Controller + 16d6 BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller + 14e4 1202 BCM957412M4122C OCP 1x25G Type1 wRoCE + 14e4 4120 NetXtreme E-Series Advanced Dual-port 10Gb SFP+ Ethernet Network Daughter Card + 14e4 4126 NetXtreme-E Dual-port 10G SFP+ Ethernet OCP 3.0 Adapter (BCM957412N4120C) + 152d 8b20 BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller + 152d 8b22 BCM57412 NetXtreme-E 25Gb RDMA Ethernet Controller +# NIC-ETH531F-LP-2P BCM57412 2 x 10G SFP+ Ethernet PCIe Card + 193d 1024 NIC-ETH531F-LP-2P + 16d7 BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller + 14e4 1402 BCM957414A4142CC 10Gb/25Gb Ethernet PCIe + 14e4 1404 BCM957414M4142C OCP 2x25G Type1 wRoCE + 14e4 4140 NetXtreme E-Series Advanced Dual-port 25Gb SFP28 Network Daughter Card +# BCM957414M4143C + 14e4 4143 NetXtreme-E Single-port 40Gb/50Gb Ethernet OCP 2.0 Adapter (BCM957414M4143C) + 14e4 4146 NetXtreme-E Dual-port 25G SFP28 Ethernet OCP 3.0 Adapter (BCM957414N4140C) + 1590 020e Ethernet 25Gb 2-port 631SFP28 Adapter + 1590 0211 Ethernet 25Gb 2-port 631FLR-SFP28 Adapter + 1eec 0101 VSE250231S Dual-port 10Gb/25Gb Ethernet PCIe + 16d8 BCM57416 NetXtreme-E Dual-Media 10G RDMA Ethernet Controller + 1028 1feb NetXtreme-E 10Gb SFP+ Adapter + 14e4 4163 NetXtreme-E Dual-port 10GBASE-T Ethernet OCP 2.0 Adapter (BCM957416M4163C) + 14e4 4166 NetXtreme-E Dual-port 10GBASE-T Ethernet OCP 3.0 Adapter (BCM957416N4160C) + 1590 020c Ethernet 10Gb 2-port 535T Adapter + 1590 0212 Ethernet 10Gb 2-port 535FLR-T Adapter + 16d9 BCM57417 NetXtreme-E 10GBASE-T RDMA Ethernet Controller + 108e 4866 Dual Port 10GBase-T Ethernet Controller + 16dc NetXtreme-E Ethernet Virtual Function + 16dd NetLink BCM5781 Gigabit Ethernet PCI Express + 16de BCM57412 NetXtreme-E Ethernet Partition + 16df BCM57314 NetXtreme-C 10Gb/25Gb/40Gb/50Gb RDMA Ethernet Controller + 16e1 NetXtreme-C Ethernet Virtual Function + 16e2 BCM57417 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller + 108e 4866 Dual Port 10Gb/25Gb SFP28 Ethernet Controller + 16e3 BCM57416 NetXtreme-E 10Gb RDMA Ethernet Controller + 16e5 NetXtreme-C RDMA Virtual Function + 16e7 BCM57404 NetXtreme-E Ethernet Partition + 16e8 BCM57406 NetXtreme-E Ethernet Partition + 16e9 BCM57407 NetXtreme-E 25Gb Ethernet Controller + 16eb BCM57412 NetXtreme-E RDMA Partition + 16ec BCM57414 NetXtreme-E Ethernet Partition + 16ed BCM57414 NetXtreme-E RDMA Partition + 16ee BCM57416 NetXtreme-E Ethernet Partition + 16ef BCM57416 NetXtreme-E RDMA Partition + 16f1 BCM57452 NetXtreme-E 10Gb/25Gb/40Gb/50Gb Ethernet + 16f3 NetXtreme BCM5727 Gigabit Ethernet PCIe + 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express + 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 16fe NetXtreme BCM5753F Fast Ethernet PCI Express + 170c BCM4401-B0 100Base-TX + 1028 0188 Inspiron 6000 laptop + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 1028 01af Inspiron 6400 + 1028 01cd Inspiron 9400 Laptop + 1028 01d7 XPS M1210 + 1028 01d8 Inspiron E1405 + 103c 099c NX6110/NC6120 + 103c 30a2 NX7300 laptop + 14e4 170c HP Compaq 6720t Mobile Thin Client + 170d NetXtreme BCM5901 100Base-TX + 1014 0545 ThinkPad R40e + 170e NetXtreme BCM5901 100Base-TX + 1712 NetLink BCM5906 Fast Ethernet PCI Express + 1713 NetLink BCM5906M Fast Ethernet PCI Express + 1028 01f3 Inspiron 1420 + 1028 0209 XPS M1330 + 103c 30c0 Compaq 6710b + 17aa 3a23 IdeaPad S10e + 1750 BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet + 14e4 2100 NetXtreme-E Dual-port 100G QSFP56 Ethernet PCIe4.0 x16 Adapter (BCM957508-P2100G) + 14e4 5208 NetXtreme-E Dual-port 100G QSFP56 Ethernet OCP 3.0 Adapter (BCM957508-N2100G) + 14e4 d124 NetXtreme-E P2100D BCM57508 2x100G QSFP PCIE + 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet + 1751 BCM57504 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet + 1028 09d4 PowerEdge XR11/XR12 LOM + 14e4 5045 NetXtreme-E BCM57504 4x25G OCP3.0 + 14e4 5250 NetXtreme-E BCM57504 4x25G KR Mezz + 14e4 d142 NetXtreme-E P425D BCM57504 4x25G SFP28 PCIE + 1752 BCM57502 NetXtreme-E 10Gb/25Gb/40Gb/50Gb Ethernet + 1800 BCM57502 NetXtreme-E Ethernet Partition + 1801 BCM57504 NetXtreme-E Ethernet Partition + 1802 BCM57508 NetXtreme-E Ethernet Partition + 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Partition + 1803 BCM57502 NetXtreme-E RDMA Partition + 1804 BCM57504 NetXtreme-E RDMA Partition + 1805 BCM57508 NetXtreme-E RDMA Partition + 14e4 df24 NetXtreme-E NGM2100D BCM57508 2x100G KR Mezz RDMA Partition + 1806 BCM5750X NetXtreme-E Ethernet Virtual Function + 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function + 1807 BCM5750X NetXtreme-E RDMA Virtual Function + 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function + 1808 BCM5750X NetXtreme-E Ethernet Virtual Function + 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function + 1809 BCM5750X NetXtreme-E RDMA Virtual Function + 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function + 2711 BCM2711 PCIe Bridge + 3352 BCM3352 + 3360 BCM3360 + 4210 BCM4210 iLine10 HomePNA 2.0 + 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem + 4212 BCM4212 v.90 56k modem + 4220 802-11b/g Wireless PCI controller, packaged as a Linksys WPC54G ver 1.2 PCMCIA card + 4222 NetXtreme BCM5753M Gigabit Ethernet PCI Express + 4301 BCM4301 802.11b Wireless LAN Controller + 1028 0407 TrueMobile 1180 Onboard WLAN + 1043 0120 WL-103b Wireless LAN PC Card + 16a5 1602 B-300 802.11b Wireless CardBus Adapter + 1737 4301 WMP11 v2.7 802.11b Wireless-B PCI Adapter + 4305 BCM4307 V.90 56k Modem + 4306 BCM4306 802.11bg Wireless LAN controller + 4307 BCM4306 802.11bg Wireless LAN Controller + 4310 BCM4310 Chipcommon I/OController + 4311 BCM4311 802.11b/g WLAN + 1028 0007 Wireless 1390 WLAN Mini-Card + 1028 0008 Wireless 1390 WLAN ExpressCard + 103c 1363 BCM4311 802.11b/g Wireless LAN Controller + 103c 1364 BCM4311 802.11b/g Wireless LAN Controller + 103c 1365 BCM4311 802.11b/g Wireless LAN Controller + 103c 1374 BCM4311 802.11b/g Wireless LAN Controller + 103c 1375 BCM4311 802.11b/g Wireless LAN Controller + 103c 1376 BCM4311 802.11b/g Wireless LAN Controller + 103c 1377 BCM4311 802.11b/g Wireless LAN Controller + 103c 137f BCM4322 802.11a/b/g/n Wireless LAN Controller + 103c 1380 BCM4322 802.11a/b/g/n Wireless LAN Controller + 14e4 4311 BCM94311MCG + 4312 BCM4311 802.11a/b/g + 1028 0007 Wireless 1490 Dual Band WLAN Mini-Card + 1028 0008 Wireless 1490 Dual Band WLAN ExpressCard + 103c 135a Broadcom 802.11a/b/g WLAN + 103c 135f Broadcom 802.11a/b/g WLAN + 103c 1360 Broadcom 802.11a/b/g WLAN + 103c 1361 Broadcom 802.11a/b/g WLAN + 103c 1362 Broadcom 802.11a/b/g WLAN + 103c 1370 Broadcom 802.11a/b/g WLAN + 103c 1371 Broadcom 802.11a/b/g WLAN + 103c 1372 Broadcom 802.11a/b/g WLAN + 103c 1373 Broadcom 802.11a/b/g WLAN + 103c 30b5 Presario V3242AU + 106b 0089 AirPort Extreme + 1371 103c Broadcom 802.11 Multiband-netwerkadapter(6715s) + 4313 BCM4311 802.11a + 4315 BCM4312 802.11b/g LP-PHY + 1028 000b Wireless 1395 WLAN Mini-Card + 1028 000c Wireless 1397 WLAN Mini-Card + 103c 137c BCM4312 802.11b/g Wireless LAN Controller + 103c 137d BCM4312 802.11b/g Wireless LAN Controller + 103c 1507 U98Z049.00 Wireless Mini PCIe Card + 105b e003 T77H030.00 Wireless Mini PCIe Card + 105b e01b T77H106.00 Wireless Half-size Mini PCIe Card + 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller + 1028 0005 Wireless 1370 WLAN Mini-PCI Card + 1028 0006 Wireless 1370 WLAN PC Card + 103c 1355 Broadcom 802.11b/g WLAN + 103c 1356 Broadcom 802.11b/g WLAN + 103c 1357 Broadcom 802.11b/g WLAN + 1043 100f WL-138G v2 / WL-138gE / WL-100gE + 1043 120f A6U notebook embedded card + 1154 0355 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Adapter + 1468 0311 Aspire 3022WLMi, 5024WLMi, 5020 + 1468 0312 TravelMate 2410 + 14e4 0449 Gateway 7510GX + 16ec 0119 U.S.Robotics Wireless MAXg PC Card + 1737 0042 WMP54GS v1.1 802.11g Wireless-G PCI Adapter with SpeedBooster + 1737 0048 WPC54G v3 802.11g Wireless-G Notebook Adapter + 1737 0049 WPC54GS v2 802.11g Wireless-G Notebook Adapter with SpeedBooster + 1799 7000 F5D7000 v4000 Wireless G Desktop Card + 1799 7001 F5D7001 v2000 Wireless G Plus Desktop Card + 1799 7010 F5D7010 v4000 Wireless G Notebook Card + 1799 7011 F5D7011 v2000 High-Speed Mode Wireless G Notebook Card + 4319 BCM4318 [AirForce 54g] 802.11a/b/g PCI Express Transceiver + 1028 0005 Wireless 1470 Dual Band WLAN Mini-PCI Card + 1028 0006 Wireless 1470 Dual Band WLAN PC Card + 103c 1358 Broadcom 802.11a/b/g WLAN + 103c 1359 Broadcom 802.11a/b/g WLAN + 103c 135a Broadcom 802.11a/b/g WLAN + 4320 BCM4306 802.11b/g Wireless LAN Controller + 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card + 1028 0002 TrueMobile 1300 WLAN PC Card + 1028 0003 Wireless 1350 WLAN Mini-PCI Card + 1028 0004 Wireless 1350 WLAN PC Card + 103c 12f4 Broadcom 802.11b/g WLAN + 103c 12f8 Broadcom 802.11b/g WLAN + 103c 12fa Broadcom 802.11b/g WLAN + 103c 12fb Broadcom 802.11b/g WLAN + 1043 100f WL-100G + 1057 7025 WN825G + 106b 004e AirPort Extreme + 1154 0330 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Desktop Adapter + 144f 7050 eMachines M6805 802.11g Built-in Wireless + 144f 7051 Sonnet Aria Extreme PCI + 1737 0013 WMP54G v1 802.11g PCI Adapter + 1737 0014 WMP54G v2 802.11g PCI Adapter + 1737 0015 WMP54GS v1.0 802.11g Wireless-G PCI Adapter with SpeedBooster + 1737 4320 WPC54G v1 / WPC54GS v1 802.11g Wireless-G Notebook Adapter + 1799 7000 F5D7000 v1000 Wireless G Desktop Card + 1799 7001 F5D7001 v1000 Wireless G Plus Desktop Card + 1799 7010 F5D7010 v1000 Wireless G Notebook Card + 1799 7011 F5D7011 v1000 High-Speed Mode Wireless G Notebook Card + 185f 1220 TravelMate 290E WLAN Mini-PCI Card + 4321 BCM4321 802.11a Wireless Network Controller + 4322 BCM4322 802.11bgn Wireless Network Controller + 4324 BCM4309 802.11abg Wireless Network Controller + 1028 0001 Truemobile 1400 + 1028 0002 TrueMobile 1400 Dual Band WLAN PC Card + 1028 0003 Truemobile 1450 MiniPCI + 1028 0004 Wireless 1450 Dual Band WLAN PC Card + 103c 12f9 Broadcom 802.11a/b/g WLAN + 103c 12fc Broadcom 802.11a/b/g WLAN + 4325 BCM4306 802.11bg Wireless Network Controller + 1414 0003 Wireless Notebook Adapter MN-720 + 1414 0004 Wireless PCI Adapter MN-730 + 4326 BCM4307 Chipcommon I/O Controller? + 4328 BCM4321 802.11a/b/g/n + 1028 0009 Wireless 1500 Draft 802.11n WLAN Mini-Card + 1028 000a Wireless 1500 Draft 802.11n WLAN Mini-card + 103c 1366 BCM4321 802.11a/b/g/n Wireless LAN Controller + 103c 1367 BCM4321 802.11a/b/g/n Wireless LAN Controller + 103c 1368 BCM4321 802.11a/b/g/n Wireless LAN Controller + 103c 1369 BCM4321 802.11a/b/g/n Wireless LAN Controller + 106b 0087 AirPort Extreme + 106b 0088 AirPort Extreme + 106b 008b AirPort Extreme + 106b 008c AirPort Extreme + 106b 0090 AirPort Extreme + 14e4 4328 BCM4328 802.11a/b/g/n + 1737 0066 WPC600N v1 802.11a/b/g/n Wireless-N CardBus Adapter + 1737 0068 WEC600N v1 802.11a/b/g/n Wireless-N ExpressCard + 4329 BCM4321 802.11b/g/n + 1385 7b00 WN511B RangeMax NEXT Wireless Notebook Adapter + 1385 7d00 WN311B RangeMax Next 270 Mbps Wireless PCI Adapter + 1737 0058 WPC300N v1 Wireless-N Notebook Adapter + 432a BCM4321 802.11an Wireless Network Controller + 432b BCM4322 802.11a/b/g/n Wireless LAN Controller + 1028 000d Wireless 1510 Wireless-N WLAN Mini-Card + 106b 008d AirPort Extreme + 106b 008e AirPort Extreme + 432c BCM4322 802.11b/g/n + 1799 d311 Dynex DX-NNBX 802.11n WLAN Cardbus Card + 432d BCM4322 802.11an Wireless Network Controller + 4331 BCM4331 802.11a/b/g/n + 106b 00d6 AirPort Extreme + 106b 00e4 AirPort Extreme + 106b 00ef AirPort Extreme + 106b 00f4 AirPort Extreme + 106b 00f5 AirPort Extreme + 106b 010e AirPort Extreme + 106b 010f AirPort Extreme + 4333 Serial (EDGE/GPRS modem part of Option GT Combo Edge) + 4344 EDGE/GPRS data and 802.11b/g combo cardbus [GC89] + 4350 BCM43222 Wireless Network Adapter + 4351 BCM43222 802.11abgn Wireless Network Adapter + 4353 BCM43224 802.11a/b/g/n + 1028 000e Wireless 1520 Half-size Mini PCIe Card + 103c 1509 WMIB-275N Half-size Mini PCIe Card + 106b 0093 AirPort Extreme + 106b 00d1 AirPort Extreme + 106b 00e9 AirPort Extreme + 14e4 04d8 Pegatron UPWL6024 + 4357 BCM43225 802.11b/g/n + 105b e021 T77H103.00 Wireless Half-size Mini PCIe Card + 4358 BCM43227 802.11b/g/n + 4359 BCM43228 802.11a/b/g/n + 1028 0011 Wireless 1530 Half-size Mini PCIe Card + 103c 182c BCM943228HM4L 802.11a/b/g/n 2x2 Wi-Fi Adapter + 4360 BCM4360 802.11ac Wireless Network Adapter + 4365 BCM43142 802.11b/g/n + 1028 0016 Wireless 1704 802.11n + BT 4.0 + 43a0 BCM4360 802.11ac Wireless Network Adapter + 43a1 BCM4360 802.11ac Wireless Network Adapter + 43a2 BCM4360 802.11ac Wireless Network Adapter + 43a3 BCM4350 802.11ac Wireless Network Adapter +# Manufactured by Foxconn for Lenovo + 17aa 075a 00JT494 + 43a9 BCM43217 802.11b/g/n + 43aa BCM43131 802.11b/g/n + 43ae BCM43162 802.11ac Wireless Network Adapter + 43b1 BCM4352 802.11ac Wireless Network Adapter + 43ba BCM43602 802.11ac Wireless LAN SoC + 43bb BCM43602 802.11ac Wireless LAN SoC + 43bc BCM43602 802.11ac Wireless LAN SoC + 43d3 BCM43567 802.11ac Wireless Network Adapter + 43d9 BCM43570 802.11ac Wireless Network Adapter + 43dc BCM4355 802.11ac Wireless LAN SoC + 43df BCM4354 802.11ac Wireless LAN SoC + 43e9 BCM4358 802.11ac Wireless LAN SoC + 43ec BCM4356 802.11ac Wireless Network Adapter + 4401 BCM4401 100Base-T + 1025 0035 TravelMate 660 + 1025 0064 Extensa 3000 series laptop + 1028 8127 Dimension 2400 + 103c 08b0 tc1100 tablet + 1043 80a8 A7V8X motherboard + 4402 BCM4402 Integrated 10/100BaseT + 4403 BCM4402 V.90 56k Modem + 4410 BCM4413 iLine32 HomePNA 2.0 + 4411 BCM4413 V.90 56k modem + 4412 BCM4412 10/100BaseT + 4415 BCM4359 802.11ac Dual-Band Wireless Network Controller + 441f BCM4361 802.11ac Dual-Band Wireless Network Controller + 4420 BCM4361 802.11ac 2.4 GHz Wireless Network Controller + 4421 BCM4361 802.11ac 5 GHz Wireless Network Controller + 4425 BRCM4378 Wireless Network Adapter + 4430 BCM44xx CardBus iLine32 HomePNA 2.0 + 4432 BCM4432 CardBus 10/100BaseT + 4464 BCM4364 802.11ac Wireless Network Adapter +# brcmfmac reports it as BCM4377/4 but macOS drivers call it BCM4377b + 4488 BCM4377b Wireless Network Adapter + 4610 BCM4610 Sentry5 PCI to SB Bridge + 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0 + 4612 BCM4610 Sentry5 V.90 56k Modem + 4613 BCM4610 Sentry5 Ethernet Controller + 4614 BCM4610 Sentry5 External Interface + 4615 BCM4610 Sentry5 USB Controller + 4704 BCM4704 PCI to SB Bridge + 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller + 4706 BCM4704 Sentry5 Ethernet Controller + 4707 BCM4704 Sentry5 USB Controller + 4708 BCM4704 Crypto Accelerator + 4710 BCM4710 Sentry5 PCI to SB Bridge + 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0 + 4712 BCM47xx V.92 56k modem + 4713 Sentry5 Ethernet Controller + 4714 BCM47xx Sentry5 External Interface + 4715 BCM47xx Sentry5 USB / Ethernet Controller + 4716 BCM47xx Sentry5 USB Host Controller + 4717 BCM47xx Sentry5 USB Device Controller + 4718 Sentry5 Crypto Accelerator + 4719 BCM47xx/53xx RoboSwitch Core + 4720 BCM4712 MIPS CPU + 4727 BCM4313 802.11bgn Wireless Network Adapter + 1028 0010 Inspiron M5010 / XPS 8300 + 5365 BCM5365P Sentry5 Host Bridge + 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller + 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller + 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller + 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller + 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller + 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric + 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller + 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch + 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller + 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch + 5695 BCM5695 12-port + HiGig Multi-Layer Gigabit Ethernet Switch + 5698 BCM5698 12-port Multi-Layer Gigabit Ethernet Switch + 5820 BCM5820 Crypto Accelerator + 5821 BCM5821 Crypto Accelerator + 5822 BCM5822 Crypto Accelerator + 5823 BCM5823 Crypto Accelerator + 5824 BCM5824 Crypto Accelerator + 5840 BCM5840 Crypto Accelerator + 5841 BCM5841 Crypto Accelerator + 5850 BCM5850 Crypto Accelerator + 5e87 Valkyrie offload engine + 5e88 Viper Offload Engine + 8602 BCM7400/BCM7405 Serial ATA Controller + 9026 CN99xx [ThunderX2] Integrated USB 3.0 xHCI Host Controller + 9027 CN99xx [ThunderX2] Integrated AHCI/SATA 3 Host Controller + a8d8 BCM43224/5 Wireless Network Adapter + aa52 BCM43602 802.11ac Wireless LAN SoC + b080 BCM56080 Firelight2 Switch ASIC + b302 BCM56302 StrataXGS 24x1GE 2x10GE Switch Controller + b334 BCM56334 StrataXGS 24x1GE 4x10GE Switch Controller + b370 BCM56370 Switch ASIC + b371 BCM56371 Switch ASIC + b372 BCM56372 Switch ASIC + b375 BCM56375 Switch ASIC + b376 BCM56376 Switch ASIC + b377 BCM56377 Switch ASIC + b379 Broadcom BCM56379 Switch ASIC + b470 BCM56470 SWITCH ASIC + b471 BCM56471 SWITCH ASIC + b472 BCM56472 SWITCH ASIC + b800 BCM56800 StrataXGS 10GE Switch Controller + b842 BCM56842 Trident 10GE Switch Controller +# Trident2 + b850 Broadcom BCM56850 Switch ASIC + b880 BCM56880 Switch ASIC +# Tomahawk + b960 Broadcom BCM56960 Switch ASIC +# Tomahawk4 + b990 BCM56990 Switch ASIC +# Tomahawk4G + b996 BCM56996 Tomahawk4G 106G Switch ASIC +# Tomahawk4GT + b998 BCM56998 Tomahawk4GT 106G Switch ASIC +# Tomahawk4D + b999 BCM56999 Tomahawk4D 106G Switch ASIC + c909 BCM78909 Switch ASIC + d802 BCM58802 Stingray 50Gb Ethernet SoC + 14e4 8021 Stingray Dual-Port 25Gb Ethernet PCIe SmartNIC w16GB DRAM (Part No BCM958802A8046C) + 14e4 8023 PS410T-H04 NetXtreme-S 4x10G 10GBaseT PCIe SmartNIC + 14e4 8024 Stingray Dual-Port 25Gb Ethernet PCIe SmartNIC w4GB DRAM (Part No BCM958802A8044C) + 14e4 8028 Stingray Dual-Port 25Gb Ethernet PCIe SmartNIC w8GB DRAM (Part No BCM958802A8048C) + 1bb0 0021 HPE SimpliVity Accelerator + d804 BCM58804 Stingray 100Gb Ethernet SoC +14e5 Pixelfusion Ltd +14e6 SHINING Technology Inc +14e7 3CX +14e8 RAYCER Inc +14e9 GARNETS System CO Ltd +14ea Planex Communications, Inc + ab06 FNW-3603-TX CardBus Fast Ethernet + ab07 RTL81xx RealTek Ethernet + ab08 FNW-3602-TX CardBus Fast Ethernet +14eb SEIKO EPSON Corp +# nee ACQIRIS +14ec Agilent Technologies + 0000 Aciris Digitizer (malformed ID) +14ed DATAKINETICS Ltd +14ee MASPRO KENKOH Corp +14ef CARRY Computer ENG. CO Ltd +14f0 CANON RESEACH CENTRE FRANCE +14f1 Conexant Systems, Inc. + 1002 HCF 56k Modem + 1003 HCF 56k Modem + 1004 HCF 56k Modem + 1005 HCF 56k Modem + 1006 HCF 56k Modem + 1022 HCF 56k Modem + 1023 HCF 56k Modem + 1024 HCF 56k Modem + 1025 HCF 56k Modem + 1026 HCF 56k Modem + 1032 HCF 56k Modem + 1033 HCF 56k Data/Fax Modem + 1033 8077 NEC + 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem + 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem + 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem + 13e0 020d Dell Copper + 13e0 020e Dell Silver + 13e0 0261 IBM + 13e0 0290 Compaq Goldwing + 13e0 02a0 IBM + 13e0 02b0 IBM + 13e0 02c0 Compaq Scooter + 13e0 02d0 IBM + 144f 1500 IBM P85-DF (1) + 144f 1501 IBM P85-DF (2) + 144f 150a IBM P85-DF (3) + 144f 150b IBM P85-DF Low Profile (1) + 144f 1510 IBM P85-DF Low Profile (2) + 1034 HCF 56k Data/Fax/Voice Modem + 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 10cf 1098 Fujitsu P85-DFSV + 1036 HCF 56k Data/Fax/Voice/Spkp Modem + 104d 8067 HCF 56k Modem + 122d 4029 MDP3880SP-W + 122d 4031 MDP3880SP-U + 13e0 0209 Dell Titanium + 13e0 020a Dell Graphite + 13e0 0260 Gateway Red Owl + 13e0 0270 Gateway White Horse + 1052 HCF 56k Data/Fax Modem (Worldwide) + 1053 HCF 56k Data/Fax Modem (Worldwide) + 1054 HCF 56k Data/Fax/Voice Modem (Worldwide) + 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide) + 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) + 122d 4035 MDP3900V-W + 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) + 1059 HCF 56k Data/Fax/Voice Modem (Worldwide) + 1063 HCF 56k Data/Fax Modem + 1064 HCF 56k Data/Fax/Voice Modem + 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1066 HCF 56k Data/Fax/Voice/Spkp Modem + 122d 4033 Dell Athena - MDP3900V-U + 1085 HCF V90 56k Data/Fax/Voice/Spkp PCI Modem + 10b6 CX06834-11 HCF V.92 56k Data/Fax/Voice/Spkp Modem + 1433 HCF 56k Data/Fax Modem + 1434 HCF 56k Data/Fax/Voice Modem + 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1436 HCF 56k Data/Fax Modem + 1453 HCF 56k Data/Fax Modem + 13e0 0240 IBM + 13e0 0250 IBM + 144f 1502 IBM P95-DF (1) + 144f 1503 IBM P95-DF (2) + 1454 HCF 56k Data/Fax/Voice Modem + 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 1456 HCF 56k Data/Fax/Voice/Spkp Modem + 122d 4035 Dell Europa - MDP3900V-W + 122d 4302 Dell MP3930V-W(C) MiniPCI + 1610 ADSL AccessRunner PCI Arbitration Device + 1611 AccessRunner PCI ADSL Interface Device + 1620 AccessRunner V2 PCI ADSL Arbitration Device + 1621 AccessRunner V2 PCI ADSL Interface Device + 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter + 1803 HCF 56k Modem + 0e11 0023 623-LAN Grizzly + 0e11 0043 623-LAN Yogi + 1811 MiniPCI Network Adapter + 1815 HCF 56k Modem + 0e11 0022 Grizzly + 0e11 0042 Yogi +# Integrated in CX86111/CX86113 processors + 1830 CX861xx Integrated Host Bridge + 2003 HSF 56k Data/Fax Modem + 2004 HSF 56k Data/Fax/Voice Modem + 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 2006 HSF 56k Data/Fax/Voice/Spkp Modem + 2013 HSF 56k Data/Fax Modem + 0e11 b195 Bear + 0e11 b196 Seminole 1 + 0e11 b1be Seminole 2 + 1025 8013 Acer + 1033 809d NEC + 1033 80bc NEC + 155d 6793 HP + 155d 8850 E Machines + 2014 HSF 56k Data/Fax/Voice Modem + 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem + 2016 HSF 56k Data/Fax/Voice/Spkp Modem + 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA) + 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA) + 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA) + 14f1 2045 Generic SoftK56 + 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA) + 2063 HSF 56k Data/Fax Modem (SmartDAA) + 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA) + 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA) + 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA) + 2093 HSF 56k Modem + 155d 2f07 Legend + 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA) + 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA) + 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA) + 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA) + 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA) + 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA) + 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA) + 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA) + 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA) + 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA) + 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA) + 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA) + 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA) + 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA) + 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA) + 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA) + 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA) + 104d 8075 Modem + 104d 8083 Modem + 104d 8097 Modem + 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA) + 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA) + 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA) + 2463 HSF 56k Data/Fax Modem (Mob SmartDAA) + 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA) + 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA) + 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA) + 2702 HSFi modem RD01-D270 + 1028 8d88 SmartHSFi V92 56K PCI Modem + 2f00 HSF 56k HSFi Modem + 13e0 8d84 IBM HSFi V.90 + 13e0 8d85 Compaq Stinger + 14f1 2004 Dynalink 56PMi + 2f02 HSF 56k HSFi Data/Fax + 2f11 HSF 56k HSFi Modem + 2f20 HSF 56k Data/Fax Modem + 14f1 200c Soft Data Fax Modem with SmartCP + 14f1 200f Dimension 3000 + 2f30 SoftV92 SpeakerPhone SoftRing Modem with SmartSP + 14f1 2014 Devolo MikroLink 56K Modem PCI + 2f50 Conexant SoftK56 Data/Fax Modem + 510f Conexant CX 20751/20752 + 5b7a CX23418 Single-Chip MPEG-2 Encoder with Integrated Analog Video/Broadcast Audio Decoder + 0070 7444 WinTV HVR-1600 + 107d 6f34 WinFast DVR3100 H + 5854 3343 GoTView PCI DVD3 Hybrid + 8200 CX25850 + 8234 RS8234 ATM SAR Controller [ServiceSAR Plus] + 8800 CX23880/1/2/3 PCI Video and Audio Decoder + 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models + 0070 3400 WinTV 34604 + 0070 3401 Hauppauge WinTV 34xxx models + 0070 6902 WinTV HVR-4000-HD + 0070 7801 WinTV HVR-1800 MCE + 0070 9001 Nova-T DVB-T + 0070 9002 Nova-T DVB-T Model 909 + 0070 9200 Nova-SE2 DVB-S + 0070 9202 Nova-S-Plus DVB-S + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 0070 9600 WinTV 88x Video + 0070 9802 WinTV-HVR1100 DVB-T/Hybrid (Low Profile) + 1002 00f8 ATI TV Wonder Pro + 1002 00f9 ATI TV Wonder + 1002 a101 HDTV Wonder + 1043 4823 PVR-416 + 107d 6611 Winfast TV 2000XP Expert + 107d 6613 Leadtek Winfast 2000XP Expert + 107d 6620 Leadtek Winfast DV2000 + 107d 663c Leadtek PVR 2000 + 107d 665f WinFast DTV1000-T + 10fc d003 IODATA GV-VCP3/PCI + 10fc d035 IODATA GV/BCTV7E + 1421 0334 Instant TV DVB-T PCI + 1461 000a AVerTV 303 (M126) + 1461 000b AverTV Studio 303 (M126) + 1461 8011 UltraTV Media Center PCI 550 + 1462 8606 MSI TV-@nywhere Master + 14c7 0107 GDI Black Gold + 14f1 0187 Conexant DVB-T reference design + 14f1 0342 Digital-Logic MICROSPACE Entertainment Center (MEC) + 153b 1166 Cinergy 1400 DVB-T + 1540 2580 Provideo PV259 + 1554 4811 PixelView + 1554 4813 Club 3D ZAP1000 MCE Edition + 17de 08a1 KWorld/VStream XPert DVB-T with cx22702 + 17de 08a6 KWorld/VStream XPert DVB-T + 17de 08b2 KWorld DVB-S 100 + 17de a8a6 digitalnow DNTV Live! DVB-T + 1822 0025 digitalnow DNTV Live! DVB-T Pro + 185b e000 VideoMate X500 + 18ac d500 FusionHDTV 5 Gold + 18ac d810 FusionHDTV 3 Gold-Q + 18ac d820 FusionHDTV 3 Gold-T + 18ac db00 FusionHDTV DVB-T1 + 18ac db11 FusionHDTV DVB-T Plus + 18ac db50 FusionHDTV DVB-T Dual Digital + 5654 2388 GoTView PCI Hybrid TV Tuner Card + 7063 3000 pcHDTV HD3000 HDTV + 7063 5500 pcHDTV HD-5500 + 8801 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port] + 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models + 185b e000 VideoMate X500 + 5654 2388 GoTView PCI Hybrid Audio AVStream Device + 7063 5500 pcHDTV HD-5500 + 8802 CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port] + 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models + 0070 6902 WinTV HVR-4000-HD + 0070 9002 Nova-T DVB-T Model 909 + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 0070 9600 WinTV 88x MPEG Encoder + 1043 4823 PVR-416 + 107d 663c Leadtek PVR 2000 + 107d 665f WinFast DTV1000-T + 14f1 0187 Conexant DVB-T reference design + 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Transport Stream Capture + 17de 08a6 KWorld/VStream XPert DVB-T + 18ac d500 DViCO FusionHDTV5 Gold + 18ac d810 DViCO FusionHDTV3 Gold-Q + 18ac d820 DViCO FusionHDTV3 Gold-T + 18ac db00 DVICO FusionHDTV DVB-T1 + 18ac db10 DVICO FusionHDTV DVB-T Plus + 5654 2388 GoTView PCI Hybrid TS Capture Device + 7063 3000 pcHDTV HD3000 HDTV + 7063 5500 pcHDTV HD-5500 + 8804 CX23880/1/2/3 PCI Video and Audio Decoder [IR Port] + 0070 6902 WinTV HVR-4000-HD + 0070 9002 Nova-T DVB-T Model 909 + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 7063 5500 pcHDTV HD-5500 + 8811 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port] + 0070 3400 WinTV 34604 + 0070 3401 Hauppauge WinTV 34xxx models + 0070 6902 WinTV HVR-4000-HD + 0070 9402 WinTV-HVR1100 DVB-T/Hybrid + 0070 9600 WinTV 88x Audio + 1462 8606 MSI TV-@nywhere Master + 18ac d500 DViCO FusionHDTV5 Gold + 18ac d810 DViCO FusionHDTV3 Gold-Q + 18ac d820 DViCO FusionHDTV3 Gold-T + 18ac db00 DVICO FusionHDTV DVB-T1 + 5654 2388 GoTView PCI Hybrid Audio Capture Device + 8852 CX23885 PCI Video and Audio Decoder + 0070 8010 WinTV HVR-1400 ExpressCard + 0070 f038 WinTV HVR-5525 + 107d 6f22 WinFast PxTV1200 + 12ab d585 PE988J Hybrid ATSC/QAM PCI-E AVS Video Capture (SoftEncoder) + 13c2 3013 TT-budget CT2-4500 CI + 1461 c039 AVerTV Hybrid Express (A577) + 153b 117e Cinergy T PCIe Dual + 18ac db78 FusionHDTV DVB-T Dual Express + 4254 0950 S950 + 4254 0952 S952 + 4254 0982 T982 + 4254 9580 T9580 + 4254 980c T980C + 8880 CX23887/8 PCIe Broadcast Audio and Video Decoder with 3D Comb + 0070 2259 WinTV HVR-1250 + 0070 6a18 WinTV-quadHD + 0070 c108 WinTV-HVR-4400-HD model 1278 + 1461 3100 CE310B SD PCIe Video Capture Card + 5654 2389 GoTView X5 DVD Hybrid PCI-E + 5654 2390 GoTView X5 3D HYBRID PCI-E +14f2 MOBILITY Electronics + 0120 EV1000 bridge + 0121 EV1000 Parallel port + 0122 EV1000 Serial port + 0123 EV1000 Keyboard controller + 0124 EV1000 Mouse controller +14f3 BroadLogic + 2030 2030 DVB-S Satellite Receiver + 2035 2035 DVB-S Satellite Receiver + 2050 2050 DVB-T Terrestrial (Cable) Receiver + 2060 2060 ATSC Terrestrial (Cable) Receiver +14f4 TOKYO Electronic Industry CO Ltd +14f5 SOPAC Ltd +14f6 COYOTE Technologies LLC +14f7 WOLF Technology Inc +14f8 AUDIOCODES Inc + 2077 TP-240 dual span E1 VoIP PCI card +14f9 AG COMMUNICATIONS +14fa WANDEL & GOLTERMANN +14fb TRANSAS MARINE (UK) Ltd +14fc Quadrics Ltd + 0000 QsNet Elan3 Network Adapter + 0001 QsNetII Elan4 Network Adapter + 0002 QsNetIII Elan5 Network Adapter +14fd JAPAN Computer Industry Inc +14fe ARCHTEK TELECOM Corp +14ff TWINHEAD INTERNATIONAL Corp +1500 DELTA Electronics, Inc + 1360 RTL81xx RealTek Ethernet +1501 BANKSOFT CANADA Ltd +1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd +1503 KAWASAKI LSI USA Inc +1504 KAISER Electronics +1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH +1506 CHAMELEON Systems Inc +# Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057). +1507 Motorola ?? / HTEC + 0001 MPC105 [Eagle] + 0002 MPC106 [Grackle] + 0003 MPC8240 [Kahlua] + 0100 MC145575 [HFC-PCI] + 0431 KTI829c 100VG + 4801 Raven + 4802 Falcon + 4803 Hawk + 4806 CPX8216 +1508 HONDA CONNECTORS/MHOTRONICS Inc +1509 FIRST INTERNATIONAL Computer Inc +150a FORVUS RESEARCH Inc +150b YAMASHITA Systems Corp +150c KYOPAL CO Ltd +150d WARPSPPED Inc +150e C-PORT Corp +150f INTEC GmbH +1510 BEHAVIOR TECH Computer Corp +1511 CENTILLIUM Technology Corp +1512 ROSUN Technologies Inc +1513 Raychem +1514 TFL LAN Inc +1515 Advent design +1516 MYSON Technology Inc + 0800 MTD-8xx 100/10M Ethernet PCI Adapter + 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter + 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter + 0891 MTD-8xx 100/10M Ethernet PCI Adapter +1517 ECHOTEK Corp +# old ID, now 1059 +1518 Kontron +1519 TELEFON AKTIEBOLAGET LM Ericsson +151a Globetek + 1002 PCI-1002 + 1004 PCI-1004 + 1008 PCI-1008 +151b COMBOX Ltd +151c DIGITAL AUDIO LABS Inc + 0003 Prodif T 2496 + 4000 Prodif 88 +151d Fujitsu Computer Products Of America +151e MATRIX Corp +151f TOPIC SEMICONDUCTOR Corp + 0000 TP560 Data/Fax/Voice 56k modem +1520 CHAPLET System Inc +1521 BELL Corp +1522 MainPine Ltd + 0100 PCI <-> IOBus Bridge + 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem + 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem + 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem + 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem + 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem + 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem + 1522 2000 RockForceD1 1 Port V.90 Data Modem + 1522 2100 RockForceF1 1 Port V.34 Super-G3 Fax Modem + 1522 2200 RockForceD2 2 Port V.90 Data Modem + 1522 2300 RockForceF2 2 Port V.34 Super-G3 Fax Modem + 1522 2400 RockForceD4 4 Port V.90 Data Modem + 1522 2500 RockForceF4 4 Port V.34 Super-G3 Fax Modem + 1522 2600 RockForceD8 8 Port V.90 Data Modem + 1522 2700 RockForceF8 8 Port V.34 Super-G3 Fax Modem + 1522 3000 IQ Express D1 - 1 Port V.92 Data Modem + 1522 3100 IQ Express F1 - 1 Port V.34 Super-G3 Fax Modem + 1522 3200 IQ Express D2 - 2 Port V.92 Data Modem + 1522 3300 IQ Express F2 - 2 Port V.34 Super-G3 Fax Modem + 1522 3400 IQ Express D4 - 4 Port V.92 Data Modem + 1522 3500 IQ Express F4 - 4 Port V.34 Super-G3 Fax Modem + 1522 3c00 IQ Express D8 - 8 Port V.92 Data Modem + 1522 3d00 IQ Express F8 - 8 Port V.34 Super-G3 Fax Modem + 4000 PCI Express UART + 1522 4001 IQ Express 1-port V.34 Super-G3 Fax + 1522 4002 IQ Express 2-port V.34 Super-G3 Fax + 1522 4004 IQ Express 4-port V.34 Super-G3 Fax + 1522 4008 IQ Express 8-port V.34 Super-G3 Fax + 1522 4100 IQ Express SideBand +1523 MUSIC Semiconductors +1524 ENE Technology Inc + 0510 CB710 Memory Card Reader Controller + 103c 006a NX9500 + 0520 FLASH memory: ENE Technology Inc: + 0530 ENE PCI Memory Stick Card Reader Controller + 0550 ENE PCI Secure Digital Card Reader Controller + 0551 SD/MMC Card Reader Controller + 0610 PCI Smart Card Reader Controller + 0720 Memory Stick Card Reader Controller + 0730 ENE PCI Memory Stick Card Reader Controller + 0750 ENE PCI SmartMedia / xD Card Reader Controller + 0751 ENE PCI Secure Digital / MMC Card Reader Controller + 1211 CB1211 Cardbus Controller + 1225 CB1225 Cardbus Controller + 1410 CB1410 Cardbus Controller + 1025 003c CL50 motherboard + 1025 005a TravelMate 290 + 103c 30d5 530 Laptop + 1411 CB-710/2/4 Cardbus Controller + 103c 006a NX9500 + 1412 CB-712/4 Cardbus Controller + 1420 CB1420 Cardbus Controller + 1421 CB-720/2/4 Cardbus Controller + 1422 CB-722/4 Cardbus Controller +1525 IMPACT Technologies +1526 ISS, Inc +1527 SOLECTRON +1528 ACKSYS +# nee American Microsystems Inc +1529 ON Semiconductor +152a QUICKTURN DESIGN Systems +152b FLYTECH Technology CO Ltd +152c MACRAIGOR Systems LLC +152d QUANTA Computer Inc +152e MELEC Inc +152f PHILIPS - CRYPTO +1530 ACQIS Technology Inc +1531 CHRYON Corp +1532 ECHELON Corp + 0020 LonWorks PCLTA-20 PCI LonTalk Adapter +1533 BALTIMORE +1534 ROAD Corp +1535 EVERGREEN Technologies Inc +1536 ACTIS Computer +1537 DATALEX COMMUNCATIONS +1538 ARALION Inc + 0303 ARS106S Ultra ATA 133/100/66 Host Controller +1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A. +153a ONO SOKKI +153b TERRATEC Electronic GmbH + 1144 Aureon 5.1 +# Terratec seems to use several IDs for the same card. + 1147 Aureon 5.1 Sky + 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV] +153c ANTAL Electronic +153d FILANET Corp +153e TECHWELL Inc +153f MIPS Technologies, Inc. + 0001 SOC-it 101 System Controller +1540 PROVIDEO MULTIMEDIA Co Ltd +1541 MACHONE Communications +# nee VIVID Technology Inc. +1542 Concurrent Real-Time + 9260 RCIM-II Real-Time Clock & Interrupt Module + 9271 RCIM-III Real-Time Clock & Interrupt Module (PCIe) + 9272 Pulse Width Modulator Card + 9273 RCIM-IV Real-Time Clock & Interrupt Module (PCIe) + 9277 5 Volt Delta Sigma Converter Card + 9278 10 Volt Delta Sigma Converter Card + 9287 Analog Output Card + 9290 FPGA Card + 9300 Universal Exhaust Gas Oxygen Sensor Simulator + 9310 Digital Programmable Resistor + 9350 Analog Input Card +1543 SILICON Laboratories + 3052 Intel 537 [Winmodem] + 4c22 Si3036 MC'97 DAA +1544 DCM DATA Systems +1545 VISIONTEK +1546 IOI Technology Corp +1547 MITUTOYO Corp +1548 JET PROPULSION Laboratory +1549 INTERCONNECT Systems Solutions +154a MAX Technologies Inc +154b COMPUTEX Co Ltd +154c VISUAL Technology Inc +154d PAN INTERNATIONAL Industrial Corp +154e SERVOTEST Ltd +154f STRATABEAM Technology +1550 OPEN NETWORK Co Ltd +1551 SMART Electronic DEVELOPMENT GmBH +1552 RACAL AIRTECH Ltd +1553 CHICONY Electronics Co Ltd +1554 PROLINK Microsystems Corp +1555 GESYTEC GmBH +1556 PLDA + 1100 PCI Express Core Reference Design + 110f PCI Express Core Reference Design Virtual Function + 1110 XpressRich Reference Design + 1111 XpressRich-AXI Ref Design + 1112 QuickPCIe + 1113 XpressSwitch + 1114 Inspector + 1115 XpressLINK Ref Design + 1116 XpressLINK-SOC Ref Design + be00 PCI Express Bridge +1557 MEDIASTAR Co Ltd +1558 CLEVO/KAPOK Computer +1559 SI LOGIC Ltd +155a INNOMEDIA Inc +155b PROTAC INTERNATIONAL Corp +155c Cemax-Icon Inc +155d Mac System Co Ltd +155e LP Elektronik GmbH +155f Perle Systems Ltd +1560 Terayon Communications Systems +1561 Viewgraphics Inc +1562 Symbol Technologies +1563 A-Trend Technology Co Ltd +1564 Yamakatsu Electronics Industry Co Ltd +1565 Biostar Microtech Int'l Corp +1566 Ardent Technologies Inc +1567 Jungsoft +1568 DDK Electronics Inc +1569 Palit Microsystems Inc. +156a Avtec Systems +156b 2wire Inc +156c Vidac Electronics GmbH +156d Alpha-Top Corp +156e Alfa Inc +156f M-Systems Flash Disk Pioneers Ltd +1570 Lecroy Corp +1571 Contemporary Controls + a001 CCSI PCI20-485 ARCnet + a002 CCSI PCI20-485D ARCnet + a003 CCSI PCI20-485X ARCnet + a004 CCSI PCI20-CXB ARCnet + a005 CCSI PCI20-CXS ARCnet + a006 CCSI PCI20-FOG-SMA ARCnet + a007 CCSI PCI20-FOG-ST ARCnet + a008 CCSI PCI20-TB5 ARCnet + a009 CCSI PCI20-5-485 5Mbit ARCnet + a00a CCSI PCI20-5-485D 5Mbit ARCnet + a00b CCSI PCI20-5-485X 5Mbit ARCnet + a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet + a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet + a201 CCSI PCI22-485 10Mbit ARCnet + a202 CCSI PCI22-485D 10Mbit ARCnet + a203 CCSI PCI22-485X 10Mbit ARCnet + a204 CCSI PCI22-CHB 10Mbit ARCnet + a205 CCSI PCI22-FOG_ST 10Mbit ARCnet + a206 CCSI PCI22-THB 10Mbit ARCnet +1572 Otis Elevator Company +1573 Lattice - Vantis +1574 Fairchild Semiconductor +1575 Voltaire Advanced Data Security Ltd +1576 Viewcast COM +1578 HITT + 4d34 VPMK4 [Video Processor Mk IV] + 5615 VPMK3 [Video Processor Mk III] +1579 Dual Technology Corp +157a Japan Elecronics Ind Inc +157b Star Multimedia Corp +157c Eurosoft (UK) + 8001 Fix2000 PCI Y2K Compliance Card +157d Gemflex Networks +157e Transition Networks +157f PX Instruments Technology Ltd +1580 Primex Aerospace Co +1581 SEH Computertechnik GmbH +1582 Cytec Corp +1583 Inet Technologies Inc +1584 Uniwill Computer Corp +1585 Logitron +1586 Lancast Inc +1587 Konica Corp +1588 Solidum Systems Corp +1589 Atlantek Microsystems Pty Ltd + 0008 Leutron Vision PicPortExpress CL + 0009 Leutron Vision PicPortExpress CL Stereo +158a Digalog Systems Inc +158b Allied Data Technologies +158c Hitachi Semiconductor & Devices Sales Co Ltd +158d Point Multimedia Systems +158e Lara Technology Inc +158f Ditect Coop +# formerly 3PAR Inc. +1590 Hewlett Packard Enterprise + 0001 Eagle Cluster Manager + 0002 Osprey Cluster Manager + 0003 Harrier Cluster Manager + a01d FC044X Fibre Channel HBA +1591 ARN +1592 Syba Tech Ltd + 0781 Multi-IO Card + 0782 Parallel Port Card 2xEPP + 0783 Multi-IO Card + 0785 Multi-IO Card + 0786 Multi-IO Card + 0787 Multi-IO Card + 0788 Multi-IO Card + 078a Multi-IO Card +1593 Bops Inc +1594 Netgame Ltd +1595 Diva Systems Corp +1596 Folsom Research Inc +1597 Memec Design Services +1598 Granite Microsystems +1599 Delta Electronics Inc +159a General Instrument +159b Faraday Technology Corp + 4321 StorLink SL3516 (Gemini) Host Bridge +159c Stratus Computer Systems +159d Ningbo Harrison Electronics Co Ltd +159e A-Max Technology Co Ltd +159f Galea Network Security +15a0 Compumaster SRL +15a1 Geocast Network Systems +15a2 Catalyst Enterprises Inc + 0001 TA700 PCI Bus Analyzer/Exerciser +15a3 Italtel +15a4 X-Net OY +15a5 Toyota Macs Inc +15a6 Sunlight Ultrasound Technologies Ltd +15a7 SSE Telecom Inc +15a8 Shanghai Communications Technologies Center +15aa Moreton Bay +15ab Bluesteel Networks Inc +15ac North Atlantic Instruments + 6893 3U OpenVPX Multi-function I/O Board [Model 68C3] +15ad VMware + 0405 SVGA II Adapter + 0710 SVGA Adapter + 0720 VMXNET Ethernet Controller + 0740 Virtual Machine Communication Interface + 0770 USB2 EHCI Controller + 0774 USB1.1 UHCI Controller + 0778 USB3 xHCI 0.96 Controller + 0779 USB3 xHCI 1.0 Controller + 0790 PCI bridge + 07a0 PCI Express Root Port + 07b0 VMXNET3 Ethernet Controller + 07c0 PVSCSI SCSI Controller + 07e0 SATA AHCI controller + 07f0 NVMe SSD Controller + 0801 Virtual Machine Interface + 15ad 0800 Hypervisor ROM Interface + 0820 Paravirtual RDMA controller + 1977 HD Audio Controller +15ae Amersham Pharmacia Biotech +15b0 Zoltrix International Ltd +15b1 Source Technology Inc +15b2 Mosaid Technologies Inc +15b3 Mellanox Technologies + 0191 MT25408 [ConnectX IB Flash Recovery] + 01f6 MT27500 Family [ConnectX-3 Flash Recovery] + 01f8 MT27520 Family [ConnectX-3 Pro Flash Recovery] + 01ff MT27600 Family [Connect-IB Flash Recovery] + 0209 MT27700 Family [ConnectX-4 Flash Recovery] + 020b MT27710 Family [ConnectX-4 Lx Flash Recovery] + 020d MT28800 Family [ConnectX-5 Flash Recovery] + 020f MT28908A0 Family [ConnectX-6 Flash Recovery] + 0210 MT28908A0 Family [ConnectX-6 Secure Flash Recovery] + 0211 MT416842 Family [BlueField SoC Flash Recovery] + 0212 MT2892 Family [ConnectX-6 Dx Flash Recovery] + 0213 MT2892 Family [ConnectX-6 Dx Secure Flash Recovery] + 0214 MT42822 Family [BlueField-2 SoC Flash Recovery] + 0215 MT42822 Family [BlueField-2 Secure Flash Recovery] + 0216 MT2894 Family [ConnectX-6 Lx Flash Recovery] + 0217 MT2894 Family [ConnectX-6 Lx Secure Flash Recovery] + 0218 MT2910 Family [ConnectX-7 Flash Recovery] + 0219 MT2910 Family [ConnectX-7 Secure Flash Recovery] + 021a MT43162 Family [BlueField-3 Lx SoC Flash Recovery] + 021b MT43162 Family [BlueField-3 Lx Secure Flash Recovery] + 021c MT43244 Family [BlueField-3 SoC Flash Recovery] + 021d MT43244 Family [BlueField-3 Secure Flash Recovery] + 021e CX8 Family [ConnectX-8 Flash Recovery] + 021f CX8 Family [ConnectX-8 Secure Flash Recovery] + 0220 BF4 Family Flash Recovery [BlueField-4 SoC Flash Recovery] + 0221 BF4 Family Secure Flash Recovery [BlueField-4 Secure Flash Recovery] + 024e MT53100 [Spectrum-2, Flash recovery mode] + 024f MT53100 [Spectrum-2, Secure Flash recovery mode] + 0250 Spectrum-3, Flash recovery mode + 0251 Spectrum-3, Secure Flash recovery mode + 0252 Amos chiplet + 0253 Amos GearBox Manager + 0254 Spectrum-4, Flash recovery mode + 0255 Spectrum-4 RMA + 0256 Abir GearBox + 0257 Quantum-2 in Flash Recovery Mode + 0258 Quantum-2 RMA + 0259 Abir Chiplet + 025b Quantum-3 in Flash Recovery Mode + 025c Quantum-3 RMA + 0262 MT27710 [ConnectX-4 Lx Programmable] EN + 0263 MT27710 [ConnectX-4 Lx Programmable Virtual Function] EN + 0264 Innova-2 Flex Burn image + 0270 Spectrum-4L, Flash recovery mode + 0271 Spectrum-4L, RMA + 0274 Spectrum-4C, Flash recovery mode + 0275 Spectrum-4C RMA + 0277 Spectrum-4TOR RMA + 0281 NPS-600 Flash Recovery + 1002 MT25400 Family [ConnectX-2 Virtual Function] + 1003 MT27500 Family [ConnectX-3] + 1014 04b5 PCIe3 40GbE RoCE Converged Host Bus Adapter for Power + 103c 1777 InfiniBand FDR/EN 10/40Gb Dual Port 544FLR-QSFP Adapter (Rev Cx) + 103c 17c9 Infiniband QDR/Ethernet 10Gb 2-port 544i Adapter + 103c 18ce InfiniBand QDR/EN 10Gb Dual Port 544M Adapter + 103c 18cf InfiniBand FDR/EN 10/40Gb Dual Port 544M Adapter + 103c 18d6 InfiniBand FDR/EN 10/40Gb Dual Port 544QSFP Adapter + 15b3 0025 ConnectX-3 IB QDR Dual Port Mezzanine Card + 15b3 0026 ConnectX-3 IB FDR Dual Port Mezzanine Card + 15b3 0028 ConnectX-3 VPI Dual QSFP+ Port QDR Infiniband 40Gb/s or 10Gb Ethernet + 15b3 0059 ConnectX-3 VPI IB FDR/40 GbE Single Port QSFP+ Mezzanine Card + 15b3 0064 ConnectX-3 EN 10/40 GbE Single Port QSFP+ Adapter (MCX313A-BCBT) + 15b3 0065 ConnectX-3 VPI IB FDR/40 GbE Dual Port QSFP+ Adapter + 15b3 0066 ConnectX-3 IB FDR10 Dual Port Mezzanine Card + 15b3 0067 ConnectX-3 VPI IB FDR/40 GbE Single Port QSFP+ Adapter + 15b3 0071 ConnectX-3 VPI IB FDR/40 GbE Dual Port QSFP+ Mezzanine Card +# SVID = 15B3 SSID = 0078 + 15b3 0078 ConnectX-3 10 GbE Dual Port KR Mezzanine Card + 15b3 0079 ConnectX-3 40 GbE Dual Port QSFP+ Adapter +# SVID = 15B3 SSID = 0080 + 15b3 0080 ConnectX-3 10 GbE Dual Port SFP+ Adapter + 1004 MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function] + 1005 MT27510 Family + 1006 MT27511 Family + 1007 MT27520 Family [ConnectX-3 Pro] + 1014 04eb 2-Port 10GbE NIC and RoCE SR PCIe3 + 103c 22f3 InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+QSFP Adapter + 103c 22f4 InfiniBand FDR/Ethernet 10Gb/40Gb 2-port 544+FLR-QSFP Adapter + 103c 801f Ethernet 10G 2-port 546SFP+ Adapter + 117c 0090 FastFrame NQ41 + 117c 0091 FastFrame NQ42 + 117c 0092 FastFrame NQ11 + 117c 0093 FastFrame NQ12 + 15b3 0006 Mellanox Technologies ConnectX-3 Pro Stand-up dual-port 40GbE MCX314A-BCCT + 15b3 0078 ConnectX-3 Pro 10 GbE Dual Port KR Mezzanine Card + 15b3 0079 ConnectX-3 Pro 40 GbE Dual Port QSFP+ Adapter + 15b3 0080 ConnectX-3 Pro 10 GbE Dual Port SFP+ Adapter + 193d 1002 520F-B + 1009 MT27530 Family + 100a MT27531 Family + 100b MT27540 Family + 100c MT27541 Family + 100d MT27550 Family + 100e MT27551 Family + 100f MT27560 Family + 1010 MT27561 Family + 1011 MT27600 [Connect-IB] + 1012 MT27600 Family [Connect-IB Virtual Function] + 1013 MT27700 Family [ConnectX-4] + 1014 04f7 PCIe3 2-port 100 GbE (NIC and RoCE) QSFP28 Adapter for Power + 15b3 0003 Mellanox Technologies ConnectX-4 Stand-up single-port 40GbE MCX413A-BCAT + 15b3 0005 Mellanox Technologies ConnectX-4 Stand-up single-port 40GbE MCX415A-BCAT + 15b3 0006 MCX416A-BCAT, ConnectX-4 EN, 40/56GbE 2P, PCIe3.0 x16 + 15b3 0007 ConnectX-4 EN network interface card, 40/56GbE dual-port QSFP28, PCIe3.0 x16, tall bracket + 15b3 0008 ConnectX-4 Stand-up dual-port 100GbE MCX416A-CCAT + 15b3 0033 ConnectX-4 VPI IB EDR/100 GbE Single Port QSFP28 Adapter + 15b3 0034 ConnectX-4 VPI IB EDR/100 GbE Dual Port QSFP28 Adapter + 15b3 0050 ConnectX-4 100 GbE Dual Port QSFP28 Adapter + 1014 MT27700 Family [ConnectX-4 Virtual Function] + 1015 MT27710 Family [ConnectX-4 Lx] + 15b3 0001 ConnectX-4 Lx EN network interface card, 25GbE single-port SFP28, PCIe3.0 x8, tall bracket, ROHS R6 + 15b3 0003 Stand-up ConnectX-4 Lx EN, 25GbE dual-port SFP28, PCIe3.0 x8, MCX4121A-ACAT + 15b3 0004 ConnectX-4 Lx Stand-up dual-port 10GbE MCX4121A-XCAT + 15b3 0005 Mellanox Technologies ConnectX-4 Lx Stand-up single-port 40GbE MCX4131A-BCAT + 15b3 0020 MCX4411A-ACQN, ConnectX-4 Lx EN OCP, 1x25Gb + 15b3 0021 MCX4421A-ACQN ConnectX-4 Lx EN OCP,2x25G + 15b3 0025 ConnectX-4 Lx 25 GbE Dual Port SFP28 rNDC + 193d 100a 620F-B +# NIC-ETH540F-LP-2P SFP+ Ethernet Card + 193d 1023 NIC-ETH540F-LP-2P + 193d 1031 NIC-ETH640i-Mb-2x25G +# NIC-ETH640F-3S-2P OCP3.0 Card + 193d 1083 NIC-ETH640F-3S-2P +# NIC-ETH540F-3S-2P OCP3.0 2x10G Card + 193d 1084 NIC-ETH540F-3S-2P + 1016 MT27710 Family [ConnectX-4 Lx Virtual Function] + 1017 MT27800 Family [ConnectX-5] + 15b3 0006 ConnectX®-5 EN network interface card, 100GbE single-port QSFP28, PCIe3.0 x16, tall bracket; MCX515A-CCAT + 15b3 0007 Mellanox ConnectX®-5 MCX516A-CCAT + 15b3 0020 ConnectX®-5 EN network interface card, 10/25GbE dual-port SFP28, PCIe3.0 x8, tall bracket ; MCX512A-ACAT + 15b3 0068 ConnectX®-5 EN network interface card for OCP2.0, Type 1, with host management, 25GbE dual-port SFP28, PCIe3.0 x8, no bracket Halogen free ; MCX542B-ACAN + 193d 1051 NIC-IB1040i-Mb-2P + 1018 MT27800 Family [ConnectX-5 Virtual Function] + 1019 MT28800 Family [ConnectX-5 Ex] + 15b3 0008 ConnectX-5 Ex EN network interface card, 100GbE dual-port QSFP28, PCIe4.0 x16, tall bracket; MCX516A-CDAT + 15b3 0125 Tencent ConnectX-5 EN Ex network interface card for OCP 3.0, with host management, 50GbE Dual-port QSFP28, PCIe4.0 x16, Thumbscrew (pull-tab) bracket + 101a MT28800 Family [ConnectX-5 Ex Virtual Function] + 101b MT28908 Family [ConnectX-6] + 101c MT28908 Family [ConnectX-6 Virtual Function] + 101d MT2892 Family [ConnectX-6 Dx] + 101e ConnectX Family mlx5Gen Virtual Function + 101f MT2894 Family [ConnectX-6 Lx] + 1020 MT28860 + 1021 MT2910 Family [ConnectX-7] + 1023 CX8 Family [ConnectX-8] + 1974 MT28800 Family [ConnectX-5 PCIe Bridge] + 1975 MT416842 Family [BlueField SoC PCIe Bridge] + 1976 MT28908 Family [ConnectX-6 PCIe Bridge] + 1977 MT2892 Family [ConnectX-6 Dx PCIe Bridge] + 1978 MT42822 Family [BlueField-2 SoC PCIe Bridge] + 1979 MT2910 Family [ConnectX-7 PCIe Bridge] + 197a MT43162 Family [BlueField-3 Lx SoC PCIe Bridge] + 197b MT43244 Family [BlueField-3 SoC PCIe Bridge] + 197c ConnectX/BlueField Family mlx5Gen PCIe Bridge [PCIe Bridge] + 2020 MT2892 Family [ConnectX-6 Dx Emulated PCIe Bridge] + 2021 MT42822 Family [BlueField-2 SoC Emulated PCIe Bridge] + 2023 MT2910 Family [ConnectX-7 Emulated PCIe Bridge] + 2024 MT43244 Family [BlueField-3 SoC Emulated PCIe Bridge] + 2025 ConnectX/BlueField Family mlx5Gen Emulated PCIe Bridge [Emulated PCIe Bridge] + 4117 MT27712A0-FDCF-AE + 1bd4 0039 SN10XMP2P25 + 1bd4 003a 25G SFP28 SP EO251FM9 Adapter + 1bd4 004d SN10XMP2P25,YZPC-01191-101 + 5274 MT21108 InfiniBridge + 5a44 MT23108 InfiniHost + 5a45 MT23108 [Infinihost HCA Flash Recovery] + 5a46 MT23108 PCI Bridge + 5e8c MT24204 [InfiniHost III Lx HCA] + 5e8d MT25204 [InfiniHost III Lx HCA Flash Recovery] + 6001 NVMe SNAP Controller + 6274 MT25204 [InfiniHost III Lx HCA] + 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode) + 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery] + 6282 MT25208 [InfiniHost III Ex] + 6340 MT25408A0-FCC-SI ConnectX, Dual Port 10Gb/s InfiniBand / 10GigE Adapter IC with PCIe 2.0 x8 2.5GT/s Interface + 634a MT25408A0-FCC-DI ConnectX, Dual Port 20Gb/s InfiniBand / 10GigE Adapter IC with PCIe 2.0 x8 2.5GT/s Interface + 1014 1014 4X InfiniBand DDR Expansion Card (CFFh) for IBM BladeCenter + 6368 MT25448 [ConnectX EN 10GigE, PCIe 2.0 2.5GT/s] + 6372 MT25458 ConnectX EN 10GBASE-T PCIe 2.5 GT/s + 6732 MT25408A0-FCC-GI ConnectX, Dual Port 20Gb/s InfiniBand / 10GigE Adapter IC with PCIe 2.0 x8 5.0GT/s Interface + 673c MT25408A0-FCC-QI ConnectX, Dual Port 40Gb/s InfiniBand / 10GigE Adapter IC with PCIe 2.0 x8 5.0GT/s Interface + 1014 0415 PCIe2 2-port 4X InfiniBand QDR Adapter for Power + 1014 0487 GX++ 1-port 4X IB QDR Adapter for Power 795 + 103c 1782 4X QDR InfiniBand Mezzanine HCA for c-Class BladeSystem + 15b3 0021 HP InfiniBand 4X QDR CX-2 PCI-e G2 Dual Port HCA + 6746 MT26438 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE Virtualization+] + 103c 1781 NC543i 1-port 4x QDR IB/Flex-10 10Gb Adapter + 103c 3349 NC543i 2-port 4xQDR IB/10Gb Adapter + 6750 MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] + 1014 0416 PCIe2 2-Port 10GbE RoCE SFP+ Adapter + 1014 0461 PCIe2 2-Port 10GbE RoCE SR Adapter + 15b3 0018 HP 10 GbE PCI-e G2 Dual-Port NIC (rev C1) +# FC EC26 + 15b3 6572 IBM Flex System EN4132 2-port 10Gb RoCE Adapter + 675a MT26458 ConnectX EN 10GBASE-T PCIe Gen2 5.0 GT/s + 6764 MT26468 [ConnectX EN 10GigE, PCIe 2.0 5GT/s Virtualization+] + 103c 3313 NC542m Dual Port Flex-10 10GbE BLc Adapter + 676e MT26478 [ConnectX EN 40GigE, PCIe 2.0 5GT/s] + 6778 MT26488 [ConnectX VPI PCIe 2.0 5GT/s - IB DDR / 10GigE Virtualization+] + 7101 NPS-400 configuration and management interface + 7102 NPS-400 network interface PF + 7103 NPS-400 network interface VF + 7121 NPS-600 configuration and management interface + 7122 NPS-600 network interface PF + 7123 NPS-600 network interface VF + 8200 Innova-2 Flex Shell Logic + a2d0 MT416842 BlueField SoC Crypto enabled + a2d1 MT416842 BlueField SoC Crypto disabled + a2d2 MT416842 BlueField integrated ConnectX-5 network controller + a2d3 MT416842 BlueField multicore SoC family VF + a2d4 MT42822 BlueField-2 SoC Crypto enabled + a2d5 MT42822 BlueField-2 SoC Crypto disabled + a2d6 MT42822 BlueField-2 integrated ConnectX-6 Dx network controller + a2d7 MT43162 BlueField-3 Lx SoC Crypto enabled + a2d8 MT43162 BlueField-3 Lx SoC Crypto disabled + a2d9 MT43162 BlueField-3 Lx integrated ConnectX-7 network controller + a2da MT43244 BlueField-3 SoC Crypto enabled + a2db MT43244 BlueField-3 SoC Crypto disabled + a2dc MT43244 BlueField-3 integrated ConnectX-7 network controller + a2dd BF4 Family Crypto enabled [BlueField-4 SoC Crypto enabled] + a2de BF4 Family Crypto disabled [BlueField-4 SoC Crypto disabled] + a2df BF4 Family integrated network controller [BlueField-4 integrated network controller] + c2d2 MT416842 BlueField SoC management interfac + c2d3 MT42822 BlueField-2 SoC Management Interface + c2d4 MT43162 BlueField-3 Lx SoC Management Interface + c2d5 MT43244 BlueField-3 SoC Management Interface + c2d6 BF4 Family Management Interface [BlueField-4 SoC Management Interface] +# SwitchX-2, 40GbE switch + c738 MT51136 + c739 MT51136 GW + c838 MT52236 + c839 MT52236 router + caf1 ConnectX-4 CAPI Function +# Spectrum, 100GbE Switch + cb84 MT52100 + cf08 Switch-IB2 + cf6c MT53100 [Spectrum-2] + cf70 Spectrum-3 + cf80 Spectrum-4 + cf82 Spectrum-4L + cf84 Spectrum-4C + d2f0 Quantum HDR (200Gbps) switch + d2f2 Quantum-2 NDR (400Gbps) switch + d2f4 Quantum-3 +15b4 CCI/TRIAD +15b5 Cimetrics Inc +15b6 Texas Memory Systems Inc + 0001 XP15 DSP Accelerator + 0002 XP30 DSP Accelerator + 0003 XP00 Data Acquisition Device + 0004 XP35 DSP Accelerator + 0007 XP100 DSP Accelerator [XP100-T0] + 0008 XP100 DSP Accelerator [XP100-T1] + 0009 XP100 DSP Accelerator [XP100-E0] + 000a XP100 DSP Accelerator [XP100-E1] + 000e XP100 DSP Accelerator [XP100-0] + 000f XP100 DSP Accelerator [XP100-1] + 0010 XP100 DSP Accelerator [XP100-P0] + 0011 XP100 DSP Accelerator [XP100-P1] + 0012 XP100 DSP Accelerator [XP100-P2] + 0013 XP100 DSP Accelerator [XP100-P3] + 0014 RamSan Flash SSD + 0015 ZBox +15b7 Sandisk Corp + 2001 Skyhawk Series NVME SSD + 5001 WD Black NVMe SSD + 5002 WD Black 2018/SN750 / PC SN720 NVMe SSD + 5003 WD Blue SN500 / PC SN520 NVMe SSD + 5004 PC SN520 NVMe SSD + 5005 PC SN520 NVMe SSD + 5006 WD Black SN750 / PC SN730 NVMe SSD + 5009 WD Blue SN550 NVMe SSD + 15b7 5009 WD Blue SN550 NVMe SSD + 500b PC SN530 NVMe SSD + 1414 500b Xbox Series X + 500d WD Ultrastar DC SN340 NVMe SSD + 5011 WD PC SN810 / Black SN850 NVMe SSD + 501a WD Blue SN570 NVMe SSD +15b8 ADDI-DATA GmbH + 1001 APCI1516 SP controller (16 digi outputs) + 1003 APCI1032 SP controller (32 digi inputs w/ opto coupler) + 1004 APCI2032 SP controller (32 digi outputs) + 1005 APCI2200 SP controller (8/16 digi outputs (relay)) + 1006 APCI1564 SP controller (32 digi ins, 32 digi outs) + 100a APCI1696 SP controller (96 TTL I/Os) + 3001 APCI3501 SP controller (analog output board) + 300f APCI3600 Noise and vibration measurement board + 7001 APCI7420 2-port Serial Controller + 7002 APCI7300 Serial Controller +15b9 Maestro Digital Communications +15ba Impacct Technology Corp +15bb Portwell Inc +15bc Agilent Technologies + 0100 HPFC-5600 Tachyon DX2+ FC + 0103 QX4 PCI Express quad 4-gigabit Fibre Channel controller + 0105 Celerity FC-44XS/FC-42XS/FC-41XS/FC-44ES/FC-42ES/FC-41ES + 117c 0022 Celerity FC-42XS Fibre Channel Adapter + 117c 0025 Celerity FC-44ES Fibre Channel Adapter + 117c 0026 Celerity FC-42ES Fibre Channel Adapter + 1100 E8001-66442 PCI Express CIC + 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker + 2928 64 Bit, 66MHz PCI Exerciser & Analyzer + 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser +15bd DFI Inc +15be Sola Electronics +15bf High Tech Computer Corp (HTC) +15c0 BVM Ltd +15c1 Quantel +15c2 Newer Technology Inc +15c3 Taiwan Mycomp Co Ltd +15c4 EVSX Inc +15c5 Procomp Informatics Ltd + 8010 1394b - 1394 Firewire 3-Port Host Adapter Card +15c6 Technical University of Budapest +15c7 Tateyama System Laboratory Co Ltd + 0349 Tateyama C-PCI PLC/NC card Rev.01A +15c8 Penta Media Co Ltd +15c9 Serome Technology Inc +15ca Bitboys OY +15cb AG Electronics Ltd +15cc Hotrail Inc +15cd Dreamtech Co Ltd +15ce Genrad Inc +# https://www.hilscher.com/imprint/ +15cf Hilscher Gesellschaft für Systemautomation mbH + 0000 CIFX PCI/PCIe +15d1 Infineon Technologies AG +15d2 FIC (First International Computer Inc) +15d3 NDS Technologies Israel Ltd +15d4 Iwill Corp +15d5 Tatung Co +15d6 Entridia Corp +15d7 Rockwell-Collins Inc +15d8 Cybernetics Technology Co Ltd +15d9 Super Micro Computer Inc +15da Cyberfirm Inc +15db Applied Computing Systems Inc +15dc Litronic Inc + 0001 Argus 300 PCI Cryptography Module +15dd Sigmatel Inc +15de Malleable Technologies Inc +15df Infinilink Corp +15e0 Cacheflow Inc +15e1 Voice Technologies Group Inc +15e2 Quicknet Technologies Inc + 0500 PhoneJack-PCI +15e3 Networth Technologies Inc +15e4 VSN Systemen BV +15e5 Valley technologies Inc +15e6 Agere Inc +15e7 Get Engineering Corp +15e8 National Datacomm Corp + 0130 Wireless PCI Card + 0131 NCP130A2 Wireless NIC +15e9 Pacific Digital Corp + 1841 ADMA-100 DiscStaQ ATA Controller +15ea Tokyo Denshi Sekei K.K. +15eb DResearch Digital Media Systems GmbH +15ec Beckhoff GmbH + 3101 FC3101 Profibus DP 1 Channel PCI + 5102 FC5102 +15ed Macrolink Inc +15ee In Win Development Inc +15ef Intelligent Paradigm Inc +15f0 B-Tree Systems Inc +15f1 Times N Systems Inc +15f2 Diagnostic Instruments Inc +15f3 Digitmedia Corp +15f4 Valuesoft +15f5 Power Micro Research +15f6 Extreme Packet Device Inc +15f7 Banctec +15f8 Koga Electronics Co +15f9 Zenith Electronics Corp +15fa J.P. Axzam Corp +15fb Zilog Inc +15fc Techsan Electronics Co Ltd +15fd N-CUBED.NET +15fe Kinpo Electronics Inc +15ff Fastpoint Technologies Inc +1600 Northrop Grumman - Canada Ltd +1601 Tenta Technology +1602 Prosys-tec Inc +1603 Nokia Wireless Communications +1604 Central System Research Co Ltd +1605 Pairgain Technologies +1606 Europop AG +1607 Lava Semiconductor Manufacturing Inc +1608 Automated Wagering International +1609 Scimetric Instruments Inc +1612 Telesynergy Research Inc. +1618 Stone Ridge Technology + 0001 RDX 11 + 0002 HFT-01 + 0400 FarSync T2P (2 port X.21/V.35/V.24) + 0440 FarSync T4P (4 port X.21/V.35/V.24) + 0610 FarSync T1U (1 port X.21/V.35/V.24) + 0620 FarSync T2U (2 port X.21/V.35/V.24) + 0640 FarSync T4U (4 port X.21/V.35/V.24) + 1610 FarSync TE1 (T1,E1) + 2610 FarSync DSL-S1 (SHDSL) + 3640 FarSync T4E (4-port X.21/V.35/V.24) + 4620 FarSync T2Ue PCI Express (2-port X.21/V.35/V.24) + 4640 FarSync T4Ue PCI Express (4-port X.21/V.35/V.24) +1619 FarSite Communications Ltd + 0400 FarSync T2P (2 port X.21/V.35/V.24) + 0440 FarSync T4P (4 port X.21/V.35/V.24) + 0610 FarSync T1U (1 port X.21/V.35/V.24) + 0620 FarSync T2U (2 port X.21/V.35/V.24) + 0640 FarSync T4U (4 port X.21/V.35/V.24) + 1610 FarSync TE1 (T1,E1) + 1612 FarSync TE1 PCI Express (T1,E1) + 2610 FarSync DSL-S1 (SHDSL) + 3640 FarSync T4E (4-port X.21/V.35/V.24) + 4620 FarSync T2Ue PCI Express (2-port X.21/V.35/V.24) + 4640 FarSync T4Ue PCI Express (4-port X.21/V.35/V.24) + 5621 FarSync T2Ee PCI Express (2 port X.21/V.35/V.24) + 5641 FarSync T4Ee PCI Express (4 port X.21/V.35/V.24) + 6620 FarSync T2U-PMC PCI Express (2 port X.21/V.35/V.24) +161f Rioworks +1621 Lynx Studio Technology, Inc. + 0020 LynxTWO-A + 0021 LynxTWO-B + 0022 LynxTWO-C + 0023 Lynx L22 + 0024 Lynx AES16 + 0025 Lynx AES16-SRC + 0028 Lynx AES16e +1626 TDK Semiconductor Corp. + 8410 RTL81xx Fast Ethernet +1629 Kongsberg Spacetec AS + 1003 Format synchronizer v3.0 + 1006 Format synchronizer, model 10500 + 1007 Format synchronizer, model 21000 + 2002 Fast Universal Data Output + 3100 IO31000 Frame Synchronizer and I/O + 3200 IO32000 Frame Synchronizer and I/O + 4002 High Rate Demodulator + 5001 High Rate FEC + 6001 High Rate Demodulator and FEC +1631 Packard Bell B.V. +1638 Standard Microsystems Corp [SMC] + 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000 +163c Smart Link Ltd. + 3052 SmartLink SmartPCI562 56K Modem + 5449 SmartPCI561 Modem +1641 MKNet Corp. +1642 Bitland(ShenZhen) Information Technology Co., Ltd. +# nee Brocade Communications Systems, Inc. +1657 Cavium QLogic + 0013 425/825/42B/82B 4Gbps/8Gbps PCIe dual port FC HBA + 103c 1742 82B 8Gbps dual port FC HBA + 103c 1744 42B 4Gbps dual port FC HBA + 1657 0014 425/825 4Gbps/8Gbps PCIe dual port FC HBA + 0014 1010/1020/1007/1741 10Gbps CNA + 1657 0014 1010/1020/1007/1741 10Gbps CNA - FCOE + 1657 0015 1010/1020/1007/1741 10Gbps CNA - LL + 0017 415/815/41B/81B 4Gbps/8Gbps PCIe single port FC HBA + 103c 1741 41B 4Gbps single port FC HBA + 103c 1743 81B 8Gbps single port FC HBA + 1657 0014 415/815 4Gbps/8Gbps single port PCIe FC HBA + 0021 804 8Gbps FC HBA for HP Bladesystem c-class + 0022 BR-1860 Fabric Adapter + 1657 0022 10Gbps CNA - FCOE + 1657 0023 10Gbps CNA - LL + 1657 0024 16Gbps FC HBA +# Mezz card for IBM + 0023 1867/1869 16Gbps FC HBA +# Same Device_ID used for 410 (1port) and 420 (2 port) HBAs. + 0646 400 4Gbps PCIe FC HBA +165a Epix Inc + c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232] + d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232] + d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232] + eb01 PIXCI(R) EB1 PCI Camera Link Video Capture Board +# Gidel Reconfigurable Computing +165c Gidel Ltd. + 5361 PROCStarII60-1 + 5362 PROCStarII60-2 + 5364 PROCStarII60-4 + 5435 ProcSparkII + 5661 ProcE60 + 56e1 ProcE180 + 5911 ProcStarIII110-1 + 5912 ProcStarIII110-2 + 5913 ProcStarIII110-3 + 5914 ProcStarIII110-4 + 5921 ProcStarIII150-1 + 5922 ProcStarIII150-2 + 5923 ProcStarIII150-3 + 5924 ProcStarIII150-4 + 5931 ProcStarIII260-1 + 5932 ProcStarIII260-2 + 5933 ProcStarIII260-3 + 5934 ProcStarIII260-4 + 5941 ProcStarIII340-1 + 5942 ProcStarIII340-2 + 5943 ProcStarIII340-3 + 5944 ProcStarIII340-4 + 5a01 ProceIII80 + 5a11 ProceIII110 + 5a21 ProceIII150 + 5a31 ProceIII260 + 5a41 ProceIII340 + 5b51 ProceIV360 + 5b61 ProceIV530 + 5b71 ProceIV820 + 5c01 ProcStarIV80-1 + 5c02 ProcStarIV80-2 + 5c03 ProcStarIV80-3 + 5c04 ProcStarIV80-4 + 5c11 ProcStarIV110-1 + 5c12 ProcStarIV110-2 + 5c13 ProcStarIV110-3 + 5c14 ProcStarIV110-4 + 5c51 ProcStarIV360-1 + 5c52 ProcStarIV360-2 + 5c53 ProcStarIV360-3 + 5c54 ProcStarIV360-4 + 5c61 ProcStarIV530-1 + 5c62 ProcStarIV530-2 + 5c63 ProcStarIV530-3 + 5c64 ProcStarIV530-4 + 5c71 ProcStarIV820-1 + 5c72 ProcStarIV820-2 + 5c73 ProcStarIV820-3 + 5c74 ProcStarIV820-4 + 5d01 Proc10480 + 5d11 Proc104110 + 5f01 ProceV_A3 + 5f11 ProceV_A7 + 5f21 ProceV_AB + 5f31 ProceV_D5 + 5f41 ProceV_D8 + 6732 Proc6M + 6832 Proc12M + 7101 Proc10a_27 + 7111 Proc10a_48 + 7121 Proc10a_66 + 7141 Proc10a_115 + 7181 Proc10a_27S + 7191 Proc10a_48S + 71a1 Proc10a_66S + 71b1 Proc10A + 72b1 HawkEye + 73b1 Proc10s +165d Hsing Tech. Enterprise Co., Ltd. +165f Linux Media Labs, LLC + 1020 LMLM4 MPEG-4 encoder +1661 Worldspace Corp. +1668 Actiontec Electronics Inc + 0100 Mini-PCI bridge +# Formerly SiByte, Inc. +166d Broadcom Corporation + 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI + 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport + 0012 SiByte BCM1280/BCM1480 System-on-a-Chip PCI-X + 0014 Sibyte BCM1280/BCM1480 System-on-a-Chip HyperTransport +1677 B&R Industrial Automation GmbH + 104e 5LS172.6 B&R Dual CAN Interface Card + 12d7 5LS172.61 B&R Dual CAN Interface Card + 20ad 5ACPCI.MFIO-K01 Profibus DP / K-Feldbus / COM +1678 NetEffect + 0100 NE020 10Gb Accelerated Ethernet Adapter (iWARP RNIC) +1679 Tokyo Electron Device Ltd. + 3000 SD Standard host controller [Ellen] +167b ZyDAS Technology Corp. + 2102 ZyDAS ZD1202 + 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card + 187e 3407 ZyAIR B-320 802.11b Wireless PCI Adapter + 2116 ZD1212B Wireless Adapter +167d Samsung Electro-Mechanics Co., Ltd. + a000 MagicLAN SWL-2210P 802.11b [Intersil ISL3874] +167e ONNTO Corp. +1681 Hercules +1682 XFX Pine Group Inc. + 5701 Radeon 5700 XT Thicc III Ultra + c580 Radeon RX 580 +1688 CastleNet Technology Inc. + 1170 WLAN 802.11b card +168a Utimaco IS GmbH + 2086 CryptoServer Se-Series Hardware Security Module + c040 CryptoServer CSe-Series Hardware Security Module + c051 CryptoServer Se-Series Gen2 Hardware Security Module + c070 u.trust Anchor Hardware Security Module cs7.2 Series + c071 u.trust Anchor Hardware Security Module cs7.3 Series + c072 u.trust Anchor Hardware Security Module cs7.3 Series Virtual Function +# nee Atheros Communications, Inc. +168c Qualcomm Atheros + 0007 AR5210 Wireless Network Adapter [AR5000 802.11a] + 1737 0007 WPC54A Wireless PC Card + 1b47 0100 Harmony 8450CN Wireless CardBus Module + 1b47 0110 Skyline 4030 / Harmony 8450 802.11a Wireless CardBus Adapter + 8086 2501 PRO/Wireless 5000 LAN PCI Adapter Module + 0011 AR5211 Wireless Network Adapter [AR5001A 802.11a] + 0012 AR5211 Wireless Network Adapter [AR5001X 802.11ab] + 1186 3a03 AirPro DWL-A650 Wireless Cardbus Adapter (rev.B) + 1186 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter + 1186 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter + 126c 8031 2201 Mobile Adapter + 1385 4400 WAB501 802.11ab Wireless CardBus Card + 1b47 aa00 8460 802.11ab Wireless CardBus Adapter + 0013 AR5212/5213/2414 Wireless Network Adapter + 0308 3402 AG-100 802.11ag Wireless Cardbus Adapter + 0308 3405 G-102 v2 802.11g Wireless Cardbus Adapter + 0308 3408 G-170S 802.11g Wireless CardBus Adapter + 0e11 00e5 NC6000/NC8000 laptop + 10b7 6002 3CRWE154A72 802.11abg Cardbus Adapter + 1113 d301 Philips CPWNA100 Wireless CardBus adapter + 1113 ee23 SMCWPCIT-G 108Mbps Wireless PCI adapter + 1154 033b Buffalo WLI-CB-AMG54 + 1154 034e Buffalo WLI-CB-AG108HP 802.11abg Cardbus Adapter + 1186 3202 DWL-G650 (Rev B3,B5) Wireless cardbus adapter + 1186 3203 AirPlus DWL-G520 Wireless PCI Adapter (rev. A) + 1186 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter + 1186 3a08 AirXpert DWL-AG520 Wireless PCI Adapter + 1186 3a12 D-Link AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C) + 1186 3a13 AirPlus DWL-G520 Wireless PCI Adapter (rev. B) + 1186 3a14 AirPremier AG DWL-AG530 Wireless PCI Adapter (rev.A) + 1186 3a17 D-Link AirPremier DWL-G680 Wireless Cardbus Adapter + 1186 3a18 D-Link AirPremier DWL-G550 Wireless PCI Adapter + 1186 3a1a WNA-2330 802.11bg Wireless CardBus Adapter + 1186 3a63 D-Link AirPremier DWL-AG660 Wireless Cardbus Adapter + 1186 3a93 Conceptronic C54I Wireless 801.11g PCI card + 1186 3a94 Conceptronic C54C 802.11g Wireless Cardbus Adapter + 1186 3ab0 Allnet ALL0281 Wireless PCI Card + 1385 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card + 1385 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card + 1385 4900 WG311v1 802.11g Wireless PCI Adapter + 1385 4a00 WAG311 802.11a/g Wireless PCI Adapter + 1385 4b00 WG511T 108 Mbps Wireless PC Card (rev.A/B) + 1385 4d00 WG311T 108 Mbps Wireless PCI Adapter (rev.A2) + 1385 4f00 WG511U Double 108 Mbps Wireless PC Card + 1385 5a00 WG311T (rev.A3 v1h3/v1h4) 108 Mbps Wireless PCI Adapter [AR2412] + 1385 5b00 WG511T 108 Mbps Wireless PC Card (rev.C) + 1385 5d00 WPN511 RangeMax Wireless PC Card + 1458 e911 GN-WIAG02 + 1468 0403 U10H014 802.11g Cardbus Adapter + 1468 0408 ThinkPad 11b/g Wireless LAN Mini PCI Adapter + 14b7 0a10 8480-WD 802.11abg Cardbus Adapter + 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter + 14b7 aa30 8800-FC 802.11bg Cardbus Adapter + 14b7 aa40 8470-WD 802.11bg Cardbus Adapter + 14b9 cb21 CB21 802.11a/b/g Cardbus Adapter + 1668 1026 IBM HighRate 11 a/b/g Wireless CardBus Adapter + 168c 0013 AirPlus XtremeG DWL-G650 Wireless PCMCIA Adapter + 168c 1025 DWL-G650B2 Wireless CardBus Adapter + 168c 1027 Engenius NL-3054CB ARIES b/g CardBus Adapter + 168c 1042 Ubiquiti Networks SuperRange a/b/g Cardbus Adapter + 168c 1051 EZ Connect g 802.11g 108Mbps Wireless PCI Adapter + 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter + 168c 2027 D-Link AirPlus DWL-G520 Wireless PCI Adapter (rev. A) + 168c 2041 Engenius 5354MP Plus ARIES2 b/g MiniPCI Adapter + 168c 2042 Engenius 5354MP Plus ARIES2 a/b/g MiniPCI Adapter + 168c 2051 TRENDnet TEW-443PI Wireless PCI Adapter + 16a5 160a BWP712 802.11bg Wireless CardBus Adapter + 16ab 7302 Trust Speedshare Turbo Pro Wireless PCI Adapter + 1737 0017 WPC55AG + 1737 0026 WMP55AG v1.1 + 1737 0035 WPC55AG v1.2 802.11abg Cardbus Adapter + 1737 0036 WMP55AG v1.2 802.11abg PCI Adapter + 1799 3000 F6D3000 Dual-Band Wireless A+G Desktop Card + 1799 3010 F6D3010 Dual-Band Wireless A+G Notebook Card + 17cf 0042 Z-COMAX Highpower XG-622H (400mw) 802.11b/g mini-PCI Adapter + 185f 1012 CM9 Wireless a/b/g MiniPCI Adapter + 185f 2012 Wistron NeWeb WLAN a+b+g model CB9 + a727 6801 3CRXJK10075 OfficeConnect Wireless 108Mbps 11g XJACK PC Card + 001a AR2413/AR2414 Wireless Network Adapter [AR5005G(S) 802.11bg] + 1052 168c Sweex Wireless Lan PC Card 54Mbps + 1113 ee20 SMC Wireless CardBus Adapter 802.11g (SMCWCB-G EU) + 1113 ee24 SMC Wireless PCI Card WPCI-G + 1186 3a15 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.D1) + 1186 3a16 AirPlus G DWL-G510 Wireless PCI Adapter(rev.B) + 1186 3a1c WNA-1330 Notebook Adapter + 1186 3a1d WDA-1320 Desktop Adapter + 1186 3a23 AirPlus G DWL-G520+A Wireless PCI Adapter + 1186 3a24 AirPlus G DWL-G650+A Wireless Cardbus Adapter + 1186 3b08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.C1) + 168c 001a Belkin FD7000 + 168c 1052 TP-Link TL-WN510G Wireless CardBus Adapter + 168c 2052 Compex Wireless 802.11 b/g MiniPCI Adapter, Rev A1 [WLM54G] + 16ec 0122 Wireless PCI Adapter Model 5418 + 1737 0053 WPC54G v7 802.11g Wireless-G Notebook Adapter + 1799 700c F5D7000 v5000 Wireless G Desktop Card + 1799 701d F5D7010 v5000 Wireless G Notebook Card + 17f9 0008 DX-WGNBC 802.11bg Wireless CardBus Adapter + 17f9 0018 DX-WGDTC 802.11bg Wireless PCI Adapter + 001b AR5413/AR5414 Wireless Network Adapter [AR5006X(S) 802.11abg] +# Atheros AR5414 32-bit mini-PCI type IIIB + 0777 1107 UB5 802.11a Wireless Mini PCI Adapter + 0777 3002 XR2 802.11g Wireless Mini PCI Adapter + 0777 3005 XR5 802.11a Wireless Mini PCI Adapter + 0777 3009 XR9 900MHz Wireless Mini PCI Adapter + 1154 034e WLI-CB-AG108HP 802.11abg Wireless CardBus Adapter + 1186 3a19 D-Link AirPremier AG DWL-AG660 Wireless Cardbus Adapter + 1186 3a22 AirPremier AG DWL-AG530 Wireless PCI Adapter (rev.B) + 11ad 5001 WN5301A 802.11bg Wireless PCI Adapter + 1458 e901 GN-WI01HT Wireless a/b/g MiniPCI Adapter + 168c 001b Wireless LAN PCI LiteOn + 168c 1062 IPN-W100CB 802.11abg Wireless CardBus Adapter + 168c 2062 EnGenius EMP-8602 (400mw) or Compex WLM54AG (SuperAG) + 168c 2063 EnGenius EMP-8602 (400mw) or Compex WLM54AG + 17f9 000b WL-711A 802.11abg Wireless CardBus Adapter + 17f9 000c WPIA-112AG 802.11abg Wireless PCI Adapter + 17f9 000d PC-686X 802.11abg Wireless Mini PCI Adapter + 185f 1600 DCMA-82 High Power WLAN 802.11a/b/g mini-PCI Module (Super A/G, eXtended Range, 400mW) + 1948 3aba RBTBJ-AW 802.11abg Wireless Cardbus Adapter + a727 6804 Wireless 11a/b/g PC Card with XJACK(r) Antenna + 001c AR242x / AR542x Wireless Network Adapter (PCI-Express) + 0777 3006 SRX 802.11abg Wireless ExpressCard Adapter + 103c 137a AR5BXB63 (Foxconn) 802.11bg Mini PCIe NIC + 106b 0086 AirPort Extreme + 144f 7106 WLL3140 (Toshiba PA3501U-1MPC) 802.11bg Wireless Mini PCIe Card + 144f 7128 WLL3141 (Toshiba PA3613U-1MPC) 802.11bg Wireless Mini PCIe Card + 1468 0428 AR5BXB63 802.11bg NIC + 1468 042a AR5007EG 802.11bg NIC + 147b 1033 AirPace Wi-Fi + 168c 001c AR242x 802.11abg NIC (PCI Express) + 168c 3061 AR5006EGS 802.11bg NIC (2.4GHz, PCI Express) + 168c 3062 AR5006EXS 802.11abg NIC (2.4/5.0GHz, PCI Express) + 168c 3063 AR5006EX 802.11abg NIC (2.4/5.0GHz, PCI Express) + 168c 3065 AR5006EG 802.11bg NIC (2.4GHz, PCI Express) + 168c 3067 AR242x 802.11abg Wireless PCI Express Adapter (rev 01) + 1a3b 1026 AW-GE780 802.11bg Wireless Mini PCIe Card + 001d AR2417 Wireless Network Adapter [AR5007G 802.11bg] + 1799 720b F5D7000 v8000 Wireless G Desktop Card + 1799 721b F5D7010 v8000 Wireless G Notebook Card +# the name AR5005VL is used for some AR5513 based designs + 0020 AR5513 802.11abg Wireless NIC + 0308 3407 M-102 802.11g Wireless Cardbus Adapter + 1186 3a67 DWL-G650M Super G MIMO Wireless Notebook Adapter + 1186 3a68 DWL-G520M Wireless 108G MIMO Desktop Adapter + 187e 340e M-302 802.11g Wireless PCI Adapter + 1976 2003 TEW-601PC 802.11g Wireless CardBus Adapter + 0023 AR5416 Wireless Network Adapter [AR5008 802.11(a)bgn] + 0308 340b NWD-170N 802.11bgn Wireless CardBus Adapter + 1154 0365 Buffalo WLP-CB-AG300 802.11abgn Cardbus Adapter + 1154 0367 WLI-CB-AG301N 802.11abgn Wireless CardBus Adapter + 1186 3a6a DWA-642 802.11n RangeBooster N CardBus Adapter + 1186 3a6b DWA-547 802.11n RangeBooster N 650 DeskTop Adapter + 1186 3a6d DWA-552 802.11n Xtreme N Desktop Adapter (rev A1) + 1186 3a76 DWA-645 802.11n RangeBooster N 650 Notebook Adapter (rev A1) + 1737 0059 WPC300N v2 Wireless-N Notebook Adapter + 1737 0069 WPC100 v1 802.11n RangePlus Wireless Notebook Adapter + 1737 0072 WMP110 v1 802.11n RangePlus Wireless PCI Adapter + 1799 8011 F5D8011 v1 802.11n N1 Wireless Notebook Card + 187e 3411 NWD-370N 802.11n Wireless PCI Adapter + 1976 2008 TEW-621PC 802.11bgn Wireless CardBus Adapter + 0024 AR5418 Wireless Network Adapter [AR5008E 802.11(a)bgn] (PCI-Express) + 106b 0087 AirPort Extreme + 1186 3a70 DWA-556 Xtreme N PCI Express Desktop Adapter + 0027 AR9160 Wireless Network Adapter [AR9001 802.11(a)bgn] + 0777 4082 SR71-A 802.11abgn Wireless Mini PCI Adapter + 0029 AR922X Wireless Network Adapter + 0777 4005 SR71-15 802.11an Mini PCI Adapter + 1186 3a7a DWA-552 802.11n Xtreme N Desktop Adapter (rev A2) + 1186 3a7d DWA-552 802.11n Xtreme N Desktop Adapter (rev A3) + 168c 0029 AR922X Wireless Network Adapter + 168c 2096 Compex WLM200NX / Wistron DNMA-92 + 002a AR928X Wireless Network Adapter (PCI-Express) + 0777 4f05 SR71-X 802.11abgn Wireless ExpressCard Adapter [AR9280] + 103c 3041 AR5BHB92-H 802.11abgn Wireless Half-size Mini PCIe Card [AR9280] + 103c 3042 AzureWave AW-NE773 802.11abgn Wireless Half-size Mini PCIe Card [AR9280] + 105b e006 T77H053.00 802.11bgn Wireless Mini PCIe Card [AR9281] + 105b e01f T77H047.31 802.11bgn Wireless Half-size Mini PCIe Card [AR9283] + 106b 008f AirPort Extreme + 11ad 6600 WN6600A 802.11bgn Wireless Mini PCIe Card [AR9281] + 144f 7141 WLL6080 802.11bgn Wireless Mini PCIe Card [AR9281] + 168c 0203 DW1525 802.11abgn WLAN PCIe Card [AR9280] + 1a32 0303 EM303 802.11bgn Wireless Mini PCIe Card [AR9281] + 1a32 0306 EM306 802.11bgn Wireless Half-size Mini PCIe Card [AR9283] + 1a3b 1067 AW-NE771 802.11bgn Wireless Mini PCIe Card [AR9281] + 1a3b 1071 AW-NE772 802.11abgn Wireless Mini PCIe Card [AR9280] + 1a3b 1081 AW-NE773 802.11abgn Wireless Half-size Mini PCIe Card [AR9280] + 002b AR9285 Wireless Network Adapter (PCI-Express) + 1028 0204 Wireless 1502 802.11bgn Half-size Mini PCIe Card + 1028 0205 Wireless 1702 802.11bgn Half-size Mini PCIe Card [AR9002WB-1NGCD] + 103c 303f U98Z062.10 802.11bgn Wireless Half-size Mini PCIe Card + 103c 3040 U98Z062.12 802.11bgn Wireless Half-size Mini PCIe Card + 105b e017 T77H126.00 802.11bgn Wireless Half-size Mini PCIe Card + 105b e023 T77H121.04 802.11bgn Wireless Half-size Mini PCIe Card + 105b e025 T77H121.05 802.11bgn Wireless Half-size Mini PCIe Card + 1113 e811 WN7811A (Toshiba PA3722U-1MPC) 802.11bgn Wireless Half-size Mini PCIe Card + 185f 30af DNXA-95 802.11bgn Wireless Half-size Mini PCIe Card + 1931 0023 Option GTM67x PCIe WiFi Adapter + 1a3b 1089 AW-NE785 / AW-NE785H 802.11bgn Wireless Full or Half-size Mini PCIe Card + 1a3b 2c37 AW-NB037H 802.11bgn Wireless Half-size Mini PCIe Card [AR9002WB-1NGCD] + 1b9a 0401 XW204E 802.11bgn Wireless Half-size Mini PCIe Card + 1b9a 0c03 WB214E 802.11bgn Wireless Half-size Mini PCIe Card [AR9002WB-1NGCD] + 002c AR2427 802.11bg Wireless Network Adapter (PCI-Express) + 002d AR9227 Wireless Network Adapter + 002e AR9287 Wireless Network Adapter (PCI-Express) + 105b e034 T77H167.00 + 0030 AR93xx Wireless Network Adapter + 103c 1627 AR9380/HB112 802.11abgn 3×3 Wi-Fi Adapter + 106b 009a AirPort Extreme + 1186 3a7e DWA-566 Wireless N 300 Dual Band PCIe Desktop Adapter + 1a56 2000 Killer Wireless-N 1102 Half-size Mini PCIe Card [AR9382] + 1a56 2001 Killer Wireless-N 1103 Half-size Mini PCIe Card [AR9380] + 0032 AR9485 Wireless Network Adapter + 1028 0208 Wireless 1506 WLAN Half Mini-Card + 103c 1838 AR9485/HB125 802.11bgn 1×1 Wi-Fi Adapter + 105b e044 Unex DHXA-225 + 144d 410e AR9485WB-EG 802.11b/g/n mini-PCIe card on a series 3 laptop + 1a3b 1186 AW-NE186H + 0033 AR958x 802.11abgn Wireless Network Adapter + 168c a120 AR9582 802.11a/n WLAN Mini-PCIe Adapter + 0034 AR9462 Wireless Network Adapter + 1028 020b Wireless 1601 802.11abgn Adapter + 1028 0300 Wireless 1802 802.11abgn Adapter + 1a56 2003 Killer Wireless-N 1202 Half-size Mini PCIe Card + 0036 QCA9565 / AR9565 Wireless Network Adapter + 1028 020e Vostro 3470 + 0037 AR9485 Wireless Network Adapter +# Also used as Gigabyte GC-WB150 on a PCIe-to-mini-PCIe converter + 1a3b 2100 AW-NB100H 802.11n Wireless Mini PCIe Card + 003c QCA986x/988x 802.11ac Wireless Network Adapter + 003e QCA6174 802.11ac Wireless Network Adapter + 1a56 143a Killer 1435 Wireless-AC + 1a56 1525 Killer N1525 Wireless-AC + 1a56 1535 Killer Wireless-n/a/ac 1535 Wireless Network Adapter + 0040 QCA9980/9990 802.11ac Wireless Network Adapter + 0041 QCA6164 802.11ac Wireless Network Adapter + 0042 QCA9377 802.11ac Wireless Network Adapter + 11ad 08a6 Qualcomm Atheros QCA9377 802.11ac Wireless Network Adapter +# compatible with Lenovo's BIOS lock + 17aa 0901 Qualcomm Atheros QCA9377 Wireless Network Adapter + 0046 QCA9984 802.11ac Wave 2 Wireless Network Adapter + 0050 QCA9887 802.11ac Wireless Network Adapter + 0207 AR5210 Wireless Network Adapter [AR5000 802.11a] + 1014 AR5212 802.11abg NIC + 1014 058a ThinkPad 11a/b/g Wireless LAN Mini Express Adapter (AR5BXB6) + 9013 AR5002X Wireless Network Adapter + ff19 AR5006X Wireless Network Adapter + ff1b AR2425 Wireless Network Adapter [AR5007EG 802.11bg] + ff1c AR5008 Wireless Network Adapter + ff1d AR922x Wireless Network Adapter +# Found in "AVM Fritz!Box FON WLAN 7270v3" + 168c ee1c AR9220-AC1A [AVM Fritz!Box FON WLAN 7270 v3] +1695 EPoX Computer Co., Ltd. +169c Netcell Corporation + 0044 Revolution Storage Processing Card +# The right ID is 196d, but they got it nibble-swapped in 2202. +169d Club-3D VB (Wrong ID) +16a5 Tekram Technology Co.,Ltd. +16ab Global Sun Technology Inc + 1100 GL24110P + 1101 PLX9052 PCMCIA-to-PCI Wireless LAN + 1102 PCMCIA-to-PCI Wireless Network Bridge + 8501 WL-8305 Wireless LAN PCI Adapter +16ae SafeNet Inc + 0001 SafeXcel 1140 + 000a SafeXcel 1841 + 1141 SafeXcel 1141 +# misused vendor ID 0001 + 0001 0001 SafeXcel 1141 v. 1.1 + 1841 SafeXcel 1842 +16af SparkLAN Communications, Inc. +16b4 Aspex Semiconductor Ltd +16b8 Sonnet Technologies, Inc. +16be Creatix Polymedia GmbH +16c3 Synopsys, Inc. + abcd DWC_usb3 / PCIe bridge + abce DWC_usb3 + abcf DWC_usb31 + edda EPMockUp +16c6 Micrel-Kendin + 8695 Centaur KS8695 ARM processor + 8842 KSZ8842-PMQL 2-Port Ethernet Switch +16c8 Octasic Inc. +16c9 EONIC B.V. The Netherlands +16ca CENATEK Inc + 0001 Rocket Drive DL +# nee Innocore Gaming Ltd., nee Densitron Gaming Ltd., a division of Densitron Technologies +16cd Advantech Co. Ltd + 0101 DirectPCI SRAM for DPX-11x series + 0102 DirectPCI SRAM for DPX-S/C/E-series + 0103 DirectPCI ROM for DPX-11x series + 0104 DirectPCI ROM for DPX-S/C/E-series + 0105 DirectPCI I/O for DPX-114/DPX-115 + 0106 DirectPCI I/O for DPX-116 + 0107 DirectPCI I/O for DPX-116U + 0108 DirectPCI I/O for DPX-117 + 0109 DirectPCI I/O for DPX-112 + 010a DirectPCI I/O for DPX-C/E-series + 010b DirectPCI I/O for DPX-S series +16ce Roland Corp. +16d5 Acromag, Inc. + 0504 PMC-DX504 Reconfigurable FPGA with LVDS I/O + 0520 PMC520 Serial Communication, 232 Octal + 0521 PMC521 Serial Communication, 422/485 Octal + 1020 PMC-AX1020 Reconfigurable FPGA with A/D & D/A + 1065 PMC-AX1065 Reconfigurable FPGA with A/D & D/A + 2004 PMC-DX2004 Reconfigurable FPGA with LVDS I/O + 2020 PMC-AX2020 Reconfigurable FPGA with A/D & D/A + 2065 PMC-AX2065 Reconfigurable FPGA with A/D & D/A + 3020 PMC-AX3020 Reconfigurable FPGA with A/D & D/A + 3065 PMC-AX3065 Reconfigurable FPGA with A/D & D/A + 4243 PMC424, APC424, AcPC424 Digital I/O and Counter Timer Module + 4248 PMC464, APC464, AcPC464 Digital I/O and Counter Timer Module + 424b PMC-DX2002 Reconfigurable FPGA with Differential I/O + 4253 PMC-DX503 Reconfigurable FPGA with TTL and Differential I/O + 4312 PMC-CX1002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O + 4313 PMC-CX1003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O + 4322 PMC-CX2002 Reconfigurable Conduction-Cooled FPGA Virtex-II with Differential I/O + 4323 PMC-CX2003 Reconfigurable Conduction-Cooled FPGA Virtex-II with CMOS and Differential I/O + 4350 PMC-DX501 Reconfigurable Digital I/O Module + 4353 PMC-DX2003 Reconfigurable FPGA with TTL and Differential I/O + 4357 PMC-DX502 Reconfigurable Differential I/O Module + 4457 PMC730, APC730, AcPC730 Multifunction Module + 4471 XMC730 Multi-function I/O module with front I/O + 4473 XMC730CC Multi-function I/O module with rear I/O Conduction-cooled + 464d PMC408 32-Channel Digital Input/Output Module + 4850 PMC220-16 12-Bit Analog Output Module + 4a42 PMC483, APC483, AcPC483 Counter Timer Module + 4a50 PMC484, APC484, AcPC484 Counter Timer Module + 4a56 PMC230 16-Bit Analog Output Module + 4b47 PMC330, APC330, AcPC330 Analog Input Module, 16-bit A/D + 4c40 PMC-LX40 Reconfigurable Virtex-4 FPGA with plug-in I/O + 4c60 PMC-LX60 Reconfigurable Virtex-4 FPGA with plug-in I/O + 4d4d PMC341, APC341, AcPC341 Analog Input Module, Simultaneous Sample & Hold + 4d4e PMC482, APC482, AcPC482 Counter Timer Board + 524d PMC-DX2001 Reconfigurable FPGA with TTL I/O + 5335 PMC-SX35 Reconfigurable Virtex-4 FPGA with plug-in I/O + 5456 PMC470 48-Channel Digital Input/Output Module + 5601 PMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5602 PMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5603 PMC-VSX95 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5604 PMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5605 PMC-VFX70 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5606 PMC-VLX155-1M Reconfigurable Virtex-5 FPGA with plug-in I/O + 5701 PMC-SLX150: Reconfigurable Spartan-6 FPGA with plug-in I/O + 5702 PMC-SLX150-1M: Reconfigurable Spartan-6 FPGA with plug-in I/O + 5801 XMC-VLX85 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5802 XMC-VLX110 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5803 XMC-VSX95 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5804 XMC-VLX155 Reconfigurable Virtex-5 FPGA with plug-in I/O + 5807 XMC-SLX150: Reconfigurable Spartan-6 FPGA with plug-in I/O + 5808 XMC-SLX150-1M: Reconfigurable Spartan-6 FPGA with plug-in I/O + 5901 APCe8650 PCI Express IndustryPack Carrier Card + 6301 XMC Module with user-configurable Virtex-6 FPGA, 240k logic cells, SFP front I/O + 6302 XMC Module with user-configurable Virtex-6 FPGA, 365k logic cells, SFP front I/O + 6303 XMC Module with user-configurable Virtex-6 FPGA, 240k logic cells, no front I/O + 6304 XMC Module with user-configurable Virtex-6 FPGA, 365k logic cells, no front I/O + 7000 XMC-7K325F: User-configurable Kintex-7 FPGA, 325k logic cells plus SFP front I/O + 7001 XMC-7K410F: User-configurable Kintex-7 FPGA, 410k logic cells plus SFP front I/O + 7002 XMC-7K325AX: User-Configurable Kintex-7 FPGA, 325k logic cells with AXM Plug-In I/O + 7003 XMC-7K410AX: User-Configurable Kintex-7 FPGA, 410k logic cells with AXM Plug-In I/O + 7004 XMC-7K325CC: User-Configurable Kintex-7 FPGA, 325k logic cells, conduction-cooled + 7005 XMC-7K410CC: User-Configurable Kintex-7 FPGA, 410k logic cells, conduction-cooled + 7006 XMC-7A200: User-Configurable Artix-7 FPGA, 200k logic cells with Plug-In I/O + 7007 XMC-7A200CC: User-Configurable Conduction-Cooled Artix-7 FPGA, with 200k logic cells + 7011 AP440-1: 32-Channel Isolated Digital Input Module + 7012 AP440-2: 32-Channel Isolated Digital Input Module + 7013 AP440-3: 32-Channel Isolated Digital Input Module + 7014 AP445: 32-Channel Isolated Digital Output Module + 7015 AP471 48-Channel TTL Level Digital Input/Output Module + 7016 AP470 48-Channel TTL Level Digital Input/Output Module + 7017 AP323 16-bit, 20 or 40 Channel Analog Input Module + 7018 AP408: 32-Channel Digital I/O Module + 7019 AP341 14-bit, 16-Channel Simultaneous Conversion Analog Input Module + 701a AP220-16 12-Bit, 16-Channel Analog Output Module + 701b AP231-16 16-Bit, 16-Channel Analog Output Module + 701c AP225 12-Bit, 16-Channel Analog Output Module with Waveform Memory + 701d AP235 16-Bit, 16-Channel Analog Output Module with Waveform Memory + 7021 APA7-201 Reconfigurable Artix-7 FPGA module 48 TTL channels + 7022 APA7-202 Reconfigurable Artix-7 FPGA module 24 RS485 channels + 7023 APA7-203 Reconfigurable Artix-7 FPGA module 24 TTL & 12 RS485 channels + 7024 APA7-204 Reconfigurable Artix-7 FPGA module 24 LVDS channels + 7027 AP418 16-Channel High Voltage Digital Input/Output Module + 7029 AP342 14-bit, 12-Channel Isolated Simultaneous Conversion Analog Input Module + 702a AP226 12-Bit, 8-Channel Isolated Analog Output Module + 702b AP236 16-Bit, 8-Channel Isolated Analog Output Module + 702c AP560A Module 4 Independent isolated CAN bus channels + 7031 AP441-1: 32-Channel Isolated Digital Input Module + 7032 AP441-2: 32-Channel Isolated Digital Input Module + 7033 AP441-3: 32-Channel Isolated Digital Input Module + 7042 AP482 Counter Timer Module with TTL Level Input/Output + 7043 AP483 Counter Timer Module with TTL Level and RS422 Input/Output + 7044 AP484 Counter Timer Module with RS422 Input/Output + 7051 APA7-501 Reconfigurable Artix-7 52,160 Cell FPGA module 48 TTL channels + 7052 APA7-502 Reconfigurable Artix-7 52,160 Cell FPGA module 24 RS485 channels + 7053 APA7-503 Reconfigurable Artix-7 52,160 Cell FPGA module 24 TTL & 12 RS485 channels + 7054 APA7-504 Reconfigurable Artix-7 52,160 Cell FPGA module 24 LVDS channels + 7073 AP730 Multi-function I/O Module 16 Digital I/O 8 Differential Analog In 4 Analog Out +16da Advantech Co., Ltd. + 0011 INES GPIB-PCI +16df PIKA Technologies Inc. +16e2 Geotest-MTS +16e3 European Space Agency + 1e0f LEON2FT Processor +16e5 Intellon Corp. + 6000 INT6000 Ethernet-to-Powerline Bridge [HomePlug AV] + 6300 INT6300 Ethernet-to-Powerline Bridge [HomePlug AV] +16ec U.S. Robotics + 00ed USR997900 + 0116 USR997902 10/100/1000 Mbps PCI Network Card + 2f00 USR5660A (USR265660A, USR5660A-BP) 56K PCI Faxmodem + 3685 Wireless Access PCI Adapter Model 022415 + 4320 USR997904 10/100/1000 64-bit NIC (Marvell Yukon) + ab06 USR997901A 10/100 Cardbus NIC +16ed Sycron N. V. + 1001 UMIO communication card +16f2 ETAS GmbH + 0200 I/O board + 16f2 0010 ES53xx I/O board +16f3 Jetway Information Co., Ltd. +16f4 Vweb Corp + 8000 VW2010 +16f6 VideoTele.com, Inc. +1702 Internet Machines Corporation (IMC) +1705 Digital First, Inc. +170b NetOctave + 0100 NSP2000-SSL crypto accelerator +170c YottaYotta Inc. +1719 EZChip Technologies + 1000 NPA Access Network Processor Family +# Seems to be a 2nd ID for Vitesse Semiconductor +1725 Vitesse Semiconductor + 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller +172a Accelerated Encryption + 13c8 AEP SureWare Runner 1000V3 +# nee Fujitsu Siemens Computers GmbH +1734 Fujitsu Technology Solutions +1735 Aten International Co. Ltd. +1737 Linksys + 0029 WPG54G ver. 4 PCI Card + 1032 Gigabit Network Adapter + 1737 0015 EG1032 v2 Instant Gigabit Network Adapter + 1737 0024 EG1032 v3 Instant Gigabit Network Adapter + 1064 Gigabit Network Adapter + 1737 0016 EG1064 v2 Instant Gigabit Network Adapter + ab08 21x4x DEC-Tulip compatible 10/100 Ethernet + ab09 21x4x DEC-Tulip compatible 10/100 Ethernet +173b Altima (nee Broadcom) + 0001 AC1002 PCI Gigabit Ethernet controller + 03e8 AC1000 Gigabit Ethernet + 03e9 AC1001 Gigabit Ethernet + 03ea AC9100 Gigabit Ethernet + 173b 0001 AC1002 + 03eb AC1003 Gigabit Ethernet +1743 Peppercon AG + 8139 ROL/F-100 Fast Ethernet Adapter with ROL +1745 ViXS Systems, Inc. + 2020 XCode II Series + 2100 XCode 2100 Series +1749 RLX Technologies +174b PC Partner Limited / Sapphire Technology +174d WellX Telecom SA +175c AudioScience Inc +175e Sanera Systems, Inc. +1760 TEDIA spol. s r. o. + 0101 PCD-7004 Digital Bi-Directional Ports PCI Card + 0102 PCD-7104 Digital Input & Output PCI Card + 0121 PCT-7303A PC card with IRC counters + 0122 PCT-7408A PC card with counters and timers + 0123 PCT-7424 PCI card with standard counters + 0141 PCA7208AL - Analog Inputs/Outputs + 0142 PCA7208AS - Analog inputs/Outputs + 0143 PCA7408AL - Analog Inputs/Outputs + 0144 PCA7408AS - Analog Inputs/Outputs + 0145 PCA-7228AL Multifunction PCI IO card + 0146 PCA-7228AS Multifunction PCI IO card + 0147 PCA7428AL Multifunction PCI IO card + 0148 PCA7428AS Multifunction PCI IO card + 0149 PCA7228EL Multifunction PCI IO card with isolated analog inputs + 0150 PCA7428EL Multifunction PCI IO card with isolated analog inputs + 0151 PCA7628AL - PCI card with analog inputs, counters and DIO + 0152 PCA7628AS PCI card with analog inputs, outputs, counters and DIO + 0161 PCA7288A PCI card with analog outputs, counters and DIO + 0180 PCI1052 Communication card for MicroUnit network + 0214 PCT-7424C (F0) PC card with standard counters + 0215 PCT-7424C (F1) PC card with standard counters + 0216 PCT-7424E (F0) PC card with standard counters + 0217 PCT-7424E (F1) PC card with standard counters + 0240 PCA7428CL_F0 - analog Inputs + 0241 PCA7428CL_F1 - analog Inputs + 0242 PCA7428CS_F0 - Analog Inputs/Outputs non isolated + 0243 PCA7428CS_F1 - Analog Inputs/Outputs non isolated + 0244 PCA7428CE_F0 - Analog Inputs isolated + 0245 PCA7428CE_F1 - Analog Inputs isolated + 0303 PCD-7006C Digital Input & Output PCI Card + 0800 PCD8006 - PCIe digital Inputs/Outputs + 0840 PCA-8428 General-purpose multifunctional PCIe card with 8 analog inputs and 2 analog outputs + 0841 PCA-8429 General-purpose multifunctional PCIe card with 8 analog inputs + 0842 PCA-8438 General-purpose multifunctional PCIe card with 16 analog inputs and 2 analog outputs + 0843 PCA-8439 General-purpose multifunctional PCIe card with 16 analog inputs + ff00 CTU CAN FD PCIe Card +1761 Pickering Interfaces Ltd +1771 InnoVISION Multimedia Ltd. +1775 General Electric +177d Cavium, Inc. + 0001 Nitrox XL N1 + 0003 Nitrox XL N1 Lite + 0004 Octeon (and older) FIPS + 0005 Octeon CN38XX Network Processor Pass 3.x + 0006 RoHS + 0010 CN15XX/CN16XX [Nitrox PX] + 0011 CNN35XX [Nitrox III] + 0012 CNN55XX [Nitrox V] + 0020 Octeon CN31XX Network Processor + 0030 Octeon CN30XX Network Processor + 0040 Octeon CN58XX Network Processor + 0050 Octeon CN57XX Network Processor (CN54XX/CN55XX/CN56XX) + 0070 Octeon CN50XX Network Processor + 0080 Octeon CN52XX Network Processor + 0090 Octeon II CN63XX Network Processor + 0091 Octeon II CN68XX Network Processor + 0092 Octeon II CN65XX Network Processor + 0093 Octeon II CN61XX Network Processor + 0094 Octeon Fusion CNF71XX Cell processor + 0095 Octeon III CN78XX Network Processor + 0096 Octeon III CN70XX Network Processor + 9700 Octeon III CN73XX Network Processor + 9702 CN23XX [LiquidIO II] Intelligent Adapter + 177d 0003 CN2350 [LiquidIO II] 2-port 10GbE Intelligent adapter +# This was changed during the production phase to 10GbE adapter. + 177d 0004 CN2350 [LiquidIO II] 2-port 10GbE Intelligent adapter + 177d 0005 CN2360 [LiquidIO II] 2-port 10GbE Intelligent adapter + 177d 0006 CN2360 [LiquidIO II] 2-port 25GbE Intelligent adapter + 177d 0007 CN2350 [LiquidIO II] 2-port 25GbE Intelligent adapter + 177d 0008 CN2350 [LiquidIO II] 2-port 10GbE SFP+ Intelligent adapter + 177d 0009 CN2360 [LiquidIO II] 2-port 10GbE SFP+ Intelligent adapter + 177d 000a CN2350 [LiquidIO II] 2-port 10GBASE-T Intelligent adapter + 177d 000b CN2360 [LiquidIO II] 2-port 10GBASE-T Intelligent adapter + 9703 CN23XX [LiquidIO II] NVMe Controller + 9712 CN23XX [LiquidIO II] SRIOV Virtual Function + 177d 0003 CN2350 [LiquidIO II] 2-port 10GbE SRIOV Virtual Function + 177d 0004 CN2350 [LiquidIO II] 2-port 10GbE SRIOV Virtual Function + 177d 0005 CN2360 [LiquidIO II] 2-port 10GbE SRIOV Virtual Function + 177d 0006 CN2360 [LiquidIO II] 2-port 25GbE SRIOV Virtual Function + 177d 0007 CN2350 [LiquidIO II] 2-port 25GbE SRIOV Virtual Function + 9713 CN23XX [LiquidIO II] NVMe SRIOV Virtual Function + 9800 Octeon Fusion CNF75XX Processor + a001 ThunderX MRML(Master RML Bridge to RSL devices) + a002 THUNDERX PCC Bridge + 177d a102 CN88XX PCC Bridge + a008 THUNDERX SMMU + 177d a108 CN88XX SMMU + a009 THUNDERX Generic Interrupt Controller + a00a THUNDERX GPIO Controller + a00b THUNDERX MPI / SPI Controller + a00c THUNDERX MIO-PTP Controller + a00d THUNDERX MIX Network Controller + a00e THUNDERX Reset Controller + a00f THUNDERX UART Controller + a010 THUNDERX eMMC/SD Controller + a011 THUNDERX MIO-BOOT Controller + a012 THUNDERX TWSI / I2C Controller + a013 THUNDERX CCPI (Multi-node connect) + a014 THUNDERX Voltage Regulator Module + a015 THUNDERX PCIe Switch Logic Interface + a016 THUNDERX Key Memory + a017 THUNDERX GTI (Global System Timers) + a018 THUNDERX Random Number Generator + a019 THUNDERX DFA + a01a THUNDERX Zip Coprocessor + a01b THUNDERX xHCI USB Controller + a01c THUNDERX AHCI SATA Controller + 177d a11c CN88XX AHCI SATA Controller + a01d THUNDERX RAID Coprocessor + a01e THUNDERX Network Interface Controller + a01f THUNDERX Traffic Network Switch + a020 THUNDERX PEM (PCI Express Interface) + a021 THUNDERX L2C (Level-2 Cache Controller) + a022 THUNDERX LMC (DRAM Controller) + a023 THUNDERX OCLA (On-Chip Logic Analyzer) + a024 THUNDERX OSM + a025 THUNDERX GSER (General Serializer/Deserializer) + a026 THUNDERX BGX (Common Ethernet Interface) + a027 THUNDERX IOBN + a029 THUNDERX NCSI (Network Controller Sideband Interface) + a02a ThunderX SGPIO (Serial GPIO controller for SATA disk lights) + a02b THUNDERX SMI / MDIO Controller + a02c THUNDERX DAP (Debug Access Port) + a02d THUNDERX PCIERC (PCIe Root Complex) + a02e ThunderX L2C-TAD (Level 2 cache tag and data) + a02f THUNDERX L2C-CBC + a030 THUNDERX L2C-MCI + a031 THUNDERX MIO-FUS (Fuse Access Controller) + a032 THUNDERX FUSF (Fuse Controller) + a033 THUNDERX Random Number Generator virtual function + a034 THUNDERX Network Interface Controller virtual function + a035 THUNDERX Parallel Bus + a036 ThunderX RAD (RAID acceleration engine) virtual function + a037 THUNDERX ZIP virtual function + a040 THUNDERX CPT Cryptographic Accelerator +# MAC found on OcteonTx2 series of silicons + a059 Octeon TX2 CGX (MAC) +# MAC found on Octeon 10 series of silicons + a060 Octeon 10 RPM (MAC) +# Octeon Tx2 Loopback Interface block + a061 Octeon Tx2 Loopback Interface (LBK) +# Octeon Tx2 Resource Virtualization Unit Physical Function + a063 Octeon Tx2 RVU Physical Function +# Octeon Tx2 Resource Virtualization Unit Virtual Function + a064 Octeon Tx2 RVU Virtual Function +# Octeon Tx2 Resource Virtualization Unit Admin Function + a065 Octeon Tx2 RVU Admin Function +# PTP Timestamping unit on Octeon 10 silicon series + a09e Octeon 10 PTP controller +# Cryptographic Accelerator found on Octeon 10 series of silicons + a0f2 Octeon 10 CPT Cryptographic Accelerator, Physical function + a0f3 Octeon 10 CPT Cryptographic Accelerator, Virtual function +# Octeon Tx2 System DPI Interface (SDP) Physical Function + a0f6 Octeon Tx2 SDP Physical Function +# Octeon Tx2 System DPI Interface (SDP) Virtual Function + a0f7 Octeon Tx2 SDP Virtual Function + a0f8 Octeon Tx2 Loopback Interface Virtual Function (LBKVF) +# Cryptographic Accelerator found on OcteonTx2 series of silicons + a0fd Octeon Tx2 CPT Cryptographic Accelerator, Physical function +# Cryptographic Accelerator found on OcteonTx2 series of silicons + a0fe Octeon Tx2 CPT Cryptographic Accelerator, Virtual function + a100 THUNDERX CN88XX 48 core SoC + a200 OCTEON TX CN81XX/CN80XX + a300 OCTEON TX CN83XX + af00 CN99xx [ThunderX2] Integrated PCI Host bridge + af84 CN99xx [ThunderX2] Integrated PCI Express RP Bridge +1787 Hightech Information System Ltd. +1789 Ennyah Technologies Corp. +# also used by Struck Innovative Systeme for joint developments +1796 Research Centre Juelich + 0001 SIS1100 [Gigabit link] + 0002 HOTlink + 0003 Counter Timer + 0004 CAMAC Controller + 0005 PROFIBUS + 0006 AMCC HOTlink + 0007 LVD Cable Bus + 0008 100MHz, 64bit Sequence Generator based on VirtexII + 0009 double 14bit-ADC + 000a SIS1100 with N110 TDC + 000b double 14bit-ADC with memory + 000d Synchronisation Slave + 000e SIS1100-eCMC + 000f TDC (GPX) + 0010 PCIe Counter Timer + 0011 SIS1100-e single link + 0012 SIS1100-e quad link + 0013 4x2.5GHz SFP to 4 lane PCIe bridge + 0014 SIS1100 with GPX piggy back + 0015 SIS8100 [Gigabit link, MicroTCA] + 0016 SIS1100e with 4 lanes + 0017 Quad 14bit, 50MHz ADC with 2.5GHz SFP + 0018 SIS8300 4-lane PCI Express, Micro TCA for Physics ADC + 0019 SIS SIS8300-Lx MTCA.4 Digitizer + 001a 100MHz, 64bit Sequence Generator based on VirtexII + 001c Quad 16bit, 150MHz ADC with 2.5GHz SFP + 0030 100MHz, 64bit Sequence Generator based on Spartan6 + 0031 200MHz 64bit Sequence Generator based on Spartan7 +# nee Techwell, Inc. +1797 Intersil Techwell + 5864 TW5864 multimedia video controller + 6801 TW6802 multimedia video card + 6802 TW6802 multimedia other device + 6810 TW6816 multimedia video controller + 6811 TW6816 multimedia video controller + 6812 TW6816 multimedia video controller + 6813 TW6816 multimedia video controller +# port 5 of 8 + 6814 TW6816 multimedia video controller +# port 6 of 8 + 6815 TW6816 multimedia video controller +# port 7 of 8 + 6816 TW6816 multimedia video controller +# channel 8 of 8 + 6817 TW6816 multimedia video controller +# Example MuniPCI-E card: http://www.commell.com.tw/product/surveillance/MPX-6864.htm + 6864 TW6864 multimedia video controller +1799 Belkin + 6001 F5D6001 Wireless PCI Card [Realtek RTL8180] + 6020 F5D6020 v3000 Wireless PCMCIA Card [Realtek RTL8180] + 6060 F5D6060 Wireless PDA Card + 700f F5D7000 v7000 Wireless G Desktop Card [Realtek RTL8185] + 701f F5D7010 v7000 Wireless G Notebook Card [Realtek RTL8185] +179a id Quantique + 0001 Quantis PCI 16Mbps +179c Data Patterns + 0557 DP-PCI-557 [PCI 1553B] + 0566 DP-PCI-566 [Intelligent PCI 1553B] + 1152 DP-cPCI-1152 (8-channel Isolated ADC Module) + 5031 DP-CPCI-5031-Synchro Module +# cPCI Carrier for Mezzanine Modules + 5112 DP-cPCI-5112 [MM-Carrier] + 5121 DP-CPCI-5121-IP Carrier + 5211 DP-CPCI-5211-IP Carrier + 5679 AGE Display Module +17a0 Genesys Logic, Inc + 7163 GL9701 PCIe to PCI Bridge + 8083 GL880 USB 1.1 UHCI controller + 8084 GL880 USB 2.0 EHCI controller + 9750 GL9750 SD Host Controller + 9755 GL9755 SD Host Controller + e763 GL9763E eMMC Controller +17aa Lenovo + 3181 ThinkCentre M75n IoT + 402b Intel 82599ES 10Gb 2-port Server Adapter X520-2 +17ab Phillips Components +17af Hightech Information System Ltd. +17b3 Hawking Technologies + ab08 PN672TX 10/100 Ethernet +17b4 Indra Networks, Inc. + 0011 WebEnhance 100 GZIP Compression Card + 0012 WebEnhance 200 GZIP Compression Card + 0015 WebEnhance 300 GZIP Compression Card + 0016 StorCompress 300 GZIP Compression Card + 0017 StorSecure 300 GZIP Compression and AES Encryption Card +17c0 Wistron Corp. +17c2 Newisys, Inc. +# nee Airgo Networks, Inc. +17cb Qualcomm + 0001 AGN100 802.11 a/b/g True MIMO Wireless Card + 1385 5c00 WGM511 Pre-N 802.11g Wireless CardBus Adapter + 1737 0045 WMP54GX v1 802.11g Wireless-G PCI Adapter with SRX + 0002 AGN300 802.11 a/b/g True MIMO Wireless Card + 1385 6d00 WPNT511 RangeMax 240 Mbps Wireless CardBus Adapter + 1737 0054 WPC54GX4 v1 802.11g Wireless-G Notebook Adapter with SRX400 + 0105 MSM8998 PCIe Root Complex + 0108 SM8150 PCIe Root Complex + 0109 SA8195P PCIe Root Complex + 0300 MDM9x35 LTE Modem [Snapdragon X7] + 0301 MDM9x45 LTE Modem [Snapdragon X12] + 0302 MDM9x55 LTE Modem [Snapdragon X16] + 0400 Datacenter Technologies QDF2432 PCI Express Root Port + 0401 Datacenter Technologies QDF2400 PCI Express Root Port + 1000 QCS405 PCIe Root Complex + 1101 QCA6390 Wireless Network Adapter + 1103 QCNFA765 Wireless Network Adapter + 1104 QCN6024/9024/9074 Wireless Network Adapter +17cc NetChip Technology, Inc + 2280 USB 2.0 +17cd Cadence Design Systems, Inc. +17cf Z-Com, Inc. +17d3 Areca Technology Corp. + 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller + 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller + 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller + 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller + 1170 ARC-1170 24-Port PCI-X to SATA RAID Controller + 1201 ARC-1200 2-Port PCI-Express to SATA II RAID Controller + 1203 ARC-1203 2/4/8 Port PCIe 2.0 to SATA 6Gb RAID Controller + 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller + 1214 ARC-12x4 PCIe 2.0 to SAS/SATA 6Gb RAID Controller + 17d3 1214 ARC-1214 4-Port PCIe 2.0 to SAS/SATA 6Gb RAID Controller + 17d3 1224 ARC-1224 8-Port PCIe 2.0 to SAS/SATA 6Gb RAID Controller + 17d3 1264 ARC-1264 12/16 Port PCIe 2.0 to SATA 6Gb RAID Controller + 17d3 1284 ARC-1284 24 Port PCIe 2.0 to SATA 6Gb RAID Controller + 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller + 1222 ARC-1222 8-Port PCI-Express to SAS/SATA II RAID Controller + 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller + 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller + 1280 ARC-1280/1280ML 24-Port PCI-Express to SATA II RAID Controller + 17d3 1221 ARC-1221 8-Port PCI-Express to SATA RAID Controller + 1300 ARC-1300ix-16 16-Port PCI-Express to SAS Non-RAID Host Adapter + 1320 ARC-1320 8/16 Port PCIe 2.0 to SAS/SATA 6Gb Non-RAID Host Adapter + 1330 ARC-1330 16 Port PCIe 3.0 to SAS/SATA 12Gb Non-RAID Host Adapter + 1680 ARC-1680 series PCIe to SAS/SATA 3Gb RAID Controller + 17d3 1212 ARC-1212 4-Port PCIe to SAS/SATA II RAID Controller + 17d3 1222 ARC-1222 8-Port PCIe to SAS/SATA 3Gb RAID Controller + 17d3 1680 ARC-1680 8/12/16/24 Port PCIe to SAS/SATA 3Gb RAID Controller + 1880 ARC-188x series PCIe 2.0/3.0 to SAS/SATA 6/12Gb RAID Controller + 17d3 1213 ARC-1213 4-Port PCIe 2.0 to SAS/SATA 6Gb RAID Controller + 17d3 1215 ARC-1215 4-Port PCIe 3.0 to SAS/SATA 6Gb RAID Controller + 17d3 1216 ARC-1216 4-Port PCIe 3.0 to SAS/SATA 12Gb RAID Controller + 17d3 1223 ARC-1223 8-Port PCIe 2.0 to SAS/SATA 6Gb RAID Controller + 17d3 1225 ARC-1225 8-Port PCIe 3.0 to SAS/SATA 6Gb RAID Controller + 17d3 1226 ARC-1226 8-Port PCIe 3.0 to SAS/SATA 12Gb RAID Controller + 17d3 1880 ARC-1880 8/12/16/24 Port PCIe 2.0 to SAS/SATA 6Gb RAID Controller + 17d3 1882 ARC-1882 8/12/16/24 Port PCIe 3.0 to SAS/SATA 6Gb RAID Controller + 17d3 1883 ARC-1883 8/12/16/24 Port PCIe 3.0 to SAS/SATA 12Gb RAID Controller + 1884 ARC-1884 series PCIe 3.0 to SAS/SATA 12/6Gb RAID Controller + 188a ARC-1886 series PCIe 4.0 to NVMe/SAS/SATA 16/12/6Gb RAID Controller + 17d3 1217 ARC-1217 4-Port PCIe 4.0 to SAS/SATA 12/6Gb RAID Controller + 17d3 1227 ARC-1227 8-Port PCIe 4.0 to SAS/SATA 12/6Gb RAID Controller + 17d3 1686 ARC-1686 PCIe 4.0 to SAS/SATA 12/6Gb Tape drive Controller + 17d3 1886 ARC-1886 PCIe 4.0 to NVMe/SAS/SATA 16/12/6Gb RAID Controller +# nee Neterion Inc., previously S2io Inc. +17d5 Exar Corp. + 5731 Xframe 10-Gigabit Ethernet PCI-X + 5732 Xframe II 10-Gigabit Ethernet PCI-X 2.0 + 5831 Xframe 10-Gigabit Ethernet PCI-X + 103c 12d5 PCI-X 133MHz 10GbE SR Fiber + 10a9 8020 Single Port 10-Gigabit Ethernet (PCI-X, Fiber) + 10a9 8024 Single Port 10-Gigabit Ethernet (PCI-X, Fiber) + 5832 Xframe II 10-Gigabit Ethernet PCI-X 2.0 + 103c 1337 PCI-X 266MHz 10GigE SR [AD385A] + 10a9 8021 Single Port 10-Gigabit Ethernet II (PCI-X, Fiber) + 17d5 6020 Xframe II SR + 17d5 6021 Xframe II SR, Low Profile + 17d5 6022 Xframe E SR + 17d5 6420 Xframe II LR + 17d5 6421 Xframe II LR, Low Profile + 17d5 6422 Xframe E LR + 17d5 6c20 Xframe II CX4 + 17d5 6c21 Xframe II CX4, Low Profile + 17d5 6c22 Xframe E CX4 + 5833 X3100 Series 10 Gigabit Ethernet PCIe + 17d5 6030 X3110 Single Port SR + 17d5 6031 X3120 Dual Port SR + 17d5 6430 X3110 Single Port LR + 17d5 6431 X3120 Dual Port LR + 17d5 7030 X3110 Single Port LRM + 17d5 7031 X3120 Dual Port LRM + 17d5 7430 X3110 Single Port 10GBase-T + 17d5 7431 X3120 Dual Port 10GBase-T + 17d5 7830 X3110 Single Port 10GBase-CR + 17d5 7831 X3120 Dual Port 10GBase-CR +17db Cray Inc + 0101 XT Series [Seastar] 3D Toroidal Router +17de KWorld Computer Co. Ltd. +17df Dini Group + 1864 Virtex4 PCI Board w/ QL5064 Bridge [DN7000K10PCI/DN8000K10PCI/DN8000K10PSX/NOTUS] + 1865 Virtex4 ASIC Emulator [DN8000K10PCIe] + 1866 Virtex4 ASIC Emulator Cable Connection [DN8000K10PCI] + 1867 Virtex4 ASIC Emulator Cable Connection [DN8000K10PCIe] + 1868 Virtex4 ASIC Emulator [DN8000K10PCIe-8] + 1900 Virtex5 PCIe ASIC Emulator [DN9000K10PCIe8T/DN9002K10PCIe8T/DN9200K10PCIe8T/DN7006K10PCIe8T/DN7406K10PCIe8T] + 1901 Virtex5 PCIe ASIC Emulator Large BARs [DN9000K10PCIe8T/DN9002K10PCIe8T/DN9200K10PCIe8T/DN7006K10PCIe8T/DN7406K10PCIe8T] + 1902 Virtex5 PCIe ASIC Emulator Low Power [Interceptor] + 1903 Spartan6 PCIe FPGA Accelerator Board [DNBFCS12PCIe] + 1904 Virtex6 PCIe ASIC Emulation Board [DNDUALV6_PCIe4] + 1905 Virtex6 PCIe ASIC Emulation Board [DNV6F6PCIe] + 1906 Virtex6 PCIe ASIC Emulation Board [DN2076K10] + 1907 Virtex6 PCIe ASIC Emulation Board [DNV6F2PCIe] + 1908 Virtex6 PCIe ASIC Emulation Board Large BARs[DNV6F2PCIe] + 1909 Kintex7 PCIe FPGA Accelerator Board [DNK7F5PCIe] + 190a Virtex7 PCIe ASIC Emulation Board [DNV7F1A] + 190b Stratix5 PCIe ASIC Emulation Board [DNS5GXF2] + 190c Virtex7 PCIe ASIC Emulation Board [DNV7F2A] + 190d Virtex7 PCIe ASIC Emulation Board [DNV7F4A] + 190e Virtex7 PCIe ASIC Emulation Board [DNV7F2B] + 190f KintexUS PCIe MainRef Design [DNPCIE_40G_KU_LL] + 1910 VirtexUS ASIC Emulation Board [DNVUF4A] + 1911 VirtexUS PCIe ASIC Emulation Board [DNVU_F2PCIe] + 1912 KintexUS PCIe MainRef Design [DNPCIe_40G_KU_LL_QSFP] + 1913 VirtexUS ASIC Emulation Board [DNVUF1A] + 1914 VirtexUS ASIC Emulation Board [DNVUF2A] + 1915 Arria10 PCIe MainRef Design [DNPCIe_80G_A10_LL] + 1916 VirtexUS PCIe Accelerator Board [DNVUF2_HPC_PCIe] + 1917 UltrascalePlus PCIe Accelerator Board [DNPCIe_400G_VU_LL] + 1918 VirtexUS+ ASIC Emulation Board [DNVUPF4A] + 1919 UltrascalePlus PCIe Accelerator Board [DNPCIe_400G_VUP_HBM_LL] + 1a00 Virtex6 PCIe DMA Netlist Design + 1a01 Virtex6 PCIe Darklite Design [DNPCIe_HXT_10G_LL] + 1a02 Virtex7 PCIe DMA Netlist Design + 1a03 Kintex7 PCIe Darklite Design [DNPCIe_K7_10G_LL] + 1a05 Stratix5 PCIe Darklite Design [DNS5GX_F2] + 1a06 VirtexUS PCIe DMA Netlist Design + 1a07 KintexUS PCIe Darklite Design [DNPCIe_40G_KU_LL] + 1a08 KintexUS PCIe Darklite Design [DNPCIe_40G_KU_LL_QSFP] + 1a09 Arria10 PCIe Darklite Design [DNPCIe_80G_A10_LL] + 1a0a VirtexUS PCIe Darklite Design [DNVUF2_HPC_PCIe] + 1a0b UltrascalePlus PCIe Darklite Design [DNPCIe_400G_VU_LL] + 1a0c KintexUS PCIe DRAM Packet Capture Design [DNPCIe_40G_KU_LL] + 1a0d KintexUS PCIe DRAM Packet Capture Design [DNPCIe_40G_KU_LL_2QSFP] + 1a0e UltrascalePlus PCIe Darklite Design [DNPCIe_400G_VUP_HBM_LL] +17e4 Sectra AB + 0001 KK671 Cardbus encryption board + 0002 KK672 Cardbus encryption board +# nee Entropic Communications Inc. +17e6 MaxLinear + 0010 EN2010 [c.Link] MoCA Network Controller (Coax, PCI interface) + 0011 EN2010 [c.Link] MoCA Network Controller (Coax, MPEG interface) + 0021 EN2210 [c.Link] MoCA Network Controller (Coax) + 0025 EN2510 [c.Link] MoCA Network Controller (Coax, PCIe interface) + 0027 EN2710 [c.Link] MoCA 2.0 Network Controller (Coax, PCIe interface) + 3700 MoCA 2.0 Network Controller (Coax, PCIe interface) + 3710 MoCA 2.5 Network Controller (Coax, PCIe interface) +17ee Connect Components Ltd +17f2 Albatron Corp. +17f3 RDC Semiconductor, Inc. + 1010 R1010 IDE Controller + 1011 R1011 IDE Controller + 1012 R1012 IDE Controller + 1031 PCI/PCI-X to PCI-E Bridge +# Integrated in Vortex86EX, Vortex86EX2 SoC + 1070 CAN Bus Controller +# Integrated in Vortex86EX, Vortex86EX2 SoCs + 1331 Motion Control Interface +# Found in the Vortex86EX2 SoC + 1930 Hybrid Function Control Register +# IGP = on-chip integrated in the MSTI-PMX-1000 (Vortex86MX). + 2010 RDC M2010 VGA-compatible graphics adapter + 2012 M2012/R3308 VGA-compatible graphics adapter +# IGP = on-chip integrated in the Vortex86DX3. Basic 2D accel. UMA architecture. + 2015 RDC M2015 VGA-compatible graphics adapter +# Found in the Vortex86EX SoC + 6011 R6011 ISA Bridge +# Found in the Vortex86EX2 SoC + 6013 R6013 ISA Bridge + 6020 R6020 North Bridge + 6021 R6021 Host Bridge +# Integrated in the Vortex86DX2 SoC + 6022 R6022 Host Bridge +# Found in the Vortex86DX3 SoC + 6023 R6023 Host Bridge +# Found in the Vortex86EX SoC + 6025 R6025 Host Bridge +# Found in the Vortex86EX2 SoC + 6026 R6026 Host Bridge + 6030 R6030 ISA Bridge + 6031 R6031 ISA Bridge +# Found in the Vortex86DX3 SoC + 6035 R6035 ISA Bridge +# Found in MSTI-PMX-1000 (Vortex86MX) SoC. + 6036 R6036 ISA Bridge + 6040 R6040 MAC Controller + 6060 R6060 USB 1.1 Controller + 6061 R6061 USB 2.0 Controller +17f7 Topdek Semiconductor Inc. +17f9 Gemtek Technology Co., Ltd +17fc IOGEAR, Inc. +17fe InProComm Inc. + 2120 IPN 2120 802.11b + 1737 0020 WMP11 v4 802.11b Wireless-B PCI Adapter + 2220 IPN 2220 802.11g + 1468 0305 T60N871 802.11g Mini PCI Wireless Adapter + 1737 0029 WPC54G v4 802.11g Wireless-G Notebook Adapter +17ff Benq Corporation +1800 Qualcore Logic Inc. + 1100 Nanospeed Trading Gateway +1803 ProdaSafe GmbH +1804 Ralink corp. (wrong ID) + 3060 RT3060 Wireless 802.11n 1T/1R +1805 Euresys S.A. +1809 Lumanate, Inc. +180c IEI Integration Corp +1813 Ambient Technologies Inc + 4000 HaM controllerless modem + 16be 0001 V9x HAM Data Fax Modem + 4100 HaM plus Data Fax Modem + 16be 0002 V9x HAM 1394 +1814 Ralink corp. + 0101 Wireless PCI Adapter RT2400 / RT2460 + 1043 0127 WiFi-b add-on Card + 1371 0010 Minitar MNW2BPCI Wireless PCI Card + 1462 6828 PC11B2 (MS-6828) Wireless 11b PCI Card + 0200 RT2500 802.11g PCI [PC54G2] + 0201 RT2500 Wireless 802.11bg + 1043 130f WL-130g + 1186 3c00 DWL-G650X Wireless 11g CardBus Adapter + 1371 001e CWC-854 Wireless-G CardBus Adapter + 1371 001f CWM-854 Wireless-G Mini PCI Adapter + 1371 0020 CWP-854 Wireless-G PCI Adapter + 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter + 1458 e931 GN-WIKG 802.11b/g mini-PCI Adapter + 1462 6833 Unknown 802.11g mini-PCI Adapter + 1462 6835 Wireless 11G CardBus CB54G2 + 1737 0032 WMP54G v4.0 PCI Adapter + 1799 700a F5D7000 v2000/v3000 Wireless G Desktop Card + 1799 701a F5D7010 v2000/v3000 Wireless G Notebook Card + 1814 2560 RT2500 Wireless 802.11bg + 182d 9073 WL-115 Wireless Network PCI Adapter + 185f 22a0 CN-WF513 Wireless Cardbus Adapter + 18eb 5312 WL531P IEEE 802.11g PCI Card-EU + 1948 3c00 C54RC v1 Wireless 11g CardBus Adapter + 1948 3c01 C54Ri v1 Wireless 11g PCI Adapter + 0300 Wireless Adapter Canyon CN-WF511 + 0301 RT2561/RT61 802.11g PCI + 1186 3c08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.E1) + 1186 3c09 DWL-G510 Rev C + 13d1 abe3 miniPCI Pluscom 802.11 a/b/g + 1458 e933 GN-WI01GS + 1458 e934 GN-WP01GS + 1462 b833 MP54G5 (MS-6833B) + 1737 0055 WMP54G v4.1 + 1799 700e F5D7000 v6000 Wireless G Desktop Card + 1799 701e F5D7010 v6000 Wireless G Notebook Card + 17f9 0012 AWLC3026T 802.11g Wireless CardBus Adapter + 1814 2561 EW-7108PCg/EW-7128g + 0302 RT2561/RT61 rev B 802.11g + 1186 3a71 DWA-510 Wireless G Desktop Adapter + 1186 3c08 AirPlus G DWL-G630 Wireless Cardbus Adapter (rev.E2) + 1186 3c09 AirPlus G DWL-G510 Wireless Network Adapter (Rev.C) + 1462 b834 PC54G3 Wireless 11g PCI Card + 1948 3c23 C54RC v2 Wireless 11g CardBus Adapter + 1948 3c24 C54Ri v2 Wireless 11g PCI Adapter + 0401 RT2600 802.11 MIMO + 1737 0052 WPC54GR v1 802.11g Wireless-G Notebook Adapter with RangeBooster + 17f9 0011 WPCR-137G 802.11bg Wireless CardBus Adapter + 17f9 0016 WPIR-119GH 802.11bg Wireless Desktop Adapter + 0601 RT2800 802.11n PCI + 1799 801c F5D8011 v3 802.11n N1 Wireless Notebook Card + 187e 3412 NWD-310N 802.11n Wireless PCI Adapter + 0681 RT2890 Wireless 802.11n PCIe + 1458 e939 GN-WS30N-RH 802.11bgn Mini PCIe Card + 0701 RT2760 Wireless 802.11n 1T/2R + 1737 0074 WMP110 v2 802.11n RangePlus Wireless PCI Adapter + 0781 RT2790 Wireless 802.11n 1T/2R PCIe + 1814 2790 RT2790 Wireless 802.11n 1T/2R PCIe + 3060 RT3060 Wireless 802.11n 1T/1R + 1186 3c04 DWA-525 Wireless N 150 Desktop Adapter (rev.A1) + 3062 RT3062 Wireless 802.11n 2T/2R + 3090 RT3090 Wireless 802.11n 1T/1R PCIe + 13bd 1057 GN-WS32L-RH Half-size Mini PCIe Card + 3091 RT3091 Wireless 802.11n 1T/2R PCIe + 3092 RT3092 Wireless 802.11n 2T/2R PCIe + 3290 RT3290 Wireless 802.11n 1T/1R PCIe + 103c 18ec Ralink RT3290LE 802.11bgn 1x1 Wi-Fi and Bluetooth 4.0 Combo Adapter + 3298 RT3290 Bluetooth + 103c 18ec Ralink RT3290LE 802.11bgn 1x1 Wi-Fi and Bluetooth 4.0 Combo Adapter + 3592 RT3592 Wireless 802.11abgn 2T/2R PCIe + 359f RT3592 PCIe Wireless Network Adapter + 5360 RT5360 Wireless 802.11n 1T/1R + 1186 3c05 DWA-525 Wireless N 150 Desktop Adapter (rev.A2) + 20f4 703a TEW-703PI N150 Wireless PCI Adapter + 5362 RT5362 PCI 802.11n Wireless Network Adapter + 5390 RT5390 Wireless 802.11n 1T/1R PCIe + 103c 1636 U98Z077.00 Half-size Mini PCIe Card + 5392 RT5392 PCIe Wireless Network Adapter + 539b RT5390R 802.11bgn PCIe Wireless Network Adapter + 539f RT5390 [802.11 b/g/n 1T1R G-band PCI Express Single Chip] + 103c 1637 Pavilion DM1Z-3000 PCIe wireless card + 5592 RT5592 PCIe Wireless Network Adapter + e932 RT2560F 802.11 b/g PCI +1815 Devolo AG +1820 InfiniCon Systems Inc. +1822 Twinhan Technology Co. Ltd + 4e35 Mantis DTV PCI Bridge Controller [Ver 1.0] +182d SiteCom Europe BV +# HFC-based ISDN card + 3069 ISDN PCI DC-105V2 + 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3] +182e Raza Microelectronics, Inc. + 0008 XLR516 Processor +# Strange vendor ID used by BCM5785 when in RAID mode +182f Broadcom +# HT1000 uses 3 IDs 1166:024a (Native SATA Mode), 1166:024b (PATA/IDE Mode), 182f:000b (RAID Mode) depends on SATA BIOS setting + 000b BCM5785 [HT1000] SATA (RAID Mode) +1830 Credence Systems Corporation + 8000 CPIn + 8001 CPId + 8002 CPIx + 8003 CPIq +183b MikroM GmbH + 08a7 MVC100 DVI + 08a8 MVC101 SDI + 08a9 MVC102 DVI+Audio + 08b0 MVC200-DC +1846 Alcatel-Lucent +1849 ASRock Incorporation +184a Thales Computers + 1100 MAX II cPLD +1850 Advantest Corporation + 0048 EK220-66401 Computer Interface Card +1851 Microtune, Inc. +1852 Anritsu Corp. +1853 SMSC Automotive Infotainment System Group +1854 LG Electronics, Inc. +185b Compro Technology, Inc. + 1489 VideoMate Vista T100 +185f Wistron NeWeb Corp. +1864 SilverBack + 2110 ISNAP 2110 +1867 Topspin Communications + 5a44 MT23108 InfiniHost HCA + 5a45 MT23108 InfiniHost HCA flash recovery + 5a46 MT23108 InfiniHost HCA bridge + 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode) + 6282 MT25208 InfiniHost III Ex +186c Humusoft, s.r.o. + 0612 AD612 Data Acquisition Device + 0614 MF614 Multifunction I/O Card + 0622 AD622 Data Acquisition Device + 0624 MF624 Multifunction I/O PCI Card + 0625 MF625 3-phase Motor Driver + 0634 MF634 Multifunction I/O PCIe Card + 0644 MF644 Multifunction I/O Thb Card +186f WiNRADiO Communications +1876 L-3 Communications + a101 VigraWATCH PCI + a102 VigraWATCH PMC + a103 Vigra I/O +187e ZyXEL Communications Corporation + 3403 ZyAir G-110 802.11g + 340e M-302 802.11g XtremeMIMO +1885 Avvida Systems Inc. +1888 Varisys Ltd + 0301 VMFX1 FPGA PMC module + 0601 VSM2 dual PMC carrier + 0710 VS14x series PowerPC PCI board + 0720 VS24x series PowerPC PCI board +188a Ample Communications, Inc +1890 Egenera, Inc. +1894 KNC One +1896 B&B Electronics Manufacturing Company, Inc. + 4202 MIport 3PCIU2 2-port Serial + 4204 MIport 3PCIU4 4-port Serial + 4208 MIport 3PCIU8 8-port Serial + 4211 MIport 3PCIOU1 1-port Isolated Serial + 4212 MIport 3PCIOU2 2-port Isolated Serial + 4214 MIport 3PCIOU4 4-port Isolated Serial + bb10 3PCI2 2-Port Serial + bb11 3PCIO1 1-Port Isolated Serial +1897 AMtek +18a1 Astute Networks Inc. +18a2 Stretch Inc. + 0002 VRC6016 16-Channel PCIe DVR Card +18a3 AT&T +18ac DViCO Corporation + d500 FusionHDTV 5 + d800 FusionHDTV 3 Gold + d810 FusionHDTV 3 Gold-Q + d820 FusionHDTV 3 Gold-T + db30 FusionHDTV DVB-T Pro + db40 FusionHDTV DVB-T Hybrid + db78 FusionHDTV DVB-T Dual Express +18b8 Ammasso + b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor +# formally Info-Tek Corp. +18bc GeCube Technologies, Inc. +18c3 Micronas Semiconductor Holding AG + 0720 nGene PCI-Express Multimedia Controller + 1461 032e Hybrid M779 PCI-E +# Nee Octigabay System +18c8 Cray Inc +18c9 ARVOO Engineering BV +18ca XGI Technology Inc. (eXtreme Graphics Innovation) + 0020 Z7/Z9 (XG20 core) + 0021 Z9s/Z9m (XG21 core) + 0027 Z11/Z11M + 0040 Volari V3XT/V5/V8 + 0047 Volari 8300 (chip: XP10, codename: XG47) +# should be 182d +18d2 Sitecom Europe BV (Wrong ID) +# Sitecom HFC-S based ISDN controller card DC-105v2 + 3069 DC-105v2 ISDN controller +18d4 Celestica +18d8 Dialogue Technology Corp. +18dd Artimi Inc + 4c6f Artimi RTMI-100 UWB adapter +18df LeWiz Communications +18e6 MPL AG + 0001 OSCI [Octal Serial Communication Interface] +18eb Advance Multimedia Internet Technology, Inc. +18ec Cesnet, z.s.p.o. + 6d05 ML555 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design + c006 COMBO6 + 18ec d001 COMBO-4MTX + 18ec d002 COMBO-4SFP + 18ec d003 COMBO-4SFPRO + 18ec d004 COMBO-2XFP + c032 COMBO-LXT110 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design + c045 COMBO6E + c050 COMBO-PTM + c058 COMBO6X + 18ec d001 COMBO-4MTX + 18ec d002 COMBO-4SFP + 18ec d003 COMBO-4SFPRO + 18ec d004 COMBO-2XFP + c132 COMBO-LXT155 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design + c232 COMBO-FXT100 + 18ec 0100 NIC (ethernet interfaces) + 18ec 0200 NIC (szedata2) 4x1G + 18ec 0201 NIC (szedata2) 2x10G + 18ec 0300 NIFIC (szedata2) 4x1G + 18ec 0302 NIFIC (szedata2) 2x10G + 18ec 4200 Flexible FlowMon (szedata2) 1x10G + 18ec ff00 Testing design + 18ec ff01 Boot design + c400 COMBO-400G1 +18ee Chenming Mold Ind. Corp. +18f1 Spectrum GmbH +18f4 Napatech A/S + 0031 NT20X Network Adapter + 0051 NT20X Capture Card + 0061 NT20E Capture Card + 0064 NT20E Inline Card + 0071 NT4E Capture Card + 0074 NT4E Inline Card + 0081 NT4E 4-port Expansion Card + 0091 NT20X Capture Card [New Rev] + 00a1 NT4E-STD Capture Card + 00a4 NT4E-STD Inline Card +# 8 x 1 Gbps / 10 Gbps PCIe Optical Bypass Adapter + 00b1 NTBPE Optical Bypass Adapter + 00c5 NT20E2 Network Adapter 2x10Gb + 00d5 NT40E2-4 Network Adapter 4x10Gb + 00e5 NT40E2-1 Network Adapter 1x40Gb +# 4-Port Adapter for 1 GbE In-Line Bypass Applications + 00f5 NT4E2-4T-BP Network Adapter 4x1Gb with Electrical Bypass + 0105 NT4E2-4-PTP Network Adapter 4x1Gb + 0115 NT20E2-PTP Network Adapter 2x10Gb + 0125 NT4E2-4-PTP Network Adapter 4x1Gb + 0135 NT20E2-PTP Network Adapter 2x10Gb + 0145 NT40E3-4-PTP Network Adapter 4x10Gb + 0155 NT100E3-1-PTP Network Adapter 1x100Gb + 0165 NT80E3-2-PTP Network Adapter 2x40Gb + 0175 NT20E3-2-PTP Network Adapter 2x10Gb + 0185 NT40A01 Network Adapter + 01a5 NT200A01 Network Adapter + 01c5 NT200A02 Network Adapter + 01d5 NT50B01 Network Adapter + 01e5 NT100A01 Network Adapter +18f6 NextIO + 1000 [Nexsis] Switch Virtual P2P PCIe Bridge + 1001 [Texsis] Switch Virtual P2P PCIe Bridge + 1050 [Nexsis] Switch Virtual P2P PCI Bridge + 1051 [Texsis] Switch Virtual P2P PCI Bridge + 2000 [Nexsis] Switch Integrated Mgmt. Endpoint + 2001 [Texsis] Switch Integrated Mgmt. Endpoint +18f7 Commtech, Inc. + 0001 ESCC-PCI-335 Serial PCI Adapter [Fastcom] + 0002 422/4-PCI-335 Serial PCI Adapter [Fastcom] + 0003 232/4-1M-PCI Serial PCI Adapter [Fastcom] + 0004 422/2-PCI-335 Serial PCI Adapter [Fastcom] + 0005 IGESCC-PCI-ISO/1 Serial PCI Adapter [Fastcom] + 000a 232/4-PCI-335 Serial PCI Adapter [Fastcom] + 000b 232/8-PCI-335 Serial PCI Adapter [Fastcom] + 000f FSCC Serial PCI Adapter [Fastcom] + 0010 GSCC Serial PCI Adapter [Fastcom] + 0011 QSSB Serial PCI Adapter [Fastcom] + 0014 SuperFSCC Serial PCI Adapter [Fastcom] + 0015 SuperFSCC-104-LVDS Serial PC/104+ Adapter [Fastcom] + 0016 FSCC-232 RS-232 Serial PCI Adapter [Fastcom] +# Software UARTs + 0017 SuperFSCC-104 Serial PC/104+ Adapter [Fastcom] +# Software UARTs + 0018 SuperFSCC/4 Serial PCI Adapter [Fastcom] +# Software UARTs + 0019 SuperFSCC Serial PCI Adapter [Fastcom] + 001a SuperFSCC-LVDS Serial PCI Adapter [Fastcom] +# Software UARTs + 001b FSCC/4 Serial PCI Adapter [Fastcom] +# RS-644 Only + 001c SuperFSCC/4-LVDS Serial PCI Adapter [Fastcom] +# Software UARTs + 001d FSCC Serial PCI Adapter [Fastcom] + 001e SuperFSCC/4 Serial PCIe Adapter [Fastcom] + 001f SuperFSCC/4 Serial cPCI Adapter [Fastcom] + 0020 422/4-PCIe Serial PCIe Adapter [Fastcom] + 0021 422/8-PCIe Serial PCIe Adapter [Fastcom] +# RS-644 Only + 0022 SuperFSCC/4-LVDS Serial PCIe Adapter [Fastcom] +# Software UARTs + 0023 SuperFSCC/4 Serial cPCI Adapter [Fastcom] +# RS-644 Only, Software UARTs + 0025 SuperFSCC/4-LVDS Serial PCI Adapter [Fastcom] +# RS-644 Only, Software UARTs + 0026 SuperFSCC-LVDS Serial PCI Adapter [Fastcom] +# Software UARTs + 0027 FSCC/4 Serial PCIe Adapter [Fastcom] +18fb Resilience Corporation +1904 Hangzhou Silan Microelectronics Co., Ltd. + 2031 SC92031 PCI Fast Ethernet Adapter + 8139 RTL8139D [Realtek] PCI 10/100BaseTX ethernet adaptor +1905 Micronas USA, Inc. +1912 Renesas Technology Corp. + 0002 SH7780 PCI Controller (PCIC) + 0011 SH7757 PCIe End-Point [PBI] + 0012 SH7757 PCIe-PCI Bridge [PPB] + 0013 SH7757 PCIe Switch [PS] + 0014 uPD720201 USB 3.0 Host Controller + 0015 uPD720202 USB 3.0 Host Controller + 001a SH7758 PCIe-PCI Bridge [PPB] + 001b SH7758 PCIe End-Point [PBI] + 001d SH7758 PCIe Switch [PS] +1919 Soltek Computer Inc. +1923 Sangoma Technologies Corp. + 0040 A200/Remora FXO/FXS Analog AFT card + 0100 A104d QUAD T1/E1 AFT card + 0300 A101 single-port T1/E1 + 0400 A104u Quad T1/E1 AFT +1924 Solarflare Communications + 0703 SFC4000 rev A net [Solarstorm] + 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard] + 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] + 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard] + 1924 0101 SFE4001-A1 + 1924 0102 SFE4001-A2 + 1924 0103 SFE4001-A3 + 1924 0201 SFE4002-A1 + 1924 0301 SFE4003-A1 + 1924 0302 SFE4003-A2 + 1924 0303 SFE4003-A3 + 1924 0304 SFE4003-A4 + 1924 0500 SFE4005-A0 + 0710 SFC4000 rev B [Solarstorm] + 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] + 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard] + 1924 0102 SFE4001-A2 + 1924 0103 SFE4001-A3 + 1924 0201 SFE4002-A1 + 1924 0302 SFE4003-A2 + 1924 0303 SFE4003-A3 + 1924 0304 SFE4003-A4 + 1924 0500 SFE4005-A0 + 1924 5102 SFN4111T-A2 + 1924 5103 SFN4111T-R3 + 1924 5104 SFN4111T-R4 + 1924 5105 SFN4111T-R5 + 1924 5201 SFN4112F-R1 + 1924 5202 SFN4112F-R2 + 0803 SFC9020 10G Ethernet Controller + 1014 0478 2-port 10GbE Low-Latency (R7) + 1014 0479 2-port 10GbE OpenOnload (R7) + 1014 04a7 Solarflare 10Gb Low-latency Dual-port HBA (R7) + 1014 04a8 Solarflare 10Gb Dual-port HBA (R7) + 103c 2132 Ethernet 10Gb 2-port 570FLR-SFP+ Adapter (R1) + 103c 2136 Ethernet 10Gb 2-port 570SFP+ Adapter (R7) + 1924 1201 SFA6902F-R1 SFP+ AOE Adapter + 1924 6200 SFN5122F-R0 SFP+ Server Adapter + 1924 6201 SFN5122F-R1 SFP+ Server Adapter + 1924 6202 SFN5122F-R2 SFP+ Server Adapter + 1924 6204 SFN5122F-R4 SFP+ Server Adapter + 1924 6205 SFN5122F-R5 SFP+ Server Adapter + 1924 6206 SFN5122F-R6 SFP+ Server Adapter + 1924 6207 SFN5122F-R7 SFP+ Server Adapter + 1924 6210 SFN5322F-R0 SFP+ Precision Time Synchronization Server Adapter + 1924 6211 SFN5322F-R1 SFP+ Precision Time Synchronization Server Adapter + 1924 6217 SFN5322F-R7 SFP+ Precision Time Synchronization Server Adapter + 1924 6227 SFN6122F-R7 SFP+ Server Adapter + 1924 6237 SFN6322F-R7 SFP+ Precision Time Synchronization Server Adapter + 1924 6501 SFN5802K-R1 Mezzanine Adapter + 1924 6511 SFN5814H-R1 Mezzanine Adapter + 1924 6521 SFN5812H-R1 Mezzanine Adapter + 1924 6562 SFN6832F-R2 SFP+ Mezzanine Adapter + 1924 6a05 SFN5112F-R5 SFP+ Server Adapter + 1924 6a06 SFN5112F-R6 SFP+ Server Adapter + 1924 7206 SFN5162F-R6 SFP+ Server Adapter + 1924 7207 SFN5162F-R7 SFP+ Server Adapter + 1924 7a06 SFN5152F-R6 SFP+ Server Adapter + 1924 7a07 SFN5152F-R7 SFP+ Server Adapter + 0813 SFL9021 10GBASE-T Ethernet Controller + 1924 6100 SFN5121T-R0 10GBASE-T Server Adapter + 1924 6102 SFN5121T-R2 10GBASE-T Server Adapter + 1924 6103 SFN5121T-R3 10GBASE-T Server Adapter + 1924 6104 SFN5121T-R4 10GBASE-T Server Adapter + 1924 6902 SFN5111T-R2 10GBASE-T Server Adapter + 1924 6904 SFN5111T-R4 10GBASE-T Server Adapter + 1924 7104 SFN5161T-R4 10GBASE-T Server Adapter + 1924 7904 SFN5151T-R4 10GBASE-T Server Adapter + 0903 SFC9120 10G Ethernet Controller + 1014 04cc SFN7122F-R2 2x10GbE SFP+ Flareon Ultra + 1924 8002 SFN7122F-R1 SFP+ Server Adapter + 1924 8003 SFN7x41Q-R1 Flareon Ultra 7000 Series 10/40G Adapter + 1924 8006 SFN7022F-R1 SFP+ Server Adapter + 1924 8007 SFN7322F-R2 Precision Time SFP+ Server Adapter + 1924 8009 SFN7x22F-R2 Flareon Ultra 7000 Series 10G Adapter + 1924 800a SFN7x02F-R2 Flareon 7000 Series 10G Adapter + 1924 800c SFN7x22F-R3 Flareon Ultra 7000 Series 10G Adapter + 1924 800d SFN7x02F-R3 Flareon 7000 Series 10G Adapter + 1924 8010 SFA7942Q-R1 QSFP+ AOE Adapter + 1924 8015 SFA7942Q-A5-0-R1 QSFP+ AOE Adapter + 0923 SFC9140 10/40G Ethernet Controller + 1924 800b SFN7x42Q-R1 Flareon Ultra 7000 Series 10/40G Adapter + 1924 800e SFN7x42Q-R2 Flareon Ultra 7000 Series 10/40G Adapter + 1924 800f SFN7xx4F-R1 Flareon Ultra 7000 Series 10G Adapter + 0a03 SFC9220 10/40G Ethernet Controller + 1924 8011 SFN8022-R1 8000 Series 10G Adapter + 1924 8012 SFN8522-R1 8000 Series 10G Adapter + 1924 8013 SFN8042-R1 8000 Series 10/40G Adapter + 1924 8014 SFN8542-R1 8000 Series 10/40G Adapter + 1924 8016 SFN8022-R2 8000 Series 10G Adapter + 1924 8017 SFN8522-R2 8000 Series 10G Adapter + 1924 8018 SFN8042-R2 8000 Series 10/40G Adapter + 1924 8019 SFN8542-R2 8000 Series 10/40G Adapter + 1924 801a SFN8722-R1 8000 Series OCP 10G Adapter + 1924 801b SFN8522-R3 8000 Series 10G Adapter + 1924 801c SFN8042-R3 8000 Series 10/40G Adapter + 1924 8021 SFN8041-R1 8000 Series 10/40G Adapter + 0b03 XtremeScale SFC9250 10/25/40/50/100G Ethernet Controller + 1924 801d x2522-R1 2000 Series 10/25G Adapter + 1924 801e x2542-R1 2000 Series 40/100G Adapter + 1924 8022 XtremeScale X2522 10G Network Adapter + 1924 8024 XtremeScale X2562 OCP 3.0 Dual Port SFP28 + 1924 8027 XtremeScale X2541 PCIe Single Port QSFP28 + 1924 8028 XtremeScale X2522-25G Network Adapter + 1924 802a XtremeScale X2542 PCIe Dual Port QSFP28 + 1924 802b XtremeScale X2552 OCP 2.0 Dual Port SFP28 + 1924 802c XtremeScale X2522-25G PCIe Dual Port SFP28 + 1924 802d XtremeScale X2562 OCP 3.0 Dual Port SFP28 + 1803 SFC9020 10G Ethernet Controller (Virtual Function) + 1813 SFL9021 10GBASE-T Ethernet Controller (Virtual Function) + 1903 SFC9120 10G Ethernet Controller (Virtual Function) + 1923 SFC9140 10/40G Ethernet Controller (Virtual Function) + 1a03 SFC9220 10/40G Ethernet Controller (Virtual Function) + 1b03 XtremeScale SFC9250 10/25/40/50/100G Ethernet Controller (Virtual Function) + 6703 SFC4000 rev A iSCSI/Onload [Solarstorm] + 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard] + 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] + 10b8 0201 SMC10GPCIe-XFP (A1) [TigerCard] + 1924 0101 SFE4001-A1 + 1924 0102 SFE4001-A2 + 1924 0103 SFE4001-A3 + 1924 0201 SFE4002-A1 + 1924 0301 SFE4003-A1 + 1924 0302 SFE4003-A2 + 1924 0303 SFE4003-A3 + 1924 0304 SFE4003-A4 + 1924 0500 SFE4005-A0 + c101 EF1-21022T [EtherFabric] +192a BiTMICRO Networks Inc. + 0008 RAMPART +192e TransDimension +1931 Option N.V. + 000c Qualcomm MSM6275 UMTS chip +1932 DiBcom +193c MAXIM Integrated Products +193d Hangzhou H3C Technologies Co., Ltd. +193f AHA Products Group + 0001 AHA36x-PCIX + 0360 AHA360-PCIe + 0363 AHA363-PCIe + 0364 AHA364-PCIe + 0367 AHA367-PCIe + 0370 AHA370-PCIe + 0604 AHA604 + 0605 AHA605 + 3641 AHA3641 + 3642 AHA3642 + 6101 AHA6101 + 6102 AHA6102 +1942 ClearSpeed Technology plc + e511 Advance X620 accelerator card + e521 Advance e620 accelerator card +1947 C-guys, Inc. + 4743 CG200 Dual SD/SDIO Host controller device +1948 Alpha Networks Inc. +194a DapTechnology B.V. + 1111 FireSpy3850 + 1112 FireSpy450b + 1113 FireSpy450bT + 1114 FireSpy850 + 1115 FireSpy850bT + 1200 FireTrac 3460bT + 1201 FireTrac 3460bT (fallback firmware) + 1202 FireTrac 3460bT + 1203 FireTrac 3460bT (fallback firmware) +# nee Curtis, Inc. +1954 One Stop Systems, Inc. +1957 Freescale Semiconductor Inc + 0012 MPC8548E + 0013 MPC8548 + 0014 MPC8543E + 0015 MPC8543 + 0018 MPC8547E + 0019 MPC8545E + 001a MPC8545 + 0020 MPC8568E + 0021 MPC8568 + 0022 MPC8567E + 0023 MPC8567 + 0030 MPC8533E + 0031 MPC8533 + 0032 MPC8544E + 0033 MPC8544 + 0040 MPC8572E + 0041 MPC8572 + 0050 MPC8536E + 0051 MPC8536 + 0052 MPC8535E + 0053 MPC8535 + 0060 MPC8569 + 0061 MPC8569E + 0070 P2020E + 0071 P2020 + 0078 P2010E + 0079 P2010 + 0080 MPC8349E + 0081 MPC8349 + 0082 MPC8347E TBGA + 0083 MPC8347 TBGA + 0084 MPC8347E PBGA + 110a 4074 SIMATIC NET CP 1628 + 0085 MPC8347 PBGA + 110a 4046 SIMATIC NET CP 1623 + 0086 MPC8343E + 0087 MPC8343 + 00b4 MPC8315E + 00b6 MPC8314E + 1a56 1101 Bigfoot Killer Xeno Pro Gigabit Ethernet Controller + 00c2 MPC8379E + 00c3 MPC8379 + 00c4 MPC8378E + 00c5 MPC8378 + 00c6 MPC8377E + 00c7 MPC8377 + 0100 P1020E + 0101 P1020 + 0102 P1021E + 0103 P1021 + 0108 P1011E + 0109 P1011 + 010a P1012E + 010b P1012 + 0110 P1022E + 0111 P1022 + 1c7f 5200 EB5200 + 0118 P1013E + 0119 P1013 + 0128 P1010 + 0400 P4080E + 0401 P4080 + 0408 P4040E + 0409 P4040 + 041f P3041 + 0440 T4240 with security + 0441 T4240 without security + 0446 T4160 with security + 0447 T4160 without security + 0830 T2080 with security + 0831 T2080 without security + 0838 T2081 with security + 0839 T2081 without security + 580c MPC5121e + 7010 MPC8641 PCI Host Bridge + 7011 MPC8641D PCI Host Bridge + 7018 MPC8610 + c006 MPC8308 + 1a56 1201 Bigfoot Killer E2100 Gigabit Ethernet Controller +# PCIe interface for emulator + fc02 RedStone +# CFI device over PCIe + fc03 CFI +1958 Faster Technology, LLC. +1959 PA Semi, Inc + a000 PA6T Core + a001 PWRficient Host Bridge + a002 PWRficient PCI-Express Port + a003 PWRficient SMBus Controller + a004 PWRficient 16550 UART + a005 PWRficient Gigabit Ethernet + a006 PWRficient 10-Gigabit Ethernet + a007 PWRficient DMA Controller + a008 PWRficient LPC/Localbus Interface + a009 PWRficient L2 Cache + a00a PWRficient DDR2 Memory Controller + a00b PWRficient SERDES + a00c PWRficient System/Debug Controller + a00d PWRficient PCI-Express Internal Endpoint +1966 Orad Hi-Tec Systems + 1975 DVG64 family + 1977 DVG128 family + 1979 3DVG/UHD3 + 1980 HDV2/UHD2 + 1234 3160 UHD2LC + 1234 3300 Legacy UHD2 + 1234 3410 UHD2 +# nee Atheros Communications, Inc. nee Attansic Technology Corp. +1969 Qualcomm Atheros + 1026 AR8121/AR8113/AR8114 Gigabit or Fast Ethernet + 1043 8304 P5KPL-CM Motherboard + 1048 Attansic L1 Gigabit Ethernet + 1043 8226 P5B-MX/WiFi-AP, P5KPL-VM Motherboard + 1062 AR8132 Fast Ethernet + 1063 AR8131 Gigabit Ethernet + 1458 e000 GA-G31M-ES2L Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 1066 Attansic L2c Gigabit Ethernet + 1067 Attansic L1c Gigabit Ethernet + 1073 AR8151 v1.0 Gigabit Ethernet + 1083 AR8151 v2.0 Gigabit Ethernet + 1090 AR8162 Fast Ethernet + 1043 108d VivoBook X202E, X202EV + 1091 AR8161 Gigabit Ethernet + 1043 1477 N56VZ + 10a0 QCA8172 Fast Ethernet + 10a1 QCA8171 Gigabit Ethernet + 2048 Attansic L2 Fast Ethernet + 2060 AR8152 v1.1 Fast Ethernet + 2062 AR8152 v2.0 Fast Ethernet + 1043 8468 Eee PC 1015PX +# E2200, E2201, E2205 + e091 Killer E220x Gigabit Ethernet Controller + e0a1 Killer E2400 Gigabit Ethernet Controller + e0b1 Killer E2500 Gigabit Ethernet Controller +196a Sensory Networks Inc. + 0101 NodalCore C-1000 Content Classification Accelerator + 0102 NodalCore C-2000 Content Classification Accelerator + 0105 NodalCore C-3000 Content Classification Accelerator +196d Club-3D BV +196e PNY +1971 AGEIA Technologies, Inc. + 1011 Physics Processing Unit [PhysX] + 1043 0001 PhysX P1 +# nee Eberspaecher Electronics +1974 Star Electronics GmbH & Co. KG + 0009 FlexCard PMC-II + 0011 FlexCard PMC-II Ethernet + 0018 FlexCard PXIe3 + 0019 FlexCard PCIe3 +# IO card for std ethernet and automotive ethernet (ieee 1000Base-T1) + 001a FlexCard PXIe Ethernet +# IO card for std ethernet and automotive ethernet (ieee 1000Base-T1) + 001b FlexCard PCIe Ethernet +1976 TRENDnet +1977 Parsec +197b JMicron Technology Corp. + 0250 JMC250 PCI Express Gigabit Ethernet Controller + 0260 JMC260 PCI Express Fast Ethernet Controller + 0368 JMB368 IDE controller + 0585 JMB58x AHCI SATA controller + 2360 JMB360 AHCI Controller + 2361 JMB361 AHCI/IDE + 1462 7235 P965 Neo MS-7235 mainboard + 2362 JMB362 SATA Controller + 1043 8460 P8P67 Deluxe Motherboard + 2363 JMB363 SATA/IDE Controller + 1043 81e4 P5B [JMB363] + 1458 b000 Motherboard + 1849 2363 Motherboard (one of many) + 2364 JMB364 AHCI Controller + 2365 JMB365 AHCI/IDE + 2366 JMB366 AHCI/IDE + 2368 JMB368 IDE controller + 2369 JMB369 Serial ATA Controller + 2380 IEEE 1394 Host Controller + 2381 Standard SD Host Controller + 2382 SD/MMC Host Controller + 2383 MS Host Controller + 2384 xD Host Controller + 2386 Standard SD Host Controller + 2387 SD/MMC Host Controller + 2388 MS Host Controller + 2389 xD Host Controller + 2391 Standard SD Host Controller + 2392 SD/MMC Host Controller + 2393 MS Host Controller + 2394 xD Host Controller +1982 Distant Early Warning Communications Inc + 1600 OX16C954 HOST-A + 16ff OX16C954 HOST-B +1987 Phison Electronics Corporation + 5007 E7 NVMe Controller + 5012 E12 NVMe Controller + 5013 PS5013 E13 NVMe Controller + 5016 E16 PCIe4 NVMe Controller + 5018 E18 PCIe4 NVMe Controller +1989 Montilio Inc. + 0001 RapidFile Bridge + 8001 RapidFile +198a Nallatech Ltd. +1993 Innominate Security Technologies AG +1999 A-Logics + a900 AM-7209 Video Processor +199a Pulse-LINK, Inc. +199d Xsigo Systems + 8209 Virtual NIC Device + 890a Virtual HBA Device +199f Auvitek + 8501 AU85X1 PCI REV1.1 + 8521 AU8521 TV card +# nee ServerEngines Corp. +19a2 Emulex Corporation + 0120 x1 PCIe Gen2 Bridge[Pilot4] + 0200 BladeEngine 10Gb PCI-E iSCSI adapter + 0201 BladeEngine 10Gb PCIe Network Adapter + 0211 BladeEngine2 10Gb Gen2 PCIe Network Adapter + 0212 BladeEngine2 10Gb Gen2 PCIe iSCSI Adapter + 0221 BladeEngine3 10Gb Gen2 PCIe Network Adapter + 0222 BladeEngine3 10Gb Gen2 PCIe iSCSI Adapter + 0700 OneConnect OCe10100/OCe10102 Series 10 GbE + 103c 1747 NC550SFP DualPort 10GbE Server Adapter + 103c 1749 NC550SFP Dual Port Server Adapter + 103c 174a NC551m Dual Port FlexFabric 10Gb Adapter + 103c 174b StorageWorks NC550 DualPort Converged Network Adapter + 103c 3314 NC551i Dual Port FlexFabric 10Gb Adapter + 0702 OneConnect 10Gb iSCSI Initiator + 0704 OneConnect OCe10100/OCe10102 Series 10 GbE CNA + 10df e602 OneConnect OCe10100 10Gb CNA + 10df e630 OneConnect OCe10102-FM-E / OCe10102-FX-E for EMC VNX Symmetrix + 0710 OneConnect 10Gb NIC (be3) +# FC 5287 / FC 5284; CCIN 5287 + 1014 03d0 PCIe2 2-port 10GbE SR Adapter for POWER +# FC 5288 / FC 5286; CCIN 5288 + 1014 03d1 PCIe2 2-port 10GbE SFP+ Copper Adapter for POWER + 1014 0409 Integrated Multifunction Card with Dual 10GbE SR Optical + Dual 1GbE for Power 750/760 + 1014 040a Integrated Multifunction Card with Dual 10GbE SR Copper + Dual 1GbE for Power 750/760 + 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter + 103c 3340 NC552SFP 2-port 10Gb Server Adapter + 103c 3341 NC552m 10Gb 2-port FlexFabric Converged Network Adapter + 103c 3345 NC553m 10Gb 2-port FlexFabric Converged Network Adapter + 103c 337b NC554FLB 10Gb 2-port FlexFabric Converged Network Adapter + 10df e733 Flex System EN4054 4-port 10Gb Ethernet Mezzanine Adapter + 0712 OneConnect 10Gb iSCSI Initiator (be3) + 0714 OneConnect 10Gb FCoE Initiator (be3) + 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter + 103c 337b NC554FLB 10Gb 2-port FlexFabric Converged Network Adapter + 0800 ServerView iRMC HTI +19a8 DAQDATA GmbH +19ac Kasten Chase Applied Research + 0001 ACA2400 Crypto Accelerator +19ae Progeny Systems Corporation + 0520 4135 HFT Interface Controller + 0521 Decimator +19ba ZyXEL Communications Corp. + 2330 ZyWALL Turbo Card +19c1 Exegy Inc. +# nee NextNet Wireless +19d1 Motorola Expedience +19d4 Quixant Limited +19da ZOTAC International (MCO) Ltd. +19de Pico Computing +19e2 Vector Informatik GmbH +19e3 DDRdrive LLC + 5801 DDRdrive X1 + 5808 DDRdrive X8 + dd52 DDRdrive X1-30 +19e5 Huawei Technologies Co., Ltd. +# subvendor + 0123 ES3000 V3 NVMe PCIe SSD + 19e5 3022 NVMe SSD ES3600P V3 800GB 2.5" U.2 + 19e5 3023 NVMe SSD ES3600P V3 1200GB 2.5" U.2 + 19e5 3024 NVMe SSD ES3600P V3 1600GB 2.5" U.2 + 19e5 3025 NVMe SSD ES3600P V3 2000GB 2.5" U.2 + 19e5 3026 NVMe SSD ES3600P V3 3200GB 2.5" U.2 + 19e5 3033 NVMe SSD ES3600C V3 1200GB HHHL AIC + 19e5 3034 NVMe SSD ES3600C V3 1600GB HHHL AIC + 19e5 3036 NVMe SSD ES3600C V3 3200GB HHHL AIC + 0200 Hi1822 Family (2*100GE) + 19e5 d139 Hi1822 SP572 (2*100GE) + 19e5 d13d Hi1822 SC371 (2*100GE) + 19e5 d147 Hi1822 SP573 (2*100GE) + 0202 Hi1822 Family (2*32G FC) + 19e5 d149 Hi1822 SP528 (2*32G FC) + 19e5 d302 Hi1822 SP521 (2*32G FC) + 19e5 d304 Hi1822 SP526 (2*32G FC) + 0203 Hi1822 Family (2*16G FC) + 19e5 d148 Hi1822 SP527 (2*16G FC) + 19e5 d301 Hi1822 SP520 (2*16G FC) + 19e5 d305 Hi1822 SP525 (2*16G FC) + 0205 Hi1822 Family (2*100GE) + 19e5 df27 Hi1822 MZ731 MEZZ (2*100GE) + 0206 Hi1822 Family (2*25GE) + 19e5 d138 Hi1822 SP582 (2*25GE) + 19e5 d13a Hi1822 SC381 (2*25GE) + 19e5 d145 Hi1822 SP586 (2*25GE) + 0210 Hi1822 Family (4*25GE) + 19e5 df2e Hi1822 MZ532 MEZZ (4*25GE) + 0211 Hi1822 Family (4*25GE) + 19e5 d12f Hi1822 SP571 (4*25GE) + 19e5 d137 Hi1822 SP581 (4*25GE) + 19e5 d142 Hi1822 SP583 (4*25GE) + 0212 Hi1822 Family (2*8G FC) + 19e5 d303 Hi1822 SP522 (2*8G FC) + 19e5 d306 Hi1822 SP523 (2*8G FC) + 1710 iBMA Virtual Network Adapter + 1711 Hi171x Series [iBMC Intelligent Management system chip w/VGA support] + 1822 Hi1822 Family (4*25GE) + 19e5 d129 Hi1822 SP570 (4*25GE) + 19e5 d136 Hi1822 SP580 (4*25GE) + 19e5 d141 Hi1822 SP583 (4*25GE) + 19e5 d146 Hi1822 SP585 (4*25GE) + 3714 ES3000 V5 NVMe PCIe SSD + 19e5 5312 NVMe SSD ES3500P V5 2000GB 2.5" U.2 + 371e Hi1822 Family Virtual Bridge + 3754 ES3000 V6 NVMe PCIe SSD + 19e5 6122 NVMe SSD ES3600P V6 1600GB 2.5" U.2 + 19e5 6123 NVMe SSD ES3600P V6 3200GB 2.5" U.2 + 19e5 6124 NVMe SSD ES3600P V6 6400GB 2.5" U.2 + 19e5 6141 NVMe SSD ES3800P V6 800GB 2.5" U.2 + 19e5 6142 NVMe SSD ES3800P V6 1600GB 2.5" U.2 + 19e5 6212 NVMe SSD ES3500P V6 1920GB 2.5" U.2 + 19e5 6213 NVMe SSD ES3500P V6 3840GB 2.5" U.2 + 19e5 6214 NVMe SSD ES3500P V6 7680GB 2.5" U.2 + 19e5 6215 NVMe SSD ES3500P V6 15360GB 2.5" U.2 + 375e Hi1822 Family Virtual Function + 379e Hi1822 Family Virtual Function + a120 HiSilicon PCIe Root Port with Gen4 + a121 HiSilicon PCI-PCI Bridge + a122 HiSilicon Embedded DMA Engine + a124 HiSilicon Internal SDI Function Engine + a125 HiSilicon SDI Network Controller + a126 HiSilicon SDI NVMe Storage Controller + a127 HiSilicon SDI Accelerator + a12a HiSilicon Add-on PCI-PCI Bridge + a220 HNS GE Network Controller + a221 HNS GE/10GE/25GE Network Controller + 19e5 0454 TM280 + 19e5 04cc TM210 + 19e5 d14a TM280 4*25G + 19e5 d14b TM210 4*GE + a222 HNS GE/10GE/25GE RDMA Network Controller + a224 HNS GE/10GE/25GE/50GE RDMA Network Controller + a226 HNS GE/10GE/25GE/50GE/100GE RDMA Network Controller + a22a HiSilicon Network For SDI + a22e HNS Network Controller (Virtual Function) + a22f HNS RDMA Network Controller (Virtual Function) + a230 HiSilicon SAS 3.0 HBA + a235 HiSilicon AHCI HBA + a238 HiSilicon USB 3.0 Host Controller + a239 HiSilicon USB 2.0 2-port Host Controller + a23a HiSilicon USB 2.0 Host Controller + a23b HiSilicon USB 1.1 Host Controller + a250 HiSilicon ZIP Engine + a251 HiSilicon ZIP Engine(Virtual Function) + a255 HiSilicon SEC Engine + a256 HiSilicon SEC Engine(Virtual Function) + a258 HiSilicon HPRE Engine + a259 HiSilicon HPRE Engine(Virtual Function) + a25a HiSilicon RDE Engine + a25b HiSilicon RDE Engine(Virtual Function) +19e7 NET (Network Equipment Technologies) + 1001 STIX DSP Card + 1002 STIX - 1 Port T1/E1 Card + 1003 STIX - 2 Port T1/E1 Card + 1004 STIX - 4 Port T1/E1 Card + 1005 STIX - 4 Port FXS Card +19ee Netronome Systems, Inc. +19f1 BFG Tech +19ff Eclipse Electronic Systems, Inc. +1a03 ASPEED Technology, Inc. + 1150 AST1150 PCI-to-PCI Bridge + 2000 ASPEED Graphics Family + 15d9 0832 X10SRL-F + 15d9 1b95 H12SSL-i +1a05 deltaww +1a07 Kvaser AB + 0006 CAN interface PC104+ HS/HS + 0007 CAN interface PCIcanx II HS or HS/HS + 0008 CAN interface PCIEcan HS or HS/HS + 0009 CAN interface PCI104 HS/HS +1a08 Sierra semiconductor + 0000 SC15064 +1a0d SEAKR Engineering +1a0e DekTec Digital Video B.V. + 083f DTA-2111 VHF/UHF Modulator +1a17 Force10 Networks, Inc. + 8002 PB-10GE-2P 10GbE Security Card +1a1d GFaI e.V. + 1a17 Meta Networks MTP-1G IDPS NIC +1a1e 3Leaf Systems, Inc. +1a22 Ambric Inc. +1a29 Fortinet, Inc. + 4338 CP8 Content Processor ASIC + 43a0 CP9 Content Processor ASIC + 4e36 NP6 Network Processor + 4e37 NP7 Network Processor +1a2b Ascom AG + 0000 GESP v1.2 + 0001 GESP v1.3 + 0002 ECOMP v1.3 + 0005 ETP v1.4 + 000a ETP-104 v1.1 + 000e DSLP-104 v1.1 +# nee Metalink Ltd. +1a30 Lantiq + 0680 MtW8171 [Hyperion II] + 0700 Wave300 PSB8224 [Hyperion III] + 0710 Wave300 PSB8231 [Hyperion III] +1a32 Quanta Microsystems, Inc +1a3b AzureWave + 1112 AR9285 Wireless Network Adapter (PCI-Express) +1a41 Tilera Corp. + 0001 TILE64 processor + 0002 TILEPro processor + 0200 TILE-Gx processor + 0201 TILE-Gx Processor Virtual Function + 2000 TILE-Gx PCI Express Root Port +1a4a SLAC National Accelerator Lab TID-AIR + 1000 MCOR Power Supply Controller + 1010 AMC EVR - Stockholm Timing Board + 1020 PGPCard - Gen3 Cameralink Interface + 1030 PGPCard - Gen3 GIGe Interface + 2000 PGPCard - 4 Lane + 2001 PGPCard - 8 Lane Plus EVR + 2010 PCI-Express EVR + 2011 PCI-Express EVR - TPR Version + 2020 PGP-GEN3 PCIe - 8 Lane Plus EVR + 2030 AXI Stream DAQ PCIe card + 2040 EXO PCIe TEM + 3000 COB DTM V1 + 3001 COB DTM V2 +1a51 Hectronic AB +1a55 Rohde & Schwarz DVS GmbH + 0010 SDStationOEM + 0011 SDStationOEM II + 0020 Centaurus + 0021 Centaurus II + 0022 Centaurus II LT + 0030 CLIPSTER-VPU 1.x (Hugo) + 0040 Hydra Cinema (JPEG) + 0050 CLIPSTER-VPU 2.x (DigiLab) + 0060 CLIPSTER-DCI 2.x (HydraX) + 0061 Atomix + 0062 Atomix LT + 0063 Atomix HDMI + 0064 Atomix STAN + 0065 Atomix HDMI STAN + 0070 RED Rocket + 0090 CinePlay +# nee Bigfoot Networks, now owned by Intel +1a56 Rivet Networks +1a57 Highly Reliable Systems +1a58 Razer USA Ltd. +1a5d Celoxica +1a5e Aprius Inc. +1a5f System TALKS Inc. +1a68 VirtenSys Limited +1a71 XenSource, Inc. +1a73 Violin Memory, Inc + 0001 Mozart [Memory Appliance 1010] +1a76 Wavesat +1a77 Lightfleet Corporation +1a78 Virident Systems Inc. + 0031 FlashMAX Drive + 1a78 0034 FlashMAX PCIe SSD [rev 3] + 1a78 0037 FlashMAX PCIe SSD [rev 3D] + 1a78 0038 FlashMAX PCIe SSD [rev 4] + 1a78 0039 FlashMAX PCIe SSD [rev 4D] + 0040 FlashMAX II + 0041 FlashMAX II + 0042 FlashMAX II + 0050 FlashMAX III +1a84 Commex Technologies + 0001 Vulcan SP HT6210 10-Gigabit Ethernet (rev 02) +1a88 MEN Mikro Elektronik + 4d45 Multifunction IP core +1a8a StarBridge, Inc. +1a8c Verigy Pte. Ltd. + 1100 E8001-66443 PCI Express CIC +1a8e DRS Technologies + 2090 Model 2090 PCI Express +1aa8 Ciprico, Inc. + 0009 RAIDCore Controller + 000a RAIDCore Controller +1aa9 Schweitzer Engineering Laboratories + 000d SEL-3390S8 Serial Adapter + 000e SEL-3390E4 Ethernet Adapter + 0014 SEL-3390T Time and Ethernet Adapter + 0018 SEL-3390E4 Ethernet Adapter +1aae Global Velocity, Inc. +1ab4 Distributed Management Task Force, Inc. (DMTF) +1ab6 CalDigit, Inc. + 6201 RAID Card +# Parallels VM virtual devices +1ab8 Parallels, Inc. + 4000 Virtual Machine Communication Interface + 4005 Accelerated Virtual Video Adapter + 4006 Memory Ballooning Controller +1ab9 Espia Srl +1ac1 Global Unichip Corp. + 089a Coral Edge TPU +1ac8 Aeroflex Gaisler +1acc Point of View BV +1ad7 Spectracom Corporation + 8000 TSync-PCIe Time Code Processor + 9100 TPRO-PCI-66U Timecode Reader/Generator +1ade Spin Master Ltd. + 1501 Swipetech barcode scanner + 3038 PCIe Video Bridge + 13c2 3016 TT-budget S2-4200 Twin + 4254 0552 S952 v3 +1ae0 Google, Inc. +# NVMe drive in GCP + 001f NVMe device + 0042 Compute Engine Virtual Ethernet [gVNIC] + abcd Airbrush Combined Paintbox IPU/Oscar Edge TPU [Pixel Neural Core] +1ae3 SANBlaze Technology, Inc. +1ae7 First Wise Media GmbH + 0520 HFC-S PCI A [X-TENSIONS XC-520] +# nee Silicon Software GmbH +1ae8 Basler AG +# CameraLink frame grabber for Visual Applets + 0751 mE5 marathon VCL +# CameraLink HS frame grabber + 0752 mE5 marathon AF2 +# CoaXpress frame grabber + 0753 mE5 marathon ACX QP +# CameraLink frame grabber + 0754 mE5 marathon ACL +# CoaXpress frame grabber + 0755 mE5 marathon ACX SP +# CoaXpress frame grabber + 0756 mE5 marathon ACX DP +# CoaXpress frame grabber for Visual Applets + 0757 mE5 marathon VCX QP +# CameraLink HS frame grabber for Visual Applets + 0758 mE5 marathon VF2 +# CameraLink frame grabber for Visual Applets / AI applications + 0759 mE5 marathon VCLx +# CameraLink frame grabber + 0a40 microEnable IV AD1-CL +# CameraLink frame grabber for Visual Applets + 0a41 microEnable IV VD1-CL +# CameraLink frame grabber + 0a42 microEnable IV AD4-CL +# CameraLink frame grabber for Visual Applets + 0a44 microEnable IV VD4-CL +# CameraLink frame grabber + 0a45 microEnable IV AS1-CL +# CoaXpress frame grabber + 0a53 microEnable 5 AQ8-CXP6B +# CoaXpress frame grabber for Visual Applets + 0a54 microEnable 5 VQ8-CXP6B +# CoaXpress frame grabber for Visual Applets + 0a56 microEnable 5 VQ8-CXP6D +# CoaXpress frame grabber + 0a57 microEnable 5 AQ8-CXP6D +# CameraLink frame grabber for Visual Applets + 0a58 microEnable 5 VD8-CL +# CameraLink frame grabber + 0a5a microEnable 5 AD8-CL +# CoaXpress frame grabber + 0a64 imaWorx CXP-12 Quad +# OEM product + 0b52 mE5 Abacus 4G Base +# OEM product + 0b53 mE5 Abacus 4G Base II +# OEM product + 0b61 mE6 Abacus 4TG +# CoaXpress frame grabber + 0b63 CXP-12 Interface Card 1C +# CoaXpress frame grabber + 0b64 CXP-12 Interface Card 4C +# CoaXpress frame grabber + 0b65 CXP-12 Interface Card 2C +# CoaXpress Thunderbolt frame grabber + 0b66 CXP-12 LightBridge 2C +# GigE Vision frame grabber + 0e42 microEnable IV AQ4-GE +# GigE Vision frame grabber for Visual Applets + 0e44 microEnable IV VQ4-GE +1ae9 Wilocity Ltd. + 0101 Wil6200 PCI Express Upstream Port + 0200 Wil6200 PCI Express Port + 0201 Wil6200 Wireless PCI Express Port + 0301 Wil6200 802.11ad Wireless Network Adapter + 0302 Wil6200 802.11ad Wireless Network Adapter + 0310 Wil6200 802.11ad Wireless Network Adapter +1aea Alcor Micro + 6601 AU6601 PCI-E Flash card reader controller + 6621 AU6621 PCI-E Flash card reader controller + 6625 AU6625 PCI-E Flash card reader controller +1aec Wolfson Microelectronics +# nee Fusion-io +1aed SanDisk + 1003 ioDimm3 (v1.2) + 1005 ioDimm3 + 1014 03c3 High IOPS SSD PCIe Adapter + 103c 176f 1.28TB MLC PCIe ioDrive Duo + 103c 1770 5.2TB MLC PCIe ioDrive Octal + 103c 178b 160GB SLC PCIe ioDrive + 103c 178c 320GB MLC PCIe ioDrive + 103c 178d 320GB SLC PCIe ioDrive Duo + 103c 178e 640GB MLC PCIe ioDrive Duo + 1006 ioXtreme + 1007 ioXtreme Pro + 1008 ioXtreme-2 + 2001 ioDrive2 + 3001 ioMemory FHHL + 3002 ioMemory HHHL + 3003 ioMemory Mezzanine +1aee Caustic Graphics Inc. +# nee Qumranet, Inc. +1af4 Red Hat, Inc. + 1000 Virtio network device + 01de fffb Propolis Virtio network device + 1001 Virtio block device + 01de fffa Propolis Virtio block device + 1002 Virtio memory balloon + 1003 Virtio console + 1004 Virtio SCSI + 1005 Virtio RNG + 1009 Virtio filesystem +# virtio 1.0 + 1041 Virtio network device +# virtio 1.0 + 1042 Virtio block device +# virtio 1.0 + 1043 Virtio console +# virtio 1.0 + 1044 Virtio RNG +# virtio 1.0 + 1045 Virtio memory balloon +# virtio 1.0 + 1048 Virtio SCSI +# virtio 1.0 + 1049 Virtio filesystem +# virtio 1.0 + 1050 Virtio GPU +# virtio 1.0 + 1052 Virtio input +# virtio 1.0 + 1053 Virtio socket + 105a Virtio file system + 1110 Inter-VM shared memory + 1af4 1100 QEMU Virtual Machine +1af5 Netezza Corp. +1afa J & W Electronics Co., Ltd. +1b03 Magnum Semiconductor, Inc, + 6100 DXT/DXTPro Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder + 7000 D7 Multiformat Broadcast HD/SD Encoder/Decoder/Transcoder +1b08 MSC Technologies GmbH +1b0a Pegatron +1b13 Jaton Corp +1b1a K&F Computing Research Co. + 0e70 GRAPE +1b1c Corsair +1b21 ASMedia Technology Inc. + 0611 ASM1061 SATA IDE Controller + 0612 ASM1062 Serial ATA Controller + 1849 0612 Motherboard + 1040 ASM1040 XHCI Controller + 1042 ASM1042 SuperSpeed USB Host Controller + 1043 1059 K53SM motherboard + 1043 8488 P8B WS Motherboard + 1849 1042 Motherboard + 1080 ASM1083/1085 PCIe to PCI Bridge + 1849 1080 Motherboard + 1142 ASM1042A USB 3.0 Host Controller + 1166 ASM1166 Serial ATA Controller + 1182 ASM1182e 2-Port PCIe x1 Gen2 Packet Switch + 1b21 118f ASM1182e 2-Port PCIe x1 Gen2 Packet Switch + 1184 ASM1184e 4-Port PCIe x1 Gen2 Packet Switch + 1849 1184 ASM1184e 4-Port PCIe x1 Gen2 Packet Switch + 1187 ASM1187e 7-Port PCIe x1 Gen2 Packet Switch + 1242 ASM1142 USB 3.1 Host Controller + 1343 ASM1143 USB 3.1 Host Controller + 1812 ASM1812 6-Port PCIe x4 Gen2 Packet Switch + 2142 ASM2142 USB 3.1 Host Controller + 1462 7a72 H270 PC MATE + 2824 ASM2824 PCIe Gen3 Packet Switch + 3242 ASM3242 USB 3.2 Host Controller +1b26 Netcope Technologies, a.s. + c132 COMBO-LXT155 + c1c0 NFB-100G1-e0 + c1c1 NFB-100G1-e1 + c250 NFB-200G2-master + c251 NFB-200G2-slave + c2c0 NFB-100G2-e0 + c2c1 NFB-100G2-e1 + cb20 COMBO-20G + cb40 COMBO-40G + cb80 NFB-40G2 +1b2c Opal-RT Technologies Inc. +1b36 Red Hat, Inc. + 0001 QEMU PCI-PCI bridge + 0002 QEMU PCI 16550A Adapter + 1af4 1100 QEMU Virtual Machine + 0003 QEMU PCI Dual-port 16550A Adapter + 1af4 1100 QEMU Virtual Machine + 0004 QEMU PCI Quad-port 16550A Adapter + 1af4 1100 QEMU Virtual Machine + 0005 QEMU PCI Test Device + 1af4 1100 QEMU Virtual Machine + 0006 PCI Rocker Ethernet switch device + 0007 PCI SD Card Host Controller Interface + 0008 QEMU PCIe Host bridge + 0009 QEMU PCI Expander bridge + 000a PCI-PCI bridge (multiseat) + 000b QEMU PCIe Expander bridge + 000c QEMU PCIe Root port + 000d QEMU XHCI Host Controller + 0010 QEMU NVM Express Controller + 0100 QXL paravirtual graphic card + 1af4 1100 QEMU Virtual Machine +1b37 Signal Processing Devices Sweden AB + 0001 ADQ214 + 0003 ADQ114 + 0005 ADQ112 + 000e ADQ108 + 000f ADQDSP + 0014 ADQ412 + 0015 ADQ212 + 001b SDR14 + 001c ADQ1600 + 001e ADQ208 + 001f DSU + 0020 ADQ14 + 0023 ADQ7 + 0026 ADQ8 + 2014 TX320 + 2019 S6000 +# now owned by HGST (a Western Digital subsidiary) +1b39 sTec, Inc. + 0001 S1120 PCIe Accelerator SSD +1b3a Westar Display Technologies + 7589 HRED J2000 - JPEG 2000 Video Codec Device +1b3e Teradata Corp. + 1fa8 BYNET BIC2SE/X + 1b3e 00a3 BYNET BIC2SX + 1b3e 00c3 BYNET BIC2SE +1b40 Schooner Information Technology, Inc. +# also used by some PROXIM (14b7) devices erroneously +1b47 Numascale AS + 0601 NumaChip N601 + 0602 NumaChip N602 +1b4b Marvell Technology Group Ltd. +# device 1b4b:0100 reports incorrect vendor id due to hw erratum (correct is 11ab) + 0100 88F3700 [Armada 3700 Family] ARM SoC + 0640 88SE9128 SATA III 6Gb/s RAID Controller + 2241 88NR2241 Non-Volatile memory controller + 1028 2112 BOSS-N1 Monolithic + 1028 2113 BOSS-N1 Modular + 1028 2151 BOSS-N1 Modular ET + 1028 2196 ROR-N100 + 1b4b 2241 Santa Cruz NVMe Host Adapter + 1d49 0306 ThinkSystem M.2 NVMe 2-Bay RAID Enablement Kit + 1d49 0307 ThinkSystem 7mm NVMe 2-Bay Rear RAID Enablement Kit + 9120 88SE9120 SATA 6Gb/s Controller + 9123 88SE9123 PCIe SATA 6.0 Gb/s controller + dc93 600e DC-6xxe series SATA 6G controller + 9125 88SE9125 PCIe SATA 6.0 Gb/s controller + 9128 88SE9128 PCIe SATA 6 Gb/s RAID controller + 9130 88SE9128 PCIe SATA 6 Gb/s RAID controller with HyperDuo + 1043 8438 P8P67 Deluxe Motherboard + 9170 88SE9170 PCIe 2.0 x1 2-port SATA 6 Gb/s Controller + 9172 88SE9172 SATA 6Gb/s Controller + 9178 88SE9170 PCIe SATA 6Gb/s Controller + 917a 88SE9172 SATA III 6Gb/s RAID Controller + 9182 88SE9182 PCIe 2.0 x2 2-port SATA 6 Gb/s Controller + 9183 88SS9183 PCIe SSD Controller + 9192 88SE9172 SATA III 6Gb/s RAID Controller + 91a0 88SE912x SATA 6Gb/s Controller [IDE mode] + 91a4 88SE912x IDE Controller + 9215 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller + 9220 88SE9220 PCIe 2.0 x2 2-port SATA 6 Gb/s RAID Controller + 9230 88SE9230 PCIe 2.0 x2 4-port SATA 6 Gb/s RAID Controller + 1028 1fd6 BOSS-S1 Adapter + 1028 1fdf BOSS-S1 Modular + 1028 1fe2 BOSS-S1 Adapter + 1028 2010 BOSS-S2 Adapter +# RS0200L6R2iM2 + 1bd4 0073 RS0200L6R2iM2 + 1d49 0300 ThinkSystem M.2 with Mirroring Enablement Kit + 1d49 0301 ThinkSystem SR630 x16 PCIE with 4 SATA ports Riser + 1d49 0302 ThinkSystem SE350 M.2 SATA 4-Bay Data RAID Mirroring Enablement Kit + 1d49 0303 ThinkSystem SE350 M.2 SATA 4-Bay Data RAID Mirroring Enablement Kit + 1d49 0304 ThinkSystem M.2 SATA 2-Bay RAID Enablement Kit + 1d49 0305 ThinkSystem 7mm SATA 2-Bay Rear RAID Enablement Kit + 9235 88SE9235 PCIe 2.0 x2 4-port SATA 6 Gb/s Controller + 9445 88SE9445 PCIe 2.0 x4 4-Port SAS/SATA 6 Gbps RAID Controller + 9480 88SE9480 SAS/SATA 6Gb/s RAID controller + 9485 88SE9485 SAS/SATA 6Gb/s controller +1b4c GALAX +1b55 NetUP Inc. + 18f6 Dual DVB Universal CI card + 18f7 Dual DVB Universal CI card rev 1.4 + 2a2c Dual DVB-S2-CI card + e2e4 Dual DVB-T/C-CI RF card +# 2xHDMI and 2xHD-SDI inputs + e5f4 MPEG2 and H264 Encoder-Transcoder + f1c4 Dual ASI-RX/TX-CI card +1b66 DELTACAST + 0007 DELTA-3G-elp-d +1b6f Etron Technology, Inc. + 7023 EJ168 USB 3.0 Host Controller + 1458 5007 GA-880GMA-USB3 + 7052 EJ188/EJ198 USB 3.0 Host Controller + 1849 7052 QC5000-ITX/PH +1b73 Fresco Logic + 1000 FL1000G USB 3.0 Host Controller + 1d5c 1000 Anker USB 3.0 Express Card + 1009 FL1009 USB 3.0 Host Controller + 1100 FL1100 USB 3.0 Host Controller + 16b8 6e31 Allegro Pro USB 3.0 PCIe +1b74 OpenVox Communication Co. Ltd. + 0115 D115P/D115E Single-port E1/T1 card + d130 D130P/D130E Single-port E1/T1 card (3rd GEN) + d210 D210P/D210E Dual-port E1/T1 card(2nd generation) + d230 D230 Dual-port E1/T1 card (2nd generation) + d410 D410/430 Quad-port E1/T1 card + d430 D410/430 Quad-port E1/T1 card +1b79 Absolute Analysis +1b85 OCZ Technology Group, Inc. + 1041 RevoDrive 3 X2 PCI-Express SSD 240 GB (Marvell Controller) + 6018 RD400/400A SSD + 8788 RevoDrive Hybrid +1b94 Signatec / Dynamic Signals Corp + e400 PX14400 Dual Xilinx Virtex5 based Digitizer +1b96 Western Digital + 2200 Ultrastar DC SN630 NVMe SSD + 2201 Ultrastar DC SN630 NVMe SSD + 2300 Ultrastar DC SN840 NVMe SSD + 2400 Ultrastar DC SN640 NVMe SSD + 2401 Ultrastar DC SN640 NVMe SSD + 2402 Ultrastar DC SN640 NVMe SSD + 2404 Ultrastar DC SN640 NVMe SSD + 2500 Ultrastar DC SN840 NVMe SSD + 2600 Ultrastar DC ZN540 ZNS NVMe SSD + 3714 PC SN730 NVMe SSD + 3734 PC SN730 NVMe SSD +1b9a XAVi Technologies Corp. +1baa QNAP Systems, Inc. +1bad ReFLEX CES + c001 XpressGXA10-LP1150 + c002 XpressGXA10-LP1151 +1bb0 SimpliVity Corporation + 0002 OmniCube Accelerator OA-3000 + 0010 OmniCube Accelerator OA-3000-2 +1bb1 Seagate Technology PLC + 005d Nytro PCIe Flash Storage + 1bb1 6501 Nytro XP6500-8A1536 1.5TB +# 2TB Nytro PCIe controller + 1bb1 6502 Nytro XP6500-8A2048 +# 4TB Nytro PCIe controller + 1bb1 6503 Nytro XP6500-8A4096 +# 2GB DRAM variant of Nytro card + 1bb1 6511 Nytro XH6550-2GB DRAM +# 8GB variant of Nytro PCIe controller + 1bb1 6512 Nytro XH6550-8GB DRAM +# 1.5 TB Nytro PCIe controller + 1bb1 6521 Nytro XP6500-8A1536 1.5TB +# 2TB Nytro PCIe controller + 1bb1 6522 Nytro XP6500-8A2048 +# 4TB Nytro PCIe controller + 1bb1 6523 Nytro XP6500-8A4096 + 0100 Nytro Flash Storage + 1bb1 0101 Nytro XF1440 + 1bb1 0103 Nytro 5000 + 1bb1 0105 Nytro 5020 + 1bb1 0106 Nytro 5020 TCG +# Larkspur 2.5" + 1bb1 0107 Nytro 5320 +# Larkspur 2.5" TCG + 1bb1 0108 Nytro 5320 TCG + 1bb1 0121 Nytro XM1440 + 1bb1 0123 Nytro 5000 +# Kiowa M.2 + 1bb1 0125 Nytro 5020 +# Kiowa M.2 TCG + 1bb1 0126 Nytro 5020 +# Larkspur M.2 22110mm + 1bb1 0127 Nytro 5320 M.2 +# Larkspur M.2 22110mm TCG + 1bb1 0128 Nytro 5320 M.2 TCG +# Larkspur M.2 2280mm + 1bb1 0131 Nytro 5320 M.2 +# Larkspur M.2 2280mm TCG + 1bb1 0132 Nytro 5320 M.2 TCG +# Larkspur E1.S + 1bb1 0141 Nytro 5320 E1.S +# Larkspur E1.S TCG + 1bb1 0142 Nytro 5320 E1.S TCG +# Kersey 2.5" + 1bb1 0151 Nytro 5520 +# Kersey 2.5" TCG + 1bb1 0152 Nytro 5520 TCG +# Nytro 5050H (Ebonhawk - High Performance) + 1bb1 0153 Nytro 5050H +# Nytro 5050H TCG (Ebonhawk High Performance) + 1bb1 0154 Nytro 5050H TCG +# Nytro 5050M (Ebonhawk Mainstream Performance) + 1bb1 0155 Nytro 5050M +# Nytro 5050M TCG (Ebonhawk Mainstream Performance) + 1bb1 0156 Nytro 5050M TCG +# Nytro 5050M (Ebonhawk Mainstream Performance) - 7mm + 1bb1 0157 Nytro 5050M 7mm +# Nytro 5050M (Ebonhawk Mainstream Performance) TCG - 7mm + 1bb1 0158 Nytro 5050M TCG 7mm +# Nytro 5060M (Rocinante Mainstream Performance) - 15mm + 1bb1 0159 Nytro 5060M +# Nytro 5050M TCG (Rocinante Mainstream Performance) - 15mm + 1bb1 0160 Nytro 5060M TCG +# Nytro 5060M 7mm (Rocinante Mainstream Performance) + 1bb1 0161 Nytro 5060M 7mm +# Nytro 5060M TCG (Rocinante Mainstream Performance) - 7mm + 1bb1 0162 Nytro 5060M TCG 7mm +# Nytro 5060H (Rocinante High Performance) + 1bb1 0163 Nytro 5060H +# Nytro 5060H TCG (Rocinante High Performance) + 1bb1 0164 Nytro 5060H TCG +# Nytro 5060H (Rocinante - High Performance) - E3.S 1T + 1bb1 0165 Nytro 5060H E3.S 1T +# Nytro 5060H (Rocinante - High Performance) - E3.S 1T TCG + 1bb1 0166 Nytro 5060H E3.S 1T TCG +# Nytro 5060H (Rocinante - High Performance) - E3.L 1T + 1bb1 0167 Nytro 5060H E3.L 1T +# Nytro 5060H (Rocinante - High Performance) - E3.L 1T TCG + 1bb1 0168 Nytro 5060H E3.L 1T TCG +# Nytro 5060M (Rocinante Mainstream Performance) - E3.S 1T + 1bb1 0169 Nytro 5060M E3.S 1T +# Nytro 5060M (Rocinante Mainstream Performance) - E3.S 1T TCG + 1bb1 0170 Nytro 5060M E3.S 1T TCG +# Nytro 5060M (Rocinante Mainstream Performance) - E3.L 1T + 1bb1 0171 Nytro 5060M E3.L 1T +# Nytro 5060M (Rocinante Mainstream Performance) - E3.L 1T TCG + 1bb1 0172 Nytro 5060M E3.L 1T TCG +# Nytro 5060M (Rocinante Mainstream Performance) - E1.S + 1bb1 0173 Nytro 5060M E1.S +# Nytro 5060M (Rocinante Mainstream Performance) - E1.S TCG + 1bb1 0174 Nytro 5060M E1.S TCG + 1bb1 01a1 Nytro XP7102 + 5012 FireCuda 510 SSD + 5016 FireCuda 520 SSD + 5018 FireCuda 530 SSD +1bb3 Bluecherry + 4304 BC-04120A MPEG4 4 port video encoder / decoder + 4309 BC-08240A MPEG4 4 port video encoder / decoder + 4310 BC-16480A MPEG4 16 port video encoder / decoder + 4e04 BC-04120A 4 port MPEG4 video encoder / decoder + 4e09 BC-08240A 8 port MPEG4 video encoder / decoder + 4e10 BC-16480A 16 port MPEG4 video encoder / decoder + 5304 BC-H04120A 4 port H.264 video and audio encoder / decoder + 5308 BC-H08240A 8 port H.264 video and audio encoder / decoder + 5310 BC-H16480A 16 port H.264 video and audio encoder / decoder +1bb5 Quantenna Communications, Inc. +1bbf Maxeler Technologies Ltd. + 0003 MAX3 + 0004 MAX4 +1bc0 Innodisk Corporation + 1001 PCIe 3TG6-P Controller + 1002 PCIe 3TE6 Controller + 1160 PCIe 3TE2 Controller + 1321 PCIe 4TG-P Controller + 1322 PCIe 4TE Controller + 2262 PCIe 3TG3-P Controller + 5208 PCIe 3TE7 Controller + 5216 PCIe 3TE8 Controller + 5236 PCIe 4TG2-P Controller +1bcf NEC Corporation + 001c Vector Engine 1.0 +1bd0 Astronics Corporation + 1001 Mx5 PMC/XMC Databus Interface Card + 1002 PM1553-5 (PC/104+ MIL-STD-1553 Interface Card) + 1004 AB3000 Series Rugged Computer + 1005 PE1000 (Multi-Protocol PCIe/104 Interface Card) + 1006 webCS Wireless Aircraft Communications Server + 1007 AB3000 Series Rugged Computer (Series N) + 1008 ME1000 mPCIe Avionics Interface Card + 100a NG1 Series Avionics Converter + 1101 OmniBus II PCIe Multi-Protocol Interface Card + 1102 OmniBusBox II Multi-Protocol Interface Core + 1103 OmniBus II cPCIe/PXIe Multi-Protocol Interface Card + 1200 NG3 Series Mil-Std-1553 Interface + 1201 NG3 Series ARINC 429 Interface + 1202 NG3 Series Avionics Discrete & Serial Interface + 1203 NG3 Series Avionics Discrete Interface +1bd4 Inspur Electronic Information Industry Co., Ltd. + 0911 Arria10_PCIe_F10A1150 +1bee IXXAT Automation GmbH + 0003 CAN-IB200/PCIe +1bef Lantiq + 0011 MIPS SoC PCI Express Port +1bf4 VTI Instruments Corporation + 0001 SentinelEX + 7011 RX0xxx +1bfd EeeTOP +1c09 CSP, Inc. + 4254 10G-PCIE3-8D-2S + 4255 10G-PCIE3-8D-Q + 4256 10G-PCIE3-8D-2S + 4258 10G-PCIE3-8E-2S Network Adapter + 4260 10G-PCIE3-8E-4S Network Adapter + 4261 10G-PCIE3-8E-4S Network Adapter + 4262 10G-PCIE3-8E-4S Network Adapter + 4263 10G-PCIE3-8E-4S Network Adapter + 4264 10G-PCIE3-8E-2S Network Adapter + 4265 10G-PCIE3-8E-2S Network Adapter + 5000 25G-PCIE3-8A-2S Security Intelligent Adapter + 5001 25G-PCIE3-8B-2S Security Intelligent Adapter +1c1c Symphony + 0001 82C101 +1c1f SoftLab-NSK + 0015 FD842 + 0019 FD722 + 001a FD788 + 001b FD720 + 001c FD922 + 001d Vega + 001f FD940 +1c28 Lite-On IT Corp. / Plextor + 0122 M6e PCI Express SSD [Marvell 88SS9183] +# previously Fiberblaze +1c2c Silicom Denmark + 000a Capture + 000f SmartNIC + 00a0 FBC4G Capture 4x1Gb [Herculaneum] + 00a1 FBC4XG Capture 4x10Gb [Ancona] + 00a2 FBC8XG Capture 8x10Gb [Livorno] + 00a3 FBC2XG Capture 2x10Gb [Genoa] + 00a4 FBC4XGG3 Capture 4x10Gb [Livigno] + 00a5 FBC2XLG Capture 2x40Gb [Livorno] + 00a6 FBC1CG Capture 1x100Gb + 00a9 FBC2XGHH Capture 2x10Gb [Latina] + 00ad FBC2CGG3HL Capture 2x100Gb [Padua] + 00af Capture slave device + 00e0 PacketMover 2x100Gb [Savona] + 00e1 PacketMover 2x100Gb [Tivoli] + 00e3 PacketMover 2x10Gb [Tivoli] + 00e5 PacketMover 2x10Gb [Corfu] + 1000 SmartNIC N5010 4x100Gb + 1001 SmartNIC N5011 w/2xE810 4x100Gb + a000 FBC2CGG3 Capture 2x40Gb [Mango_02] + a001 FBC2CGG3 Capture 2x100Gb [Mango_02] + a003 FBC2CGG3 Capture 16x10Gb [Mango] + a007 FBC2CGG3 Capture 2x40Gb [Mango] + a008 FBC2CGG3 Capture 2x25Gb [Mango] + a009 FBC2CGG3 Capture 16x10Gb [Mango] + a00a FBC2CGG3 Capture 8x10Gb [Mango] + a00e FB2CG Capture 2x100Gb [Savona] + a00f FB2CG Capture 2x40Gb [Savona] + a010 FB2CGHH Capture 2x40Gb [Tivoli] + a011 FB2CG Capture 2x25Gb [Savona] + a012 FB2CG Capture 8x10Gb [Savona] + a013 FB2CGHH Capture 2x25Gb [Tivoli] + a014 FB2CGHH Capture 8x10Gb [Tivoli] + a015 FB2CGHH Capture 2x100Gb [Tivoli] +# Used on V120 VME Crate Controller +1c32 Highland Technology, Inc. +1c33 Daktronics, Inc +1c36 Annapurna Labs Ltd. + 0001 Gigabit Ethernet Adapter + 0002 SFP+ 10G Ethernet Adapter +1c3b Accensus, LLC + 0200 Telas2 +# http://www.accensusllc.com/accensustelas2.html + 0300 Telas 2.V +1c44 Enmotus Inc + 8000 8000 Storage IO Controller +# A Western Digital Subsidiary +1c58 HGST, Inc. + 0003 Ultrastar SN100 Series NVMe SSD + 1014 04f5 PCIe3 1.6TB NVMe Flash Adapter + 1014 04f6 PCIe3 3.2TB NVMe Flash Adapter + 1c58 0003 Ultrastar SN100/SN150 NVMe SSD + 0023 Ultrastar SN200 Series NVMe SSD + 1c58 8823 Ultrastar Memory (ME200) +1c5c SK hynix + 1283 PC300 NVMe Solid State Drive 256GB + 1284 PC300 NVMe Solid State Drive 512GB + 1285 PC300 NVMe Solid State Drive 1TB + 1327 BC501 NVMe Solid State Drive + 1339 BC511 + 1504 SC300 512GB M.2 2280 SATA Solid State Drive + 1527 PC401 NVMe Solid State Drive 256GB + 174a Gold P31 SSD + 243b PE6110 NVMe Solid State Drive + 1c5c 0100 PE6110 NVMe Solid State Drive + 2839 PE8000 Series NVMe Solid State Drive + 1028 2143 DC NVMe SED PE8010 RI U.2 960GB + 1028 2144 DC NVMe PE8010 RI U.2 960GB + 1028 2145 DC NVMe SED PE8010 RI U.2 1.92TB + 1028 2146 DC NVMe PE8010 RI U.2 1.92TB + 1028 2147 DC NVMe SED PE8010 RI U.2 3.84TB + 1028 2148 DC NVMe PE8010 RI U.2 3.84TB + 1028 2149 DC NVMe SED PE8010 RI U.2 7.68TB + 1028 214a DC NVMe PE8010 RI U.2 7.68TB + 1c5c 0100 PE8000 Series NVMe Solid State Drive + 2849 PE81x0 U.2/3 NVMe Solid State Drive + 1c5c 0101 PE81x0 U.2/3 NVMe Solid State Drive +1c5f Beijing Memblaze Technology Co. Ltd. + 000d PBlaze5 520/526 + 000e PBlaze6 6530 + 1c5f 0b20 NVMe SSD PBlaze6 6530 1920G AIC + 1c5f 0b21 NVMe SSD PBlaze6 6530 1920G 2.5" U.2 + 1c5f 0b30 NVMe SSD PBlaze6 6530 3840G AIC + 1c5f 0b31 NVMe SSD PBlaze6 6530 3840G 2.5" U.2 + 1c5f 0b40 NVMe SSD PBlaze6 6530 7680G AIC + 1c5f 0b41 NVMe SSD PBlaze6 6530 7680G 2.5" U.2 + 1c5f 4b20 NVMe SSD PBlaze6 6530 1600G AIC + 1c5f 4b21 NVMe SSD PBlaze6 6530 1600G 2.5" U.2 + 1c5f 4b30 NVMe SSD PBlaze6 6530 3200G AIC + 1c5f 4b31 NVMe SSD PBlaze6 6530 3200G 2.5" U.2 + 1c5f 4b40 NVMe SSD PBlaze6 6530 6400G AIC + 1c5f 4b41 NVMe SSD PBlaze6 6530 6400G 2.5" U.2 + 003d PBlaze5 920/926 + 003e PBlaze6 6920 + 1c5f 0a31 NVMe SSD PBlaze6 6920 3840GB 2.5" U.2 + 1c5f 0a41 NVMe SSD PBlaze6 6920 7680GB 2.5" U.2 + 1c5f 4a31 NVMe SSD PBlaze6 6920 3200GB 2.5" U.2 + 1c5f 4a41 NVMe SSD PBlaze6 6920 6400GB 2.5" U.2 + 0540 PBlaze4 NVMe SSD + 0550 PBlaze5 700/900 + 0555 PBlaze5 510/516 + 0557 PBlaze5 910/916 +# http://www.nicevt.ru/ (in Russian) +1c63 Science and Research Centre of Computer Technology (JSC "NICEVT") +# http://www.radiotec.ru/catalog.php?cat=jr8&art=14109 + 0008 K1927BB1Ya [EC8430] Angara Interconnection Network Adapter +1c7e TTTech Computertechnik AG + 0200 zFAS Debug Port +1c7f Elektrobit Austria GmbH + 5100 EB5100 +1c8a TSF5 Corporation + 0001 Hunter PCI Express +1c8c Mobiveil, Inc. +1cb0 Shannon Systems + 8266 SP4 Series SSD + 1cb0 2021 SP4 Series OCS U.2 SSD + 1cb0 2121 SP4 Series ZNS U.2 SSD + 1cb0 2f21 SP4E Series NVMe U.2 SSD(1920/3840/7680GB) + 1cb0 2f22 SP4X Series NVMe U.2 SSD(1600/3200/6400GB) + d000 Venice NVMe SSD + 1cb0 2010 Venice-E Series OCS U.2 + 1cb0 2011 Venice Series OCS U.2 + 1cb0 2012 Venice-X Series OCS U.2 +# Venice-E Series NVMe U.2 SSD(1.92T/3.84T/7.68T) + 1cb0 2f10 Venice-E Series NVMe U.2 +# Venice Series NVMe U.2 SSD(2T/4T/8T) + 1cb0 2f11 Venice Series NVMe U.2 +# Venice-X Series NVMe U.2 SSD(1.6T/3.2T/6.4T) + 1cb0 2f12 Venice-X Series NVMe U.2 + 1cb0 a010 Venice-E Series OCS AIC + 1cb0 a012 Venice-X Series OCS AIC +# Venice-E Series NVMe AIC SSD(1.92T/3.84T/7.68T) + 1cb0 af10 Venice-E Series NVMe AIC +# Venice-X Series NVMe AIC SSD(1.6T/3.2T/6.4T) + 1cb0 af12 Venice-X Series NVMe AIC +1cb1 Collion UG & Co.KG +1cb5 Focusrite Audio Engineering Ltd + 0002 Clarett +1cb8 Dawning Information Industry Co., Ltd. +1cc1 ADATA Technology Co., Ltd. +# 256GB NVMe SSD + 5766 ADATA XPG GAMMIXS1 1L Media + 8201 XPG SX8200 Pro PCIe Gen3x4 M.2 2280 Solid State Drive +1cc4 Union Memory (Shenzhen) + 1203 NVMe SSD Controller UHXXXa series + 1cc4 a121 NVMe SSD UHXXXa series U.2 960GB + 1cc4 a122 NVMe SSD UHXXXa series U.2 1920GB + 1cc4 a123 NVMe SSD UHXXXa series U.2 3840GB + 1cc4 a124 NVMe SSD UHXXXa series U.2 7680GB + 1cc4 a125 NVMe SSD UHXXXa series U.2 15360GB + 1cc4 a211 NVMe SSD UHXXXa series U.2 800GB + 1cc4 a212 NVMe SSD UHXXXa series U.2 1600GB + 1cc4 a213 NVMe SSD UHXXXa series U.2 3200GB + 1cc4 a214 NVMe SSD UHXXXa series U.2 6400GB + 17ab NVMe 256G SSD device + 6303 AM630 PCIe 4.0 x4 NVMe SSD Controller +1cc5 Embedded Intelligence, Inc. + 0100 CAN-PCIe-02 +1cc7 Radian Memory Systems Inc. + 0200 RMS-200 + 0250 RMS-250 +1ccf Zoom Corporation + 0001 TAC-2 Thunderbolt Audio Converter +1cd2 SesKion GmbH + 0301 Simulyzer-RT CompactPCI Serial DIO-1 card + 0302 Simulyzer-RT CompactPCI Serial PSI5-ECU-1 card + 0303 Simulyzer-RT CompactPCI Serial PSI5-SIM-1 card + 0304 Simulyzer-RT CompactPCI Serial PWR-ANA-1 card + 0305 Simulyzer-RT CompactPCI Serial CAN-1 card +# supports 8x CAN (-FD) interfaces + 0306 Simulyzer-RT CompactPCI Serial CAN-2 card (CAN-FD) + 0307 Simulyzer-RT CompactPCI Serial DIO-2 card [Xilinx Zynq UltraScale+] +1cd7 Nanjing Magewell Electronics Co., Ltd. + 0010 Pro Capture Endpoint + 0014 PRO CAPTURE AIO 4K PLUS + 0017 PRO CAPTURE AIO 4K + 0051 Eco Capture Dual HDMI M.2 + 0052 Eco Capture HDMI 4K M.2 + 0053 Eco Capture Dual SDI M.2 + 0054 Eco Capture Quad SDI M.2 +1cdd secunet Security Networks AG +1ce4 Exablaze + 0001 ExaNIC X4 + 0002 ExaNIC X2 + 0003 ExaNIC X10 + 0004 ExaNIC X10-GM + 0005 ExaNIC X40 + 0006 ExaNIC X10-HPT + 0007 ExaNIC X40 + 0008 ExaNIC V5P + 0009 ExaNIC X25 + 000a ExaNIC X100 + 000b ExaNIC V9P + 000c ExaNIC V9P-3 + 0100 ExaDISK FX1 +1cf0 Akitio +1cf7 Subspace Dynamics +1cfa Corsair Memory, Inc +1d00 Pure Storage +1d05 Tongfang Hongkong Limited +1d0f Amazon.com, Inc. + 8061 NVMe EBS Controller + cd01 NVMe SSD Controller + ec20 Elastic Network Adapter (ENA) + efa0 Elastic Fabric Adapter (EFA) + efa1 Elastic Fabric Adapter (EFA) +1d17 Zhaoxin + 070f ZX-100 PCI Express Root Port + 0710 ZX-100/ZX-200 PCI Express Root Port + 0711 ZX-100/ZX-200 PCI Express Root Port + 0712 ZX-100/ZX-200 PCI Express Root Port + 0713 ZX-100/ZX-200 PCI Express Root Port + 0714 ZX-100/ZX-200 PCI Express Root Port + 0715 ZX-100/ZX-200 PCI Express Root Port + 0716 ZX-D PCI Express Root Port + 0717 ZX-D/ZX-E PCI Express Root Port + 0718 ZX-D/ZX-E PCI Express Root Port + 0719 ZX-D/ZX-E PCI Express Root Port + 071a ZX-D/ZX-E PCI Express Root Port + 071b ZX-D/ZX-E PCI Express Root Port + 071c ZX-D/ZX-E PCI Express Root Port + 071d ZX-D/ZX-E PCI Express Root Port + 071e ZX-D/ZX-E PCI Express Root Port + 071f ZX-200 Upstream Port of PCI Express Switch + 0720 ZX-200 PCIE RC6 controller + 0721 ZX-200 Downstream Port of PCI Express Switch + 0722 ZX-200 PCIE P2C bridge + 1000 ZX-D Standard Host Bridge + 1001 ZX-D/ZX-E Miscellaneous Bus + 1003 ZX-E Standard Host Bridge + 3001 ZX-100 Standard Host Bridge + 300a ZX-100 Miscellaneous Bus + 3038 ZX-100/ZX-200/ZX-E Standard Universal PCI to USB Host Controller + 3104 ZX-100/ZX-200/ZX-E Standard Enhanced PCI to USB Host Controller + 31b0 ZX-100/ZX-D Standard Host Bridge + 31b1 ZX-100/ZX-D Standard Host Bridge + 31b2 ZX-100/ZX-D DRAM Controller + 31b3 ZX-100/ZX-D Power Management Controller + 31b4 ZX-100/ZX-D I/O APIC + 31b5 ZX-100/ZX-D Scratch Device + 31b7 ZX-100/ZX-D/ZX-E Standard Host Bridge + 31b8 ZX-100/ZX-D PCI to PCI Bridge + 3288 ZX-100/ZX-D/ZX-E High Definition Audio Controller + 345b ZX-100/ZX-D/ZX-E Miscellaneous Bus + 3a02 ZX-100 C-320 GPU + 3a03 ZX-D C-860 GPU + 3a04 ZX-E C-960 GPU + 9002 ZX-100/ZX-200 EIDE Controller + 9003 ZX-100/ZX-E EIDE Controller + 9045 ZX-100/ZX-D/ZX-E RAID Accelerator 0 + 9046 ZX-D/ZX-E RAID Accelerator 1 + 9083 ZX-100/ZX-200/ZX-E StorX AHCI Controller + 9084 ZX-100 StorX AHCI Controller + 9100 ZX-200 Cross bus + 9101 ZX-200 Traffic Controller + 9141 ZX-100 High Definition Audio Controller + 9142 ZX-D High Definition Audio Controller + 9144 ZX-E High Definition Audio Controller + 9180 ZX-200 Networking Gigabit Ethernet Adapter + 9202 ZX-100 USB eXtensible Host Controller + 9203 ZX-200 USB eXtensible Host Controller + 9204 ZX-E USB eXtensible Host Controller + 9286 ZX-D eMMC Host Controller + 9300 ZX-D/ZX-E eSPI Host Controller + 95d0 ZX-100 Universal SD Host Controller + f410 ZX-100/ZX-D/ZX-E PCI Com Port +1d18 RME + 0001 Fireface UFX+ +# acquired by Intel +1d1c Barefoot Networks, Inc. + 0001 Tofino 1 + 0010 Tofino 1 + 0100 Tofino 2 + 0110 Tofino 2 +1d1d CNEX Labs + 1f1f QEMU NVM Express LightNVM Controller + 2807 8800 series NVMe SSD +# CEM Solutions Pvt. Ltd. +1d21 Allo +1d22 Baidu Technology + 1380 Cloud Storage Device + 3684 Kunlun AI Accelerator + 3685 Kunlun2 AI Accelerator [VF] +1d26 Kalray Inc. + 0040 Turbocard2 Accelerator + 0080 Open Network Interface Card 80G + 00c0 Turbocard3 Accelerator + 0140 Open Network Interface Card 40G + e004 AB01/EMB01 Development Board +1d37 NovaSparks + 0013 PM3 + 0014 PM4 + 0015 PM4edge + 0016 PM4edge User Device +1d40 Techman Electronics (Changshu) Co., Ltd. +1d44 DPT + a400 PM2x24/PM3224 +1d49 Lenovo +1d4c Diamanti, Inc. +1d5c Fantasia Trading LLC +1d61 Technobox, Inc. +1d62 Nebbiolo Technologies +1d65 Imagine Communications Corp. + 04de Taurus/McKinley +1d69 Celeno Communications + 2432 CL2432 + 2440 CL2440 +1d6a Aquantia Corp. + 0001 AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 00b1 AQC100 10G Ethernet MAC controller [AQtion] + 07b1 AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] +# Older revision of QNAP QM2 M.2 2280 PCIe SSD & 10GbE Expansion Card + 1baa 07b1 QM2-2P10G1TA [QXG 10GbE Network Adapter] +# Newer revision of QNAP QM2 M.2 2280 PCIe SSD & 10GbE Expansion Card + 1baa 07b2 QM2-2P10G1TA [QM2 Expansion Adapter] + 08b1 AQC108 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 11b1 AQC111 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 12b1 AQC112 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 87b1 AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 94c0 AQC113CS NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 1043 87f5 ProArt X570-CREATOR WIFI + d107 AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 1043 8741 XG-C100C + d108 AQC108 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] +1d6c Atomic Rules LLC + 1001 A5PL-E1 + 1002 A5PL-E7 + 1003 S5PEDS-AB + 1004 KC705-K325 + 1005 ZC706-Z045 + 1006 KCU105-KU040 + 1007 XUSP3S-VU095 [Jasper] + 1008 XUSPL4-VU065 [Mustang UltraScale] + 1009 XUSPL4-VU3P [Mustang UltraScale+] + 100a A10PL4-A10GX115 + 100b K35-2SFP + 100c K35-4SFP + 100d AR-ARKA-FX0 [Arkville 32B DPDK Data Mover] + 1d6c 2001 DPDK-Aware Virtual Function [Arkville VF] + 100e AR-ARKA-FX1 [Arkville 64B DPDK Data Mover] + 1d6c 2001 DPDK-Aware Virtual Function [Arkville VF] + 100f AR-ARKA-FX1 [Arkville 64B DPDK Data Mover for Versal] + 1010 AR-ARKA-FX1 [Arkville 64B DPDK Data Mover for Agilex] + 1011 AR-MAN-U50 [Manitou Class Accelerator for U50] + 1012 AR-MAN-U200 [Manitou Class Accelerator for U200] + 1013 AR-MAN-U250 [Manitou Class Accelerator for U250] + 1014 AR-MAN-U280 [Manitou Class Accelerator for U280] + 1015 AR-ARK-BBDEV-FX0 [Arkville 32B DPDK Baseband Device] + 1016 AR-ARK-BBDEV-FX1 [Arkville 64B DPDK Baseband Device] + 1017 AR-ARK-FX1 [Arkville 64B Multi-Homed Primary Endpoint] + 1018 AR-ARK-FX1 [Arkville 64B Multi-Homed Secondary Endpoint] + 1019 AR-ARK-FX1 [Arkville 64B Multi-Homed Tertiary Endpoint] + 101a AR-ARK-SRIOV-FX0 [Arkville 32B Primary Physical Function] + 101b AR-ARK-SRIOV-FX1 [Arkville 64B Primary Physical Function] + 101c AR-ARK-SRIOV-VF [Arkville Virtual Function] + 101d AR-ARK-NIC [Arkville ArkNIC Kernel Path Device] + 101e AR-ARKA-FX1 [Arkville 64B DPDK Data Mover for Agilex R-Tile] + 101f AR-TK242 [2x100GbE Packet Capture Device] + 4200 A5PL-E1-10GETI [10 GbE Ethernet Traffic Instrument] +1d72 Xiaomi +1d78 DERA Storage + 1512 TAI NVMe Controller + 1d78 2004 D5437 HHHL 2TB NVMe SSD + 1d78 2006 D5437 HHHL 4TB NVMe SSD + 1d78 2008 D5437 HHHL 8TB NVMe SSD + 1d78 2104 D5437 U.2 2TB NVMe SSD + 1d78 2106 D5437 U.2 4TB NVMe SSD + 1d78 2108 D5437 U.2 8TB NVMe SSD + 1d78 3003 D5457 HHHL 1.6TB NVMe SSD + 1d78 3005 D5457 HHHL 3.2TB NVMe SSD + 1d78 3007 D5457 HHHL 6.4TB NVMe SSD + 1d78 3103 D5457 U.2 1.6TB NVMe SSD + 1d78 3105 D5457 U.2 3.2TB NVMe SSD + 1d78 3107 D5457 U.2 6.4TB NVMe SSD +1d7c Aerotech, Inc. +# Fiber-optic HyperWire motion control bus from Aerotech. + 0001 HyperWire Adapter +1d82 NETINT Technologies Inc. + 0101 Codensity D400 SSD + 0102 Codensity D408 PCIe Gen4 NVMe SSD + 0202 Codensity T408 Video Encoding-Decoding Accelerator +# nee Fuzhou Rockchip Electronics Co., Ltd +1d87 Rockchip Electronics Co., Ltd + 0100 RK3399 PCI Express Root Port + 1808 RK1808 Neural Network Processor Card + 3566 RK3568 Remote Signal Processor +1d89 YEESTOR Microelectronics Co., Ltd + 0280 PCIe NVMe SSD +1d8f Enyx +1d92 Abaco Systems Inc. +1d93 YADRO +1d94 Chengdu Haiguang IC Design Co., Ltd. + 1450 Root Complex + 1451 I/O Memory Management Unit + 1452 PCIe Dummy Host Bridge + 1453 PCIE GPP Bridge + 1454 Internal PCIe GPP Bridge 0 to Bus B + 1455 PCIe Dummy Function + 1456 PSPCCP Command DMA Processor + 1458 10 Gb Ethernet Controller Port 0/Port1 + 1459 10 Gb Ethernet Controller Port 2/Port3 + 145a PCIe Dummy Function + 145b PCIE Non-Transparent Bridge + 145c USB3 XHCI + 145d Switch upstream in PCIe + 145e Switch downstream in PCIe + 145f USB 3.0 Host controller + 1460 Data Fabric: Device 18h; Function 0 + 1461 Data Fabric: Device 18h; Function 1 + 1462 Data Fabric: Device 18h; Function 2 + 1463 Data Fabric: Device 18h; Function 3 + 1464 Data Fabric: Device 18h; Function 4 + 1465 Data Fabric: Device 18h; Function 5 + 1466 Data Fabric: Device 18h; Function 6 + 1467 Data Fabric: Device 18h; Function 7 + 1468 NTBCCP + 7901 FCH SATA Controller [AHCI mode] + 7904 FCH SATA Controller [AHCI mode] + 7906 FCH SD Flash Controller + 790b FCH SMBus Controller + 790e FCH LPC Bridge +1d95 Graphcore Ltd + 0001 Colossus GC2 [C2] + 0002 Colossus GC1 [S1] +1d97 Shenzhen Longsys Electronics Co., Ltd. + 2263 SM2263EN/SM2263XT-based OEM SSD +1d9b Facebook, Inc. + 0010 Networking DOM Engine + 0011 IO Bridge +1da1 Teko Telecom S.r.l. +1da2 Sapphire Technology Limited + e26a Radeon R7 250 +1da3 Habana Labs Ltd. + 0001 HL-1000 AI Inference Accelerator [Goya] +# PCIe accelerator card for Deep Learning training tasks + 1000 HL-2000 AI Training Accelerator [Gaudi] +# PCIe accelerator card for Deep Learning training tasks with secured firmware + 1010 HL-2000 AI Training Accelerator [Gaudi secured] +1da8 Corigine, Inc. +1dad Fungible +1db2 ATP ELECTRONICS INC +1db7 Phytium Technology Co., Ltd. + dc20 [X100 Series] + dc21 VPU Controller [X100 Series] + dc22 DC Controller [X100 Series] + dc23 I2S/DMA Controller [X100 Series] + dc26 SATA Controller [X100 Series] + dc27 USB Controller [X100 Series] + dc29 NANDFLASH Controller [X100 Series] + dc2b I2S Controller [X100 Series] + dc2c SPIM Controller [X100 Series] + dc2d CAN Controller [X100 Series] + dc2e UART Controller [X100 Series] + dc2f PWM Controller [X100 Series] + dc30 MIO Controller [X100 Series] + dc31 GPIO Controller [X100 Series] + dc32 SMBUS Controller [X100 Series] + dc34 PS2 Controller [X100 Series] + dc35 LPC Controller [X100 Series] + dc36 LDMA Controller [X100 Series] + dc38 LSD_CFG Controller [X100 Series] + dc3a SWITCH Controller [X100 Series] + dc3c GPU_DMA Controller [X100 Series] +1dbb NGD Systems, Inc. +1dbf Guizhou Huaxintong Semiconductor Technology Co., Ltd + 0401 StarDragon4800 PCI Express Root Port +1dc5 FADU Inc. +1dcd Liqid Inc. +1dcf Beijing Sinead Technology Co., Ltd. +1dd3 Sage Microelectronics Corp. +1dd8 Pensando Systems + 0002 DSC2 Elba Upstream Port + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1000 DSC Capri Upstream Port + 1dd8 4000 Naples 100Gb 2-port QSFP28 x16 8GB + 1dd8 4001 Naples 100Gb 2-port QSFP28 x16 4GB + 1dd8 4002 Naples 25Gb 2-port SFP28 x8 4GB + 1dd8 4007 DSP DSC-25 Ent 10/25G OCP3 Card + 1dd8 4008 DSP DSC-25 10/25G 2p SFP28 Card + 1dd8 400a DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 400c DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 400d DSP DSC-100 Ent 100Gb Card + 1dd8 400e DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 4014 DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1001 DSC Virtual Downstream Port + 1dd8 4000 Naples 100Gb 2-port QSFP28 x16 8GB + 1dd8 4001 Naples 100Gb 2-port QSFP28 x16 4GB + 1dd8 4002 Naples 25Gb 2-port SFP28 x8 4GB + 1dd8 4007 DSP DSC-25 Ent 10/25G OCP3 Card + 1dd8 4008 DSP DSC-25 10/25G 2p SFP28 Card + 1dd8 400a DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 400c DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 400d DSP DSC-100 Ent 100Gb Card + 1dd8 400e DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 4014 DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1002 DSC Ethernet Controller + 1dd8 4000 Naples 100Gb 2-port QSFP28 x16 8GB + 1dd8 4001 Naples 100Gb 2-port QSFP28 x16 4GB + 1dd8 4002 Naples 25Gb 2-port SFP28 x8 4GB + 1dd8 4007 DSP DSC-25 Ent 10/25G OCP3 Card + 1dd8 4008 DSP DSC-25 10/25G 2p SFP28 Card + 1dd8 400a DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 400c DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 400d DSP DSC-100 Ent 100Gb Card + 1dd8 400e DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 4014 DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1003 DSC Ethernet Controller VF + 1dd8 4000 Naples 100Gb 2-port QSFP28 x16 8GB + 1dd8 4001 Naples 100Gb 2-port QSFP28 x16 4GB + 1dd8 4002 Naples 25Gb 2-port SFP28 x8 4GB + 1dd8 4007 DSP DSC-25 Ent 10/25G OCP3 Card + 1dd8 4008 DSP DSC-25 10/25G 2p SFP28 Card + 1dd8 400a DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 400c DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 400d DSP DSC-100 Ent 100Gb Card + 1dd8 400e DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 4014 DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1004 DSC Management Controller + 1dd8 4000 Naples 100Gb 2-port QSFP28 x16 8GB + 1dd8 4001 Naples 100Gb 2-port QSFP28 x16 4GB + 1dd8 4002 Naples 25Gb 2-port SFP28 x8 4GB + 1dd8 4007 DSP DSC-25 Ent 10/25G OCP3 Card + 1dd8 4008 DSP DSC-25 10/25G 2p SFP28 Card + 1dd8 400a DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 400c DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 400d DSP DSC-100 Ent 100Gb Card + 1dd8 400e DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 4014 DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1005 DSC NVMe Controller + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1006 DSC NVMe Controller VF + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1007 DSC Storage Accelerator + 1dd8 4000 Naples 100Gb 2-port QSFP28 x16 8GB + 1dd8 4001 Naples 100Gb 2-port QSFP28 x16 4GB + 1dd8 4002 Naples 25Gb 2-port SFP28 x8 4GB + 1dd8 4007 DSP DSC-25 Ent 10/25G OCP3 Card + 1dd8 4008 DSP DSC-25 10/25G 2p SFP28 Card + 1dd8 400a DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 400c DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 400d DSP DSC-100 Ent 100Gb Card + 1dd8 400e DSC-25 10/25G 2-port 4G RAM 8G eMMC G1 Services Card + 1dd8 4014 DSC-100 40/100G 2-port 8G RAM 16G eMMC G1 Services Card + 1dd8 5001 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card + 1dd8 5003 DSC2-200 50/100/200G 2-port 32G RAM 64G eMMC G2 Services Card +1ddd Thorlabs +1de0 Groq +# rename due to conflict with a term in use by another company for an entirely different product. + 0000 TSP100 Tensor Streaming Processor +1de1 Tekram Technology Co.,Ltd. + 0391 TRM-S1040 [DC-315 / DC-395 series] + 2020 DC-390 Series SCSI Adapter [AMD Am53C974] + 690c 690c + dc29 DC290 +1de5 Eideticom, Inc + 1000 IO Memory Controller + 2000 NoLoad Hardware Development Kit + 3000 eBPF-based PCIe Accelerator +1ded Alibaba (China) Co., Ltd. +# A RDMA (iWarp) device provided by Alibaba Cloud used in ECS environment + 107f Elastic RDMA Adapter + 5007 Elastic RDMA Adapter + 8000 M1 Root Port + 8001 ACC-RCiEP + 8002 RCiEP VF + 8003 RCEC PF + 8004 RCEC VF +1dee Biwin Storage Technology Co., Ltd. +1def Ampere Computing, LLC + e005 eMAG PCI Express Root Port 0 + e006 eMAG PCI Express Root Port 1 + e007 eMAG PCI Express Root Port 2 + e008 eMAG PCI Express Root Port 3 + e009 eMAG PCI Express Root Port 4 + e00a eMAG PCI Express Root Port 5 + e00b eMAG PCI Express Root Port 6 + e00c eMAG PCI Express Root Port 7 +# Root Complex A (RCA) + e100 Altra PCI Express Root Complex A +# RCA port 0 + e101 Altra PCI Express Root Port a0 +# RCA port 1 + e102 Altra PCI Express Root Port a1 +# RCA port 2 + e103 Altra PCI Express Root Port a2 +# RAC port 3 + e104 Altra PCI Express Root Port a3 +# RCA port 4 + e105 Altra PCI Express Root Port a4 +# RCA port 5 + e106 Altra PCI Express Root Port a5 +# RCA port 6 + e107 Altra PCI Express Root Port a6 +# RCA port 7 + e108 Altra PCI Express Root Port a7 +# Root Complex B (RCB) + e110 Altra PCI Express Root Complex B +# RCB port 0 + e111 Altra PCI Express Root Port b0 +# RCB port 1 + e112 Altra PCI Express Root Port b1 +# RCB port 2 + e113 Altra PCI Express Root Port b2 +# RCB port 3 + e114 Altra PCI Express Root Port b3 +# RCB port 4 + e115 Altra PCI Express Root Port b4 +# RCB port 5 + e116 Altra PCI Express Root Port b5 +# RCB port 6 + e117 Altra PCI Express Root Port b6 +# RCB port 7 + e118 Altra PCI Express Root Port b7 +1df3 Ethernity Networks + 0201 ACE-NIC40 Programmable Network Accelerator + 1df3 0001 ENA1040 + 1df3 0002 ENA1044 + 1df3 0003 ENA1044S + 0202 ACE-NIC50 Programmable Network Accelerator + 1df3 0001 ENA2050F + 1df3 0002 ENA2050FS + 0203 ACE-NIC100 Programmable Network Accelerator + 1df3 0000 Maintenance Mode + 1df3 0001 ENA2080F + 1df3 0002 ENA2080FS + 1df3 0003 ENA2100F + 1df3 0004 ENA2040F + 0204 ACE-NIC-NID Programmable Network Accelerator + 1df3 0001 ENA1020Z + 1df3 0002 ENA1020ZS + 0205 ACE-NIC250 Programmable Network Accelerator + 1df3 0000 Maintenance Mode + 1df3 0001 ENA2250F + 0206 ACE-NIC200 Programmable Network Accelerator + 1df3 0000 Maintenance Mode + 1df3 0001 ENA2200F + 0207 ACE-NIC50RN Programmable Network Accelerator + 1df3 0000 Maintenance Mode + 1df3 0001 ENA2050RN + 0208 ACE-NIC100RN Programmable Network Accelerator + 1df3 0000 Maintenance Mode + 1df3 0001 ENA2100RN +1df7 opencpi.org + 0001 ml605 + 0002 alst4 + 0003 alst4x +1dfc JSC NT-COM + 1181 TDM 8 Port E1/T1/J1 Adapter +1e0f KIOXIA Corporation + 0007 NVMe SSD Controller Cx6 + 1028 2078 DC NVMe CD6 RI 960GB + 1028 2079 DC NVMe CD6 RI 1.92TB + 1028 207a DC NVMe CD6 RI 3.84TB + 1028 207b DC NVMe CD6 RI 7.68TB + 1028 207c DC NVMe CD6 RI 15.36TB + 1028 207e Dell Ent NVMe CM6 RI 1.92TB + 1028 207f Dell Ent NVMe CM6 RI 3.84TB + 1028 2080 Dell Ent NVMe CM6 RI 7.68TB + 1028 2081 Dell Ent NVMe CM6 RI 15.36TB + 1028 2084 Dell Ent NVMe CM6 MU 1.6TB + 1028 2085 Dell Ent NVMe CM6 MU 3.2TB + 1028 2086 Dell Ent NVMe CM6 MU 6.4TB + 1028 210a Dell Ent NVMe FIPS CM6 RI 1.92TB + 1028 210b Dell Ent NVMe FIPS CM6 RI 3.84TB + 1028 210c Dell Ent NVMe FIPS CM6 RI 7.68TB + 1028 210d Dell Ent NVMe FIPS CM6 RI15.36TB + 1028 210e Dell Ent NVMe FIPS CM6 MU 1.6TB + 1028 210f Dell Ent NVMe FIPS CM6 MU 3.2TB + 1028 2110 Dell Ent NVMe FIPS CM6 MU 6.4TB + 1e0f 0001 Generic NVMe CM6 + 0009 NVMe SSD + 1e0f 0001 Toshiba RC500 NVMe SSD 500GB + 0011 NVMe SSD Controller CD7 + 1028 2189 DC NVMe SED CD7 RI 960GB + 1028 218a DC NVMe CD7 RI 960GB + 1028 218b DC NVMe SED CD7 RI 1.92TB + 1028 218c DC NVMe CD7 RI 1.92TB + 1028 218d DC NVMe SED CD7 RI 3.84TB + 1028 218e DC NVMe CD7 RI 3.84TB + 1028 218f DC NVMe SED CD7 RI 7.68TB + 1028 2190 DC NVMe CD7 RI 7.68TB + 1028 2191 DC NVMe SED CD7 RI 15.36TB + 1028 2192 DC NVMe CD7 RI 15.36TB +1e17 Arnold & Richter Cine Technik GmbH & Co. Betriebs KG +1e24 Squirrels Research Labs + 0101 Acorn CLE-101 + 0215 Acorn CLE-215 + 021f Acorn CLE-215+ + 1525 Xilinx BCU-1525 +# VU33P FPGA Accelerator + 1533 ForestKitten 33 +# JungleCat VU33P Module + 1633 JCM33 +# JungleCat VU35P Module + 1635 JCM35 +1e26 Fujitsu Client Computing Limited +1e36 Shanghai Enflame Technology Co. Ltd + 0001 T10 [CloudBlazer] + 0002 T11 [CloudBlazer] + 0003 T10(QSFP-DD) [CloudBlazer] + 0021 T20(32GB) [CloudBlazer] + 0022 T20(64GB) [CloudBlazer] + 0023 T21(32GB) [CloudBlazer] + 0024 T21(64GB) [CloudBlazer] + 8001 I20 [CloudBlazer] + 8011 I10 [CloudBlazer] + 8012 I10L [CloudBlazer] +# nee Thinci, Inc +1e38 Blaize, Inc + 0102 Xplorer X1600 +# https://www.medion.com/ +1e39 MEDION AG +1e3b DapuStor Corporation + 0600 NVMe SSD Controller DPU600 + 1e3b 0030 Enterprise NVMe SSD U.2 3.84TB (J5100) + 1e3b 0031 Enterprise NVMe SSD U.2 7.68TB (J5100) + 1e3b 0032 Enterprise NVMe SSD U.2 15.36TB (J5100) + 1e3b 0033 Enterprise NVMe SSD U.2 3.20TB (J5300) + 1e3b 0034 Enterprise NVMe SSD U.2 6.40TB (J5300) + 1e3b 0035 Enterprise NVMe SSD U.2 12.80TB (J5300) + 1e3b 0036 Enterprise NVMe SSD AIC 7.68TB (J5110) + 1e3b 0037 Enterprise NVMe SSD AIC 6.40TB (J5310) + 1e3b 003e Enterprise NVMe SSD AIC 3.84TB (J5110) + 1e3b 003f Enterprise NVMe SSD AIC 3.20TB (J5310) + 1e3b 0050 Enterprise NVMe SSD U.2 3.84TB (R5100) + 1e3b 0051 Enterprise NVMe SSD U.2 7.68TB (R5100) + 1e3b 0052 Enterprise NVMe SSD U.2 15.36TB (R5100) + 1e3b 0053 Enterprise NVMe SSD U.2 3.20TB (R5300) + 1e3b 0054 Enterprise NVMe SSD U.2 6.40TB (R5300) + 1e3b 0055 Enterprise NVMe SSD U.2 12.80TB (R5300) + 1e3b 0056 Enterprise NVMe SSD U.2 3.84TB (R5101) + 1e3b 0059 Enterprise NVMe SSD U.2 3.20TB (R5301) + 1e3b 0060 Enterprise NVMe SSD U.2 3.84TB (R5100D) + 1e3b 0061 Enterprise NVMe SSD U.2 7.68TB (R5100D) + 1e3b 0063 Enterprise NVMe SSD U.2 3.20TB (R5300D) + 1e3b 0064 Enterprise NVMe SSD U.2 6.40TB (R5300D) + 1e3b 00f0 Enterprise NVMe SSD U.2 0.40TB (X2900) + 1e3b 00f1 Enterprise NVMe SSD U.2 0.80TB (X2900) + 1e3b 00f2 Enterprise NVMe SSD U.2 1.60TB (X2900) + 1e3b 00f3 Enterprise NVMe SSD U.2 3.20TB (X2900) + 1e3b 00f5 Enterprise NVMe SSD U.2 0.40TB (X2900P) + 1e3b 00f6 Enterprise NVMe SSD U.2 0.80TB (X2900P) + 1098 Haishen NVMe SSD + 1e3b 0001 Enterprise NVMe SSD U.2 0.8TB (H2100) + 1e3b 0002 Enterprise NVMe SSD U.2 0.96TB (H2200) + 1e3b 0004 Enterprise NVMe SSD U.2 1.6TB (H2100) + 1e3b 0005 Enterprise NVMe SSD U.2 1.92TB (H2200) + 1e3b 0009 Enterprise NVMe SSD U.2 0.8TB (H3100) + 1e3b 000a Enterprise NVMe SSD U.2 0.96TB (H3200) + 1e3b 000c Enterprise NVMe SSD U.2 1.6TB (H3100) + 1e3b 000d Enterprise NVMe SSD U.2 1.92TB (H3200) + 1e3b 0014 Enterprise NVMe SSD U.2 3.2TB (H3100) + 1e3b 0015 Enterprise NVMe SSD U.2 3.84TB (H3200) + 1e3b 0021 Enterprise NVMe SSD U.2 6.4TB (H3100) + 1e3b 0022 Enterprise NVMe SSD U.2 7.68TB (H3200) + 1e3b 0052 Enterprise NVMe SSD U.2 0.8TB (H3900) + 1e3b 0053 Enterprise NVMe SSD U.2 1.6TB (H3900) + 1e3b 0059 Enterprise NVMe SSD U.2 0.75TB (H3900) + 1e3b 0061 Enterprise NVMe SSD HHHL 0.8TB (H2100) + 1e3b 0062 Enterprise NVMe SSD HHHL 0.96TB (H2200) + 1e3b 0064 Enterprise NVMe SSD HHHL 1.6TB (H2100) + 1e3b 0065 Enterprise NVMe SSD HHHL 1.92TB (H2200) + 1e3b 006c Enterprise NVMe SSD HHHL 0.8TB (H3100) + 1e3b 006d Enterprise NVMe SSD HHHL 0.96TB (H3200) + 1e3b 006f Enterprise NVMe SSD HHHL 1.6TB (H3100) + 1e3b 0070 Enterprise NVMe SSD HHHL 1.92TB (H3200) + 1e3b 007c Enterprise NVMe SSD HHHL 3.2TB (H3100) + 1e3b 007d Enterprise NVMe SSD HHHL 3.84TB (H3200) + 1e3b 007f Enterprise NVMe SSD HHHL 6.4TB (H3100) + 1e3b 0080 Enterprise NVMe SSD HHHL 7.68TB (H3200) + 1e3b 008a Enterprise NVMe SSD HHHL 0.8TB (H3900) + 1e3b 008b Enterprise NVMe SSD HHHL 1.6TB (H3900) + 1e3b 0091 Enterprise NVMe SSD HHHL 0.75TB (H3900) +1e3d Burlywood, Inc +1e49 Yangtze Memory Technologies Co.,Ltd + 0041 ZHITAI TiPro7000 +# YMTC PCIe/NVMe SSD + 1013 PC210 +1e4b MAXIO Technology (Hangzhou) Ltd. + 1001 NVMe SSD Controller MAP1001 + 1002 NVMe SSD Controller MAP1002 + 1003 NVMe SSD Controller MAP1003 + 1201 NVMe SSD Controller MAP1201 + 1202 NVMe SSD Controller MAP1202 + 1601 NVMe SSD Controller MAP1601 +1e4c GSI Technology +# Associative Processing Unit (APU) + 0010 APU [Leda] + 1e4c 0120 SE120 +1e57 Beijing Panyi Technology Co., Ltd + 0100 The device has already been deleted. + 0000 0100 PY8800 64GB Accelerator +1e59 Oxford Nanopore Technologies + 0001 MinION Mk1C +1e5d ASR Microelectronics + 7000 AI controller A7000 + 7010 AI controller A7010 +1e60 Hailo Technologies Ltd. + 2864 Hailo-8 AI Processor +1e68 Jiangsu Xinsheng Intelligent Technology Co., Ltd +1e6b Axiado Corp. +1e7b Dataland +1e7c Brainchip Inc + bca1 AKD1000 Neural Network Coprocessor [Akida] +1e81 Ramaxel Technology(Shenzhen) Limited + 1203 NVMe SSD Controller UHXXXa series + 1e81 a121 NVMe SSD UHXXXa series U.2 960GB + 1e81 a122 NVMe SSD UHXXXa series U.2 1920GB + 1e81 a123 NVMe SSD UHXXXa series U.2 3840GB  + 1e81 a124 NVMe SSD UHXXXa series U.2 7680GB  + 1e81 a125 NVMe SSD UHXXXa series U.2 15360GB + 1e81 a211 NVMe SSD UHXXXa series U.2 800GB  + 1e81 a212 NVMe SSD UHXXXa series U.2 1600GB  + 1e81 a213 NVMe SSD UHXXXa series U.2 3200GB  + 1e81 a214 NVMe SSD UHXXXa series U.2 6400GB  +1e85 Heitec AG +1e89 ID Quantique SA + 0002 Quantis-PCIe-40M + 0003 Quantis-PCIe-240M +# aka SED Systems +1e94 Calian SED +1e95 Solid State Storage Technology Corporation + 1002 NVMe Datacenter LJ1 SSD [3DNAND, Rainier Controller] + 1ea0 5636 TP1500 Series U.2 NVMe Datacenter SSD +1e9f Lynxi Technologies Co., Ltd. +1ea0 Tencent Technology (Shenzhen) Company Limited + 2a16 Cloud Intelligent Inference Controller + 2a18 Video Transcode Controller +1ea7 Intelliprop, Inc + 223a Typhon+ PCIe to Gen-Z Bridge + 224a IPA-PE224A CXL to Gen-Z Bridge [Sphinx] +1eab Hefei DATANG Storage Technology Co.,LTD. + 300a NVMe SSD Controller 300A + 300b NVMe SSD Controller 300B +1eac Quectel Wireless Solutions Co., Ltd. + 1001 EM120R-GL LTE Modem + 1002 EM160R-GL LTE Modem +1eae XFX Limited +1eb1 VeriSilicon Inc + 1001 Video Accelerator +1eb4 Quantum Nebula Microelectronics Technology Co.,Ltd. + 3401 SSD Contoller +1ebd EMERGETECH Company Ltd. + 0101 Seirios 2063 Video Codec +1ed2 FuriosaAI, Inc. + 0000 Warboy +1ed3 Yeston +1ed5 Moore Threads Technology Co.,Ltd + 0100 MTT S10 + 0101 MTT S10 + 0102 MTT S30 + 0105 MTT S50 + 0106 MTT S60 + 0111 MTT S100 + 0121 MTT S1000M + 0122 MTT S1000 + 0123 MTT S2000 +1ed8 Digiteq Automotive + 0101 FG4 PCIe Frame Grabber +1ed9 Myrtle.ai +1ee9 SUSE LLC +1eec Viscore Technologies Ltd + 0102 VSE250231S Dual-port 10Gb/25Gb Ethernet PCIe + 1eec VSE250231S Dual-port 10Gb/25Gb Ethernet PCIe +1eed XDX Computing Technology Ltd. + 1100 XDX110 Graphic/VGA Controller + 1101 XDX110 Audio Controller + 1200 XDX120 Graphic/VGA Controller + 1201 XDX120 Audio Controller + 1300 XDX130 Graphic/VGA Controller + 1301 XDX130 Audio Controller + 1400 XDX140 Graphic/VGA Controller + 1401 XDX140 Audio Controller + 1500 XDX150 Graphic/VGA Controller + 1501 XDX150 Audio Controller + 1600 XDX160 Graphic/VGA Controller + 1601 XDX160 Audio Controller + 1700 XDX170 Graphic/VGA Controller + 1701 XDX170 Audio Controller + 1800 XDX180 Graphic/VGA Controller + 1801 XDX180 Audio Controller + 1900 XDX190 Graphic/VGA Controller + 1901 XDX190 Audio Controller +1efb Flexxon Pte Ltd +1f02 Beijing Dayu Technology +1f03 Shenzhen Shichuangyi Electronics Co., Ltd + 1202 MAP1202-Based NVMe SSD + 2262 SM2262EN-based OEM SSD + 2263 SM2263XT-Base NVMe SSD + 5216 IG5216-based NVMe SSD + 5220 IG5220-Based NVMe SSD + 5236 IG5236-Based NVMe SSD + 5636 IG5636-Based NVMe SSD +1f2f China Mobile (Hangzhou) Information Technology Co.Ltd. + 1513 DERA MENG NVMe Controller + 1f2f 6113 KM660 U.2 1.6TB NVMe SSD + 1f2f 6114 KM560 U.2 1.92TB NVMe SSD + 1f2f 6115 KM660 U.2 3.2TB NVMe SSD + 1f2f 6116 KM560 U.2 3.84TB NVMe SSD + 1f2f 6118 KM560 U.2 7.68TB NVMe SSD +1f3f 3SNIC Ltd + 2100 3SRAID SAS/SATA HBA + 1f3f 0120 HBA 32 Ports + 1f3f 0125 HBA 40 Ports + 1f3f 0180 HBA 16 Ports + 1f3f 0185 HBA 8 Ports + 2200 3SRAID RAID controller + 1f3f 0185 RAID Controller 16 Ports with 2G Cache + 1f3f 01a1 RAID Controller 40 Ports with 2G Cache + 1f3f 01a4 RAID Controller 16 Ports with 4G Cache + 1f3f 01a8 RAID Controller 32 Ports with 4G Cache + 1f3f 01ad RAID Controller 40 Ports with 4G Cache + 9001 Ethernet VF + 1f3f 1000 Ethernet VF + 9002 Ethernet VF Hyper-V + 1f3f 1000 Ethernet VF Hyper-V + 9003 Ethernet SDI VF + 1f3f 1000 Ethernet SDI VF + 9004 Ethernet SDI VF Hyper-V + 1f3f 1000 Ethernet SDI VF Hyper-V + 9008 3SFC VF + 1f3f 1000 3SFC VF + 9009 3SFC VF Hyper-V + 1f3f 1000 3SFC VF Hyper-V + 9010 3SFC FC Controller + 1f3f 0041 Dual Port 16GE FC to PCIe Gen4 x16 Adapter + 1f3f 0061 Dual Port 32GE FC to PCIe Gen4 x16 Adapter + 9020 Ethernet Network Adapter + 1f3f 0051 Dual Port 25GE Ethernet Network Adapter + 1f3f 0052 Quad Port 25GE Ethernet Network Adapter + 1f3f 00a1 Dual Port 100GE Ethernet Network Adapter + 9030 IPU + 1f3f 0051 Dual Port 25GE IPU + 9031 SDI5.0 + 1f3f 0051 Dual Port 25GE SDI5.0lite + 1f3f 00a1 Dual Port 100GE SDI5.0 + 9032 SDI5.1 + 1f3f 00a1 Dual Port 100GE SDI5.1 +1f40 Netac Technology Co.,Ltd +1faa Hexaflake (Shanghai) Information Technology Co., Ltd. +1fab Unifabrix Ltd. + 0000 Nexus Alpha IVPU +# nee Tumsan Oy +1fc0 Ascom (Finland) Oy + 0300 E2200 Dual E1/Rawpipe Card + 0301 C5400 SHDSL/E1 Card +# nee PathScale, Inc +1fc1 QLogic, Corp. + 000d IBA6110 InfiniBand HCA + 0010 IBA6120 InfiniBand HCA +1fc9 Tehuti Networks Ltd. + 3009 10-Giga TOE SmartNIC + 3010 10-Giga TOE SmartNIC + 0000 3002 10-Giga TOE Single Port XFP SmartNIC + 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC + 0000 3008 10-Giga TOE Single Port CX4 SmartNIC + 3014 10-Giga TOE SmartNIC 2-Port + 0000 3003 10-Giga TOE Dual Port XFP Low Profile SmartNIC + 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC + 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC + 3110 10-Giga TOE Single Port SmartNIC + 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC + 3114 10-Giga TOE Dual Port Low Profile SmartNIC + 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC + 0000 3011 10-Giga TOE Dual Port SFP+/CX4 Low Profile SmartNIC + 0000 3012 10-Giga TOE Dual Port CX4/SFP+ Low Profile SmartNIC + 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC + 3310 10-Giga TOE SFP+ Single Port SmartNIC + 0000 3004 10-Giga TOE Single Port SFP+ SmartNIC + 3314 10-Giga TOE Dual Port Low Profile SmartNIC + 0000 3005 10-Giga TOE Dual Port SFP+ Low Profile SmartNIC + 0000 3011 10-Giga TOE Dual Port SFP+/CX4 Low Profile SmartNIC + 0000 3012 10-Giga TOE Dual Port CX4/SFP+ Low Profile SmartNIC + 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC + 4010 TN4010 Clean SROM + 4020 TN9030 10GbE CX4 Ethernet Adapter + 180c 2040 Mustang-200 10GbE Ethernet Adapter + 4022 TN9310 10GbE SFP+ Ethernet Adapter + 1043 8709 XG-C100F 10GbE SFP+ Ethernet Adapter + 1186 4d00 DXE-810S 10GbE SFP+ Ethernet Adapter + 1432 8103 10 Gigabit Ethernet SFP+ PCI Express Adapter + 1fc9 3015 Ethernet Adapter + 4024 TN9210 10GBase-T Ethernet Adapter + 4025 TN9510 10GBase-T/NBASE-T Ethernet Adapter + 105a 7203 SANLink3 NBase-T1 + 1186 2900 DXE-810T 10GBase-T Ethernet Adapter + 1432 8102 10 Gigabit Ethernet PCI Express Adapter + 1fc9 3015 Ethernet Adapter + 4026 TN9610 10GbE SFP+ Ethernet Adapter + 4c52 1000 LREC6860AF 10 Gigabit Ethernet Adapter + 4027 TN9710P 10GBase-T/NBASE-T Ethernet Adapter + 1154 0368 LGY-PCIE-MG + 1432 8104 10 Gigabit Ethernet PCI Express Adapter + 1546 4027 GE10-PCIE4XG202P 10Gbase-T/NBASE-T Ethernet Adapter + 1baa 3310 PCIe Expansion Card + 1fc9 3015 Ethernet Adapter + 4c52 1001 LREC6860BT 10 Gigabit Ethernet Adapter + 4527 TN9710Q 5GBase-T/NBASE-T Ethernet Adapter +1fcc StreamLabs + f416 MS416 + fb01 MH4LM +1fce Cognio Inc. + 0001 Spectrum Analyzer PC Card (SAgE) +1fd4 SUNIX Co., Ltd. + 0001 Matrix multiport serial adapter + 1999 Multiport serial controller +2000 Smart Link Ltd. + 2800 SmartPCI2800 V.92 PCI Soft DFT +2001 Temporal Research Ltd +2003 Smart Link Ltd. + 8800 LM-I56N +2004 Smart Link Ltd. +2048 Beijing SpaceControl Technology Co.Ltd +20f4 TRENDnet +2116 ZyDAS Technology Corp. +21b4 Hunan Goke Microelectronics Co., Ltd +21c3 21st Century Computer Corp. +22b8 Flex-Logix Technologies + 22a0 Flex Logix InferX X1 Inference Accelerator +22db Missing Link Electronics, Inc. +2304 Colorgraphic Communications Corp. +2348 Racore + 2010 8142 100VG/AnyLAN +2646 Kingston Technology Company, Inc. + 0010 HyperX Predator PCIe AHCI SSD + 2262 KC2000 NVMe SSD + 2263 A2000 NVMe SSD + 5008 U-SNS8154P3 NVMe SSD + 500d OM3PDP3 NVMe SSD + 500e SNVS2000G [NV1 NVMe PCIe SSD 2TB] +270b Xantel Corporation +270f Chaintech Computer Co. Ltd +2711 AVID Technology Inc. +2955 Connectix Virtual PC + 6e61 OHCI USB 1.1 controller +2a15 3D Vision(???) +2a18 Video Transcode Controller +2bd8 ROPEX Industrie-Elektronik GmbH +3000 Hansol Electronics Inc. +3112 Satelco Ingenieria S.A. +3130 AUDIOTRAK +3142 Post Impression Systems. +31ab Zonet + 1faa ZEW1602 802.11b/g Wireless Adapter +3388 Hint Corp + 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller + 0014 HiNT HC4 PCI to ISDN bridge, Network controller + 0020 HB6 Universal PCI-PCI bridge (transparent mode) + 0021 HB6 Universal PCI-PCI bridge (non-transparent mode) + 1775 c200 C2K CompactPCI interface bridge + 1775 ce90 CE9 + 4c53 1050 CT7 mainboard + 4c53 1080 CT8 mainboard + 4c53 1090 Cx9 mainboard + 4c53 10a0 CA3/CR3 mainboard + 4c53 3010 PPCI mezzanine (32-bit PMC) + 4c53 3011 PPCI mezzanine (64-bit PMC) + 4c53 4000 PMCCARR1 carrier board + 0022 HiNT HB4 PCI-PCI Bridge (PCI6150) + 0026 HB2 PCI-PCI Bridge + 1014 AudioTrak Maya + 1018 Audiotrak INCA88 + 1019 Miditrak 2120 + 101a E.Band [AudioTrak Inca88] + 101b E.Band [AudioTrak Inca88] + 8011 VXPro II Chipset + 3388 8011 VXPro II Chipset CPU to PCI Bridge + 8012 VXPro II Chipset + 3388 8012 VXPro II Chipset PCI to ISA Bridge + 8013 VXPro II IDE + 3388 8013 VXPro II Chipset EIDE Controller + a103 Blackmagic Design DeckLink HD Pro +3411 Quantum Designs (H.K.) Inc +3442 Bihl+Wiedemann GmbH + 1783 AS-i 3.0 cPCI Master + 1922 AS-i 3.0 PCI Master +3475 Arista Networks, Inc. +34ba Ice Lake-LP PCI Express Root Port #3 +3513 ARCOM Control Systems Ltd +37d9 ITD Firm ltd. + 1138 SCHD-PH-8 Phase detector +# 12-ch Relay Actuator Card + 1140 VR-12-PCI +# multiport serial board + 1141 PCI-485(422) + 1142 PCI-CAN2 +3842 eVga.com. Corp. +38ef 4Links +3d3d 3DLabs + 0001 GLINT 300SX + 0002 GLINT 500TX + 0000 0000 GLoria L + 0003 GLINT Delta + 0000 0000 GLoria XL + 0004 Permedia + 0005 Permedia + 0006 GLINT MX + 0000 0000 GLoria XL + 1048 0a42 GLoria XXL + 0007 3D Extreme + 0008 GLINT Gamma G1 + 1048 0a42 GLoria XXL + 0009 Permedia II 2D+3D + 1040 0011 AccelStar II + 1048 0a42 GLoria XXL + 13e9 1000 6221L-4U + 3d3d 0100 AccelStar II 3D Accelerator + 3d3d 0111 Permedia 3:16 + 3d3d 0114 Santa Ana + 3d3d 0116 Oxygen GVX1 + 3d3d 0119 Scirocco + 3d3d 0120 Santa Ana PCL + 3d3d 0125 Oxygen VX1 + 3d3d 0127 Permedia3 Create! + 000a GLINT R3 + 3d3d 0121 Oxygen VX1 + 000c GLINT R3 [Oxygen VX1] + 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4] + 000d GLint R4 rev A + 000e GLINT Gamma G2 + 0011 GLint R4 rev B + 0012 GLint R5 rev A + 0013 GLint R5 rev B + 0020 VP10 visual processor + 0022 VP10 visual processor + 0024 VP9 visual processor + 002c Wildcat Realizm 100/200 + 0030 Wildcat Realizm 800 + 0032 Wildcat Realizm 500 + 0100 Permedia II 2D+3D + 07a1 Wildcat III 6210 + 07a2 Sun XVR-500 Graphics Accelerator + 3d3d 1047 Sun XVR-600 Graphics Accelerator + 07a3 Wildcat IV 7210 + 1004 Permedia + 3d04 Permedia + ffff Glint VGA +4005 Avance Logic Inc. + 0300 ALS300 PCI Audio Device + 0308 ALS300+ PCI Audio Device + 0309 PCI Input Controller + 1064 ALG-2064 + 2064 ALG-2064i + 2128 ALG-2364A GUI Accelerator + 2301 ALG-2301 + 2302 ALG-2302 + 2303 AVG-2302 GUI Accelerator + 2364 ALG-2364A + 2464 ALG-2464 + 2501 ALG-2564A/25128A + 4000 ALS4000 Audio Chipset + 4005 4000 ALS4000 Audio Chipset + 4710 ALC200/200P +4033 Addtron Technology Co, Inc. + 1360 RTL8139 Ethernet +4040 NetXen Incorporated + 0001 NXB-10GXSR 10-Gigabit Ethernet PCIe Adapter with SR-XFP optical interface + 103c 7047 NC510F PCIe 10-Gigabit Server Adapter + 0002 NXB-10GCX4 10-Gigabit Ethernet PCIe Adapter with CX4 copper interface + 103c 7048 NC510c PCIe 10-Gigabit Server Adapter + 0003 NXB-4GCU Quad Gigabit Ethernet PCIe Adapter with 1000-BASE-T interface + 0004 BladeCenter-H 10-Gigabit Ethernet High Speed Daughter Card + 0005 NetXen Dual Port 10GbE Multifunction Adapter for c-Class + 103c 170e NC512m Dual Port 10GbE Multifunction BL-C Adapter + 0024 XG Mgmt + 0025 XG Mgmt + 0100 NX3031 Multifunction 1/10-Gigabit Server Adapter + 103c 171b NC522m Dual Port 10GbE Multifunction BL-c Adapter + 103c 1740 NC375T PCI Express Quad Port Gigabit Server Adapter + 103c 3251 NC375i 1G w/NC524SFP 10G Module + 103c 705a NC375i Integrated Quad Port Multifunction Gigabit Server Adapter + 103c 705b NC522SFP Dual Port 10GbE Server Adapter + 152d 896b TG20 Dual Port 10GbE Server/Storage Adapter + 4040 0124 NX3031 Quad Port Gigabit Server Adapter + 4040 0126 Dual Port SFP+ 10GbE Server Adapter +4143 Digital Equipment Corp +4144 Alpha Data + 0044 ADM-XRCIIPro +4150 ONA Electroerosion + 0001 PCI32TLITE FILSTRUP1 PCI to VME Bridge Controller + 0006 PCI32TLITE UART 16550 Opencores + 0007 PCI32TLITE CAN Controller Opencores +415a Auzentech, Inc. +416c Aladdin Knowledge Systems + 0100 AladdinCARD + 0200 CPC +4242 Universall Answer Generators +4254 DVBSky +4321 Tata Power Strategic Electronics Division +4348 WCH.CN + 2273 CH351 PCI Dual Serial Port Controller + 3253 CH352 PCI Dual Serial Port Controller + 3453 CH353 PCI Quad Serial Port Controller + 5053 CH352 PCI Serial and Parallel Port Controller + 7053 CH353 PCI Dual Serial and Parallel Ports Controller + 7073 CH356 PCI Quad Serial and Parallel Ports Controller + 7173 CH355 PCI Quad Serial Port Controller +434e Cornelis Networks +4444 Internext Compression Inc + 0016 iTVC16 (CX23416) Video Decoder + 0070 0003 WinTV PVR 250 + 0070 0009 WinTV PVR 150 + 0070 0801 WinTV PVR 150 + 0070 0807 WinTV PVR 150 + 0070 4001 WinTV PVR 250 + 0070 4009 WinTV PVR 250 + 0070 4801 WinTV PVR 250 + 0070 4803 WinTV PVR 250 + 0070 8003 WinTV PVR 150 + 0070 8801 WinTV PVR 150 + 0070 c801 WinTV PVR 150 + 0070 e807 WinTV PVR 500 (1st unit) + 0070 e817 WinTV PVR 500 (2nd unit) + 0070 ff92 WiNTV PVR-550 + 0270 0801 WinTV PVR 150 + 104d 013d ENX-26 TV Encoder + 10fc d038 GV-MVP/RX2W (1st unit) + 10fc d039 GV-MVP/RX2W (2nd unit) + 12ab fff3 MPG600 + 12ab ffff MPG600 + 1461 c00a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK3 tuner) + 1461 c00b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK3 tuner) + 1461 c00c M113 PCI Analog TV (NTSC, JAPAN version, Philips FI1286MK2 tuner) + 1461 c010 M113 PCI Analog TV (NTSC, Philips FI1236MK3 tuner) + 1461 c011 M113 PCI Analog TV (NTSC+FM, Philips FM1236MK3 tuner) + 1461 c018 M113 PCI Analog TV (NTSC, Philips FQ1236MK5 tuner) + 1461 c019 UltraTV 1500 MCE, a.k.a. M113 PCI Analog TV (NTSC+FM, Philips FQ1236MK5 tuner) + 1461 c01a M113 PCI Analog TV (PAL/SECAM, Philips FQ1216MK5 tuner) + 1461 c01b M113 PCI Analog TV (PAL/SECAM+FM, Philips FM1216MK5 tuner) + 1461 c030 M113 PCI Analog TV (NTSC-J, Partsnic tuner) + 1461 c031 M113 PCI Analog TV (NTSC-J+FM, Partsnic tuner) + 1461 c032 M113 PCI Analog TV (PAL/SECAM, Partsnic tuner) + 1461 c033 M113 PCI Analog TV (PAL/SECAM+FM, Partsnic tuner) + 1461 c034 M113 PCI Analog TV (NTSC, Partsnic tuner) + 1461 c035 M113 PCI Analog TV (NTSC+FM, Partsnic tuner) + 1461 c03f C115 PCI video capture card (no tuner) + 1461 c136 M104 mini-PCI Analog TV + 1461 c20a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK3 tuner) + 1461 c218 M755 AVerTV Video Capture (NTSC, Philips FQ1236MK5 tuner) + 1461 c219 M755 AVerTV Video Capture (NTSC+FM, Philips FQ1236MK5 tuner) + 1461 c21a M755 AVerTV Video Capture (PAL/SECAM, Philips FQ1216MK5 tuner) + 1461 c21b M755 AVerTV Video Capture (PAL/SECAM+FM, Philips FM1216MK5 tuner) + 1461 c230 M755 AVerTV Video Capture (NTSC-J, Partsnic tuner) + 1461 c231 M755 AVerTV Video Capture (NTSC-J+FM, Partsnic tuner) + 1461 c232 M755 AVerTV Video Capture (PAL/SECAM, Partsnic tuner) + 1461 c233 M755 AVerTV Video Capture (PAL/SECAM+FM, Partsnic tuner) + 1461 c234 M755 AVerTV Video Capture (NTSC, Partsnic tuner) + 1461 c235 M755 AVerTV Video Capture (NTSC+FM, Partsnic tuner) + 1461 c337 E106 AVerMedia AVerTV Video Capture + 1461 c439 M116 AVerMedia AVerTV MCE 116 Plus (NTSC/PAL/SECAM+FM+REMOTE, Xceive 2028 tuner) + 1461 c5ff C755 AVerTV Video Capture card (no tuner) + 1461 c6ff C115 PCI video capture card (no tuner) + 1461 c739 M785 AVerMedia PCI Analog TV (NTSC/PAL/SECAM+FM, Xceive 2028 tuner) + 9005 0092 VideOh! AVC-2010 + 9005 0093 VideOh! AVC-2410 + 0803 iTVC15 (CX23415) Video Decoder + 0070 4000 WinTV PVR-350 + 0070 4001 WinTV PVR-250 + 0070 4800 WinTV PVR-350 (V1) + 12ab 0000 MPG160 + 1461 a3ce M179 + 1461 a3cf M179 +4468 Bridgeport machines +4594 Cogetec Informatique Inc +45fb Baldor Electric Company +4624 Budker Institute of Nuclear Physics + adc1 ADC200ME High speed ADC + de01 DL200ME High resolution delay line PCI based card + de02 DL200ME Middle resolution delay line PCI based card +# Can't find any information on this company +4651 TXIC +4680 Umax Computer Corp +4843 Hercules Computer Technology Inc +4916 RedCreek Communications Inc + 1960 RedCreek PCI adapter +4943 Growth Networks +494f ACCES I/O Products, Inc. + 0508 PCI-IDO-16A FET Output Card + 0518 PCI-IDO-32A FET Output Card + 0520 PCI-IDO-48 FET Output Card + 0521 PCI-IDO-48A FET Output Card + 0703 PCIe-RO-4 Electromechanical Relay Output Card + 07d0 PCIe-IDO-24 FET Output Card + 0920 PCI-IDI-48 Isolated Digital Input Card + 0bd0 PCIe-IDI-24 Isolated Digital Input Card + 0c50 PCI-DIO-24H 1x 8255 Digital Input / Output Card + 0c51 PCI-DIO-24D 1x 8255 Digital Input / Output Card + 0c52 PCIe-DIO-24 1x 8255 Digital Input / Output Card + 0c53 PCIe-DIO-24H 8255 Digital Input / Output Card + 0c57 mPCIe-DIO-24 8255 Digital Input / Output Card + 0c60 PCI-DIO-48H 8255 Digital Input / Output Card + 0c61 PCIe-DIO-48 8255 Digital Input / Output Card + 0c62 P104-DIO-48 8255 Digital Input / Output Card + 0c68 PCI-DIO-72 8255 Digital Input / Output Card + 0c69 P104-DIO-96 8255 Digital Input / Output Card + 0c70 PCI-DIO-96 8255 Digital Input / Output Card + 0c78 PCI-DIO-120 8255 Digital Input / Output Card + 0dc8 PCI-IDIO-16 Isolated Digital Input / FET Output Card + 0e50 PCI-DIO-24S 8255 Digital Input / Output Card + 0e51 PCI-DIO-24H(C) 8255 Digital Input / Output Card + 0e52 PCI-DIO-24D(C) 8255 Digital Input / Output Card + 0e53 PCIe-DIO-24S 8255 Digital Input / Output Card + 0e54 PCIe-DIO-24HS 8255 Digital Input / Output Card + 0e55 PCIe-DIO-24DC 8255 Digital Input / Output Card + 0e56 PCIe-DIO-24DCS 8255 Digital Input / Output Card + 0e57 mPCIe-DIO-24S 8255 Digital Input / Output Card + 0e60 PCI-DIO-48S 2x 8255 Digital Input / Output Card + 0e61 PCIe-DIO-48S 2x 8255 Digital Input / Output Card + 0e62 P104-DIO-48S 2x 8255 Digital Input / Output Card + 0f00 PCI-IIRO-8 Isolated Digital / Relay Output Card + 0f01 LPCI-IIRO-8 Isolated Digital / Relay Output Card + 0f02 PCIe-IIRO-8 Isolated Digital / Relay Output Card + 0f08 PCI-IIRO-16 Isolated Digital / Relay Output Card + 0f09 PCIe-IIRO-16 Isolated Digital / Relay Output Card + 0fc0 PCIe-IDIO-12 Isolated Digital Input / FET Output Card + 0fc1 PCIe-IDI-12 Isolated Digital Input Card + 0fc2 PCIe-IDO-12 FET Output Card + 0fd0 PCIe-IDIO-24 Isolated Digital Input / FET Output Card + 1050 PCI-422/485-2 2x RS422/RS484 Card + 1051 PCIe-COM-2SRJ 2x RS422/RS484 Card w/RJ45 Connectors + 1052 104I-COM-2S 2x RS422/RS484 PCI/104 Board + 1053 mPCIe-COM-2S 2x RS422/RS484 PCI Express Mini Card + 1058 PCI-COM422/4 4x RS422 Card + 1059 PCI-COM485/4 4x RS485 Card + 105a PCIe-COM422-4 4x RS422 Card + 105b PCIe-COM485-4 4x RS485 Card + 105c PCIe-COM-4SRJ 4x RS422/RS485 Card w/RJ45 Connectors + 105d 104I-COM-4S 4x RS422/RS484 PCI/104 Board + 105e mPCIe-COM-4S 4x RS422/RS484 PCI Express Mini Card + 1068 PCI-COM422/8 8x RS422 Card + 1069 PCI-COM485/8 8x RS485 Card + 106a PCIe-COM422-8 8x RS422 Card + 106b PCIe-COM485-8 8x RS485 Card + 106c 104I-COM-8S 8x RS422/RS485 PCI/104 Board + 1088 PCI-COM232/1 1x RS232 Card + 1090 PCI-COM232/2 2x RS232 Card + 1091 PCIe-COM232-2RJ 2x RS232 Card w/RJ45 Connectors + 1093 mPCIe-COM232-2 2x RS232 PCI Express Mini Card + 1098 PCIe-COM232-4 4x RS232 Card + 1099 PCIe-COM232-4RJ 4x RS232 Card w/RJ45 Connectors + 109b mPCIe-COM232-4 4x RS232 PCI Express Mini Card + 10a8 P104-COM232-8 8x RS232 PC-104+ Board + 10a9 PCIe-COM232-8 8x RS232 Card + 10c9 PCI-COM-1S 1x RS422/RS485 Card + 10d0 PCI-COM2S 2x RS422/RS485 Card + 10d1 PCIe-COM-2SMRJ 2x RS232/RS422/RS485 Card w/RJ45 Connectors + 10d2 104I-COM-2SM 2x RS232/RS422/RS485 PCI/104 Board + 10d3 mPCIe-COM-2SM 2x RS232/RS422/RS485 PCI Express Mini Card + 10d8 PCI-COM-4SM 4x RS232/RS422/RS485 Card + 10d9 PCIe-COM-4SM 4x RS232/RS422/RS485 Card + 10da PCIe-COM-4SMRJ 4x RS232/RS422/RS485 Card w/RJ45 Connectors + 10db 104I-COM-4SM 4x RS232/RS422/RS485 PCI/104 Board + 10dc mPCIe-COM-4SM 4x RS232/RS422/RS485 PCI Express Mini Card + 10e8 PCI-COM-8SM 8x RS232/RS422/RS485 Card + 10e9 PCIe-COM-8SM 8x RS232/RS422/RS485 Card + 10ea 104I-COM-8SM 8x RS232/RS422/RS485 PCI-104 Board + 1108 mPCIe-ICM485-1 1x Isolated RS485 PCI Express Mini Card + 1110 mPCIe-ICM422-2 2x Isolated RS422 PCI Express Mini Card + 1111 mPCIe-ICM485-2 2x Isolated RS485 PCI Express Mini Card + 1118 mPCIe-ICM422-4 4x Isolated RS422 PCI Express Mini Card + 1119 mPCIe-ICM485-4 4x Isolated RS485 PCI Express Mini Card + 1148 PCI-ICM-1S 1x Isolated RS422/RS485 Card + 1150 PCI-ICM-2S 2x Isolated RS422/RS485 Card + 1152 PCIe-ICM-2S 2x Isolated RS422/RS485 Card + 1158 PCI-ICM422/4 4x Isolated RS422 Card + 1159 PCI-ICM485/4 4x Isolated RS485 Card + 115a PCIe-ICM-4S 4x Isolated RS422/RS485 Card + 1190 PCIe-ICM232-2 2x Isolated RS232 Card + 1191 mPCIe-ICM232-2 2x Isolated RS232 PCI Express Mini Card + 1198 PCIe-ICM232-4 4x Isolated RS232 Card + 1199 mPCIe-ICM232-4 4x Isolated RS422 PCI Express Mini Card + 11d0 PCIe-ICM-2SM 2x Isolated RS232/RS422/RS485 Card + 11d8 PCIe-ICM-4SM 4x Isolated RS232/RS422/RS485 Card + 1250 PCI-WDG-2S Watchdog and 2x Serial Card + 12d0 PCI-WDG-IMPAC + 2230 PCI-QUAD-8 8x Quadrature Input Card + 2231 PCI-QUAD-4 4x Quadrature Input Card + 22c0 PCI-WDG-CSM Watchdog Card + 25c0 P104-WDG-E Watchdog PC/104+ Board + 2c50 PCI-DIO-96CT 96x Digital Input / Output Card + 2c58 PCI-DIO-96C3 96x Digital Input / Output Card w/3x 8254 Counter Card + 2ee0 PCIe-DIO24S-CTR12 24x Digital Input / Output Card w/4x 8254 Counter Card + 2fc0 P104-WDG-CSM Watchdog PC/104+ Board + 2fc1 P104-WDG-CSMA Advanced Watchdog PC/104+ Board + 5ed0 PCI-DAC + 6c90 PCI-DA12-2 2x 12-bit Analog Output Card + 6c98 PCI-DA12-4 4x 12-bit Analog Output Card + 6ca0 PCI-DA12-6 6x 12-bit Analog Output Card + 6ca8 PCI-DA12-8 8x 12-bit Analog Output Card + 6ca9 PCI-DA12-8V + 6cb0 PCI-DA12-16 16x 12-bit Analog Output Card + 6cb1 PCI-DA12-16V + 8ef0 P104-FAS16-16 + aca8 PCI-AI12-16 12-bit 100kHz Analog Input Card + aca9 PCI-AI12-16A 12-bit 100kHz Analog Input w/FIFO Card + eca8 PCI-AIO12-16 12-bit 100kHz Analog Input w/2x Analog Output and FIFO Card + ecaa PCI-A12-16A 12-bit 100kHz Analog Input w/2x Analog Output and FIFO Card + ece8 LPCI-A16-16A 16-bit 500kHz Analog Input low-profile Card + ece9 LPCI-AIO16A 16-bit 500kHz Analog Input low-profile Card +4978 Axil Computer Inc +4a14 NetVin + 5000 NV5000SC + 4a14 5000 RT8029-Based Ethernet Adapter +4b10 Buslogic Inc. +4c48 LUNG HWA Electronics +4c52 LR-Link +4c53 SBS Technologies + 0000 PLUSTEST device + 4c53 3000 PLUSTEST card (PC104+) + 4c53 3001 PLUSTEST card (PMC) + 0001 PLUSTEST-MM device + 4c53 3002 PLUSTEST-MM card (PMC) +4ca1 Seanix Technology Inc +4d51 MediaQ Inc. + 0200 MQ-200 +4d54 Microtechnica Co Ltd +4d56 MATRIX VISION GmbH + 0000 [mvHYPERION-CLe/CLb] CameraLink PCI Express x1 Frame Grabber + 0001 [mvHYPERION-CLf/CLm] CameraLink PCI Express x4 Frame Grabber + 0010 [mvHYPERION-16R16/-32R16] 16 Video Channel PCI Express x4 Frame Grabber + 0020 [mvHYPERION-HD-SDI] HD-SDI PCI Express x4 Frame Grabber + 0030 [mvHYPERION-HD-SDI-Merger] HD-SDI PCI Express x4 Frame Grabber + 7012 [mvBlueNAOS BVS CA-BN] PCIe Gen1 x2 Camera + 7014 [mvBlueNAOS BVS CA-BN] PCIe Gen1 x4 Camera + 7022 [mvBlueNAOS BVS CA-BN] PCIe Gen2 x2 Camera + 7024 [mvBlueNAOS BVS CA-BN] PCIe Gen2 x4 Camera +4ddc ILC Data Device Corp + 0100 DD-42924I5-300 (ARINC 429 Data Bus) + 0300 SB-3620 Motion Feedback Device + 0340 SB-3623 Motion Feedback Device + 0400 SB-3622 Motion Feedback Device + 0500 SB-3621 Motion Feedback Device + 0510 SB-3624 Motion Feedback Device + 0801 BU-65570I1 MIL-STD-1553 Test and Simulation + 0802 BU-65570I2 MIL-STD-1553 Test and Simulation + 0811 BU-65572I1 MIL-STD-1553 Test and Simulation + 0812 BU-65572I2 MIL-STD-1553 Test and Simulation + 0881 BU-65570T1 MIL-STD-1553 Test and Simulation + 0882 BU-65570T2 MIL-STD-1553 Test and Simulation + 0891 BU-65572T1 MIL-STD-1553 Test and Simulation + 0892 BU-65572T2 MIL-STD-1553 Test and Simulation + 0901 BU-65565C1 MIL-STD-1553 Data Bus + 0902 BU-65565C2 MIL-STD-1553 Data Bus + 0903 BU-65565C3 MIL-STD-1553 Data Bus + 0904 BU-65565C4 MIL-STD-1553 Data Bus + 0b01 BU-65569I1 MIL-STD-1553 Data Bus + 0b02 BU-65569I2 MIL-STD-1553 Data Bus + 0b03 BU-65569I3 MIL-STD-1553 Data Bus + 0b04 BU-65569I4 MIL-STD-1553 Data Bus + 0d01 SB-3641 Motion Feedback Device + 0d10 SB-365x Motion Feedback Device + 2f00 SB-3642 Motion Feedback Device + 3000 SB-3644 Motion Feedback Device +4e58 Nutanix, Inc. + 0001 Virtual NVMe Controller +5045 University of Toronto + 4243 BLASTbus PCI Interface Card v1 +5046 GemTek Technology Corporation + 1001 PCI Radio +5053 Voyetra Technologies + 2010 Daytona Audio Adapter +50b2 TerraTec Electronic GmbH +5136 S S Technologies +5143 Qualcomm Inc +5145 Ensoniq (Old) + 3031 Concert AudioPCI +5168 Animation Technologies Inc. + 0300 FlyDVB-S + 0301 FlyDVB-T +5301 Alliance Semiconductor Corp. + 0001 ProMotion aT3D +5333 S3 Graphics Ltd. + 0551 Plato/PX (system) + 5631 86c325 [ViRGE] + 8800 86c866 [Vision 866] + 8801 86c964 [Vision 964] + 8810 86c764_0 [Trio 32 vers 0] + 8811 86c764/765 [Trio32/64/64V+] + 8812 86cM65 [Aurora64V+] + 8813 86c764_3 [Trio 32/64 vers 3] + 8814 86c767 [Trio 64UV+] + 8815 86cM65 [Aurora 128] + 883d 86c988 [ViRGE/VX] + 8870 FireGL + 8880 86c868 [Vision 868 VRAM] vers 0 + 8881 86c868 [Vision 868 VRAM] vers 1 + 8882 86c868 [Vision 868 VRAM] vers 2 + 8883 86c868 [Vision 868 VRAM] vers 3 + 88b0 86c928 [Vision 928 VRAM] vers 0 + 88b1 86c928 [Vision 928 VRAM] vers 1 + 88b2 86c928 [Vision 928 VRAM] vers 2 + 88b3 86c928 [Vision 928 VRAM] vers 3 + 88c0 86c864 [Vision 864 DRAM] vers 0 + 88c1 86c864 [Vision 864 DRAM] vers 1 + 88c2 86c864 [Vision 864-P DRAM] vers 2 + 88c3 86c864 [Vision 864-P DRAM] vers 3 + 88d0 86c964 [Vision 964 VRAM] vers 0 + 88d1 86c964 [Vision 964 VRAM] vers 1 + 88d2 86c964 [Vision 964-P VRAM] vers 2 + 88d3 86c964 [Vision 964-P VRAM] vers 3 + 88f0 86c968 [Vision 968 VRAM] rev 0 + 88f1 86c968 [Vision 968 VRAM] rev 1 + 88f2 86c968 [Vision 968 VRAM] rev 2 + 88f3 86c968 [Vision 968 VRAM] rev 3 + 8900 86c755 [Trio 64V2/DX] + 5333 8900 86C775 Trio64V2/DX + 8901 86c775/86c785 [Trio 64V2/DX or /GX] + 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX + 8902 Plato/PX + 8903 Trio 3D business multimedia + 8904 86c365, 86c366 [Trio 3D] + 1014 00db Integrated Trio3D + 4843 314a Terminator 128/3D GLH + 5333 8904 86C365 Trio3D AGP + 8905 Trio 64V+ family + 8906 Trio 64V+ family + 8907 Trio 64V+ family + 8908 Trio 64V+ family + 8909 Trio 64V+ family + 890a Trio 64V+ family + 890b Trio 64V+ family + 890c Trio 64V+ family + 890d Trio 64V+ family + 890e Trio 64V+ family + 890f Trio 64V+ family + 8a01 86c375 [ViRGE/DX] or 86c385 [ViRGE/GX] + 0e11 b032 ViRGE/GX + 10b4 1617 Nitro 3D + 10b4 1717 Nitro 3D + 5333 8a01 ViRGE/DX + 8a10 ViRGE/GX2 + 1092 8a10 Stealth 3D 4000 + 8a13 86c360 [Trio 3D/1X], 86c362, 86c368 [Trio 3D/2X] + 5333 8a13 Trio3D/2X + 8a20 86c794 [Savage 3D] + 5333 8a20 86C391 Savage3D + 8a21 86c390 [Savage 3D/MV] + 5333 8a21 86C390 Savage3D/MV + 8a22 Savage 4 + 1033 8068 Savage 4 + 1033 8069 Savage 4 + 1033 8110 Savage 4 LT + 105d 0018 SR9 8Mb SDRAM + 105d 002a SR9 Pro 16Mb SDRAM + 105d 003a SR9 Pro 32Mb SDRAM + 105d 092f SR9 Pro+ 16Mb SGRAM + 1092 4207 Stealth III S540 + 1092 4800 Stealth III S540 + 1092 4807 SpeedStar A90 + 1092 4808 Stealth III S540 + 1092 4809 Stealth III S540 + 1092 480e Stealth III S540 + 1092 4904 Stealth III S520 + 1092 4905 SpeedStar A200 + 1092 4a09 Stealth III S540 + 1092 4a0b Stealth III S540 Xtreme + 1092 4a0f Stealth III S540 + 1092 4e01 Stealth III S540 + 1102 101d 3d Blaster Savage 4 + 1102 101e 3d Blaster Savage 4 + 5333 8100 86C394-397 Savage4 SDRAM 100 + 5333 8110 86C394-397 Savage4 SDRAM 110 + 5333 8125 86C394-397 Savage4 SDRAM 125 + 5333 8143 86C394-397 Savage4 SDRAM 143 + 5333 8a22 86C394-397 Savage4 + 5333 8a2e 86C394-397 Savage4 32bit + 5333 9125 86C394-397 Savage4 SGRAM 125 + 5333 9143 86C394-397 Savage4 SGRAM 143 + 8a23 Savage 4 + 8a25 ProSavage PM133 + 0303 0303 D9840-60001 [Brio BA410 Motherboard] + 8a26 ProSavage KM133 + 8c00 ViRGE/M3 + 8c01 ViRGE/MX + 1179 0001 ViRGE/MX + 8c02 ViRGE/MX+ + 8c03 ViRGE/MX+MV + 8c10 86C270-294 [SavageMX-MV] + 8c11 82C270-294 [SavageMX] + 8c12 86C270-294 [SavageIX-MV] + 1014 017f ThinkPad T20/T22 + 1179 0001 86C584 SuperSavage/IXC Toshiba + 8c13 86C270-294 [SavageIX] + 1179 0001 Magnia Z310 + 8c22 SuperSavage MX/128 + 8c24 SuperSavage MX/64 + 8c26 SuperSavage MX/64C + 8c2a SuperSavage IX/128 SDR + 8c2b SuperSavage IX/128 DDR + 8c2c SuperSavage IX/64 SDR + 8c2d SuperSavage IX/64 DDR + 8c2e SuperSavage IX/C SDR + 1014 01fc ThinkPad T23 + 8c2f SuperSavage IX/C DDR + 8d01 86C380 [ProSavageDDR K4M266] + 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK) + 8d03 VT8751 [ProSavageDDR P4M266] + 8d04 VT8375 [ProSavage8 KM266/KL266] + 8e00 DeltaChrome + 8e26 ProSavage + 8e40 2300E Graphics Processor + 8e48 Matrix [Chrome S25 / S27] + 5333 0130 Chrome S27 256M DDR2 + 9043 Chrome 430 GT + 9045 Chrome 430 ULP / 435 ULP / 440 GTX + 9060 Chrome 530 GT + 9102 86C410 [Savage 2000] + 1092 5932 Viper II Z200 + 1092 5934 Viper II Z200 + 1092 5952 Viper II Z200 + 1092 5954 Viper II Z200 + 1092 5a35 Viper II Z200 + 1092 5a37 Viper II Z200 + 1092 5a55 Viper II Z200 + 1092 5a57 Viper II Z200 + ca00 SonicVibes +5431 AuzenTech, Inc. +544c Teralogic Inc + 0350 TL880-based HDTV/ATSC tuner +544d TBS Technologies + 6178 DVB Tuner PCIe Card + 544d 6904 TBS6904 DVB-S2 Quad Tuner PCIe Card + 544d 6905 TBS6905 DVB-S2 Quad Tuner PCIe Card + 6205 0001 TBS6205 DVB-T2/T/C Quad TV Tuner PCIe Card + 6209 0001 TBS6209 DVB-T2/C2/T/C/ISDB-T OctaTV Tuner +5452 SCANLAB AG + 3443 RTC4 +5455 Technische Universitaet Berlin + 4458 S5933 +5456 GoTView +5519 Cnet Technologies, Inc. +5544 Dunord Technologies + 0001 I-30xx Scanner Interface +5555 Genroco, Inc + 0003 TURBOstor HFP-832 [HiPPI NIC] + 3b00 Epiphan DVI2PCIe video capture card +5646 Vector Fabrics BV +5654 VoiceTronix Pty Ltd +5678 Dawicontrol Computersysteme GmbH +5700 Netpower +# alternately Extreme Engineering Solutions, Inc. +5845 X-ES, Inc. +584d AuzenTech Co., Ltd. +5851 Exacq Technologies + 8008 tDVR8008 8-port video capture card + 8016 tDVR8016 16-chan video capture card + 8032 tDVR8032 32-chan video capture card +5853 XenSource, Inc. + 0001 Xen Platform Device + c000 Citrix XenServer PCI Device for Windows Update +# Virtual device surfaced in guests to provide HID events. + c110 Virtualized HID +# Device surfaced in guests to provide 2d graphics capabilities + c147 Virtualized Graphics Device + c200 XCP-ng Project PCI Device for Windows Update +5854 GoTView +5ace Beholder International Ltd. +6205 TBS Technologies (wrong ID) +6209 TBS Technologies (wrong ID) +631c SmartInfra Ltd + 1652 PXI-1652 Signal Generator + 2504 PXI-2504 Signal Interrogator +6356 UltraStor +6374 c't Magazin fuer Computertechnik + 6773 GPPCI +6409 Logitec Corp. +6549 Teradici Corp. + 1200 TERA1200 PC-over-IP Host +6666 Decision Computer International Co. + 0001 PCCOM4 + 0002 PCCOM8 + 0004 PCCOM2 + 0101 PCI 8255/8254 I/O Card + 0200 12-bit AD/DA Card + 0201 14-bit AD/DA Card + 1011 Industrial Card + 1021 8 photo couple 8 relay Card + 1022 4 photo couple 4 relay Card + 1025 16 photo couple 16 relay Card + 4000 WatchDog Card +6688 Zycoo Co., Ltd + 1200 CooVox TDM Analog Module + 1400 CooVOX TDM GSM Module + 1600 CooVOX TDM E1/T1 Module + 1800 CooVOX TDM BRI Module +6766 Glenfly Tech Co., Ltd. + 3d00 Arise-GT-10C0 + 3d02 Arise1020 + 3d03 Arise-GT-1040 + 3d04 Arise1010 + 3d40 Arise-GT-10C0 High Definition Audio Controller + 3d41 Arise1020 High Definition Audio Controller +6899 ZT Systems +# nee Qumranet +6900 Red Hat, Inc. +7063 pcHDTV + 2000 HD-2000 + 3000 HD-3000 + 5500 HD5500 HDTV +7284 HT OMEGA Inc. +7357 IOxOS Technologies SA + 7910 7910 [Althea] +7401 EndRun Technologies + e100 PTP3100 PCIe PTP Slave Clock +7470 TP-LINK Technologies Co., Ltd. +7526 HongQin (Beijing) Technology Co., Ltd. + 0082 HQ SSD 1TB + 0083 HQ SSD 2TB M.2 NVMe +7604 O.N. Electronic Co Ltd. +7bde MIDAC Corporation +7fed PowerTV +8008 Quancom Electronic GmbH + 0010 WDOG1 [PCI-Watchdog 1] + 0011 PWDOG2 [PCI-Watchdog 2] + 0015 Clock77/PCI & Clock77/PCIe (DCF-77 receiver) +# Wrong ID used in subsystem ID of AsusTek PCI-USB2 PCI card. +807d Asustek Computer, Inc. +8086 Intel Corporation + 0007 82379AB + 0008 Extended Express System Support Controller + 0039 21145 Fast Ethernet + 0040 Core Processor DRAM Controller + 0041 Core Processor PCI Express x16 Root Port + 0042 Core Processor Integrated Graphics Controller + 0043 Core Processor Secondary PCI Express Root Port + 0044 Core Processor DRAM Controller + 1025 0347 Aspire 7740G + 1025 0487 TravelMate 5742 + 1028 040a Latitude E6410 + 144d c06a R730 Laptop + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 0045 Core Processor PCI Express x16 Root Port + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 0046 Core Processor Integrated Graphics Controller + 1028 040a Latitude E6410 + 144d c06a R730 Laptop + 17c0 10d9 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 0047 Core Processor Secondary PCI Express Root Port + 0048 Core Processor DRAM Controller + 0049 Core Processor PCI Express x16 Root Port + 004a Core Processor Integrated Graphics Controller + 004b Core Processor Secondary PCI Express Root Port + 0050 Core Processor Thermal Management Controller + 0069 Core Processor DRAM Controller + 0082 Centrino Advanced-N 6205 [Taylor Peak] + 8086 1301 Centrino Advanced-N 6205 AGN + 8086 1306 Centrino Advanced-N 6205 ABG + 8086 1307 Centrino Advanced-N 6205 BG + 8086 1321 Centrino Advanced-N 6205 AGN + 8086 1326 Centrino Advanced-N 6205 ABG + 0083 Centrino Wireless-N 1000 [Condor Peak] + 8086 1205 Centrino Wireless-N 1000 BGN + 8086 1206 Centrino Wireless-N 1000 BG + 8086 1225 Centrino Wireless-N 1000 BGN + 8086 1226 Centrino Wireless-N 1000 BG + 8086 1305 Centrino Wireless-N 1000 BGN + 8086 1306 Centrino Wireless-N 1000 BG + 8086 1325 Centrino Wireless-N 1000 BGN + 8086 1326 Centrino Wireless-N 1000 BG + 0084 Centrino Wireless-N 1000 [Condor Peak] + 8086 1215 Centrino Wireless-N 1000 BGN + 8086 1216 Centrino Wireless-N 1000 BG + 8086 1315 Centrino Wireless-N 1000 BGN + 8086 1316 Centrino Wireless-N 1000 BG + 0085 Centrino Advanced-N 6205 [Taylor Peak] + 8086 1311 Centrino Advanced-N 6205 (802.11a/b/g/n) + 8086 1316 Centrino Advanced-N 6205 ABG + 0087 Centrino Advanced-N + WiMAX 6250 [Kilmer Peak] + 8086 1301 Centrino Advanced-N + WiMAX 6250 2x2 AGN + 8086 1306 Centrino Advanced-N + WiMAX 6250 2x2 ABG + 8086 1321 Centrino Advanced-N + WiMAX 6250 2x2 AGN + 8086 1326 Centrino Advanced-N + WiMAX 6250 2x2 ABG + 0089 Centrino Advanced-N + WiMAX 6250 [Kilmer Peak] + 8086 1311 Centrino Advanced-N + WiMAX 6250 2x2 AGN + 8086 1316 Centrino Advanced-N + WiMAX 6250 2x2 ABG + 008a Centrino Wireless-N 1030 [Rainbow Peak] + 8086 5305 Centrino Wireless-N 1030 BGN + 8086 5307 Centrino Wireless-N 1030 BG + 8086 5325 Centrino Wireless-N 1030 BGN + 8086 5327 Centrino Wireless-N 1030 BG + 008b Centrino Wireless-N 1030 [Rainbow Peak] + 8086 5315 Centrino Wireless-N 1030 BGN + 8086 5317 Centrino Wireless-N 1030 BG + 0090 Centrino Advanced-N 6230 [Rainbow Peak] + 8086 5211 Centrino Advanced-N 6230 AGN + 8086 5215 Centrino Advanced-N 6230 BGN + 8086 5216 Centrino Advanced-N 6230 ABG + 0091 Centrino Advanced-N 6230 [Rainbow Peak] + 8086 5201 Centrino Advanced-N 6230 AGN + 8086 5205 Centrino Advanced-N 6230 BGN + 8086 5206 Centrino Advanced-N 6230 ABG + 8086 5207 Centrino Advanced-N 6230 BG + 8086 5221 Centrino Advanced-N 6230 AGN + 8086 5225 Centrino Advanced-N 6230 BGN + 8086 5226 Centrino Advanced-N 6230 ABG + 0100 2nd Generation Core Processor Family DRAM Controller + 1028 04aa XPS 8300 + 1043 844d P8P67/P8H67 Series Motherboard + 8086 200d DH61CR motherboard + 0101 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port + 1028 04b2 Vostro 3350 + 106b 00dc MacBookPro8,2 [Core i7, 15", 2011] + 144d c652 NP300E5C series laptop + 0102 2nd Generation Core Processor Family Integrated Graphics Controller + 1028 04aa XPS 8300 + 1043 0102 P8H67 Series Motherboard + 0104 2nd Generation Core Processor Family DRAM Controller + 1028 04a3 Precision M4600 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 106b 00dc MacBookPro8,2 [Core i7, 15", 2011] + 144d c652 NP300E5C series laptop + 17aa 21cf ThinkPad T520 + 0105 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port + 106b 00dc MacBookPro8,2 [Core i7, 15", 2011] + 0106 2nd Generation Core Processor Family Integrated Graphics Controller + 0108 Xeon E3-1200 Processor Family DRAM Controller + 0109 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port + 010a Xeon E3-1200 Processor Family Integrated Graphics Controller + 010b Xeon E3-1200/2nd Generation Core Processor Family Integrated Graphics Controller + 010c Xeon E3-1200/2nd Generation Core Processor Family DRAM Controller + 010d Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port + 010e Xeon E3-1200/2nd Generation Core Processor Family Integrated Graphics Controller + 0112 2nd Generation Core Processor Family Integrated Graphics Controller + 0116 2nd Generation Core Processor Family Integrated Graphics Controller + 1028 04da Vostro 3750 + 144d c652 integrated HD 3000 graphics controller on NP300E5C series laptop + 0122 2nd Generation Core Processor Family Integrated Graphics Controller + 0126 2nd Generation Core Processor Family Integrated Graphics Controller + 1028 04cc Vostro 3350 + 17aa 21ce ThinkPad T420 + 17aa 21cf ThinkPad T520 + 0150 Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller + 1043 84ca P8 series motherboard + 1458 d000 Ivy Bridge GT1 [HD Graphics] + 15d9 0624 X9SCM-F Motherboard + 1849 0150 Motherboard + 0151 Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port + 1043 1477 N56VZ + 1043 844d P8 series motherboard + 1043 84ca P8H77-I Motherboard + 8086 2010 Server Board S1200BTS + 0152 Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller + 1043 84ca P8H77-I Motherboard + 0153 3rd Gen Core Processor Thermal Subsystem + 1043 1517 Zenbook Prime UX31A + 0154 3rd Gen Core processor DRAM Controller + 1025 0806 Aspire E1-470G + 1025 0813 Aspire R7-571 + 103c 17f6 ProBook 4540s + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 10cf 16bf LIFEBOOK E752 + 0155 Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port + 8086 2010 Server Board S1200BTS + 0156 3rd Gen Core processor Graphics Controller + 1043 108d VivoBook X202EV + 0158 Xeon E3-1200 v2/Ivy Bridge DRAM Controller + 1043 844d P8 series motherboard + 8086 2010 Server Board S1200BT Family + 0159 Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port + 015a Xeon E3-1200 v2/Ivy Bridge Graphics Controller + 015c Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller + 015d Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port + 1043 844d P8 series motherboard + 015e Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller + 0162 IvyBridge GT2 [HD Graphics 4000] + 1043 84ca P8 series motherboard + 1849 0162 Motherboard + 0166 3rd Gen Core processor Graphics Controller + 1043 1517 Zenbook Prime UX31A + 1043 2103 N56VZ + 10cf 16c1 LIFEBOOK E752 + 016a Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller + 1043 844d P8B WS Motherboard + 0172 Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller + 0176 3rd Gen Core processor Graphics Controller + 0201 Arctic Sound + 0284 Comet Lake PCH-LP LPC Premium Controller/eSPI Controller + 1028 09be Latitude 7410 + 02a3 Comet Lake PCH-LP SMBus Host Controller + 1028 09be Latitude 7410 + 02a4 Comet Lake SPI (flash) Controller + 1028 09be Latitude 7410 + 02a6 Comet Lake North Peak + 02b0 Comet Lake PCI Express Root Port #9 + 02b1 Comet Lake PCI Express Root Port #10 + 02b3 Comet Lake PCI Express Root Port #12 + 02b4 Comet Lake PCI Express Root Port #13 + 02b8 Comet Lake PCI Express Root Port #1 + 02bc Comet Lake PCI Express Root Port #5 + 02c5 Comet Lake Serial IO I2C Host Controller + 1028 09be Latitude 7410 + 02c8 Comet Lake PCH-LP cAVS + 1028 09be Latitude 7410 + 02d3 Comet Lake SATA AHCI Controller + 02e0 Comet Lake Management Engine Interface + 1028 09be Latitude 7410 + 02e8 Serial IO I2C Host Controller + 1028 09be Latitude 7410 + 02e9 Comet Lake Serial IO I2C Host Controller + 1028 09be Latitude 7410 + 02ea Comet Lake PCH-LP LPSS: I2C Controller #2 + 02ed Comet Lake PCH-LP USB 3.1 xHCI Host Controller + 1028 09be Latitude 7410 + 02ef Comet Lake PCH-LP Shared SRAM + 1028 09be Latitude 7410 + 02f0 Comet Lake PCH-LP CNVi WiFi + 8086 0034 Wireless-AC 9560 160MHz + 8086 0070 Wi-Fi 6 AX201 160MHz + 8086 0074 Wi-Fi 6 AX201 160MHz + 8086 4070 Wi-Fi 6 AX201 160MHz + 02f5 Comet Lake PCH-LP SCS3 + 02f9 Comet Lake Thermal Subsytem + 1028 09be Latitude 7410 + 02fc Comet Lake Integrated Sensor Solution + 1028 09be Latitude 7410 + 0309 80303 I/O Processor PCI-to-PCI Bridge + 030d 80312 I/O Companion Chip PCI-to-PCI Bridge + 0326 6700/6702PXH I/OxAPIC Interrupt Controller A + 103c 3208 ProLiant DL140 G2 + 1775 1100 CR11/VR11 Single Board Computer + 0327 6700PXH I/OxAPIC Interrupt Controller B + 103c 3208 ProLiant DL140 G2 + 1775 1100 CR11/VR11 Single Board Computer + 0329 6700PXH PCI Express-to-PCI Bridge A + 032a 6700PXH PCI Express-to-PCI Bridge B + 032c 6702PXH PCI Express-to-PCI Bridge A + 0330 80332 [Dobson] I/O processor (A-Segment Bridge) + 0331 80332 [Dobson] I/O processor (A-Segment IOAPIC) + 0332 80332 [Dobson] I/O processor (B-Segment Bridge) + 0333 80332 [Dobson] I/O processor (B-Segment IOAPIC) + 0334 80332 [Dobson] I/O processor (ATU) + 0335 80331 [Lindsay] I/O processor (PCI-X Bridge) + 0336 80331 [Lindsay] I/O processor (ATU) + 0340 41210 [Lanai] Serial to Parallel PCI Bridge (A-Segment Bridge) + 0341 41210 [Lanai] Serial to Parallel PCI Bridge (B-Segment Bridge) + 0370 80333 Segment-A PCIe Express to PCI-X bridge + 0371 80333 A-Bus IOAPIC + 0372 80333 Segment-B PCIe Express to PCI-X bridge + 0373 80333 B-Bus IOAPIC + 0374 80333 Address Translation Unit + 0402 Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller + 0406 Haswell Integrated Graphics Controller + 040a Xeon E3-1200 v3 Processor Integrated Graphics Controller + 0412 Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller + 1028 05d7 Alienware X51 R2 + 103c 1998 EliteDesk 800 G1 + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 0416 4th Gen Core Processor Integrated Graphics Controller + 17aa 220e ThinkPad T440p + 041a Xeon E3-1200 v3 Processor Integrated Graphics Controller + 041e 4th Generation Core Processor Family Integrated Graphics Controller + 0434 DH89XXCC Series QAT + 0435 DH895XCC Series QAT + 0436 DH8900CC Null Device + 0438 DH8900CC Series Gigabit Network Connection + 043a DH8900CC Series Gigabit Fiber Network Connection + 043c DH8900CC Series Gigabit Backplane Network Connection + 0440 DH8900CC Series Gigabit SFP Network Connection + 0442 DH89XXCC Series QAT Virtual Function + 0443 DH895XCC Series QAT Virtual Function + 0482 82375EB/SB PCI to EISA Bridge + 0483 82424TX/ZX [Saturn] CPU to PCI bridge + 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge + 0486 82425EX/ZX [Aries] PCIset with ISA bridge + 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge + 04d0 82437FX [Triton FX] + 0500 E8870 Processor bus control + 0501 E8870 Memory controller +# and registers common to both SPs + 0502 E8870 Scalability Port 0 +# and global performance monitoring + 0503 E8870 Scalability Port 1 + 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port) + 0511 E8870IO Hub Interface Port 1 registers + 0512 E8870IO Hub Interface Port 2 registers + 0513 E8870IO Hub Interface Port 3 registers + 0514 E8870IO Hub Interface Port 4 registers + 0515 E8870IO General SIOH registers + 0516 E8870IO RAS registers + 0530 E8870SP Scalability Port 0 registers + 0531 E8870SP Scalability Port 1 registers + 0532 E8870SP Scalability Port 2 registers + 0533 E8870SP Scalability Port 3 registers + 0534 E8870SP Scalability Port 4 registers + 0535 E8870SP Scalability Port 5 registers +# (bi-interleave 0) and global registers that are neither per-port nor per-interleave + 0536 E8870SP Interleave registers 0 and 1 +# (bi-interleave 1) + 0537 E8870SP Interleave registers 2 and 3 + 0600 RAID Controller + 8086 0136 SRCU31L + 8086 01af SRCZCR + 8086 01c1 ICP Vortex GDT8546RZ + 8086 01f7 SCRU32 +# uninitialized SRCU32 RAID Controller + 061f 80303 I/O Processor + 0684 H470 Chipset LPC/eSPI Controller + 0687 Q470 Chipset LPC/eSPI Controller + 068d Comet Lake LPC Controller + 06a3 Comet Lake PCH SMBus Controller + 06a4 Comet Lake PCH SPI Controller + 06a8 Comet Lake PCH Serial IO UART Host Controller #0 + 06a9 Comet Lake PCH Serial IO UART Host Controller #1 + 06aa Comet Lake PCH Serial IO SPI Controller #0 + 06ab Comet Lake PCH Serial IO SPI Controller #1 + 06ac Comet Lake PCI Express Root Port #21 + 06b0 Comet Lake PCI Express Root Port #9 + 06bd Comet Lake PCIe Port #6 + 06c0 Comet Lake PCI Express Root Port #17 + 06c8 Comet Lake PCH cAVS + 06d2 Comet Lake SATA AHCI Controller + 06d6 Comet Lake PCH-H RAID + 06d7 Comet Lake PCH-H RAID + 06e0 Comet Lake HECI Controller + 06e3 Comet Lake Keyboard and Text (KT) Redirection + 06e8 Comet Lake PCH Serial IO I2C Controller #0 + 06e9 Comet Lake PCH Serial IO I2C Controller #1 + 06ea Comet Lake PCH Serial IO I2C Controller #2 + 06eb Comet Lake PCH Serial IO I2C Controller #3 + 06ed Comet Lake USB 3.1 xHCI Host Controller + 06ef Comet Lake PCH Shared SRAM + 06f0 Comet Lake PCH CNVi WiFi + 8086 0034 Wireless-AC 9560 + 8086 0074 Wi-Fi 6 AX201 160MHz + 8086 02a4 Wireless-AC 9462 + 06f9 Comet Lake PCH Thermal Controller + 06fb Comet Lake PCH Serial IO SPI Controller #2 + 0700 CE Media Processor A/V Bridge + 0701 CE Media Processor NAND Flash Controller + 0703 CE Media Processor Media Control Unit 1 + 0704 CE Media Processor Video Capture Interface + 0707 CE Media Processor SPI Slave + 0708 Atom Processor CE 4100 + 0709 Atom Processor CE 4200 + 0800 Moorestown SPI Ctrl 0 + 0801 Moorestown SPI Ctrl 1 + 0802 Moorestown I2C 0 + 0803 Moorestown I2C 1 + 0804 Moorestown I2C 2 + 0805 Moorestown Keyboard Ctrl + 0806 Moorestown USB Ctrl + 0807 Moorestown SD Host Ctrl 0 + 0808 Moorestown SD Host Ctrl 1 + 0809 Moorestown NAND Ctrl + 080a Moorestown Audio Ctrl + 080b Moorestown ISP + 080c Moorestown Security Controller + 080d Moorestown External Displays + 080e Moorestown SCU IPC + 080f Moorestown GPIO Controller + 0810 Moorestown Power Management Unit + 0811 Moorestown OTG Ctrl + 0812 Moorestown SPI Ctrl 2 + 0813 Moorestown SC DMA + 0814 Moorestown LPE DMA + 0815 Moorestown SSP0 + 0817 Medfield Serial IO I2C Controller #3 + 0818 Medfield Serial IO I2C Controller #4 + 0819 Medfield Serial IO I2C Controller #5 + 081a Medfield GPIO Controller [Core] + 081b Medfield Serial IO HSUART Controller #1 + 081c Medfield Serial IO HSUART Controller #2 + 081d Medfield Serial IO HSUART Controller #3 + 081e Medfield Serial IO HSUART DMA Controller + 081f Medfield GPIO Controller [AON] + 0820 Medfield SD Host Controller + 0821 Medfield SDIO Controller #1 + 0822 Medfield SDIO Controller #2 + 0823 Medfield eMMC Controller #0 + 0824 Medfield eMMC Controller #1 + 0827 Medfield Serial IO DMA Controller + 0828 Medfield Power Management Unit + 0829 Medfield USB Device Controller (OTG) + 082a Medfield SCU IPC + 082c Medfield Serial IO I2C Controller #0 + 082d Medfield Serial IO I2C Controller #1 + 082e Medfield Serial IO I2C Controller #2 + 0885 Centrino Wireless-N + WiMAX 6150 + 8086 1305 Centrino Wireless-N + WiMAX 6150 BGN + 8086 1307 Centrino Wireless-N + WiMAX 6150 BG + 8086 1325 Centrino Wireless-N + WiMAX 6150 BGN + 8086 1327 Centrino Wireless-N + WiMAX 6150 BG + 0886 Centrino Wireless-N + WiMAX 6150 + 8086 1315 Centrino Wireless-N + WiMAX 6150 BGN + 8086 1317 Centrino Wireless-N + WiMAX 6150 BG + 0887 Centrino Wireless-N 2230 + 8086 4062 Centrino Wireless-N 2230 BGN + 8086 4462 Centrino Wireless-N 2230 BGN + 0888 Centrino Wireless-N 2230 + 8086 4262 Centrino Wireless-N 2230 BGN + 088e Centrino Advanced-N 6235 + 8086 4060 Centrino Advanced-N 6235 AGN + 8086 4460 Centrino Advanced-N 6235 AGN + 088f Centrino Advanced-N 6235 + 8086 4260 Centrino Advanced-N 6235 AGN + 0890 Centrino Wireless-N 2200 + 8086 4022 Centrino Wireless-N 2200 BGN + 8086 4422 Centrino Wireless-N 2200 BGN + 8086 4822 Centrino Wireless-N 2200 BGN + 0891 Centrino Wireless-N 2200 + 8086 4222 Centrino Wireless-N 2200 BGN + 0892 Centrino Wireless-N 135 + 8086 0062 Centrino Wireless-N 135 BGN + 8086 0462 Centrino Wireless-N 135 BGN + 0893 Centrino Wireless-N 135 + 8086 0262 Centrino Wireless-N 135 BGN + 0894 Centrino Wireless-N 105 + 8086 0022 Centrino Wireless-N 105 BGN + 8086 0422 Centrino Wireless-N 105 BGN + 8086 0822 Centrino Wireless-N 105 BGN + 0895 Centrino Wireless-N 105 + 8086 0222 Centrino Wireless-N 105 BGN + 0896 Centrino Wireless-N 130 + 8086 5005 Centrino Wireless-N 130 BGN + 8086 5007 Centrino Wireless-N 130 BG + 8086 5025 Centrino Wireless-N 130 BGN + 8086 5027 Centrino Wireless-N 130 BG + 0897 Centrino Wireless-N 130 + 8086 5015 Centrino Wireless-N 130 BGN + 8086 5017 Centrino Wireless-N 130 BG + 08a7 Quark SoC X1000 SDIO / eMMC Controller + 08ae Centrino Wireless-N 100 + 8086 1005 Centrino Wireless-N 100 BGN + 8086 1007 Centrino Wireless-N 100 BG + 8086 1025 Centrino Wireless-N 100 BGN + 8086 1027 Centrino Wireless-N 100 BG + 08af Centrino Wireless-N 100 + 8086 1015 Centrino Wireless-N 100 BGN + 8086 1017 Centrino Wireless-N 100 BG + 08b1 Wireless 7260 +# Wilkins Peak 2 + 8086 4020 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 402a Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4060 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4062 Wireless-N 7260 +# Wilkins Peak 2 + 8086 406a Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4070 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4072 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4160 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4162 Wireless-N 7260 +# Wilkins Peak 2 + 8086 4170 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4420 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4460 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4462 Wireless-N 7260 +# Wilkins Peak 2 + 8086 446a Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4470 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4472 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4560 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4570 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 486e Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4870 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4a6c Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4a6e Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4a70 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4c60 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4c70 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 5070 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 5072 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 5170 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 5770 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c020 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c02a Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c060 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c062 Wireless-N 7260 +# Wilkins Peak 2 + 8086 c06a Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c070 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c072 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c160 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c162 Wireless-N 7260 +# Wilkins Peak 2 + 8086 c170 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c360 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c420 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c460 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c462 Wireless-N 7260 +# Wilkins Peak 2 + 8086 c470 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c472 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c560 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c570 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c760 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c770 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 cc60 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 cc70 Dual Band Wireless-AC 7260 + 08b2 Wireless 7260 +# Wilkins Peak 2 + 8086 4220 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4260 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4262 Wireless-N 7260 +# Wilkins Peak 2 + 8086 426a Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4270 Wireless-N 7260 +# Wilkins Peak 2 + 8086 4272 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 4360 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 4370 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c220 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c260 Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c262 Wireless-N 7260 +# Wilkins Peak 2 + 8086 c26a Dual Band Wireless-N 7260 +# Wilkins Peak 2 + 8086 c270 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c272 Dual Band Wireless-AC 7260 +# Wilkins Peak 2 + 8086 c370 Dual Band Wireless-AC 7260 + 08b3 Wireless 3160 +# Wilkins Peak 1 + 8086 0060 Dual Band Wireless-N 3160 +# Wilkins Peak 1 + 8086 0062 Wireless-N 3160 +# Wilkins Peak 1 + 8086 0070 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 0072 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 0170 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 0172 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 0260 Dual Band Wireless-N 3160 +# Wilkins Peak 1 + 8086 0470 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 0472 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 1070 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 1170 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 8060 Dual Band Wireless N-3160 +# Wilkins Peak 1 + 8086 8062 Wireless N-3160 +# Wilkins Peak 1 + 8086 8070 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8072 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8170 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8172 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8470 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8570 Dual Band Wireless AC 3160 + 08b4 Wireless 3160 +# Wilkins Peak 1 + 8086 0270 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 0272 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 0370 Dual Band Wireless-AC 3160 +# Wilkins Peak 1 + 8086 8260 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8270 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8272 Dual Band Wireless AC 3160 +# Wilkins Peak 1 + 8086 8370 Dual Band Wireless AC 3160 +# PowerVR SGX 545 + 08cf Atom Processor Z2760 Integrated Graphics Controller + 0931 Atom Processor CE 2600 [Puma 6] + 0934 Quark SoC X1000 I2C Controller and GPIO Controller + 0935 Quark SoC X1000 SPI Controller + 0936 Quark SoC X1000 HS-UART + 0937 Quark SoC X1000 10/100 Ethernet MAC + 0939 Quark SoC X1000 USB EHCI Host Controller / USB 2.0 Device + 093a Quark SoC X1000 USB OHCI Host Controller + 0953 PCIe Data Center SSD + 8086 3702 DC P3700 SSD + 8086 3703 DC P3700 SSD [2.5" SFF] + 8086 3704 DC P3500 SSD [Add-in Card] + 8086 3705 DC P3500 SSD [2.5" SFF] + 8086 3709 DC P3600 SSD [Add-in Card] + 8086 370a DC P3600 SSD [2.5" SFF] + 8086 370d SSD 750 Series [Add-in Card] + 8086 370e SSD 750 Series [2.5" SFF] + 0958 Quark SoC X1000 Host Bridge + 095a Wireless 7265 +# Stone Peak 2 AC + 8086 1010 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 5000 Dual Band Wireless-N 7265 +# Stone Peak 2 BGN + 8086 5002 Wireless-N 7265 +# Stone Peak 2 AGN + 8086 500a Dual Band Wireless-N 7265 +# Stone Peak 2 AC + 8086 5010 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 5012 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 5020 Dual Band Wireless-N 7265 +# Stone Peak 2 AGN + 8086 502a Dual Band Wireless-N 7265 +# Maple Peak AC + 8086 5090 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 5100 Dual Band Wireless-AC 7265 +# Stone Peak 2 BGN + 8086 5102 Wireless-N 7265 +# Stone Peak 2 AGN + 8086 510a Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 5110 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 5112 Dual Band Wireless-AC 7265 +# Maple Peak AC + 8086 5190 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 5400 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 5410 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 5412 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 5420 Dual Band Wireless-N 7265 +# Maple Peak AC + 8086 5490 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 5510 Dual Band Wireless-AC 7265 +# Maple Peak AC + 8086 5590 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 9000 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 900a Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9010 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9012 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9110 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9112 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9210 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9310 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 9400 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9410 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 9510 Dual Band Wireless-AC 7265 + 095b Wireless 7265 +# Stone Peak 2 AGN + 8086 5200 Dual Band Wireless-N 7265 +# Stone Peak 2 BGN + 8086 5202 Wireless-N 7265 +# Stone Peak 2 AGN + 8086 520a Dual Band Wireless-N 7265 +# Stone Peak 2 AC + 8086 5210 Dual Band Wireless-AC 7265 +# Stone Peak 2 AC + 8086 5212 Dual Band Wireless-AC 7265 +# Maple Peak AC + 8086 5290 Dual Band Wireless-AC 7265 +# Stone Peak 2 BGN + 8086 5302 Wireless-N 7265 +# Stone Peak 2 AC + 8086 5310 Dual Band Wireless-AC 7265 +# Stone Peak 2 AGN + 8086 9200 Dual Band Wireless-AC 7265 + 095e Quark SoC X1000 Legacy Bridge + 0960 80960RP (i960RP) Microprocessor/Bridge + 0962 80960RM (i960RM) Bridge + 0964 80960RP (i960RP) Microprocessor/Bridge + 0a03 Haswell-ULT Thermal Subsystem + 0a04 Haswell-ULT DRAM Controller + 17aa 2214 ThinkPad X240 + 0a06 Haswell-ULT Integrated Graphics Controller + 0a0c Haswell-ULT HD Audio Controller + 17aa 2214 ThinkPad X240 + 0a16 Haswell-ULT Integrated Graphics Controller + 17aa 2214 ThinkPad X240 + 0a22 Haswell-ULT Integrated Graphics Controller + 0a26 Haswell-ULT Integrated Graphics Controller + 0a2a Haswell-ULT Integrated Graphics Controller + 0a2e Haswell-ULT Integrated Graphics Controller + 0a53 DC P3520 SSD + 0a54 NVMe Datacenter SSD [3DNAND, Beta Rock Controller] + 1028 1fe1 Express Flash NVMe 1TB 2.5" U.2 (P4500) + 1028 1fe2 Express Flash NVMe 2TB 2.5" U.2 (P4500) + 1028 1fe3 Express Flash NVMe 4TB 2.5" U.2 (P4500) + 1028 1fe4 Express Flash NVMe 4TB HHHL AIC (P4500) + 1028 1fee Express Flash NVMe 1.6TB 2.5" U.2 (P4610) + 1028 1fef Express Flash NVMe 3.2TB 2.5" U.2 (P4610) + 1028 1ff0 Express Flash NVMe 6.4TB 2.5" U.2 (P4610) + 1028 1fff Express Flash NVMe 8.0TB 2.5" U.2 (P4510) + 1028 2003 Express Flash NVMe 1.0 TB 2.5" U.2 (P4510) + 1028 2004 Express Flash NVMe 2.0TB 2.5" U.2 (P4510) + 1028 2005 Express Flash NVMe 4.0TB 2.5" U.2 (P4510) + 108e 4870 NVMe PCIe 3.0 SSD 6.4TB AIC (P4608) + 108e 4871 NVMe PCIe 3.0 SSD 6.4TB 2.5-inch (P4600) + 108e 4879 NVMe PCIe 3.0 SSD v2 6.4TB AIC (P4618) + 108e 487a NVMe PCIe 3.0 SSD v2 6.4TB 2.5-inch (P4610) + 1137 0227 NVMe Datacenter SSD [3DNAND] 1.6TB 2.5" U.2 (P4600) + 1137 0228 NVMe Datacenter SSD [3DNAND] 2.0TB 2.5" U.2 (P4600) + 1137 0229 NVMe Datacenter SSD [3DNAND] 3.2TB 2.5" U.2 (P4600) + 1137 022b NVMe Datacenter SSD [3DNAND] 1.0TB 2.5" U.2 (P4500) + 1137 022c NVMe Datacenter SSD [3DNAND] 2.0TB 2.5" U.2 (P4500) + 1137 022d NVMe Datacenter SSD [3DNAND] 4.0TB 2.5" U.2 (P4500) + 1137 0231 NVMe Datacenter SSD [3DNAND] 0.5TB 2.5" U.2 (P4501) + 1137 0232 NVMe Datacenter SSD [3DNAND] 1.0TB 2.5" U.2 (P4501) + 1137 0233 NVMe Datacenter SSD [3DNAND] 2.0TB 2.5" U.2 (P4501) + 1137 0258 NVMe Datacenter SSD [3DNAND] 1.6TB 2.5" U.2 (P4610) + 1137 025a NVMe Datacenter SSD [3DNAND] 3.2TB 2.5" U.2 (P4610) + 1137 025b NVMe Datacenter SSD [3DNAND] 1.0TB 2.5" U.2 (P4510) + 1137 025c NVMe Datacenter SSD [3DNAND] 2.0TB 2.5" U.2 (P4510) + 1137 025d NVMe Datacenter SSD [3DNAND] 4.0TB 2.5" U.2 (P4510) + 1137 025e NVMe Datacenter SSD [3DNAND] 8.0TB 2.5" U.2 (P4510) + 1590 025d NVMe Datacenter SSD [3DNAND] 1.0TB 2.5" U.2 (P4500) + 1590 025e NVMe Datacenter SSD [3DNAND] 2.0TB 2.5" U.2 (P4500) + 1590 025f NVMe Datacenter SSD [3DNAND] 4.0TB 2.5" U.2 (P4500) + 1590 0262 NVMe Datacenter SSD [3DNAND] 1.6TB 2.5" U.2 (P4600) + 1590 0264 NVMe Datacenter SSD [3DNAND] 3.2TB 2.5" U.2 (P4600) + 1590 0265 NVMe Datacenter SSD [3DNAND] 6.4TB 2.5" U.2 (P4600) + 1590 026c NVMe Datacenter SSD [3DNAND] 4.0TB AIC (P4500) + 1d49 4702 Thinksystem Intel P4500 NVMe U.2 + 1d49 4704 Thinksystem Intel P4500 NVMe AIC + 1d49 4712 Thinksystem Intel P4600 NVMe U.2 + 1d49 4714 Thinksystem Intel P4600 NVMe AIC + 1d49 4802 Thinksystem U.2 P4510 NVMe SSD + 1d49 4812 Thinksystem U.2 P4610 NVMe SSD + 8086 4308 SSD D5-P4320 and D5-P4326 + 8086 4702 NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P4500) + 8086 4704 NVMe Datacenter SSD [3DNAND] SE AIC (P4500) + 8086 4712 NVMe Datacenter SSD [3DNAND] ME 2.5" U.2 (P4600) + 8086 4714 NVMe Datacenter SSD [3DNAND] ME AIC (P4600) + 8086 4802 NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P4510) + 8086 4804 NVMe Datacenter SSD [3DNAND] SE AIC (P4510) + 8086 4805 NVMe Datacenter SSD [3DNAND] SE M.2 (P4511) + 8086 4812 NVMe Datacenter SSD [3DNAND] ME 2.5" U.2 (P4610) + 8086 4814 NVMe Datacenter SSD [3DNAND] ME AIC (P4610) + 0a55 NVMe DC SSD [3DNAND, Beta Rock Controller] + 1028 1fe5 Express Flash NVMe 1.6TB 2.5" U.2 (P4600) + 1028 1fe6 Express Flash NVMe 2TB 2.5" U.2 (P4600) + 1028 1fe7 Express Flash NVMe 3.2TB 2.5" U.2 (P4600) + 1028 1fe8 Express Flash NVMe 2.0TB HHHL AIC (P4600) + 1028 1fe9 Express Flash NVMe 4.0TB HHHL AIC (P4600) + 0b26 Thunderbolt 4 Bridge [Goshen Ridge 2020] + 0b27 Thunderbolt 4 USB Controller [Goshen Ridge 2020] + 0b60 NVMe DC SSD [3DNAND, Sentinel Rock Controller] + 1028 2060 NVMe SED MU U.2 1.6TB (P5600) + 1028 2061 NVMe SED MU U.2 3.2TB (P5600) + 1028 2062 NVMe SED MU U.2 6.4TB (P5600) + 1028 2064 NVMe SED RI U.2 1.92TB (P5500) + 1028 2065 NVMe SED RI U.2 3.84TB (P5500) + 1028 2066 NVMe SED RI U.2 7.68TB (P5500) + 1028 209e NVMe MU U.2 1.6TB (P5600) + 1028 209f NVMe MU U.2 3.2TB (P5600) + 1028 2100 NVMe MU U.2 6.4TB (P5600) + 1028 2102 NVMe RI U.2 1.92TB (P5500) + 1028 2103 NVMe RI U.2 3.84TB (P5500) + 1028 2104 NVMe RI U.2 7.68TB (P5500) + 1028 219a NVMe P5316 RI 15.36TB + 1028 219b NVMe P5316 RI 30.72TB + 1028 219c NVMe SED P5316 RI 15.36 + 1028 219d NVMe SED P5316 RI 30.72 + 1028 219e NVMe FIPS P5316 RI 15.36TB + 1028 219f NVMe FIPS P5316 RI 30.72 + 8086 8008 NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P5510) + 8086 8d08 NVMe Datacenter SSD [3DNAND] VE 2.5" U.2 (P5316) + 8086 8d1d NVMe Datacenter SSD [3DNAND] VE E1.L 9.5/18mm (P5316) + 8086 c008 NVMe Datacenter SSD [3DNAND] SE U.2 15mm (P5530) + 0bd0 Ponte Vecchio 2T + 0bd5 Ponte Vecchio 1T + 0be0 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be1 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 105b 0d7c D270S/D250S Motherboard + 0be2 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be3 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be4 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be5 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be6 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be7 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be8 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0be9 Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0bea Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0beb Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0bec Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0bed Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0bee Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0bef Atom Processor D2xxx/N2xxx Integrated Graphics Controller + 0bf0 Atom Processor D2xxx/N2xxx DRAM Controller + 0bf1 Atom Processor D2xxx/N2xxx DRAM Controller + 0bf2 Atom Processor D2xxx/N2xxx DRAM Controller + 0bf3 Atom Processor D2xxx/N2xxx DRAM Controller + 0bf4 Atom Processor D2xxx/N2xxx DRAM Controller + 0bf5 Atom Processor D2xxx/N2xxx DRAM Controller + 105b 0d7c D270S/D250S Motherboard + 0bf6 Atom Processor D2xxx/N2xxx DRAM Controller + 0bf7 Atom Processor D2xxx/N2xxx DRAM Controller + 0c00 4th Gen Core Processor DRAM Controller + 1028 05d7 Alienware X51 R2 + 103c 1998 EliteDesk 800 G1 + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 0c01 Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller + 0c04 Xeon E3-1200 v3/4th Gen Core Processor DRAM Controller + 103c 1909 ZBook 15 + 17aa 220e ThinkPad T440p + 0c05 Xeon E3-1200 v3/4th Gen Core Processor PCI Express x8 Controller + 0c08 Xeon E3-1200 v3 Processor DRAM Controller + 0c09 Xeon E3-1200 v3/4th Gen Core Processor PCI Express x4 Controller + 0c0c Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 309f ThinkCentre M83 + 0c40 Atom Processor CE 5300 + 0c46 Atom Processor S1200 PCI Express Root Port 1 + 0c47 Atom Processor S1200 PCI Express Root Port 2 + 0c48 Atom Processor S1200 PCI Express Root Port 3 + 0c49 Atom Processor S1200 PCI Express Root Port 4 + 0c4e Atom Processor S1200 NTB Primary + 0c50 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QuickData Technology Device + 0c51 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QuickData Technology Device + 0c52 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QuickData Technology Device + 0c53 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QuickData Technology Device + 0c54 Atom Processor S1200 Internal + 0c55 Atom Processor S1200 DFX 1 + 0c56 Atom Processor S1200 DFX 2 + 0c59 Atom Processor S1200 SMBus 2.0 Controller 0 + 0c5a Atom Processor S1200 SMBus 2.0 Controller 1 + 0c5b Atom Processor S1200 SMBus Controller 2 + 0c5c Atom Processor S1200 SMBus Controller 3 + 0c5d Atom Processor S1200 SMBus Controller 4 + 0c5e Atom Processor S1200 SMBus Controller 5 + 0c5f Atom Processor S1200 UART + 0c60 Atom Processor S1200 Integrated Legacy Bus + 0c70 Atom Processor S1200 Internal + 0c71 Atom Processor S1200 Internal + 0c72 Atom Processor S1200 Internal + 0c73 Atom Processor S1200 Internal + 0c74 Atom Processor S1200 Internal + 0c75 Atom Processor S1200 Internal + 0c76 Atom Processor S1200 Internal + 0c77 Atom Processor S1200 Internal + 0c78 Atom Processor S1200 Internal + 0c79 Atom Processor S1200 Internal + 0c7a Atom Processor S1200 Internal + 0c7b Atom Processor S1200 Internal + 0c7c Atom Processor S1200 Internal + 0c7d Atom Processor S1200 Internal + 0c7e Atom Processor S1200 Internal + 0c7f Atom Processor S1200 Internal + 0cf8 Ethernet Controller X710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking + 8086 0000 Ethernet Controller X710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking + 8086 0001 Ethernet Controller X710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking + 0d00 Crystal Well DRAM Controller + 0d01 Crystal Well PCI Express x16 Controller + 0d04 Crystal Well DRAM Controller + 0d05 Crystal Well PCI Express x8 Controller + 0d09 Crystal Well PCI Express x4 Controller + 0d0c Crystal Well HD Audio Controller + 0d16 Crystal Well Integrated Graphics Controller + 0d26 Crystal Well Integrated Graphics Controller + 0d36 Crystal Well Integrated Graphics Controller + 0d4c Ethernet Connection (11) I219-LM + 0d4d Ethernet Connection (11) I219-V + 0d4e Ethernet Connection (10) I219-LM + 0d4f Ethernet Connection (10) I219-V + 0d53 Ethernet Connection (12) I219-LM + 0d55 Ethernet Connection (12) I219-V + 0d58 Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking + 8086 0000 Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking + 8086 0001 Ethernet Controller XXV710 Intel(R) FPGA Programmable Acceleration Card N3000 for Networking + 0d9f Ethernet Controller (2) I225-IT + 0dd2 Ethernet Network Adapter I710 + 1137 0000 I710T4LG 4x1 GbE RJ45 PCIe NIC + 1137 02e3 I710T4LG 4x1 GbE RJ45 PCIe NIC + 8086 0000 Ethernet Network Adapter I710-T4L + 8086 000d Ethernet Network Adapter I710-T4L + 8086 0010 Ethernet Network Adapter I710-T4L for OCP 3.0 + 8086 401a Ethernet Network Adapter I710-T4L + 8086 401b Ethernet Network Adapter I710-T4L for OCP 3.0 + 0dd5 Ethernet Adaptive Virtual Function + 0dda Ethernet Connection X722 for 10GbE SFP+ + 1bd4 0076 Ethernet Connection F102IX722 for 10GbE SFP + 0e00 Xeon E7 v2/Xeon E5 v2/Core i7 DMI2 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e01 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port in DMI2 Mode + 0e02 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 1a + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 0e03 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 1b + 0e04 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 2a + 0e05 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 2b + 0e06 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 2c + 0e07 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 2d + 0e08 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 3a + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 0e09 Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 3b + 0e0a Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 3c + 0e0b Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 3d + 0e10 Xeon E7 v2/Xeon E5 v2/Core i7 IIO Configuration Registers + 0e13 Xeon E7 v2/Xeon E5 v2/Core i7 IIO Configuration Registers + 0e17 Xeon E7 v2/Xeon E5 v2/Core i7 IIO Configuration Registers + 0e18 Xeon E7 v2/Xeon E5 v2/Core i7 IIO Configuration Registers + 0e1c Xeon E7 v2/Xeon E5 v2/Core i7 IIO Configuration Registers + 0e1d Xeon E7 v2/Xeon E5 v2/Core i7 R2PCIe + 0e1e Xeon E7 v2/Xeon E5 v2/Core i7 UBOX Registers + 0e1f Xeon E7 v2/Xeon E5 v2/Core i7 UBOX Registers + 0e20 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 0 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e21 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 1 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e22 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 2 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e23 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 3 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e24 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 4 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e25 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 5 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e26 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 6 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e27 Xeon E7 v2/Xeon E5 v2/Core i7 Crystal Beach DMA Channel 7 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e28 Xeon E7 v2/Xeon E5 v2/Core i7 VTd/Memory Map/Misc + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e29 Xeon E7 v2/Xeon E5 v2/Core i7 Memory Hotplug + 0e2a Xeon E7 v2/Xeon E5 v2/Core i7 IIO RAS + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 15d9 066b X9SRL-F + 0e2c Xeon E7 v2/Xeon E5 v2/Core i7 IOAPIC + 15d9 066b X9SRL-F + 0e2e Xeon E7 v2/Xeon E5 v2/Core i7 CBDMA + 0e2f Xeon E7 v2/Xeon E5 v2/Core i7 CBDMA + 0e30 Xeon E7 v2/Xeon E5 v2/Core i7 Home Agent 0 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 0e32 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 0 + 0e33 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 1 + 0e34 Xeon E7 v2/Xeon E5 v2/Core i7 R2PCIe + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 0e36 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Performance Ring Monitoring + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 0e37 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Performance Ring Monitoring + 0e38 Xeon E7 v2/Xeon E5 v2/Core i7 Home Agent 1 + 0e3a Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 2 + 0e3e Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Performance Ring Monitoring + 0e3f Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Performance Ring Monitoring + 0e40 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 2 + 0e41 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Registers + 0e43 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Reut 2 + 0e44 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Reut 2 + 0e45 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Agent Register + 0e47 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Agent Register + 0e60 Xeon E7 v2/Xeon E5 v2/Core i7 Home Agent 1 + 0e68 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Target Address/Thermal Registers + 0e6a Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder Registers + 0e6b Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder Registers + 0e6c Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder Registers + 0e6d Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder Registers + 0e71 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 RAS Registers + 0e74 Xeon E7 v2/Xeon E5 v2/Core i7 R2PCIe + 0e75 Xeon E7 v2/Xeon E5 v2/Core i7 R2PCIe + 0e77 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Registers + 0e79 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 RAS Registers + 0e7d Xeon E7 v2/Xeon E5 v2/Core i7 UBOX Registers + 0e7f Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Registers + 0e80 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 0 + 0e81 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Registers + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 0e83 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Reut 0 + 0e84 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Reut 0 + 0e85 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Agent Register + 0e87 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Registers + 0e90 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 1 + 0e93 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 1 + 0e94 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Reut 1 + 0e95 Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link Agent Register + 0ea0 Xeon E7 v2/Xeon E5 v2/Core i7 Home Agent 0 + 1028 04f7 Xeon E5 v2 on PowerEdge R320 server + 0ea8 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Target Address/Thermal Registers + 0eaa Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder Registers + 0eab Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder Registers + 0eac Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder Registers + 0ead Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder Registers + 0eae Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO Registers + 0eaf Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO Registers + 0eb0 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 Thermal Control 0 + 0eb1 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 Thermal Control 1 + 0eb2 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 ERROR Registers 0 + 0eb3 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 ERROR Registers 1 + 0eb4 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 Thermal Control 2 + 0eb5 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 Thermal Control 3 + 0eb6 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 ERROR Registers 2 + 0eb7 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 ERROR Registers 3 + 0ebc Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO Registers + 0ebe Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO Registers + 0ebf Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO Registers + 0ec0 Xeon E7 v2/Xeon E5 v2/Core i7 Power Control Unit 0 + 0ec1 Xeon E7 v2/Xeon E5 v2/Core i7 Power Control Unit 1 + 0ec2 Xeon E7 v2/Xeon E5 v2/Core i7 Power Control Unit 2 + 0ec3 Xeon E7 v2/Xeon E5 v2/Core i7 Power Control Unit 3 + 0ec4 Xeon E7 v2/Xeon E5 v2/Core i7 Power Control Unit 4 + 0ec8 Xeon E7 v2/Xeon E5 v2/Core i7 System Address Decoder + 0ec9 Xeon E7 v2/Xeon E5 v2/Core i7 Broadcast Registers + 0eca Xeon E7 v2/Xeon E5 v2/Core i7 Broadcast Registers + 0ed8 Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0ed9 Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0edc Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0edd Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0ede Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0edf Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0ee0 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee1 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee2 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee3 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee4 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee5 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee6 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee7 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee8 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ee9 Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0eea Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0eeb Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0eec Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0eed Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0eee Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers + 0ef0 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 Thermal Control 0 + 0ef1 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 Thermal Control 1 + 0ef2 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 ERROR Registers 0 + 0ef3 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 ERROR Registers 1 + 0ef4 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 Thermal Control 2 + 0ef5 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 Thermal Control 3 + 0ef6 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 ERROR Registers 2 + 0ef7 Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 0 Channel 0-3 ERROR Registers 3 + 0ef8 Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0ef9 Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0efa Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0efb Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0efc Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0efd Xeon E7 v2/Xeon E5 v2/Core i7 DDRIO + 0f00 Atom Processor Z36xxx/Z37xxx Series SoC Transaction Register + 0f04 Atom Processor Z36xxx/Z37xxx Series High Definition Audio Controller + 0f06 Atom Processor Z36xxx/Z37xxx Series LPIO1 DMA Controller + 0f08 Atom Processor Z36xxx/Z37xxx Series LPIO1 PWM Controller + 0f09 Atom Processor Z36xxx/Z37xxx Series LPIO1 PWM Controller + 0f0a Atom Processor Z36xxx/Z37xxx Series LPIO1 HSUART Controller #1 + 0f0c Atom Processor Z36xxx/Z37xxx Series LPIO1 HSUART Controller #2 + 0f0e Atom Processor Z36xxx/Z37xxx Series LPIO1 SPI Controller + 0f12 Atom Processor E3800/CE2700 Series SMBus Controller + 0f14 Atom Processor Z36xxx/Z37xxx Series SDIO Controller + 0f15 Atom Processor Z36xxx/Z37xxx Series SDIO Controller + 0f16 Atom Processor Z36xxx/Z37xxx Series SDIO Controller + 0f18 Atom Processor Z36xxx/Z37xxx Series Trusted Execution Engine + 0f1c Atom Processor Z36xxx/Z37xxx Series Power Control Unit + 0f20 Atom Processor E3800 Series SATA IDE Controller + 0f21 Atom Processor E3800 Series SATA IDE Controller + 0f22 Atom Processor E3800 Series SATA AHCI Controller + 0f23 Atom Processor E3800 Series SATA AHCI Controller + 0f28 Atom Processor Z36xxx/Z37xxx Series LPE Audio Controller + 0f31 Atom Processor Z36xxx/Z37xxx Series Graphics & Display + 0f34 Atom Processor Z36xxx/Z37xxx Series USB EHCI + 0f35 Atom Processor Z36xxx/Z37xxx, Celeron N2000 Series USB xHCI + 1025 0936 Aspire ES1 + 0f37 Atom Processor Z36xxx/Z37xxx Series OTG USB Device + 0f38 Atom Processor Z36xxx/Z37xxx Series Camera ISP + 0f40 Atom Processor Z36xxx/Z37xxx Series LPIO2 DMA Controller + 0f41 Atom Processor Z36xxx/Z37xxx Series LPIO2 I2C Controller #1 + 0f42 Atom Processor Z36xxx/Z37xxx Series LPIO2 I2C Controller #2 + 0f43 Atom Processor Z36xxx/Z37xxx Series LPIO2 I2C Controller #3 + 0f44 Atom Processor Z36xxx/Z37xxx Series LPIO2 I2C Controller #4 + 0f45 Atom Processor Z36xxx/Z37xxx Series LPIO2 I2C Controller #5 + 0f46 Atom Processor Z36xxx/Z37xxx Series LPIO2 I2C Controller #6 + 0f47 Atom Processor Z36xxx/Z37xxx Series LPIO2 I2C Controller #7 + 0f48 Atom Processor E3800 Series PCI Express Root Port 1 + 0f4a Atom Processor E3800 Series PCI Express Root Port 2 + 0f4c Atom Processor E3800 Series PCI Express Root Port 3 + 0f4e Atom Processor E3800 Series PCI Express Root Port 4 + 0f50 Atom Processor E3800 Series eMMC 4.5 Controller + 1000 82542 Gigabit Ethernet Controller (Fiber) + 0e11 b0df NC6132 Gigabit Ethernet Adapter (1000-SX) + 0e11 b0e0 NC6133 Gigabit Ethernet Adapter (1000-LX) + 0e11 b123 NC6134 Gigabit Ethernet Adapter (1000-LX) + 1014 0119 Netfinity Gigabit Ethernet SX Adapter + 8086 1000 PRO/1000 Gigabit Server Adapter + 1001 82543GC Gigabit Ethernet Controller (Fiber) + 0e11 004a NC6136 Gigabit Server Adapter + 1014 01ea Netfinity Gigabit Ethernet SX Adapter + 8086 1002 PRO/1000 F Server Adapter + 8086 1003 PRO/1000 F Server Adapter + 1002 Pro 100 LAN+Modem 56 Cardbus II + 8086 200e Pro 100 LAN+Modem 56 Cardbus II + 8086 2013 Pro 100 SR Mobile Combo Adapter + 8086 2017 Pro 100 S Combo Mobile Adapter + 1004 82543GC Gigabit Ethernet Controller (Copper) + 0e11 0049 NC7132 Gigabit Upgrade Module + 0e11 b1a4 NC7131 Gigabit Server Adapter + 1014 10f2 Gigabit Ethernet Server Adapter + 8086 1004 PRO/1000 T Server Adapter + 8086 2004 PRO/1000 T Server Adapter + 1008 82544EI Gigabit Ethernet Controller (Copper) + 1014 0269 iSeries 1000/100/10 Ethernet Adapter + 1028 011b PowerEdge 1650/2550 + 1028 011c PRO/1000 XT Network Connection + 8086 1107 PRO/1000 XT Server Adapter + 8086 2107 PRO/1000 XT Server Adapter + 8086 2110 PRO/1000 XT Desktop Adapter + 8086 3108 PRO/1000 XT Network Connection + 1009 82544EI Gigabit Ethernet Controller (Fiber) + 1014 0268 iSeries Gigabit Ethernet Adapter + 8086 1109 PRO/1000 XF Server Adapter + 8086 2109 PRO/1000 XF Server Adapter + 100a 82540EM Gigabit Ethernet Controller + 100c 82544GC Gigabit Ethernet Controller (Copper) + 8086 1112 PRO/1000 T Desktop Adapter + 8086 2112 PRO/1000 T Desktop Adapter + 100d 82544GC Gigabit Ethernet Controller (LOM) + 1028 0123 PRO/1000 XT Network Connection + 1079 891f 82544GC Based Network Connection + 4c53 1080 CT8 mainboard + 8086 110d 82544GC Based Network Connection + 100e 82540EM Gigabit Ethernet Controller + 1014 0265 PRO/1000 MT Network Connection + 1014 0267 PRO/1000 MT Network Connection + 1014 026a PRO/1000 MT Network Connection + 1028 002e Optiplex GX260 + 1028 0134 PowerEdge 600SC + 1028 0151 Optiplex GX270 + 107b 8920 PRO/1000 MT Desktop Adapter + 1af4 1100 QEMU Virtual Machine + 8086 001e PRO/1000 MT Desktop Adapter + 8086 002e PRO/1000 MT Desktop Adapter + 8086 1376 PRO/1000 GT Desktop Adapter + 8086 1476 PRO/1000 GT Desktop Adapter + 100f 82545EM Gigabit Ethernet Controller (Copper) + 1014 0269 iSeries 1000/100/10 Ethernet Adapter + 1014 028e PRO/1000 MT Network Connection + 15ad 0750 PRO/1000 MT Single Port Adapter + 8086 1000 PRO/1000 MT Network Connection + 8086 1001 PRO/1000 MT Server Adapter + 1010 82546EB Gigabit Ethernet Controller (Copper) + 0e11 00db NC7170 Gigabit Server Adapter + 1014 027c PRO/1000 MT Dual Port Network Adapter + 15ad 0760 PRO/1000 MT Dual Port Adapter + 18fb 7872 RESlink-X + 1fc1 0026 Niagara 2260 Bypass Card + 4c53 1080 CT8 mainboard + 4c53 10a0 CA3/CR3 mainboard + 8086 1011 PRO/1000 MT Dual Port Server Adapter + 8086 1012 PRO/1000 MT Dual Port Server Adapter + 8086 101a PRO/1000 MT Dual Port Network Connection + 8086 3424 SE7501HG2 Mainboard + 1011 82545EM Gigabit Ethernet Controller (Fiber) + 1014 0268 iSeries Gigabit Ethernet Adapter + 8086 1002 PRO/1000 MF Server Adapter + 8086 1003 PRO/1000 MF Server Adapter (LX) + 1012 82546EB Gigabit Ethernet Controller (Fiber) + 0e11 00dc NC6170 Gigabit Server Adapter + 8086 1012 PRO/1000 MF Dual Port Server Adapter + 1013 82541EI Gigabit Ethernet Controller + 8086 0013 PRO/1000 MT Network Connection + 8086 1013 PRO/1000 MT Network Connection + 8086 1113 PRO/1000 MT Desktop Adapter + 1014 82541ER Gigabit Ethernet Controller + 8086 0014 PRO/1000 MT Desktop Connection + 8086 1014 PRO/1000 MT Network Connection + 1015 82540EM Gigabit Ethernet Controller (LOM) + 8086 1015 PRO/1000 MT Mobile Connection + 1016 82540EP Gigabit Ethernet Controller (Mobile) + 1014 052c PRO/1000 MT Mobile Connection + 1179 0001 PRO/1000 MT Mobile Connection + 8086 1016 PRO/1000 MT Mobile Connection + 1017 82540EP Gigabit Ethernet Controller + 8086 1017 PR0/1000 MT Desktop Connection + 1018 82541EI Gigabit Ethernet Controller + 8086 1018 PRO/1000 MT Mobile Connection + 1019 82547EI Gigabit Ethernet Controller + 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE) + 1458 e000 Intel Gigabit Ethernet (Kenai II) + 8086 1019 PRO/1000 CT Desktop Connection + 8086 301f D865PERL mainboard + 8086 3025 D875PBZ motherboard + 8086 302c D865GBF Mainboard + 8086 3427 S875WP1-E mainboard + 101a 82547EI Gigabit Ethernet Controller (Mobile) + 8086 101a PRO/1000 CT Mobile Connection + 101d 82546EB Gigabit Ethernet Controller + 8086 1000 PRO/1000 MT Quad Port Server Adapter + 101e 82540EP Gigabit Ethernet Controller (Mobile) + 1014 0549 Thinkpad + 1179 0001 PRO/1000 MT Mobile Connection + 8086 101e PRO/1000 MT Mobile Connection + 101f Ethernet Controller V710 for 5GBASE-T + 1026 82545GM Gigabit Ethernet Controller + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 8086 1000 PRO/1000 MT Server Connection + 8086 1001 PRO/1000 MT Server Adapter + 8086 1002 PRO/1000 MT Server Adapter + 8086 1003 PRO/1000 GT Server Adapter + 8086 1026 PRO/1000 MT Server Connection + 1027 82545GM Gigabit Ethernet Controller + 103c 3103 NC310F PCI-X Gigabit Server Adapter + 8086 1001 PRO/1000 MF Server Adapter(LX) + 8086 1002 PRO/1000 MF Server Adapter(LX) + 8086 1003 PRO/1000 MF Server Adapter(LX) + 8086 1027 PRO/1000 MF Server Adapter + 1028 82545GM Gigabit Ethernet Controller + 8086 1028 PRO/1000 MB Server Connection + 1029 82559 Ethernet Controller + 1030 82559 InBusiness 10/100 + 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller + 1014 0209 ThinkPad A/T/X Series + 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 104d 813c Vaio PCG-GRV616G + 107b 5350 EtherExpress PRO/100 VE + 1179 0001 EtherExpress PRO/100 VE + 144d c000 EtherExpress PRO/100 VE + 144d c001 EtherExpress PRO/100 VE + 144d c003 EtherExpress PRO/100 VE + 144d c006 vpr Matrix 170B4 + 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller + 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller + 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller + 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller + 1036 82801CAM (ICH3) 82562EH Ethernet Controller + 1037 82801CAM (ICH3) Chipset Ethernet Controller + 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller + 0e11 0098 Evo N600c + 1039 82801DB PRO/100 VE (LOM) Ethernet Controller + 1014 0267 NetVista A30p + 114a 0582 PC8 onboard ethernet ETH1 + 103a 82801DB PRO/100 VE (CNR) Ethernet Controller + 103b 82801DB PRO/100 VM (LOM) Ethernet Controller + 103c 82801DB PRO/100 VM (CNR) Ethernet Controller + 103d 82801DB PRO/100 VE (MOB) Ethernet Controller + 1014 0522 ThinkPad R40 + 1028 2002 Latitude D500 + 8086 103d 82562EZ 10/100 Ethernet Controller + 103e 82801DB PRO/100 VM (MOB) Ethernet Controller + 1040 536EP Data Fax Modem + 16be 1040 V.9X DSP Data Fax Modem + 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter + 103c 08b0 tc1100 tablet + 8086 2522 Samsung X10/P30 integrated WLAN + 8086 2527 MIM2000/Centrino + 8086 2561 Dell Latitude D800 + 8086 2581 Toshiba Satellite M10 + 1048 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE LR Server Adapter + 8086 a11f PRO/10GbE LR Server Adapter + 1049 82566MM Gigabit Network Connection + 103c 30c1 Compaq 6910p + 17aa 20b9 ThinkPad T61/R61 + 104a 82566DM Gigabit Network Connection + 104b 82566DC Gigabit Network Connection + 104c 82562V 10/100 Network Connection + 104d 82566MC Gigabit Network Connection + 104e Ethernet Controller X710 for 10 Gigabit SFP+ + 104f Ethernet Controller X710 for 10 Gigabit backplane + 1050 82562EZ 10/100 Ethernet Controller + 1014 0287 ThinkCentre S50 + 1028 019d Dimension 3000 + 1462 728c 865PE Neo2 (MS-6728) + 1462 758c MS-6758 (875P Neo) + 8086 3020 D865PERL mainboard + 8086 302f Desktop Board D865GBF + 8086 3427 S875WP1-E mainboard + 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller + 1052 PRO/100 VM Network Connection + 1053 PRO/100 VM Network Connection + 1054 PRO/100 VE Network Connection + 1055 PRO/100 VM Network Connection + 1056 PRO/100 VE Network Connection + 1057 PRO/100 VE Network Connection + 1059 82551QM Ethernet Controller + 105b 82546GB Gigabit Ethernet Controller (Copper) + 105e 82571EB/82571GB Gigabit Ethernet Controller D0/D1 (copper applications) + 103c 7044 NC360T PCI Express Dual Port Gigabit Server Adapter + 103c 704e Dual Port 1000Base-T (PCIe) [AD337A] + 1775 1100 CR11/VR11 Single Board Computer + 1775 6003 Telum GE-QT + 18df 1214 2x 1GbE, PCIe x1, dual Intel 82571EB chips + 8086 005e PRO/1000 PT Dual Port Server Connection + 8086 105e PRO/1000 PT Dual Port Network Connection + 8086 10d5 82571PT Gigabit PT Quad Port Server ExpressModule + 8086 115e PRO/1000 PT Dual Port Server Adapter + 8086 125e PRO/1000 PT Dual Port Server Adapter + 8086 135e PRO/1000 PT Dual Port Server Adapter + 105f 82571EB Gigabit Ethernet Controller + 103c 704f Dual Port 1000Base-SX (PCIe) [AD338A] + 8086 005a PRO/1000 PF Dual Port Server Adapter + 8086 115f PRO/1000 PF Dual Port Server Adapter + 8086 125f PRO/1000 PF Dual Port Server Adapter + 8086 135f PRO/1000 PF Dual Port Server Adapter + 1060 82571EB Gigabit Ethernet Controller + 8086 0060 PRO/1000 PB Dual Port Server Connection + 8086 1060 PRO/1000 PB Dual Port Server Connection + 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller + 1043 80f8 P5GD1-VW Mainboard + 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller + 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller + 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller + 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile + 103c 30d5 530 Laptop + 1069 82562EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile + 106a 82562G - PRO/100 VE (LOM) Ethernet Controller + 106b 82562G - PRO/100 VE Ethernet Controller Mobile + 1075 82547GI Gigabit Ethernet Controller + 1028 0165 PowerEdge 750 + 8086 0075 PRO/1000 CT Network Connection + 8086 1075 PRO/1000 CT Network Connection + 1076 82541GI Gigabit Ethernet Controller + 1028 0165 PRO/1000 MT Network Connection + 1028 016d PRO/1000 MT Network Connection + 1028 019a PRO/1000 MT Network Connection + 1028 106d PRO/1000 MT Network Connection + 8086 0076 PRO/1000 MT Network Connection + 8086 1076 PRO/1000 MT Network Connection + 8086 1176 PRO/1000 MT Desktop Adapter + 8086 1276 PRO/1000 MT Network Adapter + 1077 82541GI Gigabit Ethernet Controller + 1179 0001 PRO/1000 MT Mobile Connection + 8086 0077 PRO/1000 MT Mobile Connection + 8086 1077 PRO/1000 MT Mobile Connection + 1078 82541ER Gigabit Ethernet Controller + 8086 1078 82541ER-based Network Connection + 1079 82546GB Gigabit Ethernet Controller + 103c 12a6 Dual Port 1000Base-T [A9900A] + 103c 12cf Core Dual Port 1000Base-T [AB352A] + 1775 10d0 V5D Single Board Computer Gigabit Ethernet + 1775 ce90 CE9 + 1fc1 0027 Niagara 2261 Failover NIC + 4c53 1090 Cx9 / Vx9 mainboard + 4c53 10b0 CL9 mainboard + 8086 0079 PRO/1000 MT Dual Port Network Connection + 8086 1079 PRO/1000 MT Dual Port Network Connection + 8086 1179 PRO/1000 MT Dual Port Server Adapter + 8086 117a PRO/1000 MT Dual Port Server Adapter + 107a 82546GB Gigabit Ethernet Controller + 103c 12a8 Dual Port 1000base-SX [A9899A] + 8086 107a PRO/1000 MF Dual Port Server Adapter + 8086 127a PRO/1000 MF Dual Port Server Adapter + 107b 82546GB Gigabit Ethernet Controller + 8086 007b PRO/1000 MB Dual Port Server Connection + 8086 107b PRO/1000 MB Dual Port Server Connection + 107c 82541PI Gigabit Ethernet Controller + 8086 1376 PRO/1000 GT Desktop Adapter + 8086 1476 PRO/1000 GT Desktop Adapter + 107d 82572EI Gigabit Ethernet Controller (Copper) + 8086 1082 PRO/1000 PT Server Adapter + 8086 1084 PRO/1000 PT Server Adapter + 8086 1092 PRO/1000 PT Server Adapter + 107e 82572EI Gigabit Ethernet Controller (Fiber) + 8086 1084 PRO/1000 PF Server Adapter + 8086 1085 PRO/1000 PF Server Adapter + 8086 1094 PRO/1000 PF Server Adapter + 107f 82572EI Gigabit Ethernet Controller + 1080 FA82537EP 56K V.92 Data/Fax Modem PCI + 1081 631xESB/632xESB LAN Controller Copper + 1082 631xESB/632xESB LAN Controller fiber + 1083 631xESB/632xESB LAN Controller SERDES + 1084 631xESB/632xESB IDE Redirection + 1085 631xESB/632xESB Serial Port Redirection + 1086 631xESB/632xESB IPMI/KCS0 + 1087 631xESB/632xESB UHCI Redirection + 1089 631xESB/632xESB BT + 108a 82546GB Gigabit Ethernet Controller + 8086 108a PRO/1000 P Dual Port Server Adapter + 8086 118a PRO/1000 P Dual Port Server Adapter + 108b 82573V Gigabit Ethernet Controller (Copper) + 1462 176c on board on MSI 945P - NEO (MS-7176) + 108c 82573E Gigabit Ethernet Controller (Copper) + 108e 82573E KCS (Active Management) + 108f Active Management Technology - SOL + 1091 PRO/100 VM Network Connection + 1092 PRO/100 VE Network Connection + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 1093 PRO/100 VM Network Connection + 1094 PRO/100 VE Network Connection + 1095 PRO/100 VE Network Connection + 1096 80003ES2LAN Gigabit Ethernet Controller (Copper) + 15d9 1096 Motherboard + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 S5000PSLSATA Server Board + 1097 631xESB/632xESB DPT LAN Controller (Fiber) + 1098 80003ES2LAN Gigabit Ethernet Controller (Serdes) + 1099 82546GB Gigabit Ethernet Controller (Copper) + 8086 1099 PRO/1000 GT Quad Port Server Adapter + 109a 82573L Gigabit Ethernet Controller + 1179 ff10 PRO/1000 PL + 17aa 2001 ThinkPad T60 + 17aa 207e ThinkPad X60/X60s + 8086 109a PRO/1000 PL Network Connection + 8086 309c Desktop Board D945GTP + 8086 30a5 Desktop Board D975XBX + 109b 82546GB PRO/1000 GF Quad Port Server Adapter + 109e 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE CX4 Server Adapter + 8086 a11f PRO/10GbE CX4 Server Adapter + 10a0 82571EB PRO/1000 AT Quad Port Bypass Adapter + 10a1 82571EB PRO/1000 AF Quad Port Bypass Adapter + 10a4 82571EB Gigabit Ethernet Controller + 8086 10a4 PRO/1000 PT Quad Port Server Adapter + 8086 11a4 PRO/1000 PT Quad Port Server Adapter + 10a5 82571EB Gigabit Ethernet Controller (Fiber) + 8086 10a5 PRO/1000 PF Quad Port Server Adapter + 8086 10a6 PRO/1000 PF Quad Port Server Adapter + 10a6 82599EB 10-Gigabit Dummy Function + 10a7 82575EB Gigabit Network Connection + 8086 10a8 82575EB Gigabit Riser Card + 10a9 82575EB Gigabit Backplane Connection + 10b0 82573L PRO/1000 PL Network Connection + 10b2 82573V PRO/1000 PM Network Connection + 10b3 82573E PRO/1000 PM Network Connection + 10b4 82573L PRO/1000 PL Network Connection + 10b5 82546GB Gigabit Ethernet Controller (Copper) + 103c 3109 NC340T PCI-X Quad-port Gigabit Server Adapter + 8086 1099 PRO/1000 GT Quad Port Server Adapter + 8086 1199 PRO/1000 GT Quad Port Server Adapter + 10b6 82598 10GbE PCI-Express Ethernet Controller + 10b9 82572EI Gigabit Ethernet Controller (Copper) + 103c 704a 110T PCIe Gigabit Server Adapter + 8086 1083 PRO/1000 PT Desktop Adapter + 8086 1093 PRO/1000 PT Desktop Adapter + 10ba 80003ES2LAN Gigabit Ethernet Controller (Copper) + 10bb 80003ES2LAN Gigabit Ethernet Controller (Serdes) + 10bc 82571EB/82571GB Gigabit Ethernet Controller (Copper) + 1014 0368 4-Port 10/100/1000 Base-TX PCI Express Adapter for POWER + 103c 704b NC364T PCI Express Quad Port Gigabit Server Adapter +# 375-3481-01 REV:50 + 108e 11bc Quad Port Adapter + 8086 10bc PRO/1000 PT Quad Port LP Server Adapter + 8086 11bc PRO/1000 PT Quad Port LP Server Adapter (Kirkwood Low Profile) + 10bd 82566DM-2 Gigabit Network Connection + 1028 0211 OptiPlex 755 + 10bf 82567LF Gigabit Network Connection + 10c0 82562V-2 10/100 Network Connection + 1028 020d Inspiron 530 + 10c2 82562G-2 10/100 Network Connection + 10c3 82562GT-2 10/100 Network Connection + 10c4 82562GT 10/100 Network Connection + 10c5 82562G 10/100 Network Connection + 10c6 82598EB 10-Gigabit AF Dual Port Network Connection + 8086 a05f 10-Gigabit XF SR Dual Port Server Adapter + 8086 a15f 10-Gigabit XF SR Dual Port Server Adapter + 10c7 82598EB 10-Gigabit AF Network Connection + 1014 037f 10-Gigabit XF SR Server Adapter + 1014 0380 10-Gigabit XF LR Server Adapter + 8086 a05f 10-Gigabit XF SR Server Adapter + 8086 a15f 10-Gigabit XF SR Server Adapter + 8086 a16f 10-Gigabit XF SR Server Adapter + 10c8 82598EB 10-Gigabit AT Network Connection + 8086 a10c 10-Gigabit AT Server Adapter + 8086 a11c 10-Gigabit AT Server Adapter + 8086 a12c 10-Gigabit AT Server Adapter + 10c9 82576 Gigabit Network Connection + 103c 31ef NC362i Integrated Dual port Gigabit Server Adapter + 103c 323f NC362i Integrated Dual port Gigabit Server Adapter + 10a9 8028 UV-BaseIO dual-port GbE + 13a3 0037 DS4100 Secure Multi-Gigabit Server Adapter with Compression + 15d9 a811 H8DGU + 8086 a01c Gigabit ET Dual Port Server Adapter + 8086 a03c Gigabit ET Dual Port Server Adapter + 8086 a04c Gigabit ET Dual Port Server Adapter + 10ca 82576 Virtual Function + 10cb 82567V Gigabit Network Connection + 10cc 82567LM-2 Gigabit Network Connection + 10cd 82567LF-2 Gigabit Network Connection + 10ce 82567V-2 Gigabit Network Connection + 10d3 82574L Gigabit Network Connection + 103c 1785 NC112i 1-port Ethernet Server Adapter + 103c 3250 NC112T PCI Express single Port Gigabit Server Adapter + 1043 8369 Motherboard + 1093 76e9 PCIe-8233 Ethernet Adapter + 10a9 8029 Prism XL Single Port Gigabit Ethernet + 15d9 0605 X8SIL + 15d9 060a X7SPA-H/X7SPA-HF Motherboard + 15d9 060d C7SIM-Q Motherboard + 8086 0001 Gigabit CT2 Desktop Adapter + 8086 3578 Server Board S1200BTLR + 8086 357a Server Board S1200BTS + 8086 a01f Gigabit CT Desktop Adapter + e4bf 50c1 PC1-GROOVE + e4bf 50c2 PC2-LIMBO + 10d4 Matrox Concord GE (customized Intel 82574) + 10d5 82571PT Gigabit PT Quad Port Server ExpressModule + 10d6 82575GB Gigabit Network Connection + 8086 10d6 Gigabit VT Quad Port Server Adapter + 8086 145a Gigabit VT Quad Port Server Adapter + 8086 147a Gigabit VT Quad Port Server Adapter + 10d8 82599EB 10 Gigabit Unprogrammed + 10d9 82571EB Dual Port Gigabit Mezzanine Adapter + 103c 1716 NC360m Dual Port 1GbE BL-c Adapter + 10da 82571EB Quad Port Gigabit Mezzanine Adapter + 103c 1717 NC364m Quad Port 1GbE BL-c Adapter + 10db 82598EB 10-Gigabit Dual Port Network Connection + 10dd 82598EB 10-Gigabit AT CX4 Network Connection + 10de 82567LM-3 Gigabit Network Connection + 10df 82567LF-3 Gigabit Network Connection + 10e1 82598EB 10-Gigabit AF Dual Port Network Connection + 8086 a15f 10-Gigabit SR Dual Port Express Module + 10e2 82575GB Gigabit Network Connection + 8086 10e2 Gigabit VT Quad Port Server Adapter + 10e5 82567LM-4 Gigabit Network Connection + 10e6 82576 Gigabit Network Connection + 8086 a01f Gigabit EF Dual Port Server Adapter + 8086 a02f Gigabit EF Dual Port Server Adapter + 10e7 82576 Gigabit Network Connection + 103c 31ff NC362i Integrated Dual Port BL-c Gigabit Server Adapter + 10e8 82576 Gigabit Network Connection + 8086 a02b Gigabit ET Quad Port Server Adapter + 8086 a02c Gigabit ET Quad Port Server Adapter + 10ea 82577LM Gigabit Network Connection + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + e4bf 50c1 PC1-GROOVE + 10eb 82577LC Gigabit Network Connection + 10ec 82598EB 10-Gigabit AT CX4 Network Connection + 8086 a01f 10-Gigabit CX4 Dual Port Server Adapter + 8086 a11f 10-Gigabit CX4 Dual Port Server Adapter + 10ed 82599 Ethernet Controller Virtual Function + 10ef 82578DM Gigabit Network Connection + 1028 02da OptiPlex 980 + 15d9 060d C7SIM-Q Motherboard + 10f0 82578DC Gigabit Network Connection + 10f1 82598EB 10-Gigabit AF Dual Port Network Connection + 8086 a20f 10-Gigabit AF DA Dual Port Server Adapter + 8086 a21f 10-Gigabit AF DA Dual Port Server Adapter + 10f4 82598EB 10-Gigabit AF Network Connection + 8086 106f 10-Gigabit XF LR Server Adapter + 8086 a06f 10-Gigabit XF LR Server Adapter + 10f5 82567LM Gigabit Network Connection + 17aa 20ee ThinkPad T400 + 10f6 82574L Gigabit Network Connection + 10f7 10 Gigabit BR KX4 Dual Port Network Connection + 108e 7b12 Sun Dual 10GbE PCIe 2.0 FEM + 8086 000d Ethernet Mezzanine Adapter X520-KX4-2 + 10f8 82599 10 Gigabit Dual Port Backplane Connection + 1028 1f63 10GbE 2P X520k bNDC + 103c 17d2 Ethernet 10Gb 2-port 560M Adapter + 103c 18d0 Ethernet 10Gb 2-port 560FLB Adapter + 1059 0111 T4007 10GbE interface + 1059 0130 T4009 10GbE interface + 8086 000c Ethernet X520 10GbE Dual Port KX4-KR Mezz + 10f9 82599 10 Gigabit Dual Port Network Connection + 10fb 82599ES 10-Gigabit SFI/SFP+ Network Connection + 1028 1f72 Ethernet 10G 4P X520/I350 rNDC + 103c 17d0 Ethernet 10Gb 2-port 560FLR-SFP+ Adapter + 103c 17d2 Ethernet 10Gb 2-port 560M Adapter + 103c 17d3 Ethernet 10Gb 2-port 560SFP+ Adapter + 103c 211b Ethernet 10Gb 1-port P560FLR-SFP+ Adapter + 103c 2147 Ethernet 10Gb 1-port 561i Adapter + 103c 2159 Ethernet 10Gb 2-port 562i Adapter + 108e 7b11 Ethernet Server Adapter X520-2 + 1170 004c 82599 DP 10G Mezzanine Adapter + 1374 1a08 PE310G4SPI9/PE310G4SPI9L/PE310G4SPI9LA Quad Port Fiber 10 Gigabit Ethernet PCI Express Server Adapter + 15d9 0611 AOC-STGN-i2S + 1734 11a9 10 Gigabit Dual Port Network Connection + 17aa 1071 ThinkServer X520-2 AnyFabric + 17aa 4007 82599ES 10-Gigabit SFI/SFP+ Network Connection + 17aa 402b 82599ES 10Gb 2-port Server Adapter X520-DA2 + 17aa 402f FPGA Card XC7VX690T-3FFG1157E + 18d4 0c09 82599ES 10Gb 2-port SFP+ OCP Mezz Card MOP81-I-10GS2 + 193d 1004 560F-B + 1bd4 001b 10G SFP+ DP ER102Fi4 Rack Adapter + 1bd4 002f 10G SFP+ DP EP102Fi4A Adapter + 1bd4 0032 10G SFP+ DP EP102Fi4 Adapter + 1bd4 0067 F102I82599 + 8086 0002 Ethernet Server Adapter X520-DA2 + 8086 0003 Ethernet Server Adapter X520-2 + 8086 0006 Ethernet Server Adapter X520-1 + 8086 0008 Ethernet OCP Server Adapter X520-2 + 8086 000a Ethernet Server Adapter X520-1 + 8086 000c Ethernet Server Adapter X520-2 + 8086 10a6 82599ES 10Gb 2 port Server Adapter X520-DA2 + 8086 7a11 Ethernet Server Adapter X520-2 + 8086 7a12 Ethernet Server Adapter X520-2 + 10fc 82599 10 Gigabit Dual Port Network Connection + 10fe 82552 10/100 Network Connection + 1107 PRO/1000 MF Server Adapter (LX) + 1130 82815 815 Chipset Host Bridge and Memory Controller Hub + 1025 1016 Travelmate 612 TX + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 8086 4532 Desktop Board D815EEA2/D815EFV + 8086 4557 D815EGEW Mainboard + 1131 82815 815 Chipset AGP Bridge + 1132 82815 Chipset Graphics Controller (CGC) + 1025 1016 Travelmate 612 TX + 103c 2001 e-pc 40 + 104d 80df Vaio PCG-FX403 + 8086 4532 Desktop Board D815EEA2/D815EFV + 8086 4541 D815EEA Motherboard + 8086 4557 D815EGEW Mainboard + 1136 Thunderbolt 4 Bridge [Maple Ridge 4C 2020] + 1137 Thunderbolt 4 NHI [Maple Ridge 4C 2020] + 1138 Thunderbolt 4 USB Controller [Maple Ridge 4C 2020] + 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller + 8086 1161 82806AA PCI64 Hub APIC + 1162 Xscale 80200 Big Endian Companion Chip + 1190 Merrifield SD/SDIO/eMMC Controller + 1191 Merrifield Serial IO HSUART Controller + 1192 Merrifield Serial IO HSUART DMA Controller + 1194 Merrifield Serial IO SPI Controller + 1195 Merrifield Serial IO I2C Controller + 1196 Merrifield Serial IO I2C Controller + 1199 Merrifield GPIO Controller + 119e Merrifield USB Device Controller (OTG) + 11a0 Merrifield SCU IPC + 11a1 Merrifield Power Management Unit + 11a2 Merrifield Serial IO DMA Controller + 11a5 Merrifield Serial IO PWM Controller + 11c3 Quark SoC X1000 PCIe Root Port 0 + 11c4 Quark SoC X1000 PCIe Root Port 1 + 1200 IXP1200 Network Processor + 172a 0000 AEP SSL Accelerator + 1209 8255xER/82551IT Fast Ethernet Controller + 140b 0610 PMC610 quad Ethernet board + 1af4 1100 QEMU Virtual Machine + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 4c53 1070 PC6 mainboard + 1221 82092AA PCI to PCMCIA Bridge + 1222 82092AA IDE Controller + 1223 SAA7116 + 1225 82452KX/GX [Orion] + 1226 82596 PRO/10 PCI + 1227 82865 EtherExpress PRO/100A + 1228 82556 EtherExpress PRO/100 Smart + 1229 82557/8/9/0/1 Ethernet Pro 100 + 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN* + 0e11 b01e NC3120 Fast Ethernet NIC + 0e11 b01f NC3122 Fast Ethernet NIC (dual port) + 0e11 b02f NC1120 Ethernet NIC + 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN + 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL) + 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded) + 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL) + 0e11 b0dd NC3131 Fast Ethernet NIC (dual port) + 0e11 b0de NC3132 Fast Ethernet Module (dual port) + 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX) + 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL) + 0e11 b13c NC3162 Fast Ethernet NIC (embedded) + 0e11 b144 NC3123 Fast Ethernet NIC (WOL) + 0e11 b163 NC3134 Fast Ethernet NIC (dual port) + 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port) + 0e11 b1a4 NC7131 Gigabit Server Adapter + 1014 005c 82558B Ethernet Pro 10/100 + 1014 01bc 82559 Fast Ethernet LAN On Motherboard + 1014 01f1 10/100 Ethernet Server Adapter + 1014 01f2 10/100 Ethernet Server Adapter + 1014 0207 Ethernet Pro/100 S + 1014 0232 10/100 Dual Port Server Adapter + 1014 023a ThinkPad R30 + 1014 105c Netfinity 10/100 + 1014 2205 ThinkPad A22p + 1014 305c 10/100 EtherJet Management Adapter + 1014 405c 10/100 EtherJet Adapter with Alert on LAN + 1014 505c 10/100 EtherJet Secure Management Adapter + 1014 605c 10/100 EtherJet Secure Management Adapter + 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter + 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter + 1028 009b 10/100 Ethernet Server Adapter + 1028 00ce 10/100 Ethernet Server Adapter + 1033 8000 PC-9821X-B06 + 1033 8016 PK-UG-X006 + 1033 801f PK-UG-X006 + 1033 8026 PK-UG-X006 + 1033 8063 82559-based Fast Ethernet Adapter + 1033 8064 82559-based Fast Ethernet Adapter + 103c 10c0 NetServer 10/100TX + 103c 10c3 NetServer 10/100TX + 103c 10ca NetServer 10/100TX + 103c 10cb NetServer 10/100TX + 103c 10e3 NetServer 10/100TX + 103c 10e4 NetServer 10/100TX + 103c 1200 NetServer 10/100TX + 108e 10cf EtherExpress PRO/100(B) + 10c3 1100 SmartEther100 SC1100 + 10cf 1115 8255x-based Ethernet Adapter (10/100) + 10cf 1143 8255x-based Ethernet Adapter (10/100) + 110a 008b 82551QM Fast Ethernet Multifuction PCI/CardBus Controller + 114a 0582 PC8 onboard ethernet ETH2 + 1179 0001 8255x-based Ethernet Adapter (10/100) + 1179 0002 PCI FastEther LAN on Docker + 1179 0003 8255x-based Fast Ethernet + 1259 2560 AT-2560 100 + 1259 2561 AT-2560 100 FX Ethernet Adapter + 1266 0001 NE10/100 Adapter + 13e9 1000 6221L-4U + 144d 2501 SEM-2000 MiniPCI LAN Adapter + 144d 2502 SEM-2100IL MiniPCI LAN Adapter + 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem) + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 1af4 1100 QEMU Virtual Machine + 4c53 1080 CT8 mainboard + 4c53 10e0 PSL09 PrPMC + 8086 0001 EtherExpress PRO/100B (TX) + 8086 0002 EtherExpress PRO/100B (T4) + 8086 0003 EtherExpress PRO/10+ + 8086 0004 EtherExpress PRO/100 WfM + 8086 0005 82557 10/100 + 8086 0006 82557 10/100 with Wake on LAN + 8086 0007 82558 10/100 Adapter + 8086 0008 82558 10/100 with Wake on LAN + 8086 0009 82558B PRO/100+ PCI (TP) + 8086 000a EtherExpress PRO/100+ Management Adapter + 8086 000b EtherExpress PRO/100+ + 8086 000c EtherExpress PRO/100+ Management Adapter + 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter + 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN* + 8086 000f EtherExpress PRO/100 Desktop Adapter + 8086 0010 EtherExpress PRO/100 S Management Adapter + 8086 0011 EtherExpress PRO/100 S Management Adapter + 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D) + 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E) + 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC + 8086 0031 EtherExpress PRO/100 Desktop Adapter + 8086 0040 EtherExpress PRO/100 S Desktop Adapter + 8086 0041 EtherExpress PRO/100 S Desktop Adapter + 8086 0042 EtherExpress PRO/100 Desktop Adapter + 8086 0050 EtherExpress PRO/100 S Desktop Adapter + 8086 1009 EtherExpress PRO/100+ Server Adapter + 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B) + 8086 1012 EtherExpress PRO/100 S Server Adapter (D) + 8086 1013 EtherExpress PRO/100 S Server Adapter (E) + 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter + 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter + 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server + 8086 1040 EtherExpress PRO/100 S Server Adapter + 8086 1041 EtherExpress PRO/100 S Server Adapter + 8086 1042 EtherExpress PRO/100 Server Adapter + 8086 1050 EtherExpress PRO/100 S Server Adapter + 8086 1051 EtherExpress PRO/100 Server Adapter + 8086 1052 EtherExpress PRO/100 Server Adapter + 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter + 8086 1229 82557/8/9 [Ethernet Pro 100] + 8086 2009 EtherExpress PRO/100 S Mobile Adapter + 8086 200d EtherExpress PRO/100 Cardbus + 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem + 8086 200f EtherExpress PRO/100 SR Mobile Adapter + 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter + 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter + 8086 2016 EtherExpress PRO/100 S Mobile Adapter + 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter + 8086 2018 EtherExpress PRO/100 SR Mobile Adapter + 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter + 8086 2101 EtherExpress PRO/100 P Mobile Adapter + 8086 2102 EtherExpress PRO/100 SP Mobile Adapter + 8086 2103 EtherExpress PRO/100 SP Mobile Adapter + 8086 2104 EtherExpress PRO/100 SP Mobile Adapter + 8086 2105 EtherExpress PRO/100 SP Mobile Adapter + 8086 2106 EtherExpress PRO/100 P Mobile Adapter + 8086 2107 EtherExpress PRO/100 Network Connection + 8086 2108 EtherExpress PRO/100 Network Connection + 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter + 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter + 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2203 EtherExpress PRO/100+ MiniPCI + 8086 2204 EtherExpress PRO/100+ MiniPCI + 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter + 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter + 8086 2402 EtherExpress PRO/100+ MiniPCI + 8086 2407 EtherExpress PRO/100+ MiniPCI + 8086 2408 EtherExpress PRO/100+ MiniPCI + 8086 2409 EtherExpress PRO/100+ MiniPCI + 8086 240f EtherExpress PRO/100+ MiniPCI + 8086 2410 EtherExpress PRO/100+ MiniPCI + 8086 2411 EtherExpress PRO/100+ MiniPCI + 8086 2412 EtherExpress PRO/100+ MiniPCI + 8086 2413 EtherExpress PRO/100+ MiniPCI + 8086 3000 82559 Fast Ethernet LAN on Motherboard + 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN* + 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II* + 8086 3006 EtherExpress PRO/100 S Network Connection + 8086 3007 EtherExpress PRO/100 S Network Connection + 8086 3008 EtherExpress PRO/100 Network Connection + 8086 3010 EtherExpress PRO/100 S Network Connection + 8086 3011 EtherExpress PRO/100 S Network Connection + 8086 3012 EtherExpress PRO/100 Network Connection + 8086 301a S845WD1-E mainboard + 8086 3411 SDS2 Mainboard + 122d 430FX - 82437FX TSC [Triton I] + 122e 82371FB PIIX ISA [Triton I] + 1230 82371FB PIIX IDE [Triton I] + 1231 DSVD Modem + 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX) + 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP) + 1237 440FX - 82441FX PMC [Natoma] + 01de fffe Propolis Virtual 440FX + 1af4 1100 Qemu virtual machine + 1239 82371FB PIIX IDE Interface + 123b 82380PB PCI to PCI Docking Bridge + 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge + 123d 683053 Programmable Interrupt Device + 123e 82466GX (IHPC) Integrated Hot-Plug Controller (hidden mode) + 123f 82466GX Integrated Hot-Plug Controller (IHPC) + 1240 82752 (752) AGP Graphics Accelerator + 124b 82380FB (MPCI2) Mobile Docking Controller + 124c Ethernet Connection E823-L for backplane + 124d Ethernet Connection E823-L for SFP + 124e Ethernet Connection E823-L/X557-AT 10GBASE-T + 124f Ethernet Connection E823-L 1GbE + 1250 430HX - 82439HX TXC [Triton II] + 125b Ethernet Controller I226-LM + 1360 82806AA PCI64 Hub PCI Bridge + 1361 82806AA PCI64 Hub Controller (HRes) + 8086 1361 82806AA PCI64 Hub Controller (HRes) + 8086 8000 82806AA PCI64 Hub Controller (HRes) + 1460 82870P2 P64H2 Hub PCI Bridge + 1461 82870P2 P64H2 I/OxAPIC + 15d9 3480 P4DP6 + 4c53 1090 Cx9/Vx9 mainboard + 1462 82870P2 P64H2 Hot Plug Controller + 1501 82567V-3 Gigabit Network Connection + 1502 82579LM Gigabit Network Connection (Lewisville) + 1028 04a3 Precision M4600 + 17aa 21ce ThinkPad T520 + 8086 3578 Server Board S1200BTLR + 8086 357a Server Board S1200BTS + 1503 82579V Gigabit Network Connection + 1043 849c P8P67 Deluxe Motherboard + 10cf 161c LIFEBOOK E752 + 8086 200d DH61CR motherboard + 1507 Ethernet Express Module X520-P2 + 1508 82598EB Gigabit BX Network Connection + 1509 82580 Gigabit Network Connection + 150a 82576NS Gigabit Network Connection + 150b 82598EB 10-Gigabit AT2 Server Adapter + 8086 a10c 82598EB 10-Gigabit AT2 Server Adapter + 8086 a11c 82598EB 10-Gigabit AT2 Server Adapter + 8086 a12c 82598EB 10-Gigabit AT2 Server Adapter + 150c 82583V Gigabit Network Connection + 150d 82576 Gigabit Backplane Connection + 8086 a10c Gigabit ET Quad Port Mezzanine Card + 150e 82580 Gigabit Network Connection + 103c 1780 NC365T 4-port Ethernet Server Adapter + 8086 12a1 Ethernet Server Adapter I340-T4 + 8086 12a2 Ethernet Server Adapter I340-T4 + 150f 82580 Gigabit Fiber Network Connection + 1510 82580 Gigabit Backplane Connection + 1511 82580 Gigabit SFP Connection + 1513 CV82524 Thunderbolt Controller [Light Ridge 4C 2010] + 1514 Ethernet X520 10GbE Dual Port KX4 Mezz + 8086 000b Ethernet X520 10GbE Dual Port KX4 Mezz + 1515 X540 Ethernet Controller Virtual Function + 1516 82580 Gigabit Network Connection + 8086 12b1 Ethernet Server Adapter I340-T2 + 8086 12b2 Ethernet Server Adapter I340-T2 + 1517 82599ES 10 Gigabit Network Connection + 1137 006a UCS CNA M61KR-I Intel Converged Network Adapter + 1518 82576NS SerDes Gigabit Network Connection + 151a DSL2310 Thunderbolt Controller [Eagle Ridge 2C 2011] + 151b CVL2510 Thunderbolt Controller [Light Peak 2C 2010] + 151c 82599 10 Gigabit TN Network Connection + 108e 7b13 Dual 10GBASE-T LP + 151d Ethernet Connection E823-L for QSFP + 1520 I350 Ethernet Controller Virtual Function + 1521 I350 Gigabit Network Connection + 1028 0602 Gigabit 2P I350-t LOM + 1028 0693 Gigabit 2P I350-t LOM + 1028 06e2 Gigabit 2P I350-t LOM + 1028 0757 Gigabit I350-t LOM + 1028 075a Gigabit I350-t LOM + 1028 1f60 Gigabit 4P I350-t rNDC + 1028 1f62 Gigabit 4P X540/I350 rNDC + 1028 1fa8 Ethernet 10G 4P X550/I350 rNDC + 1028 1fa9 Ethernet 10G 4P X550 rNDC + 1028 1faa Gigabit 4P X550/I350 rNDC + 1028 ff9a Gigabit 4P X710/I350 rNDC + 103c 17d1 Ethernet 1Gb 4-port 366FLR Adapter + 103c 2003 Ethernet 1Gb 2-port 367i Adapter + 103c 2226 Ethernet 1Gb 1-port 364i Adapter + 103c 337f Ethernet 1Gb 2-port 361i Adapter + 103c 3380 Ethernet 1Gb 4-port 366i Adapter + 103c 339e Ethernet 1Gb 2-port 361T Adapter + 103c 8157 Ethernet 1Gb 4-port 366T Adapter + 108e 7b16 Quad Port GbE PCIe 2.0 ExpressModule, UTP + 108e 7b18 Quad Port GbE PCIe 2.0 Low Profile Adapter, UTP + 1093 7648 PCIe-8237R Ethernet Adapter + 1093 7649 PCIe-8236 Ethernet Adapter + 1093 76b1 PCIe-8237R-S Ethernet Adapter + 1093 775b PCIe-8237 Ethernet Adapter + 10a9 802a UV2-BaseIO dual-port GbE + 1137 023e 1GigE I350 LOM + 15d9 0000 AOC-SGP-i4 + 15d9 0652 Dual Port i350 GbE MicroLP [AOC-CGP-i2] + 17aa 1074 ThinkServer I350-T4 AnyFabric + 17aa 4005 I350 Gigabit Network Connection + 18d4 0c07 I350 1Gb 2-port RJ45 OCP Mezz Card MOP41-I-1GT2 + 193d 1005 360T-B + 193d 1007 360T-L +# NIC-ETH360T-3S-4P OCP3.0 4x1G Base-T Card + 193d 1080 NIC-ETH360T-3S-4P + 1bd4 001d 1G base-T QP EP014Ti1 Adapter + 1bd4 0035 1G base-T QP EP014Ti1 Adapter + 1bd4 0066 F014I350 + 8086 0001 Ethernet Server Adapter I350-T4 + 8086 0002 Ethernet Server Adapter I350-T2 + 8086 0003 Ethernet Network Adapter I350-T4 for OCP NIC 3.0 + 8086 00a1 Ethernet Server Adapter I350-T4 + 8086 00a2 Ethernet Server Adapter I350-T2 + 8086 00a3 Ethernet Network Adapter I350-T4 for OCP NIC 3.0 + 8086 00aa Ethernet Network Adapter I350-T4 for OCP NIC 3.0 + 8086 4017 Ethernet Network Adapter I350-T4 for OCP NIC 3.0 + 8086 5001 Ethernet Server Adapter I350-T4 + 8086 5002 Ethernet Server Adapter I350-T2 + 8086 5003 Ethernet 1G 4P I350-t OCP + 1522 I350 Gigabit Fiber Network Connection + 108e 7b17 Quad Port GbE PCIe 2.0 ExpressModule, MMF + 108e 7b19 Dual Port GbE PCIe 2.0 Low Profile Adapter, MMF + 8086 0002 Ethernet Server Adapter I350-T2 + 8086 0003 Ethernet Server Adapter I350-F4 + 8086 0004 Ethernet Server Adapter I350-F2 + 8086 0005 Ethernet Server Adapter I350-F1 + 8086 00a2 Ethernet Server Adapter I350-T2 + 8086 00a3 Ethernet Server Adapter I350-F4 + 8086 00a4 Ethernet Server Adapter I350-F2 + 1523 I350 Gigabit Backplane Connection + 1028 0060 Gigabit 2P I350 LOM + 1028 1f9b Gigabit 4P I350-t bNDC + 103c 1784 Ethernet 1Gb 2-port 361FLB Adapter + 103c 18d1 Ethernet 1Gb 2-port 361FLB Adapter + 103c 1989 Ethernet 1Gb 2-port 363i Adapter + 103c 339f Ethernet 1Gb 4-port 366M Adapter + 8086 1f52 1GbE 4P I350 Mezz + 1524 I350 Gigabit Connection + 1525 82567V-4 Gigabit Network Connection + 1526 82576 Gigabit Network Connection + 8086 a05c Gigabit ET2 Quad Port Server Adapter + 8086 a06c Gigabit ET2 Quad Port Server Adapter + 1527 82580 Gigabit Fiber Network Connection + 8086 0001 Ethernet Server Adapter I340-F4 + 8086 0002 Ethernet Server Adapter I340-F4 + 1528 Ethernet Controller 10-Gigabit X540-AT2 + 1028 1f61 Ethernet 10G 4P X540/I350 rNDC + 103c 192d 561FLR-T 2-port 10Gb Ethernet Adapter + 103c 2004 Ethernet 10Gb 2-port 561i Adapter + 103c 211a Ethernet 10Gb 2-port 561T Adapter + 108e 4853 Ethernet Controller 10-Gigabit X540-AT2 + 108e 7b14 Sun Dual Port 10 GbE PCIe 2.0 ExpressModule, Base-T + 108e 7b15 Sun Dual Port 10 GbE PCIe 2.0 Low Profile Adapter, Base-T + 1137 00bf Ethernet Converged Network Adapter X540-T2 + 1170 0052 Ethernet Controller 10-Gigabit X540-AT2 + 15d9 0734 AOC-STG-I2T + 17aa 1073 ThinkServer X540-T2 AnyFabric + 17aa 4006 Ethernet Controller 10-Gigabit X540-AT2 + 1bd4 001a 10G base-T DP ER102Ti3 Rack Adapter + 1bd4 0033 10G base-T DP EP102Ti3 Adapter + 1bd4 0034 10G base-T DP EP102Ti3A Adapter + 8086 0001 Ethernet Converged Network Adapter X540-T2 + 8086 0002 Ethernet Converged Network Adapter X540-T1 + 8086 001a Ethernet Converged Network Adapter X540-T2 + 8086 00a2 Ethernet Converged Network Adapter X540-T1 + 8086 1f61 Ethernet 10G 4P X540/I350 rNDC + 8086 5003 Ethernet 10G 2P X540-t Adapter + 8086 5004 Ethernet 10G 2P X540-t Adapter + 1529 82599 10 Gigabit Dual Port Network Connection with FCoE + 152a 82599 10 Gigabit Dual Port Backplane Connection with FCoE + 152e 82599 Virtual Function + 152f I350 Virtual Function + 1530 X540 Virtual Function + 1531 I210 Gigabit Unprogrammed + 1533 I210 Gigabit Network Connection + 1028 0b35 I210 Gigabit Network Connection + 103c 0003 Ethernet I210-T1 GbE NIC + 1059 0180 RD10019 1GbE interface + 1093 7706 Compact Vision System Ethernet Adapter + 10a9 802c UV300 BaseIO single-port GbE + 10a9 802d UV3000 BaseIO GbE Network + 17aa 1100 ThinkServer Ethernet Server Adapter + 8086 0001 Ethernet Server Adapter I210-T1 + 8086 0002 Ethernet Server Adapter I210-T1 + 1536 I210 Gigabit Fiber Network Connection + 1537 I210 Gigabit Backplane Connection + 1059 0110 T4005 1GbE interface + 1059 0111 T4007 1GbE interface + 1059 0120 T4008 1GbE interface + 1059 0130 T4009 1GbE interface + 1059 0140 T2035 1GbE interface + 1059 0150 RD-01068 1GbE interface + 1059 0170 RD-01213 10GbE interface + 1538 I210 Gigabit Network Connection + 1539 I211 Gigabit Network Connection + 153a Ethernet Connection I217-LM + 103c 1909 ZBook 15 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 309f ThinkCentre M83 + 153b Ethernet Connection I217-V + 1547 DSL3510 Thunderbolt Controller [Cactus Ridge 4C 2012] + 1548 DSL3310 Thunderbolt Controller [Cactus Ridge 2C 2012] + 1549 DSL2210 Thunderbolt Controller [Port Ridge 1C 2011] + 154a Ethernet Server Adapter X520-4 + 8086 011a Ethernet Converged Network Adapter X520-4 + 8086 011b Ethernet Converged Network Adapter X520-4 + 8086 011c Ethernet Converged Network Adapter X520-4 + 154c Ethernet Virtual Function 700 Series + 154d Ethernet 10G 2P X520 Adapter + 8086 7b11 10GbE 2P X520 Adapter + 1557 82599 10 Gigabit Network Connection + 17aa 4008 82599EN 10 Gigabit Network Connection + 1bd4 001c 10G SFP+ SP ER101Fi4 Rack Adapter + 1bd4 0030 10G SFP+ SP EP101Fi4A Adapter + 8086 0001 Ethernet OCP Server Adapter X520-1 + 1558 Ethernet Converged Network Adapter X520-Q1 + 8086 011a Ethernet Converged Network Adapter X520-Q1 + 8086 011b Ethernet Converged Network Adapter X520-Q1 + 1559 Ethernet Connection I218-V + 155a Ethernet Connection I218-LM + 17aa 2214 ThinkPad X240 + 155c Ethernet Server Bypass Adapter + 8086 0001 Ethernet Server Bypass Adapter X540-T2 + 155d Ethernet Server Bypass Adapter + 8086 0001 Ethernet Server Bypass Adapter X520-SR2 + 8086 0002 Ethernet Server Bypass Adapter X520-LR2 + 1560 Ethernet Controller X540 + 1563 Ethernet Controller X550 + 1028 1fa8 Ethernet 10G 4P X550/I350 rNDC + 1028 1fa9 Ethernet 10G 4P X550 rNDC + 1137 02b2 X550-TX 10 Gig LOM + 1137 02b3 X550-TX 10 Gig LOM + 1170 0001 Intel Ethernet Controller X550-T2 OCP card + 14c0 1201 X550 10Gb 2P RJ45 OCP Mezz + 1590 00d1 Ethernet 10Gb 2-port 562T Adapter + 1590 00d2 Ethernet 10Gb 2-port 562FLR-T Adapter + 16b8 7217 Twin10G Thunderbolt 3 Edition + 18d4 0c08 X550 10Gb 2-port RJ45 OCP Mezz Card MOP81-I-10GT2 + 193d 1008 560T-B + 193d 1009 560T-L + 193d 1011 UN-NIC-ETH563T-sL-2P + 8086 0001 Ethernet Converged Network Adapter X550-T2 + 8086 001a Ethernet Converged Network Adapter X550-T2 + 8086 001b Ethernet Server Adapter X550-T2 for OCP + 8086 001d Ethernet 10G 2P X550-t Adapter + 8086 0022 Ethernet Converged Network Adapter X550-T2 + 1564 X550 Virtual Function + 1565 X550 Virtual Function + 1566 DSL4410 Thunderbolt NHI [Redwood Ridge 2C 2013] + 1567 DSL4410 Thunderbolt Bridge [Redwood Ridge 2C 2013] + 1568 DSL4510 Thunderbolt NHI [Redwood Ridge 4C 2013] + 1569 DSL4510 Thunderbolt Bridge [Redwood Ridge 4C 2013] + 156a DSL5320 Thunderbolt 2 NHI [Falcon Ridge 2C 2013] + 156b DSL5320 Thunderbolt 2 Bridge [Falcon Ridge 2C 2013] + 156c DSL5520 Thunderbolt 2 NHI [Falcon Ridge 4C 2013] + 156d DSL5520 Thunderbolt 2 Bridge [Falcon Ridge 4C 2013] + 156f Ethernet Connection I219-LM + 1028 06dc Latitude E7470 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 1570 Ethernet Connection I219-V + 1571 Ethernet Virtual Function 700 Series + 1572 Ethernet Controller X710 for 10GbE SFP+ + 1028 0000 Ethernet 10G X710 rNDC + 1028 1f99 Ethernet 10G 4P X710/I350 rNDC + 1028 1f9c Ethernet 10G 4P X710 SFP+ rNDC + 103c 0000 Ethernet 10Gb 562SFP+ Adapter + 103c 22fc Ethernet 10Gb 2-port 562FLR-SFP+ Adapter + 103c 22fd Ethernet 10Gb 2-port 562SFP+ Adapter + 1137 0000 Ethernet Converged NIC X710-DA + 1137 013b Ethernet Converged NIC X710-DA4 + 1137 020a Ethernet Converged NIC X710-DA2 + 1590 0000 Ethernet Controller X710 for 10GbE SFP+ + 1590 0225 Ethernet 10GbE 4P 563SFP+ Adapter + 1590 022f Ethernet 10Gb 2-port 564i Communication Board + 17aa 0000 ThinkServer X710 AnyFabric for 10GbE SFP+ + 17aa 4001 ThinkServer X710-4 AnyFabric for 10GbE SFP+ + 17aa 4002 ThinkServer X710-2 AnyFabric for 10GbE SFP+ + 193d 1020 NIC-ETH561F-sL-4x10G + 193d 1021 NIC-ETH561F-sL-2x10G +# NIC-ETH561F-3S-2P OCP3.0 2x10G SFP+ Card + 193d 1081 NIC-ETH561F-3S-2P + 19e5 d11c Ethernet 2-port X710 10Gb SFP+ Adapter SP330 + 1bd4 0042 10G SFP+ DP EP102Fi4 Adapter + 1bd4 0056 Ethernet Network Adapter X710-BM2 for OCP NIC 3.0 + 1bd4 0065 F102IX710 + 1bd4 0074 Ethernet Network Adapter X710-BM2 for lldp + 8086 0000 Ethernet Converged Network Adapter X710 + 8086 0001 Ethernet Converged Network Adapter X710-4 + 8086 0002 Ethernet Converged Network Adapter X710-4 + 8086 0004 Ethernet Converged Network Adapter X710-4 + 8086 0005 Ethernet 10G 4P X710 Adapter + 8086 0006 Ethernet 10G 2P X710 Adapter + 8086 0007 Ethernet Converged Network Adapter X710-2 + 8086 0008 Ethernet Converged Network Adapter X710-2 + 8086 0009 Ethernet Controller X710 for 10GbE SFP+ + 8086 000a Ethernet Controller X710 for 10GbE SFP+ + 8086 000b Ethernet Server Adapter X710-DA2 for OCP + 8086 000d Ethernet Controller X710 for 10GbE SFP+ + 8086 000e Ethernet Server Adapter OCP X710-2 + 8086 000f Ethernet Server Adapter OCP X710-2 + 8086 0010 Ethernet Converged Network Adapter X710 + 8086 0011 Ethernet Network Adapter X710-2 for OCP NIC 3.0 + 8086 0012 Ethernet Network Adapter X710-4 for OCP NIC 3.0 + 8086 0013 Ethernet 10G 2P X710 OCP + 8086 0014 Ethernet 10G 4P X710 OCP + 8086 0015 Ethernet Server Adapter X710-DA2 for OCP + 8086 00a1 Ethernet Network Adapter X710-2 for OCP NIC 3.0 + 8086 00a2 Ethernet Network Adapter X710-4 for OCP NIC 3.0 + 8086 4005 Ethernet Controller X710 for 10GbE SFP+ + 8086 4006 Ethernet Controller X710 for 10GbE SFP+ + 8086 4007 Ethernet Controller X710 for 10GbE SFP+ + 1574 Ethernet Controller XL710 Emulation + 1575 DSL6340 Thunderbolt 3 NHI [Alpine Ridge 2C 2015] + 1576 DSL6340 Thunderbolt 3 Bridge [Alpine Ridge 2C 2015] + 1577 DSL6540 Thunderbolt 3 NHI [Alpine Ridge 4C 2015] + 1578 DSL6540 Thunderbolt 3 Bridge [Alpine Ridge 4C 2015] + 157b I210 Gigabit Network Connection + ea50 cc10 RXi2-BP + 157c I210 Gigabit Backplane Connection + 157d DSL5110 Thunderbolt 2 NHI (Low Power) [Win Ridge 2C 2014] + 157e DSL5110 Thunderbolt 2 Bridge (Low Power) [Win Ridge 2C 2014] + 1580 Ethernet Controller XL710 for 40GbE backplane + 1581 Ethernet Controller X710 for 10GbE backplane + 1028 0000 Ethernet 10G X710-k bNDC + 1028 1f98 Ethernet 10G 4P X710-k bNDC + 1028 1f9e Ethernet 10G 2P X710-k bNDC + 1059 0150 RD-01068 10GbE-KR interface + 1059 0170 RD-01213 10GbE interface + 1590 0000 Ethernet 2-port 563i Adapter + 1590 00f8 Ethernet 2-port 563i Adapter + 193d 100e NIC-ETH561i-Mb-4x10G + 8086 0000 Ethernet Converged Network Adapter XL710-Q2 + 1583 Ethernet Controller XL710 for 40GbE QSFP+ + 1028 0000 Ethernet 40G 2P XL710 QSFP+ rNDC + 1028 1f9f Ethernet 40G 2P XL710 QSFP+ rNDC + 108e 0000 10 Gb/40 Gb Ethernet Adapter + 108e 7b1b 10 Gb/40 Gb Ethernet Adapter + 108e 7b1d 10Gb/40Gb Ethernet Adapter + 1137 0000 Ethernet Converged NIC XL710-QDA2 + 1137 013c Ethernet Converged NIC XL710-QDA2 + 8086 0000 Ethernet Converged Network Adapter XL710-Q2 + 8086 0001 Ethernet Converged Network Adapter XL710-Q2 + 8086 0002 Ethernet Converged Network Adapter XL710-Q2 + 8086 0003 Ethernet I/O Module XL710-Q2 + 8086 0004 Ethernet Server Adapter XL710-Q2OCP + 8086 0006 Ethernet Converged Network Adapter XL710-Q2 + 1584 Ethernet Controller XL710 for 40GbE QSFP+ + 8086 0000 Ethernet Converged Network Adapter XL710-Q1 + 8086 0001 Ethernet Converged Network Adapter XL710-Q1 + 8086 0002 Ethernet Converged Network Adapter XL710-Q1 + 8086 0003 Ethernet I/O Module XL710-Q1 + 8086 0004 Ethernet Server Adapter XL710-Q1OCP + 1585 Ethernet Controller X710 for 10GbE QSFP+ + 1586 Ethernet Controller X710 for 10GBASE-T + 108e 0000 Ethernet Controller X710 for 10GBASE-T + 108e 4857 Ethernet Controller X710 for 10GBASE-T + 1587 Ethernet Controller XL710 for 20GbE backplane + 103c 0000 Ethernet 10/20Gb 2-port 660FLB Adapter + 103c 22fe Ethernet 10/20Gb 2-port 660FLB Adapter + 1588 Ethernet Controller XL710 for 20GbE backplane + 103c 0000 Ethernet 10/20Gb 2-port 660M Adapter + 103c 22ff Ethernet 10/20Gb 2-port 660M Adapter + 1137 0000 Ethernet Network Adapter XXV710 + 1137 02b4 Ethernet Network Adapter XXV710 OCP 2.0 + 1589 Ethernet Controller X710/X557-AT 10GBASE-T + 108e 0000 Quad Port 10GBase-T Adapter + 108e 7b1c Quad Port 10GBase-T Adapter + 8086 0000 Ethernet Converged Network Adapter X710-T + 8086 0001 Ethernet Converged Network Adapter X710-T4 + 8086 0002 Ethernet Converged Network Adapter X710-T4 + 8086 0003 Ethernet Converged Network Adapter X710-T + 8086 00a0 Ethernet Converged Network Adapter X710-T4 + 8086 1003 Ethernet Converged Network Adapter X710-T + 158a Ethernet Controller XXV710 for 25GbE backplane + 1590 0000 10/25Gb Ethernet Adapter + 1590 0286 Synergy 4610C 10/25Gb Ethernet Adapter + 8086 0000 Ethernet Controller XXV710 for 25GbE backplane + 8086 000a Ethernet 25G 2P XXV710 Mezz + 158b Ethernet Controller XXV710 for 25GbE SFP28 + 1137 0000 Ethernet Network Adapter XXV710 + 1137 0225 Ethernet Network Adapter XXV710 + 1137 02b4 Ethernet Network Adapter XXV710 OCP 2.0 +# UEFI PXE Disabled + 1374 0230 Single Port 25 Gigabit Ethernet PCI Express Server Adapter (PE325G1I71) +# With UEFI PXE Enabled + 1374 0231 Single Port 25 Gigabit Ethernet PCI Express Server Adapter (PE325G1I71EU) +# UEFI PXE Disabled + 1374 0234 Dual Port 25 Gigabit Ethernet PCI Express Server Adapter (PE325G2I71) +# With UEFI PXE Enabled + 1374 0235 Dual Port 25 Gigabit Ethernet PCI Express Server Adapter (PE325G2I71EU) +# PCIe x8 Bifurcated as x4x4, UEFI PXE Disabled, low profile + 1374 0238 Quad Port 25 Gigabit Ethernet PCI Express Server Adapter (PE325G4I71L) +# PCIe x8 Bifurcated as x4x4, UEFI PXE Enabled, low profile + 1374 0239 Quad Port 25 Gigabit Ethernet PCI Express Server Adapter (PE325G4I71LEU) +# PCIe x16 Bifurcated as x8x8, UEFI PXE Disabled, low profile + 1374 023a Quad Port 25 Gigabit Ethernet PCI Express Server Adapter (PE31625G4I71L) +# PCIe x16 Bifurcated as x8x8, UEFI PXE Enabled, low profile + 1374 023b Quad Port 25 Gigabit Ethernet PCI Express Server Adapter (PE31625G4I71LEU) + 1590 0000 Ethernet Network Adapter XXV710-2 + 1590 0253 Ethernet 10/25/Gb 2-port 661SFP28 Adapter + 8086 0000 Ethernet Network Adapter XXV710 + 8086 0001 Ethernet Network Adapter XXV710-2 + 8086 0002 Ethernet Network Adapter XXV710-2 + 8086 0003 Ethernet Network Adapter XXV710-1 + 8086 0004 Ethernet Network Adapter XXV710-1 + 8086 0005 Ethernet Network Adapter OCP XXV710-2 + 8086 0006 Ethernet Network Adapter OCP XXV710-2 + 8086 0007 Ethernet Network Adapter OCP XXV710-1 + 8086 0008 Ethernet Network Adapter OCP XXV710-1 + 8086 0009 Ethernet 25G 2P XXV710 Adapter + 8086 000a Ethernet 25G 2P XXV710 OCP + 8086 4001 Ethernet Network Adapter XXV710-2 + 1591 Ethernet Controller E810-C for backplane + 1592 Ethernet Controller E810-C for QSFP + 1137 02bf E810CQDA2 2x100 GbE QSFP28 PCIe NIC + 193d 1050 NIC-ETH1060F-LP-2P 2x100GbE Ethernet PCIe Card + 8086 0001 Ethernet Network Adapter E810-C-Q1 + 8086 0002 Ethernet Network Adapter E810-C-Q2 + 8086 0004 Ethernet Network Adapter E810-C-Q2 + 8086 0005 Ethernet Network Adapter E810-C-Q1 for OCP3.0 + 8086 0006 Ethernet Network Adapter E810-C-Q2 for OCP3.0 + 8086 0009 Ethernet Network Adapter E810-C-Q1 + 8086 000a Ethernet Network Adapter E810-C-Q1 for OCP + 8086 000b Ethernet 100G 2P E810-C Adapter + 8086 000c Ethernet 100G 2P E810-C OCP + 8086 000d Ethernet Network Adapter E810-L-Q2 for OCP 3.0 + 8086 000e Ethernet Network Adapter E810-2C-Q2 + 8086 000f Ethernet Network Adapter E810-C-Q2T + 8086 0010 Ethernet 100G 2P E810-C-stg Adapter + 8086 0011 Ethernet Network Adapter E810-C-Q1 for OCP3.0 + 8086 0012 Ethernet 100G 2P E810-C-st Adapter + 1593 Ethernet Controller E810-C for SFP + 1137 02c3 E810XXVDA4 4x25/10 GbE SFP28 PCIe NIC + 1137 02e9 E810XXVDA4TG 4x25/10 GbE SFP28 PCIe NIC + 1137 02ea E810XXVDA4T 4x25/10 GbE SFP28 PCIe NIC + 8086 0002 Ethernet Network Adapter E810-L-2 + 8086 0005 Ethernet Network Adapter E810-XXV-4 + 8086 0006 Ethernet Network Adapter E810-XXV-4 + 8086 0007 Ethernet Network Adapter E810-XXV-4 + 8086 0008 Ethernet Network Adapter E810-XXV-2 + 8086 0009 Ethernet Network Adapter E810-XXV-2 for OCP 2.0 + 8086 000a Ethernet 25G 4P E810-XXV Adapter + 8086 000c Ethernet Network Adapter E810-XXV-4 for OCP 3.0 + 8086 000d Ethernet 25G 4P E810-XXV OCP + 8086 000e Ethernet Network Adapter E810-XXV-4T + 8086 000f Ethernet 25G 4P E810-XXV-stg Adapter + 8086 0010 Ethernet 25G 4P E810-XXV-st Adapter + 8086 4010 Ethernet Network Adapter E810-XXV-4 + 8086 4013 Ethernet Network Adapter E810-XXV-4 for OCP 3.0 + 1599 Ethernet Controller E810-XXV for backplane + 8086 0001 Ethernet 25G 2P E810-XXV-k Mezz + 159a Ethernet Controller E810-XXV for QSFP + 159b Ethernet Controller E810-XXV for SFP + 1137 02be E810XXVDA2 2x25/10 GbE SFP28 PCIe NIC + 1bd4 0057 Ethernet Network Adapter E810-XXVAM2 + 1bd4 0058 Ethernet Network Adapter E810-XXVAM2 for OCP 3.0 + 1bd4 006e Ethernet Network Adapter E810-XXVAM2 for BD + 1eec 0102 VSE250241E Dual-port 10Gb/25Gb Ethernet PCIe + 8086 0001 Ethernet 25G 2P E810-XXV OCP + 8086 0002 Ethernet 25G 2P E810-XXV Adapter + 8086 0003 Ethernet Network Adapter E810-XXV-2 + 8086 0005 Ethernet Network Adapter E810-XXV-2 for OCP 3.0 + 8086 4001 Ethernet Network Adapter E810-XXV-2 + 8086 4002 Ethernet Network Adapter E810-XXV-2 for OCP 3.0 + 8086 4003 Ethernet Network Adapter E810-XXV-2 + 8086 4015 Ethernet Network Adapter E810-XXV-2 for OCP 3.0 + 15a0 Ethernet Connection (2) I218-LM + 15a1 Ethernet Connection (2) I218-V + 15a2 Ethernet Connection (3) I218-LM + 15a3 Ethernet Connection (3) I218-V + 15a4 Ethernet Switch FM10000 Host Interface + 15a5 Ethernet Switch FM10000 Host Virtual Interface + 15a8 Ethernet Connection X552 Virtual Function + 15a9 X552 Virtual Function + 15aa Ethernet Connection X552 10 GbE Backplane + 1059 0120 T4008 10GbE interface + 15ab Ethernet Connection X552 10 GbE Backplane + 1059 0150 RD-01068 10GbE interface + 1059 0170 RD-01213 10GbE interface + 15ac Ethernet Connection X552 10 GbE SFP+ + 1059 0160 RD-01167 10GbE interface + 15ad Ethernet Connection X552/X557-AT 10GBASE-T + 15ae Ethernet Connection X552 1000BASE-T + 15b0 Ethernet Connection X552 Backplane + 15b4 X553 Virtual Function + 15b5 DSL6340 USB 3.1 Controller [Alpine Ridge] + 15b6 DSL6540 USB 3.1 Controller [Alpine Ridge] + 15b7 Ethernet Connection (2) I219-LM + 15b8 Ethernet Connection (2) I219-V + 1462 7a72 H270 PC MATE + 15b9 Ethernet Connection (3) I219-LM + 15bb Ethernet Connection (7) I219-LM + 15bc Ethernet Connection (7) I219-V + 15bd Ethernet Connection (6) I219-LM + 15be Ethernet Connection (6) I219-V + 15bf JHL6240 Thunderbolt 3 NHI (Low Power) [Alpine Ridge LP 2016] + 15c0 JHL6240 Thunderbolt 3 Bridge (Low Power) [Alpine Ridge LP 2016] + 15c1 JHL6240 Thunderbolt 3 USB 3.1 Controller (Low Power) [Alpine Ridge LP 2016] + 15c2 Ethernet Connection X553 Backplane + 15c3 Ethernet Connection X553 Backplane + 15c4 Ethernet Connection X553 10 GbE SFP+ + 15c5 X553 Virtual Function + 15c6 Ethernet Connection X553 1GbE + 15c7 Ethernet Connection X553 1GbE + 15c8 Ethernet Connection X553/X557-AT 10GBASE-T + 15ce Ethernet Connection X553 10 GbE SFP+ + 15d0 Ethernet SDI Adapter + 8086 0001 Ethernet SDI Adapter FM10420-100GbE-QDA2 + 8086 0002 Ethernet SDI Adapter FM10840-MTP2 + 15d1 Ethernet Controller 10G X550T + 8086 0002 Ethernet Converged Network Adapter X550-T1 + 8086 001b Ethernet Server Adapter X550-T1 for OCP + 8086 0021 Ethernet Converged Network Adapter X550-T1 + 8086 00a2 Ethernet Converged Network Adapter X550-T1 + 15d2 JHL6540 Thunderbolt 3 NHI (C step) [Alpine Ridge 4C 2016] + 15d3 JHL6540 Thunderbolt 3 Bridge (C step) [Alpine Ridge 4C 2016] + 15d4 JHL6540 Thunderbolt 3 USB Controller (C step) [Alpine Ridge 4C 2016] + 15d5 Ethernet SDI Adapter FM10420-25GbE-DA2 + 8086 0001 Ethernet SDI Adapter FM10420-25GbE-DA2 + 15d6 Ethernet Connection (5) I219-V + 15d7 Ethernet Connection (4) I219-LM + 15d8 Ethernet Connection (4) I219-V + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 17aa 225d ThinkPad T480 + 15d9 JHL6340 Thunderbolt 3 NHI (C step) [Alpine Ridge 2C 2016] + 15da JHL6340 Thunderbolt 3 Bridge (C step) [Alpine Ridge 2C 2016] + 15db JHL6340 Thunderbolt 3 USB 3.1 Controller (C step) [Alpine Ridge 2C 2016] + 15df Ethernet Connection (8) I219-LM + 15e0 Ethernet Connection (8) I219-V + 15e1 Ethernet Connection (9) I219-LM + 15e2 Ethernet Connection (9) I219-V + 15e3 Ethernet Connection (5) I219-LM + 15e4 Ethernet Connection X553 1GbE + 15e5 Ethernet Connection X553 1GbE + 15e7 JHL7540 Thunderbolt 3 Bridge [Titan Ridge 2C 2018] + 15e8 JHL7540 Thunderbolt 3 NHI [Titan Ridge 2C 2018] + 15e9 JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 2C 2018] + 15ea JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] + 15eb JHL7540 Thunderbolt 3 NHI [Titan Ridge 4C 2018] + 1028 09be Latitude 7410 + 15ec JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018] + 1028 09be Latitude 7410 + 15ef JHL7540 Thunderbolt 3 Bridge [Titan Ridge DD 2018] + 15f0 JHL7540 Thunderbolt 3 USB Controller [Titan Ridge DD 2018] + 15f2 Ethernet Controller I225-LM + 8086 0001 Ethernet Network Adapter I225-T1 + 8086 0002 Ethernet Network Adapter I225-T1 + 15f3 Ethernet Controller I225-V + 8086 0003 Intel(R) Ethernet Controller (3) I225-V + 15f4 Ethernet Connection (15) I219-LM + 15f5 Ethernet Connection (15) I219-V + 15f6 I210 Gigabit Ethernet Connection + 15f9 Ethernet Connection (14) I219-LM + 15fa Ethernet Connection (14) I219-V + 15fb Ethernet Connection (13) I219-LM + 15fc Ethernet Connection (13) I219-V + 15ff Ethernet Controller X710 for 10GBASE-T + 1137 0000 X710TLG GbE RJ45 PCIe NIC + 1137 02c1 X710T2LG 2x10 GbE RJ45 PCIe NIC + 1137 02c2 X710T4LG 4x10 GbE RJ45 PCIe NIC + 1137 02d9 Ethernet Network Adapter X710-T2L OCP 3.0 + 1137 02da Ethernet Network Adapter X710-T4L OCP 3.0 +# NIC-ETH565T-3S-2P OCP3.0 2x10G Base-T Card + 193d 1082 NIC-ETH565T-3S-2P + 8086 0000 Ethernet Network Adapter X710-TL + 8086 0001 Ethernet Network Adapter X710-T4L + 8086 0002 Ethernet Network Adapter X710-T4L + 8086 0003 Ethernet Network Adapter X710-T2L + 8086 0004 Ethernet Network Adapter X710-T2L + 8086 0005 Ethernet 10G 2P X710-T2L-t Adapter + 8086 0006 Ethernet 10G 4P X710-T4L-t Adapter + 8086 0007 Ethernet 10G 2P X710-T2L-t OCP + 8086 0008 Ethernet 10G 4P X710-T4L-t OCP + 8086 0009 Ethernet Network Adapter X710-T4L for OCP 3.0 + 8086 000a Ethernet Network Adapter X710-T4L for OCP 3.0 + 8086 000b Ethernet Network Adapter X710-T2L for OCP 3.0 + 8086 000c Ethernet Network Adapter X710-T2L for OCP 3.0 + 8086 000d Ethernet 10G 2P X710-T2L-t OCP + 8086 000f Ethernet Network Adapter X710-T2L for OCP 3.0 + 8086 4009 Ethernet Network Adapter X710-T2L + 8086 4012 Ethernet Network Adapter X710-T4L for OCP 3.0 + 8086 4018 Ethernet Network Adapter X710-T2L for OCP 3.0 + 8086 4019 Ethernet Network Adapter X710-T4L + 1600 Broadwell-U Host Bridge -OPI + 1601 Broadwell-U PCI Express x16 Controller + 1602 Broadwell-U Integrated Graphics + 1603 Broadwell-U Processor Thermal Subsystem + 1604 Broadwell-U Host Bridge -OPI + 1605 Broadwell-U PCI Express x8 Controller + 1606 HD Graphics + 1607 Broadwell-U CHAPS Device + 1608 Broadwell-U Host Bridge -OPI + 1609 Broadwell-U x4 PCIe + 160a Broadwell-U Integrated Graphics + 160b Broadwell-U Integrated Graphics + 160c Broadwell-U Audio Controller + 160d Broadwell-U Integrated Graphics + 160e Broadwell-U Integrated Graphics + 160f Broadwell-U SoftSKU + 1610 Broadwell-U Host Bridge - DMI + 1612 HD Graphics 5600 + 1614 Broadwell-U Host Bridge - DMI + 1616 HD Graphics 5500 + 103c 2216 ZBook 15u G2 Mobile Workstation + 1618 Broadwell-U Host Bridge - DMI + 161a Broadwell-U Integrated Graphics + 161b Broadwell-U Integrated Graphics + 161d Broadwell-U Integrated Graphics + 161e HD Graphics 5300 + 1622 Iris Pro Graphics 6200 + 1626 HD Graphics 6000 + 162a Iris Pro Graphics P6300 + 162b Iris Graphics 6100 + 162d Broadwell-U Integrated Graphics + 162e Broadwell-U Integrated Graphics + 1632 Broadwell-U Integrated Graphics + 1636 Broadwell-U Integrated Graphics + 163a Broadwell-U Integrated Graphics + 163b Broadwell-U Integrated Graphics + 163d Broadwell-U Integrated Graphics + 163e Broadwell-U Integrated Graphics + 1889 Ethernet Adaptive Virtual Function + 188a Ethernet Connection E823-C for backplane + 188b Ethernet Connection E823-C for QSFP + 188c Ethernet Connection E823-C for SFP + 188d Ethernet Connection E823-C/X557-AT 10GBASE-T + 188e Ethernet Connection E823-C 1GbE + 1890 Ethernet Connection E822-C for backplane + 1891 Ethernet Connection E822-C for QSFP + 1892 Ethernet Connection E822-C for SFP + 1893 Ethernet Connection E822-C/X557-AT 10GBASE-T + 1894 Ethernet Connection E822-C 1GbE + 1897 Ethernet Connection E822-L for backplane + 1898 Ethernet Connection E822-L for SFP + 1899 Ethernet Connection E822-L/X557-AT 10GBASE-T + 189a Ethernet Connection E822-L 1GbE + 18a0 C4xxx Series QAT + 18a1 C4XXX Series QAT Virtual Function + 18ee 200xx Series QAT + 18ef 200xx Series QAT Virtual Function + 1900 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1901 6th-10th Gen Core Processor PCIe Controller (x16) + 1902 HD Graphics 510 + 1903 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e4 XPS 15 9550 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 09be Latitude 7410 + 103c 825b OMEN-17-w001nv + 17aa 225d ThinkPad T480 + 1904 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1028 06dc Latitude E7470 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 17aa 382a B51-80 Laptop + 1905 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x8) + 1906 HD Graphics 510 + 17aa 382a B51-80 Laptop + 1908 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1909 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x4) + 190c Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 190f Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1910 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + 1911 Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model + 1028 0869 Vostro 3470 + 1028 09be Latitude 7410 + 1462 7a72 H270 PC MATE + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 17aa 225d ThinkPad T480 + 1912 HD Graphics 530 + 1916 Skylake GT2 [HD Graphics 520] + 1028 06dc Latitude E7470 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 1918 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1919 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Imaging Unit + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 191b HD Graphics 530 + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + 191d HD Graphics P530 + 191e HD Graphics 515 + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 191f Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1921 HD Graphics 520 + 1926 Iris Graphics 540 + 1927 Iris Graphics 550 + 192b Iris Graphics 555 + 192d Iris Graphics P555 + 1932 Iris Pro Graphics 580 + 193a Iris Pro Graphics P580 + 193b Iris Pro Graphics 580 + 193d Iris Pro Graphics P580 + 1960 80960RP (i960RP) Microprocessor + 101e 0431 MegaRAID 431 RAID Controller + 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller + 101e 0466 MegaRAID 466 Express Plus RAID Controller + 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller + 101e 0490 MegaRAID 490 Express 300 RAID Controller + 101e 0762 MegaRAID 762 Express RAID Controller + 101e 09a0 PowerEdge Expandable RAID Controller 2/SC + 1028 0467 PowerEdge Expandable RAID Controller 2/DC + 1028 1111 PowerEdge Expandable RAID Controller 2/SC + 103c 03a2 MegaRAID + 103c 10c6 MegaRAID 438, NetRAID-3Si + 103c 10c7 MegaRAID T5, Integrated NetRAID + 103c 10cc MegaRAID, Integrated NetRAID + 103c 10cd NetRAID-1Si + 105a 0000 SuperTrak + 105a 2168 SuperTrak Pro + 105a 5168 SuperTrak66/100 + 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC + 1111 1112 PowerEdge Expandable RAID Controller 2/SC + 113c 03a2 MegaRAID + e4bf 1010 CG1-RADIO + e4bf 1020 CU2-QUARTET + e4bf 1040 CU1-CHORUS + e4bf 3100 CX1-BAND + 1962 80960RM (i960RM) Microprocessor + 105a 0000 SuperTrak SX6000 I2O CPU + 1964 80960RN (i960RN) Microprocessor + 1980 Atom Processor C3000 Series System Agent + 19a1 Atom Processor C3000 Series Error Registers + 19a2 Atom Processor C3000 Series Root Complex Event Collector + 19a3 Atom Processor C3000 Series Integrated QAT Root Port + 19a4 Atom Processor C3000 Series PCI Express Root Port #0 + 19a5 Atom Processor C3000 Series PCI Express Root Port #1 + 19a6 Atom Processor C3000 Series PCI Express Root Port #2 + 19a7 Atom Processor C3000 Series PCI Express Root Port #3 + 19a8 Atom Processor C3000 Series PCI Express Root Port #4 + 19a9 Atom Processor C3000 Series PCI Express Root Port #5 + 19aa Atom Processor C3000 Series PCI Express Root Port #6 + 19ab Atom Processor C3000 Series PCI Express Root Port #7 + 19ac Atom Processor C3000 Series SMBus Contoller - Host + 19b0 Atom Processor C3000 Series SATA Controller 0 + 19b1 Atom Processor C3000 Series SATA Controller 0 + 19b2 Atom Processor C3000 Series SATA Controller 0 + 19b3 Atom Processor C3000 Series SATA Controller 0 + 19b4 Atom Processor C3000 Series SATA Controller 0 + 19b5 Atom Processor C3000 Series SATA Controller 0 + 19b6 Atom Processor C3000 Series SATA Controller 0 + 19b7 Atom Processor C3000 Series SATA Controller 0 + 19be Atom Processor C3000 Series SATA Controller 0 + 19bf Atom Processor C3000 Series SATA Controller 0 + 19c0 Atom Processor C3000 Series SATA Controller 1 + 19c1 Atom Processor C3000 Series SATA Controller 1 + 19c2 Atom Processor C3000 Series SATA Controller 1 + 19c3 Atom Processor C3000 Series SATA Controller 1 + 19c4 Atom Processor C3000 Series SATA Controller 1 + 19c5 Atom Processor C3000 Series SATA Controller 1 + 19c6 Atom Processor C3000 Series SATA Controller 1 + 19c7 Atom Processor C3000 Series SATA Controller 1 + 19ce Atom Processor C3000 Series SATA Controller 1 + 19cf Atom Processor C3000 Series SATA Controller 1 + 19d0 Atom Processor C3000 Series USB 3.0 xHCI Controller + 19d1 Atom Processor C3000 Series Integrated LAN Root Port #0 + 19d2 Atom Processor C3000 Series Integrated LAN Root Port #1 + 19d3 Atom Processor C3000 Series ME HECI 1 + 19d4 Atom Processor C3000 Series ME HECI 2 + 19d5 Atom Processor C3000 Series ME KT Controller + 19d6 Atom Processor C3000 Series ME HECI 3 + 19d8 Atom Processor C3000 Series HSUART Controller + 19dc Atom Processor C3000 Series LPC or eSPI + 19dd Atom Processor C3000 Series Primary to Side Band (P2SB) Bridge + 19de Atom Processor C3000 Series Power Management Controller + 19df Atom Processor C3000 Series SMBus controller + 19e0 Atom Processor C3000 Series SPI Controller + 19e2 Atom Processor C3000 Series QuickAssist Technology + 19e3 Atom Processor C3000 Series QuickAssist Technology Virtual Function + 1a1c Ethernet Connection (17) I219-LM + 1a1d Ethernet Connection (17) I219-V + 1a1e Ethernet Connection (16) I219-LM + 1a1f Ethernet Connection (16) I219-V + 1a21 82840 840 [Carmel] Chipset Host Bridge (Hub A) + 1a23 82840 840 [Carmel] Chipset AGP Bridge + 1a24 82840 840 [Carmel] Chipset PCI Bridge (Hub B) + 1a30 82845 845 [Brookdale] Chipset Host Bridge + 1028 010e Optiplex GX240 + 147b 0505 BL7 motherboard + 15d9 3280 Supermicro P4SBE Mainboard + 1a31 82845 845 [Brookdale] Chipset AGP Bridge + 1a38 5000 Series Chipset DMA Engine + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 S5000PSLSATA Server Board + 1a48 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE SR Server Adapter + 8086 a11f PRO/10GbE SR Server Adapter + 1b48 82597EX 10GbE Ethernet Controller + 8086 a01f PRO/10GbE LR Server Adapter + 8086 a11f PRO/10GbE LR Server Adapter + 1c00 6 Series/C200 Series Chipset Family Desktop SATA Controller (IDE mode, ports 0-3) + 1c01 6 Series/C200 Series Chipset Family Mobile SATA Controller (IDE mode, ports 0-3) + 1c02 6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller + 1028 04aa XPS 8300 + 1043 844d P8 series motherboard + 8086 200d DH61CR motherboard + 8086 7270 Server Board S1200BT Family + 1c03 6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller + 1028 04a3 Precision M4600 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 17aa 21cf ThinkPad T520 + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c04 6 Series/C200 Series Desktop SATA RAID Controller + 103c 3118 Smart Array B110i SATA RAID Controller + 1c05 6 Series/C200 Series Mobile SATA RAID Controller + 1c06 Z68 Express Chipset SATA RAID Controller + 1c08 6 Series/C200 Series Chipset Family Desktop SATA Controller (IDE mode, ports 4-5) + 1c09 6 Series/C200 Series Chipset Family Mobile SATA Controller (IDE mode, ports 4-5) + 1c10 6 Series/C200 Series Chipset Family PCI Express Root Port 1 + 1028 04aa XPS 8300 + 1028 04da Vostro 3750 + 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 + 8086 7270 Server Board S1200BTS / Apple MacBook Pro 8,1/8,2 + 1c12 6 Series/C200 Series Chipset Family PCI Express Root Port 2 + 1028 04aa XPS 8300 + 17aa 21cf ThinkPad T520 + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c14 6 Series/C200 Series Chipset Family PCI Express Root Port 3 + 1028 04da Vostro 3750 + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c16 6 Series/C200 Series Chipset Family PCI Express Root Port 4 + 1028 04aa XPS 8300 + 17aa 21cf ThinkPad T520 + 1c18 6 Series/C200 Series Chipset Family PCI Express Root Port 5 + 1028 04da Vostro 3750 + 17aa 21cf ThinkPad T520 + 8086 7270 Server Board S1200BTS + 1c1a 6 Series/C200 Series Chipset Family PCI Express Root Port 6 + 1028 04da Vostro 3750 + 1043 844d P8 series motherboard + 1c1c 6 Series/C200 Series Chipset Family PCI Express Root Port 7 + 1c1e 6 Series/C200 Series Chipset Family PCI Express Root Port 8 + 1043 844d P8 series motherboard + 1c20 6 Series/C200 Series Chipset Family High Definition Audio Controller + 1028 0490 Alienware M17x R3 + 1028 04a3 Precision M4600 + 1028 04aa XPS 8300 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 +# Realtek ALC656 + 103c 2abf HP Pavilion p6-2100 Desktop PC Series + 1043 8418 P8P67 Deluxe Motherboard + 1043 841b P8H67 Series Motherboard + 17aa 21cf ThinkPad T520 +# Realtek ALC888 audio codec + 8086 2008 DQ67SW board + 8086 200d DH61CR motherboard + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c22 6 Series/C200 Series Chipset Family SMBus Controller + 1028 04a3 Precision M4600 + 1028 04aa XPS 8300 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 + 8086 200d DH61CR motherboard + 8086 7270 Server Board S1200BT Family / Apple MacBook Pro 8,1/8,2 + 1c24 6 Series/C200 Series Chipset Family Thermal Management Controller + 1c25 6 Series/C200 Series Chipset Family DMI to PCI Bridge + 1c26 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 + 1028 04a3 Precision M4600 + 1028 04aa XPS 8300 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 + 8086 200d DH61CR motherboard + 8086 7270 Server Board S1200BT Family / Apple MacBook Pro 8,1/8,2 + 1c27 6 Series/C200 Series Chipset Family USB Universal Host Controller #1 + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c2c 6 Series/C200 Series Chipset Family USB Universal Host Controller #5 + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c2d 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 + 1028 04a3 Precision M4600 + 1028 04aa XPS 8300 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 + 8086 200d DH61CR motherboard + 8086 7270 Server Board S1200BT Family / Apple MacBook Pro 8,1/8,2 + 1c33 6 Series/C200 Series Chipset Family LAN Controller + 1c35 6 Series/C200 Series Chipset Family VECI Controller + 1c3a 6 Series/C200 Series Chipset Family MEI Controller #1 + 1028 04a3 Precision M4600 + 1028 04aa XPS 8300 + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 + 8086 200d DH61CR motherboard + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c3b 6 Series/C200 Series Chipset Family MEI Controller #2 + 1c3c 6 Series/C200 Series Chipset Family IDE-r Controller + 1c3d 6 Series/C200 Series Chipset Family KT Controller + 1c40 6 Series/C200 Series Chipset Family LPC Controller + 1c41 Mobile SFF 6 Series Chipset Family LPC Controller + 1c42 6 Series/C200 Series Chipset Family LPC Controller + 1c43 Mobile 6 Series Chipset Family LPC Controller + 1c44 Z68 Express Chipset LPC Controller + 1c45 6 Series/C200 Series Chipset Family LPC Controller + 1c46 P67 Express Chipset LPC Controller + 1043 844d P8P67 Deluxe Motherboard + 1c47 UM67 Express Chipset LPC Controller + 1c48 6 Series/C200 Series Chipset Family LPC Controller + 1c49 HM65 Express Chipset LPC Controller + 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] + 1c4a H67 Express Chipset LPC Controller + 1028 04aa XPS 8300 + 1043 844d P8H67 Series Motherboard + 1c4b HM67 Express Chipset LPC Controller + 1028 04b2 Vostro 3350 + 1028 04da Vostro 3750 + 1c4c Q65 Express Chipset LPC Controller + 1c4d QS67 Express Chipset LPC Controller + 1c4e Q67 Express Chipset LPC Controller + 1c4f QM67 Express Chipset LPC Controller + 1028 04a3 Precision M4600 + 17aa 21cf ThinkPad T520 + 1c50 B65 Express Chipset LPC Controller + 1c51 6 Series/C200 Series Chipset Family LPC Controller + 1c52 C202 Chipset LPC Controller + 8086 7270 Server Board S1200BTS + 1c53 6 Series/C200 Series Chipset Family LPC Controller + 1c54 C204 Chipset LPC Controller + 1c55 6 Series/C200 Series Chipset Family LPC Controller + 1c56 C206 Chipset LPC Controller + 1043 844d P8B WS Motherboard + 1c57 6 Series/C200 Series Chipset Family LPC Controller + 1c58 Upgraded B65 Express Chipset LPC Controller + 1c59 Upgraded HM67 Express Chipset LPC Controller + 1c5a Upgraded Q67 Express Chipset LPC Controller + 1c5b 6 Series/C200 Series Chipset Family LPC Controller + 1c5c H61 Express Chipset LPC Controller + 8086 200d DH61CR motherboard + 1c5d 6 Series/C200 Series Chipset Family LPC Controller + 1c5e 6 Series/C200 Series Chipset Family LPC Controller + 1c5f 6 Series/C200 Series Chipset Family LPC Controller + 1d00 C600/X79 series chipset 4-Port SATA IDE Controller + 1d02 C600/X79 series chipset 6-Port SATA AHCI Controller + 1028 04f7 C602J on PowerEdge R320 server + 1d04 C600/X79 series chipset SATA RAID Controller + 1d06 C600/X79 series chipset SATA Premium RAID Controller + 1d08 C600/X79 series chipset 2-Port SATA IDE Controller + 1d10 C600/X79 series chipset PCI Express Root Port 1 + 1028 04f7 C602J on PowerEdge R320 server + 1d11 C600/X79 series chipset PCI Express Root Port 1 + 1d12 C600/X79 series chipset PCI Express Root Port 2 + 1d13 C600/X79 series chipset PCI Express Root Port 2 + 1d14 C600/X79 series chipset PCI Express Root Port 3 + 1d15 C600/X79 series chipset PCI Express Root Port 3 + 1d16 C600/X79 series chipset PCI Express Root Port 4 + 1d17 C600/X79 series chipset PCI Express Root Port 4 + 1d18 C600/X79 series chipset PCI Express Root Port 5 + 1028 04f7 C602J on PowerEdge R320 server + 1d19 C600/X79 series chipset PCI Express Root Port 5 + 1d1a C600/X79 series chipset PCI Express Root Port 6 + 1d1b C600/X79 series chipset PCI Express Root Port 6 + 1d1c C600/X79 series chipset PCI Express Root Port 7 + 1d1d C600/X79 series chipset PCI Express Root Port 7 + 1d1e C600/X79 series chipset PCI Express Root Port 8 + 1028 04f7 C602J on PowerEdge R320 server + 1d1f C600/X79 series chipset PCI Express Root Port 8 + 1d20 C600/X79 series chipset High Definition Audio Controller + 1d22 C600/X79 series chipset SMBus Host Controller + 15d9 066b X9SRL-F + 1d24 C600/X79 series chipset Thermal Management Controller + 15d9 066b X9SRL-F + 1d25 C600/X79 series chipset DMI to PCI Bridge + 1d26 C600/X79 series chipset USB2 Enhanced Host Controller #1 + 1028 04f7 C602J on PowerEdge R320 server + 15d9 066b X9SRL-F + 1d2d C600/X79 series chipset USB2 Enhanced Host Controller #2 + 1028 04f7 C602J on PowerEdge R320 server + 103c 18a9 HP DL360e G8 + 15d9 066b X9SRL-F + 1d33 C600/X79 series chipset LAN Controller + 1d35 C600/X79 series chipset VECI Controller + 1d3a C600/X79 series chipset MEI Controller #1 + 1028 04f7 C602J on PowerEdge R320 server + 15d9 066b X9SRL-F + 1d3b C600/X79 series chipset MEI Controller #2 + 1028 04f7 C602J on PowerEdge R320 server + 15d9 066b X9SRL-F + 1d3c C600/X79 series chipset IDE-r Controller + 1d3d C600/X79 series chipset KT Controller + 1d3e C600/X79 series chipset PCI Express Virtual Root Port + 1028 04f7 C602J on PowerEdge R320 server + 1d3f C608/C606/X79 series chipset PCI Express Virtual Switch Port + 1d40 C600/X79 series chipset LPC Controller + 1d41 C600/X79 series chipset LPC Controller + 1028 04f7 C602J on PowerEdge R320 server + 15d9 066b X9SRL-F + 1d50 C608 chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d54 C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d55 C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit + 1d58 C606 chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d59 C604/X79 series chipset 4-Port SATA/SAS Storage Control Unit + 1d5a C600/X79 series chipset Dual 4-Port SATA Storage Control Unit + 1d5b C602 chipset 4-Port SATA Storage Control Unit + 1d5c C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d5d C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit + 1d5e C600/X79 series chipset Dual 4-Port SATA Storage Control Unit + 1d5f C600/X79 series chipset 4-Port SATA Storage Control Unit + 1d60 C608 chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d64 C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d65 C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit + 1d68 C606 chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d69 C604/X79 series chipset 4-Port SATA/SAS Storage Control Unit + 1d6a C600/X79 series chipset Dual 4-Port SATA Storage Control Unit + 1d6b C602 chipset 4-Port SATA Storage Control Unit + 0497 1028 Dell Precision T3600 + 1d6c C600/X79 series chipset Dual 4-Port SATA/SAS Storage Control Unit + 1d6d C600/X79 series chipset 4-Port SATA/SAS Storage Control Unit + 1d6e C600/X79 series chipset Dual 4-Port SATA Storage Control Unit + 1d6f C600/X79 series chipset 4-Port SATA Storage Control Unit + 1d70 C600/X79 series chipset SMBus Controller 0 + 1d71 C608/C606/X79 series chipset SMBus Controller 1 + 1d72 C608 chipset SMBus Controller 2 + 1d74 C608/C606/X79 series chipset PCI Express Upstream Port + 1d76 C600/X79 series chipset Multi-Function Glue + 1e00 7 Series/C210 Series Chipset Family 4-port SATA Controller [IDE mode] + 1e01 7 Series Chipset Family 4-port SATA Controller [IDE mode] + 144d c652 NP300E5C series laptop + 1e02 7 Series/C210 Series Chipset Family 6-port SATA Controller [AHCI mode] + 1043 84ca P8 series motherboard + 1849 1e02 Motherboard + 1e03 7 Series Chipset Family 6-port SATA Controller [AHCI mode] + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 10cf 16e2 LIFEBOOK E752 + 144d c652 NP300E5C series laptop + 1e04 7 Series/C210 Series Chipset Family SATA Controller [RAID mode] + 1e05 7 Series Chipset SATA Controller [RAID mode] + 1e06 7 Series/C210 Series Chipset Family SATA Controller [RAID mode] + 1e07 7 Series Chipset Family SATA Controller [RAID mode] + 1e08 7 Series/C210 Series Chipset Family 2-port SATA Controller [IDE mode] + 1e09 7 Series Chipset Family 2-port SATA Controller [IDE mode] + 144d c652 NP300E5C series laptop + 1e0e 7 Series/C210 Series Chipset Family SATA Controller [RAID mode] + 1e10 7 Series/C216 Chipset Family PCI Express Root Port 1 + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1043 84ca P8H77-I Motherboard + 10cf 16e9 LIFEBOOK E752 + 144d c652 NP300E5C series laptop + 1849 1e10 Motherboard + 1e12 7 Series/C210 Series Chipset Family PCI Express Root Port 2 + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1e14 7 Series/C210 Series Chipset Family PCI Express Root Port 3 + 10cf 16e9 LIFEBOOK E752 + 1e16 7 Series/C216 Chipset Family PCI Express Root Port 4 + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 144d c652 NP300E5C series laptop + 1849 1618 Z77 Extreme4 motherboard + 1e18 7 Series/C210 Series Chipset Family PCI Express Root Port 5 + 1043 84ca P8H77-I Motherboard + 1849 1e18 Motherboard + 1e1a 7 Series/C210 Series Chipset Family PCI Express Root Port 6 + 1849 1e1a Motherboard + 1e1c 7 Series/C210 Series Chipset Family PCI Express Root Port 7 + 1e1e 7 Series/C210 Series Chipset Family PCI Express Root Port 8 + 10cf 16e9 LIFEBOOK E752 + 1849 1e1e Motherboard + 1e20 7 Series/C216 Chipset Family High Definition Audio Controller + 1028 054b XPS One 2710 + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1043 8415 P8H77-I Motherboard + 1043 8445 P8Z77-V LX Motherboard + 10cf 1757 LIFEBOOK E752 + 144d c652 NP300E5C series laptop + 1849 1898 Z77 Extreme4 motherboard + 1e22 7 Series/C216 Chipset Family SMBus Controller + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1043 84ca P8 series motherboard + 10cf 16e6 LIFEBOOK E752 + 144d c652 NP300E5C series laptop + 1849 1e22 Motherboard + 1e24 7 Series/C210 Series Chipset Family Thermal Management Controller + 1043 1517 Zenbook Prime UX31A + 1e25 7 Series/C210 Series Chipset Family DMI to PCI Bridge + 1e26 7 Series/C216 Chipset Family USB Enhanced Host Controller #1 + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1043 84ca P8 series motherboard + 10cf 16e8 LIFEBOOK E752 + 144d c652 NP300E5C series laptop + 1849 1e26 Motherboard + 1e2d 7 Series/C216 Chipset Family USB Enhanced Host Controller #2 + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1043 84ca P8 series motherboard + 10cf 16e8 LIFEBOOK E752 + 144d c652 NP300E5C series laptop + 1849 1e2d Motherboard + 1e31 7 Series/C210 Series Chipset Family USB xHCI Host Controller + 103c 179b Elitebook 8470p + 103c 17ab ProBook 6570b + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1043 84ca P8 series motherboard + 10cf 16ee LIFEBOOK E752 + 17aa 21f3 ThinkPad T430 + 1849 1e31 Motherboard + 1e33 7 Series/C210 Series Chipset Family LAN Controller + 1e3a 7 Series/C216 Chipset Family MEI Controller #1 + 1043 108d VivoBook X202EV + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 1043 84ca P8 series motherboard + 10cf 16ea LIFEBOOK E752 + 144d c652 NP300E5C series laptop + 1849 1e3a Motherboard + 1e3b 7 Series/C210 Series Chipset Family MEI Controller #2 + 1e3c 7 Series/C210 Series Chipset Family IDE-r Controller + 1e3d 7 Series/C210 Series Chipset Family KT Controller + 1e41 7 Series Chipset Family LPC Controller + 1e42 7 Series Chipset Family LPC Controller + 1e43 7 Series Chipset Family LPC Controller + 1e44 Z77 Express Chipset LPC Controller + 1043 84ca P8 series motherboard + 1849 1e44 Motherboard + 1e45 7 Series Chipset Family LPC Controller + 1e46 Z75 Express Chipset LPC Controller + 1e47 Q77 Express Chipset LPC Controller + 1e48 Q75 Express Chipset LPC Controller + 1e49 B75 Express Chipset LPC Controller + 1e4a H77 Express Chipset LPC Controller + 1043 84ca P8H77-I Motherboard + 1e4b 7 Series Chipset Family LPC Controller + 1e4c 7 Series Chipset Family LPC Controller + 1e4d 7 Series Chipset Family LPC Controller + 1e4e 7 Series Chipset Family LPC Controller + 1e4f 7 Series Chipset Family LPC Controller + 1e50 7 Series Chipset Family LPC Controller + 1e51 7 Series Chipset Family LPC Controller + 1e52 7 Series Chipset Family LPC Controller + 1e53 C216 Series Chipset LPC Controller + 1e54 7 Series Chipset Family LPC Controller + 1e55 QM77 Express Chipset LPC Controller + 1e56 QS77 Express Chipset LPC Controller + 1e57 HM77 Express Chipset LPC Controller + 1e58 UM77 Express Chipset LPC Controller + 1e59 HM76 Express Chipset LPC Controller + 1043 1477 N56VZ + 1043 1517 Zenbook Prime UX31A + 10cf 16e0 LIFEBOOK E752 + 1e5a 7 Series Chipset Family LPC Controller + 1e5b UM77 Express Chipset LPC Controller + 1e5c 7 Series Chipset Family LPC Controller + 1e5d HM75 Express Chipset LPC Controller + 144d c652 NP300E5C series laptop + 1e5e HM70 Express Chipset LPC Controller + 1043 108d VivoBook X202EV + 1e5f NM70 Express Chipset LPC Controller + 1f00 Atom processor C2000 SoC Transaction Router + 1f01 Atom processor C2000 SoC Transaction Router + 1f02 Atom processor C2000 SoC Transaction Router + 1f03 Atom processor C2000 SoC Transaction Router + 1f04 Atom processor C2000 SoC Transaction Router + 1f05 Atom processor C2000 SoC Transaction Router + 1f06 Atom processor C2000 SoC Transaction Router + 1f07 Atom processor C2000 SoC Transaction Router + 1f08 Atom processor C2000 SoC Transaction Router + 1f09 Atom processor C2000 SoC Transaction Router + 1f0a Atom processor C2000 SoC Transaction Router + 1f0b Atom processor C2000 SoC Transaction Router + 1f0c Atom processor C2000 SoC Transaction Router + 1f0d Atom processor C2000 SoC Transaction Router + 1f0e Atom processor C2000 SoC Transaction Router + 1f0f Atom processor C2000 SoC Transaction Router + 1f10 Atom processor C2000 PCIe Root Port 1 + 1f11 Atom processor C2000 PCIe Root Port 2 + 1f12 Atom processor C2000 PCIe Root Port 3 + 1f13 Atom processor C2000 PCIe Root Port 4 + 1f14 Atom processor C2000 RAS + 1f15 Atom processor C2000 SMBus 2.0 + 1f16 Atom processor C2000 RCEC + 1f18 Atom processor C2000 QAT + 1f19 Atom processor C2000 QAT + 1f20 Atom processor C2000 4-Port IDE SATA2 Controller + 1f21 Atom processor C2000 4-Port IDE SATA2 Controller + 1f22 Atom processor C2000 AHCI SATA2 Controller + 1f23 Atom processor C2000 AHCI SATA2 Controller + 1f24 Atom processor C2000 RAID SATA2 Controller + 1f25 Atom processor C2000 RAID SATA2 Controller + 1f26 Atom processor C2000 RAID SATA2 Controller + 1f27 Atom processor C2000 RAID SATA2 Controller + 1f2c Atom processor C2000 USB Enhanced Host Controller + 0200 1028 Atom C2338 on Dell 0K8Y0N motherboard + 1f2e Atom processor C2000 RAID SATA2 Controller + 1f2f Atom processor C2000 RAID SATA2 Controller + 1f30 Atom processor C2000 2-Port IDE SATA3 Controller + 1f31 Atom processor C2000 2-Port IDE SATA3 Controller + 1f32 Atom processor C2000 AHCI SATA3 Controller + 1f33 Atom processor C2000 AHCI SATA3 Controller + 1f34 Atom processor C2000 RAID SATA3 Controller + 1f35 Atom processor C2000 RAID SATA3 Controller + 1f36 Atom processor C2000 RAID SATA3 Controller + 1f37 Atom processor C2000 RAID SATA3 Controller + 1f38 Atom processor C2000 PCU + 1f39 Atom processor C2000 PCU + 1f3a Atom processor C2000 PCU + 1f3b Atom processor C2000 PCU + 1f3c Atom processor C2000 PCU SMBus + 1f3d Atom Processor C2000 PECI SMBus + 1f3e Atom processor C2000 RAID SATA3 Controller + 1f3f Atom processor C2000 RAID SATA3 Controller + 1f40 Ethernet Connection I354 1.0 GbE Backplane + 1028 05f1 Ethernet Connection I354 1.0 GbE Backplane + 1f41 Ethernet Connection I354 + 1f42 Atom processor C2000 GbE + 1f44 Atom processor C2000 GbE Virtual Function + 1f45 Ethernet Connection I354 2.5 GbE Backplane + 2014 Sky Lake-E Ubox Registers + 2015 Sky Lake-E Ubox Registers + 2016 Sky Lake-E Ubox Registers + 2018 Sky Lake-E M2PCI Registers + 201a Sky Lake-E Non-Transparent Bridge Registers + 201c Sky Lake-E Non-Transparent Bridge Registers + 201d Volume Management Device NVMe RAID Controller + 2020 Sky Lake-E DMI3 Registers + 15d9 095d X11SPM-TF + 2021 Sky Lake-E CBDMA Registers + 2024 Sky Lake-E MM/Vt-d Configuration Registers + 2025 Sky Lake-E RAS + 2026 Sky Lake-E IOAPIC + 2030 Sky Lake-E PCI Express Root Port A + 2031 Sky Lake-E PCI Express Root Port B + 2032 Sky Lake-E PCI Express Root Port C + 2033 Sky Lake-E PCI Express Root Port D + 2034 Sky Lake-E VT-d + 2035 Sky Lake-E RAS Configuration Registers + 2036 Sky Lake-E IOxAPIC Configuration Registers + 2040 Sky Lake-E Integrated Memory Controller + 2041 Sky Lake-E Integrated Memory Controller + 2042 Sky Lake-E Integrated Memory Controller + 2043 Sky Lake-E Integrated Memory Controller + 2044 Sky Lake-E Integrated Memory Controller + 2045 Sky Lake-E LM Channel 1 + 2046 Sky Lake-E LMS Channel 1 + 2047 Sky Lake-E LMDP Channel 1 + 2048 Sky Lake-E DECS Channel 2 + 2049 Sky Lake-E LM Channel 2 + 204a Sky Lake-E LMS Channel 2 + 204b Sky Lake-E LMDP Channel 2 + 204c Sky Lake-E M3KTI Registers + 204d Sky Lake-E M3KTI Registers + 204e Sky Lake-E M3KTI Registers + 2054 Sky Lake-E CHA Registers + 2055 Sky Lake-E CHA Registers + 2056 Sky Lake-E CHA Registers + 2057 Sky Lake-E CHA Registers + 2058 Sky Lake-E KTI 0 + 2059 Sky Lake-E UPI Registers + 2066 Sky Lake-E Integrated Memory Controller + 2068 Sky Lake-E DDRIO Registers + 2069 Sky Lake-E DDRIO Registers + 206a Sky Lake-E IOxAPIC Configuration Registers + 206e Sky Lake-E DDRIO Registers + 206f Sky Lake-E DDRIO Registers + 2078 Sky Lake-E PCU Registers + 207a Sky Lake-E PCU Registers + 2080 Sky Lake-E PCU Registers + 2081 Sky Lake-E PCU Registers + 2082 Sky Lake-E PCU Registers + 2083 Sky Lake-E PCU Registers + 2084 Sky Lake-E PCU Registers + 2085 Sky Lake-E PCU Registers + 2086 Sky Lake-E PCU Registers + 2088 Sky Lake-E DDRIO Registers + 208d Sky Lake-E CHA Registers + 208e Sky Lake-E CHA Registers + 2241 Larrabee + 2250 Xeon Phi coprocessor 5100 series + 225c Xeon Phi coprocessor SE10/7120 series + 225d Xeon Phi coprocessor 3120 series + 225e Xeon Phi coprocessor 31S1 + 2262 Xeon Phi coprocessor 7220 + 2280 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SoC Transaction Register + 2284 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series High Definition Audio Controller + 2286 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO1 DMA Controller + 228a Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO1 HSUART Controller #1 + 228c Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO1 HSUART Controller #2 + 2292 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx SMBus Controller + 2294 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series MMC Controller + 2295 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SDIO Controller + 2296 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SD Controller + 2298 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Trusted Execution Engine + 229c Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCU + 22a3 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SATA Controller + 22a4 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SATA AHCI Controller + 22a8 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Low Power Engine Audio + 22b0 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller + 22b1 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller + 22b5 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series USB xHCI Controller + 22b8 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Imaging Unit + 22c0 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 DMA Controller + 22c1 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 I2C Controller #1 + 22c2 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 I2C Controller #2 + 22c3 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 I2C Controller #3 + 22c4 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 I2C Controller #4 + 22c5 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 I2C Controller #5 + 22c6 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 I2C Controller #6 + 22c7 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series LPIO2 I2C Controller #7 + 22c8 Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCI Express Port #1 + 22ca Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCI Express Port #2 + 22cc Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCI Express Port #3 + 22ce Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCI Express Port #4 + 22dc Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Power Management Controller + 2310 DH89xxCC LPC Controller + 2323 DH89xxCC 4 Port SATA AHCI Controller + 2330 DH89xxCC SMBus Controller + 2331 DH89xxCC Chap Counter + 2332 DH89xxCC Thermal Subsystem + 2334 DH89xxCC USB2 Enhanced Host Controller #1 + 2335 DH89xxCC USB2 Enhanced Host Controller #1 + 2342 DH89xxCC PCI Express Root Port #1 + 2343 DH89xxCC PCI Express Root Port #1 + 2344 DH89xxCC PCI Express Root Port #2 + 2345 DH89xxCC PCI Express Root Port #2 + 2346 DH89xxCC PCI Express Root Port #3 + 2347 DH89xxCC PCI Express Root Port #3 + 2348 DH89xxCC PCI Express Root Port #4 + 2349 DH89xxCC PCI Express Root Port #4 + 2360 DH89xxCC Watchdog Timer + 2364 DH89xxCC MEI 0 + 2365 DH89xxCC MEI 1 + 2390 DH895XCC Series LPC Controller + 23a1 DH895XCC Series 2-Port SATA Controller [IDE Mode] + 23a3 DH895XCC Series 4-Port SATA Controller [AHCI Mode] + 23a6 DH895XCC Series 2-Port SATA Controller [IDE Mode] + 23b0 DH895XCC Series SMBus Controller + 23b1 DH895XCC Series CHAP Counter + 23b2 DH895XCC Series Thermal Management Controller + 23b4 DH895XCC Series USB2 Enhanced Host Controller #1 + 23b5 DH895XCC Series USB2 Enhanced Host Controller #1 + 23c2 DH895XCC Series PCI Express Root Port #1 + 23c3 DH895XCC Series PCI Express Root Port #1 + 23c4 DH895XCC Series PCI Express Root Port #2 + 23c5 DH895XCC Series PCI Express Root Port #2 + 23c6 CDH895XCC Series PCI Express Root Port #3 + 23c7 DH895XCC Series PCI Express Root Port #3 + 23c8 DH895XCC Series PCI Express Root Port #4 + 23c9 DH895XCC Series PCI Express Root Port #4 + 23e0 DH895XCC Series Watchdog Timer + 23e4 DH895XCC Series MEI Controller #1 + 23e5 DH895XCC Series MEI Controller #2 + 2410 82801AA ISA Bridge (LPC) + 2411 82801AA IDE Controller + 2412 82801AA USB Controller + 2413 82801AA SMBus Controller + 2415 82801AA AC'97 Audio Controller + 1028 0095 Precision Workstation 220 Integrated Digital Audio + 1028 00b4 OptiPlex GX110 + 110a 0051 Activy 2xx + 11d4 0040 SoundMAX Integrated Digital Audio + 11d4 0048 SoundMAX Integrated Digital Audio + 11d4 5340 SoundMAX Integrated Digital Audio + 1734 1025 Activy 3xx + 1af4 1100 QEMU Virtual Machine + 2416 82801AA AC'97 Modem Controller + 2418 82801AA PCI Bridge + 2420 82801AB ISA Bridge (LPC) + 2421 82801AB IDE Controller + 2422 82801AB USB Controller + 2423 82801AB SMBus Controller + 2425 82801AB AC'97 Audio Controller + 11d4 0040 SoundMAX Integrated Digital Audio + 11d4 0048 SoundMAX Integrated Digital Audio + 2426 82801AB AC'97 Modem Controller + 2428 82801AB PCI Bridge + 2440 82801BA ISA Bridge (LPC) + 8086 5744 S845WD1-E + 2442 82801BA/BAM UHCI USB 1.1 Controller #1 + 1014 01c6 Netvista A40/A40p + 1025 1016 Travelmate 612 TX + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 147b 0505 BL7 motherboard + 147b 0507 TH7II-RAID + 8086 4532 Desktop Board D815EEA2/D815EFV + 8086 4557 D815EGEW Mainboard + 8086 4d44 D850EMV2 motherboard + 8086 5744 S845WD1-E mainboard + 2443 82801BA/BAM SMBus Controller + 1014 01c6 Netvista A40/A40p + 1025 1016 Travelmate 612 TX + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 147b 0505 BL7 motherboard + 147b 0507 TH7II-RAID + 15d9 3280 Supermicro P4SBE Mainboard + 8086 4532 Desktop Board D815EEA2/D815EFV + 8086 4557 D815EGEW Mainboard + 8086 5744 S845WD1-E mainboard + 2444 82801BA/BAM UHCI USB 1.1 Controller #2 + 1025 1016 Travelmate 612 TX + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 104d 80df Vaio PCG-FX403 + 147b 0505 BL7 motherboard + 147b 0507 TH7II-RAID + 8086 4532 Desktop Board D815EEA2/D815EFV + 8086 5744 S845WD1-E mainboard + 2445 82801BA/BAM AC'97 Audio Controller + 0e11 000b Compaq Deskpro EN Audio + 0e11 0088 Evo D500 + 1014 01c6 Netvista A40/A40p + 1025 1016 Travelmate 612 TX + 1028 00d8 Precision 530 + 103c 126f e-pc 40 + 104d 80df Vaio PCG-FX403 + 1462 3370 STAC9721 AC + 147b 0505 BL7 motherboard + 147b 0507 TH7II-RAID + 8086 4557 D815EGEW Mainboard + 8086 4656 Desktop Board D815EFV + 8086 4d44 D850EMV2 motherboard + 2446 82801BA/BAM AC'97 Modem Controller + 1025 1016 Travelmate 612 TX + 104d 80df Vaio PCG-FX403 + 2448 82801 Mobile PCI Bridge + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 103c 0934 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 103c 30c1 Compaq 6910p + 1043 1017 X58LE + 104d 902d VAIO VGN-NR120E + 105b 0d7c D270S/D250S Motherboard + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 144d c00c P30 notebook + 144d c06a R730 Laptop + 144d c072 Notebook N150P + 1458 5000 GA-D525TUD + 1734 1055 Amilo M1420 + 17aa 2013 ThinkPad R60e + 17aa 20ae ThinkPad T61/R61 + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + 8086 544b Desktop Board D425KT + e4bf cc47 CCG-RUMBA + 2449 82801BA/BAM/CA/CAM Ethernet Controller + 0e11 0012 EtherExpress PRO/100 VM + 0e11 0091 EtherExpress PRO/100 VE + 1014 01ce EtherExpress PRO/100 VE + 1014 01dc EtherExpress PRO/100 VE + 1014 01eb EtherExpress PRO/100 VE + 1014 01ec EtherExpress PRO/100 VE + 1014 0202 EtherExpress PRO/100 VE + 1014 0205 EtherExpress PRO/100 VE + 1014 0217 EtherExpress PRO/100 VE + 1014 0234 EtherExpress PRO/100 VE + 1014 023d EtherExpress PRO/100 VE + 1014 0244 EtherExpress PRO/100 VE + 1014 0245 EtherExpress PRO/100 VE + 1014 0265 PRO/100 VE Desktop Connection + 1014 0267 PRO/100 VE Desktop Connection + 1014 026a PRO/100 VE Desktop Connection + 109f 315d EtherExpress PRO/100 VE + 109f 3181 EtherExpress PRO/100 VE + 1179 ff01 PRO/100 VE Network Connection + 1186 7801 EtherExpress PRO/100 VE + 144d 2602 HomePNA 1M CNR + 1af4 1100 QEMU Virtual Machine + 8086 3010 EtherExpress PRO/100 VE + 8086 3011 EtherExpress PRO/100 VM + 8086 3012 82562EH based Phoneline + 8086 3013 EtherExpress PRO/100 VE + 8086 3014 EtherExpress PRO/100 VM + 8086 3015 82562EH based Phoneline + 8086 3016 EtherExpress PRO/100 P Mobile Combo + 8086 3017 EtherExpress PRO/100 P Mobile + 8086 3018 EtherExpress PRO/100 + 244a 82801BAM IDE U100 Controller + 1025 1016 Travelmate 612TX + 104d 80df Vaio PCG-FX403 + 244b 82801BA IDE U100 Controller + 1014 01c6 Netvista A40/A40p + 1028 00c7 Dimension 8100 + 1028 00d8 Precision 530 + 1028 010e Optiplex GX240 + 103c 126f e-pc 40 + 1043 8027 TUSL2-C Mainboard + 147b 0505 BL7 motherboard + 147b 0507 TH7II-RAID + 15d9 3280 Supermicro P4SBE Mainboard + 8086 4532 Desktop Board D815EEA2/D815EFV + 8086 4557 D815EGEW Mainboard + 8086 4d44 D850EMV2 motherboard + 8086 5744 S845WD1-E mainboard + 244c 82801BAM ISA Bridge (LPC) + 244e 82801 PCI Bridge + 1014 0267 NetVista A30p + 1028 020d Inspiron 530 + 1028 0211 Optiplex 755 + 1028 02da OptiPlex 980 + 1028 04f7 PowerEdge R320 server + 103c 2a3b Pavilion A1512X + 103c 2a6f Asus IPIBL-LB Motherboard + 103c 31fe ProLiant DL140 G3 + 103c 330b ProLiant ML150 G6 Server +# same ID possibly also on other ASUS boards + 1043 8277 P5K PRO Motherboard + 1043 844d P8 series motherboard + 1043 8534 ASUS B85-PLUS + 1458 5000 Motherboard + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7418 Wind PC MS-7418 + 15d9 060d C7SIM-Q Motherboard + 15d9 9680 X7DBN Motherboard + 1775 11cc CC11/CL11 + 8086 7270 Server Board S1200BTS + 2450 82801E ISA Bridge (LPC) + 2452 82801E USB Controller + 2453 82801E SMBus Controller + 2459 82801E Ethernet Controller 0 + 245b 82801E IDE U100 Controller + 245d 82801E Ethernet Controller 1 + 245e 82801E PCI Bridge + 2480 82801CA LPC Interface Controller + 2482 82801CA/CAM USB Controller #1 + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 8086 3424 SE7501HG2 Mainboard + 8086 4541 Latitude C640 + 2483 82801CA/CAM SMBus Controller + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 2484 82801CA/CAM USB Controller #2 + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 2485 82801CA/CAM AC'97 Audio Controller + 1013 5959 Crystal WMD Audio Codec + 1014 0222 ThinkPad A30/A30p/T23 + 1014 0508 ThinkPad T30 + 1014 051c ThinkPad A/T/X Series + 1043 1583 L3C (SPDIF) + 1043 1623 L2B (no SPDIF) + 1043 1643 L3F + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 144d c006 vpr Matrix 170B4 + 2486 82801CA/CAM AC'97 Modem Controller + 1014 0223 ThinkPad A/T/X Series + 1014 0503 ThinkPad R31 + 1014 051a ThinkPad A/T/X Series + 101f 1025 620 Series + 1043 1496 PCtel HSP56 MR + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 134d 4c21 Dell Inspiron 2100 internal modem + 144d 2115 vpr Matrix 170B4 internal modem + 14f1 5421 MD56ORD V.92 MDC Modem + 2487 82801CA/CAM USB Controller #3 + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 15d9 3480 P4DP6 + 8086 1958 vpr Matrix 170B4 + 248a 82801CAM IDE U100 Controller + 0e11 0030 Evo N600c + 1014 0220 ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 8086 1958 vpr Matrix 170B4 + 8086 4541 Latitude C640 + 248b 82801CA Ultra ATA Storage Controller + 15d9 3480 P4DP6 + 248c 82801CAM ISA Bridge (LPC) + 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge + 1014 0267 NetVista A30p + 1462 5800 845PE Max (MS-6580) + 24c1 82801DBL (ICH4-L) IDE Controller + 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 0126 Optiplex GX260 + 1028 0160 Dimension 2400 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 114a 0582 PC8 onboard USB 1.x + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1462 5800 845PE Max (MS-6580) + 1509 2990 Averatec 5110H laptop + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 1734 1055 Amilo M1420 + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + 8086 4541 Latitude D400/D500 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 0126 Optiplex GX260 + 1028 014f Latitude X300 + 1028 0160 Dimension 2400 + 1028 018d Inspiron 700m/710m + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1071 8160 MIM2000 + 114a 0582 PC8 onboard SMbus + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1458 24c2 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 1734 1055 Amilo M1420 + 4c53 1090 Cx9 / Vx9 mainboard + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 0126 Optiplex GX260 + 1028 0160 Dimension 2400 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 144d c00c P30/P35 notebook + 1462 5800 845PE Max (MS-6580) + 1509 2990 Averatec 5110H + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + 8086 4541 Latitude D400/D500 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller + 0e11 00b8 Analog Devices Inc. codec [SoundMAX] + 1014 0267 NetVista A30p + 1014 0537 ThinkPad T4x Series + 1014 055f Thinkpad R50e model 1634 + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0152 Latitude D500 + 1028 0160 Dimension 2400 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m [SigmaTel STAC9750,51] + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 1713 M2400N/M6800N laptop + 1043 80b0 P4B533 + 1071 8160 MIM2000 + 1179 0201 Toshiba Tecra M1 + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1458 a002 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 1734 1005 D1451 (SCENIC N300, i845GV) Sigmatel STAC9750T + 1734 1055 Amilo M1420 + 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller + 1014 0524 ThinkPad T4x Series + 1014 0525 ThinkPad + 1014 0559 ThinkPad R50e + 1025 003c Aspire 2001WLCi (Compal CL50 motherboard) implementation + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 1716 M2400N laptop + 1043 1826 M6800N + 1071 8160 MIM2000 + 134d 4c21 Latitude D500 + 144d 2115 X10 Laptop + 144d c00c P30/P35 notebook +# Conexant HSF Softmodem (CXT22) + 14f1 5422 D480 MDC V.9x Modem + 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 + 1014 0267 NetVista A30p + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 0126 Optiplex GX260 + 1028 0160 Dimension 2400 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 144d c00c P30/P35 notebook + 1462 5800 845PE Max (MS-6580) + 1509 2990 Averatec 5110H + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + 8086 4541 Latitude D400/D500 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24ca 82801DBM (ICH4-M) IDE Controller + 1014 052d ThinkPad + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 014f Latitude X300 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1071 8160 MIM2000 + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1734 1055 Amilo M1420 + 8086 4541 Latitude D400/D500 + 24cb 82801DB (ICH4) IDE Controller + 1014 0267 NetVista A30p + 1028 0126 Optiplex GX260 + 1028 0160 Dimension 2400 + 1043 8089 P4B533 + 114a 0582 PC8 onboard IDE + 1458 24c2 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 4c53 1090 Cx9 / Vx9 mainboard + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24cc 82801DBM (ICH4-M) LPC Interface Bridge + 144d c00c P30 notebook + 1734 1055 Amilo M1420 + 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller + 1014 0267 NetVista A30p + 1014 052e ThinkPad + 1025 005a TravelMate 290 + 1025 0064 Extensa 3000 series laptop: Intel 82801DBM (ICH4-M) + 1028 011d Latitude D600 + 1028 0126 Optiplex GX260 + 1028 0139 Latitude D400 + 1028 0152 Latitude D500 + 1028 0160 Dimension 2400 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 1043 8089 P4B533 + 1071 8160 MIM2000 + 114a 0582 PC8 onboard USB 2.0 + 1179 ff00 Satellite 2430 + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 1462 3981 845PE Max (MS-6580) + 1509 1968 Averatec 5110H + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 1734 1055 Amilo M1420 + 1af4 1100 QEMU Virtual Machine + 4c53 1090 Cx9 / Vx9 mainboard + 8086 24c2 Latitude X300 + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge + 24d1 82801EB (ICH5) SATA Controller + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 1028 019a PowerEdge SC1425 + 103c 12bc d530 CMT (DG746A) + 103c 3208 ProLiant DL140 G2 + 1043 80a6 P4P800 series motherboard + 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 5200 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 + 1014 0287 ThinkCentre S50 + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard UHCI + 1028 016d PowerEdge 2850 onboard UHCI + 1028 0170 PowerEdge 6850 onboard UHCI + 1028 0183 PowerEdge 1800 + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 103c 3208 ProLiant DL140 G2 + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000/8KNXP motherboard + 1462 7280 865PE Neo2 (MS-6728) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller + 1014 0287 ThinkCentre S50 + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0156 Precision 360 + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 103c 12bc d330 uT + 103c 3208 ProLiant DL140 G2 + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series SMBus + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 + 1014 0287 ThinkCentre S50 + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard UHCI + 1028 016d PowerEdge 2850 onboard UHCI + 1028 0170 PowerEdge 6850 onboard UHCI + 1028 0183 PowerEdge 1800 + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 103c 3208 ProLiant DL140 G2 + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller + 100a 147b Abit IS7-E motherboard + 1014 0287 ThinkCentre S50 + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 103c 006a NX9500 + 103c 12bc d330 uT + 1043 80f3 P4P800 series motherboard + 1043 810f P5P800-MX Mainboard + 1458 a002 GA-8IPE1000/8KNXP motherboard + 1462 0080 865PE Neo2-V (MS-6788) Mainboard + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 8086 a000 D865PERL mainboard + 8086 e000 D865PERL mainboard + 8086 e001 Desktop Board D865GBF + 8086 e002 SoundMax Integrated Digital Audio + 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller + 103c 006a NX9500 + 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3 + 1014 0287 ThinkCentre S50 + 1014 02ed xSeries server mainboard + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard UHCI + 1028 016d PowerEdge 2850 onboard UHCI + 1028 0170 PowerEdge 6850 onboard UHCI + 1028 0183 PowerEdge 1800 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24db 82801EB/ER (ICH5/ICH5R) IDE Controller + 1014 0287 ThinkCentre S50 + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 IDE Controller + 1028 016d PowerEdge 2850 IDE Controller + 1028 0170 PowerEdge 6850 IDE Controller + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7580 MSI 875P + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard IDE + 8086 24db P4C800 Mainboard + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24dc 82801EB (ICH5) LPC Interface Bridge + 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller + 1014 0287 ThinkCentre S50 + 1014 02dd eServer xSeries server mainboard + 1014 02ed eServer xSeries server mainboard + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 1028 016c PowerEdge 1850 onboard EHCI + 1028 016d PowerEdge 2850 onboard EHCI + 1028 0170 PowerEdge 6850 onboard EHCI + 1028 0183 PowerEdge 1800 + 1028 019a PowerEdge SC1425 + 103c 006a NX9500 + 103c 12bc d530 CMT (DG746A) + 103c 3208 ProLiant DL140 G2 + 1043 80a6 P4P800/P5P800 series motherboard + 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4 + 1014 0287 ThinkCentre S50 + 1014 02ed xSeries server mainboard + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 1043 80a6 P4P800/P5P800 series motherboard + 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) + 1462 7280 865PE Neo2 (MS-6728) + 1462 7650 Hetis 865GV-E (MS-7065) + 1565 3101 P4TSV Motherboard (865G) + 15d9 4580 P4SCE Mainboard + 1734 101c PRIMERGY RX/TX S2 series onboard UHCI + 8086 3427 S875WP1-E mainboard + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 8086 524c D865PERL mainboard + 24df 82801ER (ICH5R) SATA Controller + 1028 0168 Precision Workstation 670 Mainboard + 24f0 Omni-Path HFI Silicon 100 Series [discrete] + 10a9 802e Omni-path HFI 100 Series, 1-port A-board + 10a9 802f Omni-path HFI 100 Series, 2-port A-board + 10a9 8030 Omni-path HFI 100 Series, 1-port B-board + 10a9 8031 Omni-path HFI 100 Series, 2-port B-board + 1590 00e7 100Gb 1-port OP101 QSFP28 x8 PCIe Gen3 with Intel Omni-Path Adapter + 1590 00e8 100Gb 1-port OP101 QSFP28 x16 PCIe Gen3 with Intel Omni-Path Adapter + 1590 021c Apollo 100Gb 1-port Intel Omni-Path Architecture 860z Mezzanine FIO Adapter + 15d9 0934 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, SIOM Module + 15d9 099b Omni-path HFI Mezz AOC, 1 Port, PCIe x16. + 1cb8 0001 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600 QSFP28 + 1cb8 0002 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC6600 Fixed Port + 1cb8 0003 Omni-Path HFI Adapter 100 Series, 2 Port, 2 PCIe x16, Earth Simulation QSFP28 + 1cb8 0004 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600E QSFP28 + 434e 0001 Omni-Path HFI Adapter 100 Series, 1 Port, OCP 3.0 + 434e 2628 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16 + 8086 2628 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16 + 8086 2629 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x8 + 8086 262a Omni-Path HFI Adapter 100 Series, 2 Ports, Split PCIe x16 + 8086 262d Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, IO Module AHWKPTP100HF + 24f1 Omni-Path HFI Silicon 100 Series [integrated] + 24f3 Wireless 8260 +# Snow Field Peak AC + 8086 0010 Dual Band Wireless-AC 8260 + 8086 1010 Dual Band Wireless-AC 8260 + 24f4 Wireless 8260 +# Snow Field Peak AC + 8086 0030 Dual Band Wireless-AC 8260 + 24fb Dual Band Wireless-AC 3168NGW [Stone Peak] + 24fd Wireless 8265 / 8275 +# Windstorm Peak + 8086 0010 Dual Band Wireless-AC 8265 + 8086 0150 Dual Band Wireless-AC 8265 + 8086 1010 Dual Band Wireless-AC 8265 + 8086 1130 Dual Band Wireless-AC 8265 + 2500 82820 820 (Camino) Chipset Host Bridge (MCH) + 1028 0095 Precision Workstation 220 Chipset + 1043 801c P3C-2000 system chipset + 2501 82820 820 (Camino) Chipset Host Bridge (MCH) + 1043 801c P3C-2000 system chipset + 250b 82820 820 (Camino) Chipset Host Bridge + 250f 82820 820 (Camino) Chipset AGP Bridge + 2520 82805AA MTH Memory Translator Hub + 2521 82804AA MRH-S Memory Repeater Hub for SDRAM + 2522 NVMe Optane Memory Series + 8086 3806 Optane Memory 16GB + 8086 3810 Optane Memory M10 16GB + 2526 Wireless-AC 9260 + 2530 82850 850 (Tehama) Chipset Host Bridge (MCH) + 1028 00c7 Dimension 8100 + 147b 0507 TH7II-RAID + 2531 82860 860 (Wombat) Chipset Host Bridge (MCH) + 1028 00d8 Precision 530 + 2532 82850 850 (Tehama) Chipset AGP Bridge + 2533 82860 860 (Wombat) Chipset AGP Bridge + 2534 82860 860 (Wombat) Chipset PCI Bridge + 2540 E7500 Memory Controller Hub + 15d9 3480 P4DP6 + 2541 E7500/E7501 Host RASUM Controller + 15d9 3480 P4DP6 + 4c53 1090 Cx9 / Vx9 mainboard + 8086 3424 SE7501HG2 Mainboard + 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge + 2544 E7500/E7501 Hub Interface B RASUM Controller + 4c53 1090 Cx9 / Vx9 mainboard + 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge + 2546 E7500/E7501 Hub Interface C RASUM Controller + 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge + 2548 E7500/E7501 Hub Interface D RASUM Controller + 254c E7501 Memory Controller Hub + 4c53 1090 Cx9 / Vx9 mainboard + 8086 3424 SE7501HG2 Mainboard + 2550 E7505 Memory Controller Hub + 2551 E7505/E7205 Series RAS Controller + 2552 E7505/E7205 PCI-to-AGP Bridge + 2553 E7505 Hub Interface B PCI-to-PCI Bridge + 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller + 255d E7205 Memory Controller Hub + 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface + 1028 0126 Optiplex GX260 + 1458 2560 GA-8PE667 Ultra + 1462 5800 845PE Max (MS-6580) + 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge + 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device + 0e11 00b9 Evo D510 SFF + 1014 0267 NetVista A30p + 1028 0160 Dimension 2400 + 1734 1003 D1521 Mainboard (Fujitsu-Siemens) + 1734 1004 D1451 Mainboard (SCENIC N300, i845GV) + 2570 82865G/PE/P DRAM Controller/Host-Hub Interface + 103c 006a NX9500 + 103c 12bc d330 uT + 1043 80f2 P4P800/P5P800 series motherboard + 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE) + 2571 82865G/PE/P AGP Bridge + 2572 82865G Integrated Graphics Controller + 1014 0287 ThinkCentre S50 + 1028 019d Dimension 3000 + 103c 12bc D530 sff(dc578av) + 1043 80a5 P5P800-MX Mainboard + 1462 7650 Hetis 865GV-E (MS-7065) + 1734 101b Fujitsu-Siemens Scenic E300 i865GV + 8086 4246 Desktop Board D865GBF + 8086 4c43 Desktop Board D865GLC + 2573 82865G/PE/P PCI to CSA Bridge + 2576 82865G/PE/P Processor to I/O Memory Interface + 2578 82875P/E7210 Memory Controller Hub + 1458 2578 GA-8KNXP motherboard (875P) + 1462 7580 MS-6758 (875P Neo) + 15d9 4580 P4SCE Motherboard + 2579 82875P Processor to AGP Controller + 257b 82875P/E7210 Processor to PCI to CSA Bridge + 257e 82875P/E7210 Processor to I/O Memory Interface + 2580 82915G/P/GV/GL/PL/910GL Memory Controller Hub + 1458 2580 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105b Scenic W620 + 2581 82915G/P/GV/GL/PL/910GL PCI Express Root Port + 2582 82915G/GV/910GL Integrated Graphics Controller + 1028 1079 Optiplex GX280 + 103c 3006 DC7100 SFF(DX878AV) + 1043 2582 P5GD1-VW Mainboard + 1458 2582 GA-8I915ME-G Mainboard + 1734 105b Scenic W620 + 1849 2582 ASRock P4Dual-915GL + 2584 82925X/XE Memory Controller Hub + 1028 0177 Dimension 8400 + 2585 82925X/XE PCI Express Root Port + 2588 E7220/E7221 Memory Controller Hub + 2589 E7220/E7221 PCI Express Root Port + 258a E7221 Integrated Graphics Controller + 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller + 1014 0575 ThinkPad X41 / Z60t + 1028 0182 Latitude C610 + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 1043 82d9 Asus Eee PC 900 + 104d 81b7 Vaio VGN-S3XP + a304 81b7 Vaio VGN-S3XP + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2591 Mobile 915GM/PM Express PCI Express Root Port + 103c 0934 Compaq nw8240 Mobile Workstation + 2592 Mobile 915GM/GMS/910GML Express Graphics Controller + 1014 0582 ThinkPad X41 + 103c 099c NX6110/NC6120 + 103c 308a NC6220 + 1043 1881 GMA 900 915GM Integrated Graphics + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 25a1 6300ESB LPC Interface Controller + 25a2 6300ESB PATA Storage Controller + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 10d0 V5D Single Board Computer IDE + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + 25a3 6300ESB SATA Storage Controller + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25a4 6300ESB SMBus Controller + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 10d0 V5D Single Board Computer + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25a6 6300ESB AC'97 Audio Controller + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 25a7 6300ESB AC'97 Modem Controller + 25a9 6300ESB USB Universal Host Controller + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 10d0 V5D Single Board Computer USB + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25aa 6300ESB USB Universal Host Controller + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ab 6300ESB Watchdog Timer + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 10d0 V5D Single Board Computer + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 1af4 1100 QEMU Virtual Machine + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ac 6300ESB I/O Advanced Programmable Interrupt Controller + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 10d0 V5D Single Board Computer + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ad 6300ESB USB2 Enhanced Host Controller + 1734 1073 Primergy Econel 200 D2020 mainboard + 1775 10d0 V5D Single Board Computer USB 2.0 + 1775 1100 CR11/VR11 Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25ae 6300ESB 64-bit PCI-X Bridge + 25b0 6300ESB SATA RAID Controller + 1775 1100 CR11/VR11 Single Board Computer + 4c53 10d0 Telum ASLP10 Processor AMC + 4c53 10e0 PSL09 PrPMC + 25c0 5000X Chipset Memory Controller Hub + 25d0 5000Z Chipset Memory Controller Hub + 25d4 5000V Chipset Memory Controller Hub + 15d9 8680 X7DVL-E-O motherboard + 25d8 5000P Chipset Memory Controller Hub + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 25e2 5000 Series Chipset PCI Express x4 Port 2 + 25e3 5000 Series Chipset PCI Express x4 Port 3 + 25e4 5000 Series Chipset PCI Express x4 Port 4 + 25e5 5000 Series Chipset PCI Express x4 Port 5 + 25e6 5000 Series Chipset PCI Express x4 Port 6 + 25e7 5000 Series Chipset PCI Express x4 Port 7 + 25f0 5000 Series Chipset FSB Registers + 1028 01bb PowerEdge 1955 FSB Registers + 103c 31fd ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 25f1 5000 Series Chipset Reserved Registers + 103c 31fd ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 25f3 5000 Series Chipset Reserved Registers + 103c 31fd ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 25f5 5000 Series Chipset FBD Registers + 103c 31fd ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 25f6 5000 Series Chipset FBD Registers + 103c 31fd ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 25f7 5000 Series Chipset PCI Express x8 Port 2-3 + 25f8 5000 Series Chipset PCI Express x8 Port 4-5 + 25f9 5000 Series Chipset PCI Express x8 Port 6-7 + 25fa 5000X Chipset PCI Express x16 Port 4-7 + 2600 E8500/E8501 Hub Interface 1.5 + 1028 0170 PowerEdge 6850 Hub Interface + 2601 E8500/E8501 PCI Express x4 Port D + 2602 E8500/E8501 PCI Express x4 Port C0 + 2603 E8500/E8501 PCI Express x4 Port C1 + 2604 E8500/E8501 PCI Express x4 Port B0 + 2605 E8500/E8501 PCI Express x4 Port B1 + 2606 E8500/E8501 PCI Express x4 Port A0 + 2607 E8500/E8501 PCI Express x4 Port A1 + 2608 E8500/E8501 PCI Express x8 Port C + 2609 E8500/E8501 PCI Express x8 Port B + 260a E8500/E8501 PCI Express x8 Port A + 260c E8500/E8501 IMI Registers + 2610 E8500/E8501 FSB Registers + 2611 E8500/E8501 Address Mapping Registers + 2612 E8500/E8501 RAS Registers + 2613 E8500/E8501 Reserved Registers + 2614 E8500/E8501 Reserved Registers + 2615 E8500/E8501 Miscellaneous Registers + 2617 E8500/E8501 Reserved Registers + 2618 E8500/E8501 Reserved Registers + 2619 E8500/E8501 Reserved Registers + 261a E8500/E8501 Reserved Registers + 261b E8500/E8501 Reserved Registers + 261c E8500/E8501 Reserved Registers + 261d E8500/E8501 Reserved Registers + 261e E8500/E8501 Reserved Registers + 2620 E8500/E8501 eXternal Memory Bridge + 1028 0170 PowerEdge 6850 Memory Bridge + 2621 E8500/E8501 XMB Miscellaneous Registers + 1028 0170 PowerEdge 6850 XMB Registers + 2622 E8500/E8501 XMB Memory Interleaving Registers + 1028 0170 PowerEdge 6850 Memory Interleaving Registers + 2623 E8500/E8501 XMB DDR Initialization and Calibration + 1028 0170 PowerEdge 6850 DDR Initialization and Calibration + 2624 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2625 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2626 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2627 E8500/E8501 XMB Reserved Registers + 1028 0170 PowerEdge 6850 Reserved Registers + 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2641 82801FBM (ICH6M) LPC Interface Bridge + 1014 0568 ThinkPad X41 + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge + 2651 82801FB/FW (ICH6/ICH6W) SATA Controller + 1028 0179 Optiplex GX280 + 1043 2601 P5GD1-VW Mainboard + 1734 105c Scenic W620 + 8086 4147 D915GAG Motherboard + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller + 1028 0177 Dimension 8400 + 1462 7028 915P/G Neo2 + 2653 82801FBM (ICH6M) SATA Controller + 1014 056a ThinkPad X41 + 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 + 1014 0565 ThinkPad X41 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 2558 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 + 1014 0565 ThinkPad X41 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 2659 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 + 1014 0565 ThinkPad X41 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 265a GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 + 1014 0565 ThinkPad X41 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 265a GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller + 1014 0566 ThinkPad X41 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 5006 GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + 8086 265c Dimension 3100 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 + 103c 0934 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2 + 103c 0934 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller + 1014 05b7 ThinkPad Z60t +# based on the PTGD1-LA motherboard + 103c 2a09 PufferM-UL8E + 1043 1173 A6VC + 1043 814e P5GD1-VW Mainboard + 1462 7028 915P/G Neo2 + 1af4 1100 QEMU Virtual Machine + 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller + 1014 056b ThinkPad X41 + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 1043 80a6 P5GD1-VW Mainboard + 1458 266a GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller + 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller + 1025 006a Conexant AC'97 CoDec (in Acer TravelMate 2410 serie laptop) + 103c 0934 Compaq nw8240/nx8220 + 103c 099c NX6110/NC6120 + 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller + 1014 0581 ThinkPad X41 (Analog Devices AD1981B codec) + 1025 006a Realtek ALC 655 codec (in Acer TravelMate 2410 serie laptop) + 1028 0177 Dimension 8400 + 1028 0179 Optiplex GX280 + 1028 0182 Latitude D610 Laptop + 1028 0187 Precision M70 Laptop + 1028 0188 Inspiron 6000 laptop + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq NC6220 + 103c 099c NX6110/NC6120 + 103c 3006 DC7100 SFF(DX878AV) + 1458 a002 GA-8I915ME-G Mainboard + 152d 0745 Packard Bell A8550 Laptop + 1734 105a Scenic W620 + 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller + 1028 0177 Dimension 8400 + 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC + 103c 099c NX6110/NC6120 + 1043 80a6 P5GD1-VW Mainboard + 1458 266f GA-8I915ME-G Mainboard + 1462 7028 915P/G Neo2 + 1734 105c Scenic W620 + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 2670 631xESB/632xESB/3100 Chipset LPC Interface Controller + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 2680 631xESB/632xESB/3100 Chipset SATA IDE Controller + 2681 631xESB/632xESB SATA AHCI Controller + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 2682 631xESB/632xESB SATA RAID Controller + 103c 31fe Adaptec Serial ATA HostRAID + 2683 631xESB/632xESB SATA RAID Controller + 2688 631xESB/632xESB/3100 Chipset UHCI USB Controller #1 + 1028 01bb PowerEdge 1955 onboard USB + 1028 01f0 PowerEdge R900 onboard USB + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 2689 631xESB/632xESB/3100 Chipset UHCI USB Controller #2 + 1028 01bb PowerEdge 1955 onboard USB + 1028 01f0 PowerEdge R900 onboard USB + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 268a 631xESB/632xESB/3100 Chipset UHCI USB Controller #3 + 1028 01f0 PowerEdge R900 onboard USB + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 268b 631xESB/632xESB/3100 Chipset UHCI USB Controller #4 + 1028 01f0 PowerEdge R900 onboard USB + 15d9 8680 X7DVL-E-O motherboard + 8086 3476 S5000PSLSATA Server Board + 268c 631xESB/632xESB/3100 Chipset EHCI USB2 Controller + 1028 01bb PowerEdge 1955 onboard USB + 1028 01f0 PowerEdge R900 onboard USB + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 2690 631xESB/632xESB/3100 Chipset PCI Express Root Port 1 + 103c 31fe ProLiant DL140 G3 + 15d9 9680 X7DBN Motherboard + 2692 631xESB/632xESB/3100 Chipset PCI Express Root Port 2 + 103c 31fe ProLiant DL140 G3 + 2694 631xESB/632xESB/3100 Chipset PCI Express Root Port 3 + 2696 631xESB/632xESB/3100 Chipset PCI Express Root Port 4 + 2698 631xESB/632xESB AC '97 Audio Controller + 2699 631xESB/632xESB AC '97 Modem Controller + 269a 631xESB/632xESB High Definition Audio Controller + 269b 631xESB/632xESB/3100 Chipset SMBus Controller + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 8086 3476 S5000PSLSATA Server Board + 269e 631xESB/632xESB IDE Controller + 103c 31fe ProLiant DL140 G3 + 15d9 8680 X7DVL-E-O motherboard + 15d9 9680 X7DBN Motherboard + 2700 Optane SSD 900P Series + 8086 3900 900P Series [Add-in Card] + 8086 3901 900P Series [2.5" SFF] + 2701 NVMe Datacenter SSD [Optane] + 1028 2000 Express Flash NVMe [Optane] 375GB 2.5" U.2 (P4800X) + 1028 2001 Express Flash NVMe [Optane] 750GB 2.5" U.2 (P4800X) + 1028 2002 Express Flash NVMe [Optane] 750GB AIC (P4800X) + 1028 200a Express Flash NVMe [Optane] 375GB AIC (P4800X) + 8086 3904 NVMe Datacenter SSD [Optane] x4 AIC (P4800X) + 8086 3905 NVMe Datacenter SSD [Optane] 15mm 2.5" U.2 (P4800X) + 2723 Wi-Fi 6 AX200 + 1a56 1654 Killer™ Wi-Fi 6 AX1650x (AX200NGW) + 8086 0084 Wi-Fi 6 AX200NGW + 2725 Wi-Fi 6 AX210/AX211/AX411 160MHz + 8086 0020 Wi-Fi 6 AX210 160MHz + 8086 0024 Wi-Fi 6 AX210 160MHz + 8086 0090 Wi-Fi 6 AX211 160MHz + 8086 00b0 Wi-Fi 6 AX411 160MHz + 8086 0310 Wi-Fi 6 AX210 160MHz + 8086 0510 Wi-Fi 6 AX210 160MHz + 8086 0a10 Wi-Fi 6 AX210 160MHz + 8086 2020 Wi-Fi 6 AX210 160MHz + 8086 4020 Wi-Fi 6 AX210 160MHz + 8086 6020 Wi-Fi 6 AX210 160MHz + 8086 6024 Wi-Fi 6 AX210 160MHz + 8086 e020 Wi-Fi 6 AX210 160MHz + 8086 e024 Wi-Fi 6 AX210 160MHz + 2770 82945G/GZ/P/PL Memory Controller Hub + 1028 01ad OptiPlex GX620 + 103c 2a3b Pavilion A1512X + 1043 817a P5LD2-VM Mainboard + 107b 5048 E4500 + 1462 7418 Wind PC MS-7418 + 1849 2770 ConRoe1333-D667 + 8086 544e DeskTop Board D945GTP + 2771 82945G/GZ/P/PL PCI Express Root Port + 2772 82945G/GZ Integrated Graphics Controller + 103c 2a3b Pavilion A1512X + 1462 7418 Wind PC MS-7418 + 1849 2772 ConRoe1333-D667 + 8086 544e DeskTop Board D945GTP + 8086 d605 Desktop Board D945GCCR + 2774 82955X Memory Controller Hub + 2775 82955X PCI Express Root Port + 2776 82945G/GZ Integrated Graphics Controller + 2778 E7230/3000/3010 Memory Controller Hub + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 2779 E7230/3000/3010 PCI Express Root Port + 277a 82975X/3010 PCI Express Root Port + 277c 82975X Memory Controller Hub + 1043 8178 P5WDG2 WS Professional motherboard + 277d 82975X PCI Express Root Port + 2780 82915G/GV/GL/910GL [Grantsdale] Graphics Device + 2782 82915G Integrated Graphics Controller + 1043 2582 P5GD1-VW Mainboard + 1734 105b Scenic W620 + 2792 Mobile 915GM/GMS/910GML Express Graphics Controller + 1014 0582 ThinkPad X41 + 103c 099c NX6110/NC6120 + 103c 308a Compaq nc6220 Notebook PC + 1043 1881 GMA 900 915GM Integrated Graphics + e4bf 0ccd CCD-CALYPSO + e4bf 0cd3 CD3-JIVE + e4bf 58b1 XB1 + 27a0 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub + 1025 006c 9814 WKMI + 1028 01d7 XPS M1210 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 103c 30d5 530 Laptop + 1043 1237 A6J-Q008 + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 17aa 2015 ThinkPad T60 + 17aa 2017 ThinkPad R60/T60/X60 series + 27a1 Mobile 945GM/PM/GMS, 943/940GML and 945GT Express PCI Express Root Port + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 27a2 Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller + 103c 30a1 NC2400 + 103c 30d5 530 Laptop + 17aa 201a ThinkPad R60/T60/X60 series + 9902 1584 CCE MPL-D10H120F + 27a6 Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller + 103c 30a1 NC2400 + 103c 30d5 530 Laptop + 1775 11cc CC11/CL11 integrated graphics (secondary) + 17aa 201a ThinkPad R60/T60/X60 series + 27ac Mobile 945GSE Express Memory Controller Hub + 1775 11cc CC11/CL11 + 27ad Mobile 945GSE Express PCI Express Root Port + 27ae Mobile 945GSE Express Integrated Graphics Controller + 1775 11cc CC11/CL11 integrated graphics (primary) + 27b0 82801GH (ICH7DH) LPC Interface Bridge + 103c 2a3b Pavilion A1512X + 8086 544e DeskTop Board D945GTP + 27b8 82801GB/GR (ICH7 Family) LPC Interface Bridge + 1028 01e6 PowerEdge 860 + 103c 2a8c Compaq 500B Microtower + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM Motherboard + 107b 5048 E4500 + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 8086 544e DeskTop Board D945GTP + 27b9 82801GBM (ICH7-M) LPC Interface Bridge + 1028 01d7 XPS M1210 + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 103c 30d5 530 Laptop + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 10f7 8338 Panasonic CF-Y5 laptop + 17aa 2009 ThinkPad R60/T60/X60 series + 27bc NM10 Family LPC Controller + 1043 83ad Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 144d c072 Notebook N150P + 1458 5001 GA-D525TUD + 8086 4f4d DeskTop Board D510MO + 8086 544b Desktop Board D425KT + 27bd 82801GHM (ICH7-M DH) LPC Interface Bridge + 1025 006c 9814 WKMI + 27c0 NM10/ICH7 Family SATA Controller [IDE mode] + 1028 01ad OptiPlex GX620 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 2a8c Compaq 500B Microtower + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM Motherboard + 107b 5048 E4500 + 1462 2310 MSI Hetis 945 + 1462 7236 945P Neo3-F Rev. 2.2 motherboard + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 8086 544b Desktop Board D425KT + 8086 544e DeskTop Board D945GTP + 27c1 NM10/ICH7 Family SATA Controller [AHCI mode] + 1028 01df PowerEdge SC440 + 103c 2a3b Pavilion A1512X + 1043 83ad Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 144d c072 Notebook N150P + 1458 b005 GA-D525TUD + 1775 11cc CC11/CL11 + 8086 4f4d DeskTop Board D510MO + 8086 5842 DeskTop Board D975XBX + 27c3 82801GR/GDH (ICH7R/ICH7DH) SATA Controller [RAID mode] + 1775 11cc CC11/CL11 + 8086 544e DeskTop Board D945GTP + 27c4 82801GBM/GHM (ICH7-M Family) SATA Controller [IDE mode] + 1025 006c 9814 WKMI + 1028 01d7 XPS M1210 + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 17aa 200e ThinkPad T60 + 27c5 82801GBM/GHM (ICH7-M Family) SATA Controller [AHCI mode] + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 103c 30d5 530 Laptop + 17aa 200d ThinkPad R60/T60/X60 series + 27c6 82801GHM (ICH7-M DH) SATA Controller [RAID mode] + 27c8 NM10/ICH7 Family USB UHCI Controller #1 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 103c 30d5 530 Laptop + 1043 1237 A6J-Q008 + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM, P5LD2-VM Mainboard + 1043 83ad Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 107b 5048 E4500 + 144d c072 Notebook N150P + 1458 5004 GA-D525TUD + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad R60/T60/X60 series + 8086 4f4d DeskTop Board D510MO + 8086 544b Desktop Board D425KT + 8086 544e DeskTop Board D945GTP + 27c9 NM10/ICH7 Family USB UHCI Controller #2 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM, P5LD2-VM Mainboard + 1043 83ad Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 107b 5048 E4500 + 144d c072 Notebook N150P + 1458 5004 GA-D525TUD + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad R60/T60/X60 series + 8086 4f4d DeskTop Board D510MO + 8086 544b Desktop Board D425KT + 8086 544e DeskTop Board D945GTP + 27ca NM10/ICH7 Family USB UHCI Controller #3 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM, P5LD2-VM Mainboard + 1043 83ad Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 107b 5048 E4500 + 144d c072 Notebook N150P + 1458 5004 GA-D525TUD + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad R60/T60/X60 series + 8086 4f4d DeskTop Board D510MO + 8086 544e DeskTop Board D945GTP + 27cb NM10/ICH7 Family USB UHCI Controller #4 + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 1043 1237 A6J-Q008 + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM, P5LD2-VM Mainboard + 1043 83ad Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 107b 5048 E4500 + 144d c072 Notebook N150P + 1458 5004 GA-D525TUD + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 200a ThinkPad R60/T60/X60 series + 8086 4f4d DeskTop Board D510MO + 8086 544e DeskTop Board D945GTP + 27cc NM10/ICH7 Family USB2 EHCI Controller + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 103c 30d5 530 Laptop + 1043 1237 A6J-Q008 + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM, P5LD2-VM Mainboard + 1043 83ad Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 144d c072 Notebook N150P + 1458 5006 GA-D525TUD + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 200b ThinkPad R60/T60/X60 series + 8086 4f4d DeskTop Board D510MO + 8086 544b Desktop Board D425KT + 8086 544e DeskTop Board D945GTP + 27d0 NM10/ICH7 Family PCI Express Port 1 + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 144d c072 Notebook N150P + 1458 5001 GA-D525TUD + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 2011 ThinkPad R60e + 8086 544b Desktop Board D425KT + 27d2 NM10/ICH7 Family PCI Express Port 2 + 103c 309f Compaq nx9420 Notebook + 103c 30a3 Compaq nw8440 + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 144d c072 Notebook N150P + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 2011 ThinkPad R60e + 8086 544b Desktop Board D425KT + 27d4 NM10/ICH7 Family PCI Express Port 3 + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 144d c072 Notebook N150P + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 2011 ThinkPad R60e + 8086 544b Desktop Board D425KT + 27d6 NM10/ICH7 Family PCI Express Port 4 + 103c 30a3 Compaq nw8440 + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 144d c072 Notebook N150P + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 2011 ThinkPad R60e + 8086 544b Desktop Board D425KT + 27d8 NM10/ICH7 Family High Definition Audio Controller + 1025 006c 9814 WKMI + 1028 01d7 XPS M1210 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 103c 30d5 530 Laptop + 1043 1123 A6J-Q008 + 1043 13c4 G2P + 1043 817f P5LD2-VM Mainboard (Realtek ALC 882 codec) + 1043 8249 P5B-MX/WiFi-AP + 1043 8290 P5KPL-VM Motherboard + 1043 82ea P5KPL-CM Motherboard + 1043 8437 Eee PC 1015PX + 105b 0d7c D270S/D250S Motherboard + 1071 8207 Medion MIM 2240 Notebook PC [MD98100] + 107b 5048 E4500 + 10f7 8338 Panasonic CF-Y5 laptop + 1179 ff10 Toshiba Satellite A100-796 audio (Realtek ALC861) + 1179 ff31 AC97 Data Fax SoftModem with SmartCP + 1447 1043 Asus A8JP (Analog Devices AD1986A) + 144d c072 Notebook N150P + 1458 a002 GA-D525TUD (Realtek ALC887) + 1458 a102 GA-8I945PG-RH Mainboard + 1462 7418 Wind PC MS-7418 + 152d 0753 Softmodem + 1734 10ad Conexant softmodem SmartCP + 17aa 2010 ThinkPad R60/T60/X60 series + 17aa 3802 3000 C200 audio [Realtek ALC861VD] + 8086 1112 DeskTop Board D945GTP + 8086 27d8 DeskTop Board D945GTP + 8086 d618 DeskTop Board D510MO + 8384 7680 STAC9221 HD Audio Codec + 27da NM10/ICH7 Family SMBus Controller + 1025 006c 9814 WKMI + 1028 01ad OptiPlex GX620 + 1028 01d7 XPS M1210 + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM Motherboard + 105b 0d7c D270S/D250S Motherboard + 1071 8209 Medion MIM 2240 Notebook PC [MD98100] + 10f7 8338 Panasonic CF-Y5 laptop + 144d c072 Notebook N150P + 1458 5001 GA-8I945PG-RH/GA-D525TUD Mainboard + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 200f ThinkPad R60/T60/X60 series + 8086 4f4d DeskTop Board D510MO + 8086 544b Desktop Board D425KT + 8086 544e DeskTop Board D945GTP + 8086 5842 DeskTop Board D975XBX + 27dc NM10/ICH7 Family LAN Controller + 103c 2a3b Pavilion A1512X + 8086 308d DeskTop Board D945GTP + 27dd 82801G (ICH7 Family) AC'97 Modem Controller + 27de 82801G (ICH7 Family) AC'97 Audio Controller + 1028 01ad OptiPlex GX620 + 1462 7267 Realtek ALC883 Audio Controller + 1775 11cc CC11 integrated audio (AD1981BL codec) + 27df 82801G (ICH7 Family) IDE Controller + 1028 01df PowerEdge SC440 + 1028 01e6 PowerEdge 860 + 103c 2a3b Pavilion A1512X + 103c 2a8c Compaq 500B Microtower + 103c 309f Compaq nx9420 Notebook + 103c 30a1 NC2400 + 103c 30a3 Compaq nw8440 + 103c 30d5 530 Laptop + 1043 1237 A6J-Q008 + 1043 8179 P5B-MX/WiFi-AP, P5KPL-VM Motherboard + 107b 5048 E4500 + 10f7 8338 Panasonic CF-Y5 laptop + 1462 7418 Wind PC MS-7418 + 1775 11cc CC11/CL11 + 17aa 200c ThinkPad R60/T60/X60 series + 8086 544e DeskTop Board D945GTP + 27e0 82801GR/GH/GHM (ICH7 Family) PCI Express Port 5 + 1775 11cc CC11/CL11 + 27e2 82801GR/GH/GHM (ICH7 Family) PCI Express Port 6 + 1775 11cc CC11/CL11 + 2810 82801HB/HR (ICH8/R) LPC Interface Controller + 1043 81ec P5B + 2811 82801HEM (ICH8M-E) LPC Interface Controller + 103c 30c1 Compaq 6910p + 17aa 20b6 ThinkPad T61/R61 + e4bf cc47 CCG-RUMBA + 2812 82801HH (ICH8DH) LPC Interface Controller + 2814 82801HO (ICH8DO) LPC Interface Controller + 2815 82801HM (ICH8M) LPC Interface Controller + 1025 0121 Aspire 5920G + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 17aa 20a5 ThinkPad R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + 2820 82801H (ICH8 Family) 4 port SATA Controller [IDE mode] + 1028 01da OptiPlex 745 + 1462 7235 P965 Neo MS-7235 mainboard + 2821 82801HR/HO/HH (ICH8R/DO/DH) 6 port SATA Controller [AHCI mode] + 2822 SATA Controller [RAID mode] + 1028 020d Inspiron 530 + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 2823 C610/X99 series chipset sSATA Controller [RAID mode] + 2824 82801HB (ICH8) 4 port SATA Controller [AHCI mode] + 1043 81ec P5B + 2825 82801HR/HO/HH (ICH8R/DO/DH) 2 port SATA Controller [IDE mode] + 1028 01da OptiPlex 745 + 1462 7235 P965 Neo MS-7235 mainboard + 2826 C600/X79 series chipset SATA RAID Controller + 1d49 0100 Intel RSTe SATA Software RAID + 1d49 0101 Intel RSTe SATA Software RAID + 1d49 0102 Intel RSTe SATA Software RAID + 1d49 0103 Intel RSTe SATA Software RAID + 1d49 0104 Intel RSTe SATA Software RAID + 1d49 0105 Intel RSTe SATA Software RAID + 2827 C610/X99 series chipset sSATA Controller [RAID mode] + 2828 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode] + 1028 01f3 Inspiron 1420 + 103c 30c0 Compaq 6710b + 17aa 20a8 ThinkPad R61 + e4bf cc47 CCG-RUMBA + 2829 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] + 1025 0121 Aspire 5920G + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 17aa 20a7 ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 282a 82801 Mobile SATA Controller [RAID mode] + 1028 040b Latitude E6510 + e4bf 50c1 PC1-GROOVE + 2830 82801H (ICH8 Family) USB UHCI Controller #1 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20aa ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2831 82801H (ICH8 Family) USB UHCI Controller #2 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20aa ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2832 82801H (ICH8 Family) USB UHCI Controller #3 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 17aa 20aa ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2833 82801H (ICH8 Family) USB UHCI Controller #4 + 1043 81ec P5B + 2834 82801H (ICH8 Family) USB UHCI Controller #4 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20aa ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2835 82801H (ICH8 Family) USB UHCI Controller #5 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 17aa 20aa Thinkpad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2836 82801H (ICH8 Family) USB2 EHCI Controller #1 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20ab ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 283a 82801H (ICH8 Family) USB2 EHCI Controller #2 + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 17aa 20ab ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 283e 82801H (ICH8 Family) SMBus Controller + 1025 0121 Aspire 5920G + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 9008 Vaio VGN-SZ79SN_C + 104d 902d VAIO VGN-NR120E + 1462 7235 P965 Neo MS-7235 mainboard + 17aa 20a9 ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 283f 82801H (ICH8 Family) PCI Express Port 1 + 1028 01da OptiPlex 745 + 103c 30c1 Compaq 6910p + 1043 1017 X58LE + 104d 902d VAIO VGN-NR120E + 17aa 20ad ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + 2841 82801H (ICH8 Family) PCI Express Port 2 + 103c 30c1 Compaq 6910p + 1043 1017 X58LE + 104d 902d VAIO VGN-NR120E + 17aa 20ad ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + 2843 82801H (ICH8 Family) PCI Express Port 3 + 1043 1017 X58LE + 104d 902d VAIO VGN-NR120E + 17aa 20ad ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + 2845 82801H (ICH8 Family) PCI Express Port 4 + 1043 1017 X58LE + 17aa 20ad ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + 2847 82801H (ICH8 Family) PCI Express Port 5 + 1028 01da OptiPlex 745 + 103c 30c1 Compaq 6910p + 17aa 20ad ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + 2849 82801H (ICH8 Family) PCI Express Port 6 + 284b 82801H (ICH8 Family) HD Audio Controller + 1025 011f Realtek ALC268 audio codec + 1025 0121 Aspire 5920G + 1025 0145 Realtek ALC889 (Aspire 8920G w. Dolby Theater) + 1028 01da OptiPlex 745 + 1028 01f3 Inspiron 1420 + 1028 01f9 Latitude D630 + 1028 01ff Precision M4300 + 1028 022f Inspiron 1525 + 1028 0256 Studio 1735 + 103c 2802 Compaq dc7700p + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 1043 1339 M51S series + 1043 17f3 X58LE + 1043 81ec P5B + 104d 9005 Vaio VGN-FZ260E + 104d 9008 Vaio VGN-SZ79SN_C + 104d 9016 Sony VAIO VGN-AR51M + 104d 902d VAIO VGN-NR120E + 14f1 5051 Presario C700 + 17aa 20ac ThinkPad T61/R61 + 17c0 4088 Medion WIM 2210 Notebook PC [MD96850] + 8384 7616 Dell Vostro 1400 + e4bf cc47 CCG-RUMBA + 284f 82801H (ICH8 Family) Thermal Reporting Device + 2850 82801HM/HEM (ICH8M/ICH8M-E) IDE Controller + 1025 0121 Aspire 5920G + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 17aa 20a6 ThinkPad T61/R61 + 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 28c0 Volume Management Device NVMe RAID Controller + 2912 82801IH (ICH9DH) LPC Interface Controller + 2914 82801IO (ICH9DO) LPC Interface Controller + 1028 0211 Optiplex 755 + 2916 82801IR (ICH9R) LPC Interface Controller + 1028 020d Inspiron 530 + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard + 1462 7345 MS-7345 Motherboard + 8086 5044 Desktop Board DP35DP + 2917 ICH9M-E LPC Interface Controller + 17aa 20f5 ThinkPad T400 + e4bf cc4d CCM-BOOGIE + 2918 82801IB (ICH9) LPC Interface Controller + 1028 0236 PowerEdge R610 82801IB (ICH9) LPC Interface Controller + 1462 7360 G33/P35 Neo + 1af4 1100 QEMU Virtual Machine + 2919 ICH9M LPC Interface Controller + 2920 82801IR/IO/IH (ICH9R/DO/DH) 4 port SATA Controller [IDE mode] + 1028 020d Inspiron 530 + 1028 020f PowerEdge R300 onboard SATA Controller + 1028 0210 PowerEdge T300 onboard SATA Controller + 1028 0211 Optiplex 755 + 1028 023c PowerEdge R200 onboard SATA Controller + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801IR [ICH9R] + 2921 82801IB (ICH9) 2 port SATA Controller [IDE mode] + 1028 0235 PowerEdge R710 SATA IDE Controller + 1028 0236 PowerEdge R610 SATA IDE Controller + 1028 0237 PowerEdge T610 SATA IDE Controller + 1462 7360 G33/P35 Neo + 2922 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801IR [ICH9R] + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + 2923 82801IB (ICH9) 4 port SATA Controller [AHCI mode] + 2925 82801IR/IO (ICH9R/DO) SATA Controller [RAID mode] + 1734 10e0 System Board D2542 + 8086 2925 System Board D2542 + 2926 82801I (ICH9 Family) 2 port SATA Controller [IDE mode] + 1028 020d Inspiron 530 + 1028 020f PowerEdge R300 onboard SATA Controller + 1028 0210 PowerEdge T300 onboard SATA Controller + 1028 0211 Optiplex 755 + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801IR [ICH9R] + 1462 7360 G33/P35 Neo + 2928 82801IBM/IEM (ICH9M/ICH9M-E) 2 port SATA Controller [IDE mode] + 2929 82801IBM/IEM (ICH9M/ICH9M-E) 4 port SATA Controller [AHCI mode] + 103c 3628 dv6-1190en + 17aa 20f8 ThinkPad T400 + e4bf cc4d CCM-BOOGIE + 292c 82801IEM (ICH9M-E) SATA Controller [RAID mode] + 292d 82801IBM/IEM (ICH9M/ICH9M-E) 2 port SATA Controller [IDE mode] + e4bf cc4d CCM-BOOGIE + 2930 82801I (ICH9 Family) SMBus Controller + 1028 020d Inspiron 530 + 1028 0211 Optiplex 755 + 103c 2a6f Asus IPIBL-LB Motherboard + 103c 3628 dv6-1190en + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f9 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 2932 82801I (ICH9 Family) Thermal Subsystem + 103c 3628 dv6-1190en + 2934 82801I (ICH9 Family) USB UHCI Controller #1 + 1028 020d Inspiron 530 + 1028 020f PowerEdge R300 onboard UHCI + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 023c PowerEdge R200 onboard UHCI + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 1028 2011 Optiplex 755 + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f0 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 2935 82801I (ICH9 Family) USB UHCI Controller #2 + 1028 020d Inspiron 530 + 1028 020f PowerEdge R300 onboard UHCI + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 023c PowerEdge R200 onboard UHCI + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f0 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 2936 82801I (ICH9 Family) USB UHCI Controller #3 + 1028 020d Inspiron 530 + 1028 020f PowerEdge R300 onboard UHCI + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0211 Optiplex 755 + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 023c PowerEdge R200 onboard UHCI + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f0 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 2937 82801I (ICH9 Family) USB UHCI Controller #4 + 1028 020d Inspiron 530 + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 1028 2011 Optiplex 755 + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f0 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 2937 Optiplex 755 + 8086 2942 828011 (ICH9 Family ) USB UHCI Controller + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 2938 82801I (ICH9 Family) USB UHCI Controller #5 + 1028 020d Inspiron 530 + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB UHCI Controller + 1028 0236 PowerEdge R610 USB UHCI Controller + 1028 0237 PowerEdge T610 USB UHCI Controller + 1028 0287 PowerEdge M610 onboard UHCI + 1028 029c PowerEdge M710 USB UHCI Controller + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f0 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 2938 Optiplex 755 + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 2939 82801I (ICH9 Family) USB UHCI Controller #6 + 1028 020d Inspiron 530 + 1028 0210 PowerEdge T300 onboard UHCI + 1028 0237 PowerEdge T610 USB UHCI Controller + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f0 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 293a 82801I (ICH9 Family) USB2 EHCI Controller #1 + 1028 020d Inspiron 530 + 1028 020f PowerEdge R300 onboard EHCI + 1028 0210 PowerEdge T300 onboard EHCI + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB EHCI Controller + 1028 0236 PowerEdge R610 USB EHCI Controller + 1028 0237 PowerEdge T610 USB EHCI Controller + 1028 023c PowerEdge R200 onboard EHCI + 1028 0287 PowerEdge M610 onboard EHCI + 1028 029c PowerEdge M710 USB EHCI Controller + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f1 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 293c 82801I (ICH9 Family) USB2 EHCI Controller #2 + 1028 020d Inspiron 530 + 1028 0211 Optiplex 755 + 1028 0235 PowerEdge R710 USB EHCI Controller + 1028 0236 PowerEdge R610 USB EHCI Controller + 1028 0237 PowerEdge T610 USB EHCI Controller + 1028 0287 PowerEdge M610 onboard EHCI + 1028 029c PowerEdge M710 USB EHCI Controller + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f1 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 293c Optiplex 755 + 8086 5044 Desktop Board DP35DP + e4bf cc4d CCM-BOOGIE + 293e 82801I (ICH9 Family) HD Audio Controller + 1028 020d Inspiron 530 + 1028 0211 Optiplex 755 + 103c 2a6f Asus IPIBL-LB Motherboard + 103c 3628 dv6-1190en + 1043 829f P5K PRO Motherboard: 82801IR [ICH9R] + 1462 735a MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 1462 7360 G33/P35 Neo + 17aa 20f2 ThinkPad T400 + 1af4 1100 QEMU Virtual Machine + 8086 293e Optiplex 755 + 8086 2940 Optiplex 755 + e4bf cc4d CCM-BOOGIE + 2940 82801I (ICH9 Family) PCI Express Port 1 + 1028 020d Inspiron 530 + 1028 0211 Optiplex 755 + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 8086 2940 Optiplex 755 + 2942 82801I (ICH9 Family) PCI Express Port 2 + 1028 020d Inspiron 530 + 2944 82801I (ICH9 Family) PCI Express Port 3 + 1028 020d Inspiron 530 + 103c 2a6f Asus IPIBL-LB Motherboard + 2946 82801I (ICH9 Family) PCI Express Port 4 + 1028 020d Inspiron 530 + 2948 82801I (ICH9 Family) PCI Express Port 5 + 1028 020d Inspiron 530 + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 294a 82801I (ICH9 Family) PCI Express Port 6 + 1028 020d Inspiron 530 + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] + 294c 82566DC-2 Gigabit Network Connection + 17aa 302e 82566DM-2 Gigabit Network Connection + 2970 82946GZ/PL/GL Memory Controller Hub + 1043 823b P5B-MX/WiFi-AP + 2971 82946GZ/PL/GL PCI Express Root Port + 2972 82946GZ/GL Integrated Graphics Controller + 1043 823b P5B-MX/WiFi-AP + 2973 82946GZ/GL Integrated Graphics Controller + 2974 82946GZ/GL HECI Controller + 2975 82946GZ/GL HECI Controller + 2976 82946GZ/GL PT IDER Controller + 2977 82946GZ/GL KT Controller + 2980 82G35 Express DRAM Controller + 2981 82G35 Express PCI Express Root Port + 2982 82G35 Express Integrated Graphics Controller + 2983 82G35 Express Integrated Graphics Controller + 2984 82G35 Express HECI Controller + 2990 82Q963/Q965 Memory Controller Hub + 1028 01da OptiPlex 745 + 2991 82Q963/Q965 PCI Express Root Port + 2992 82Q963/Q965 Integrated Graphics Controller + 2993 82Q963/Q965 Integrated Graphics Controller + 2994 82Q963/Q965 HECI Controller + 2995 82Q963/Q965 HECI Controller + 2996 82Q963/Q965 PT IDER Controller + 2997 82Q963/Q965 KT Controller + 29a0 82P965/G965 Memory Controller Hub + 1043 81ea P5B + 1462 7276 MS-7276 [G965MDH] + 29a1 82P965/G965 PCI Express Root Port + 29a2 82G965 Integrated Graphics Controller + 1462 7276 MS-7276 [G965MDH] + 29a3 82G965 Integrated Graphics Controller + 29a4 82P965/G965 HECI Controller + 29a5 82P965/G965 HECI Controller + 29a6 82P965/G965 PT IDER Controller + 29a7 82P965/G965 KT Controller + 29b0 82Q35 Express DRAM Controller + 1028 0211 OptiPlex 755 + 29b1 82Q35 Express PCI Express Root Port + 1028 0211 OptiPlex 755 + 29b2 82Q35 Express Integrated Graphics Controller + 1028 0211 OptiPlex 755 + 29b3 82Q35 Express Integrated Graphics Controller + 1028 0211 OptiPlex 755 + 29b4 82Q35 Express MEI Controller + 1028 0211 OptiPlex 755 + 29b5 82Q35 Express MEI Controller + 29b6 82Q35 Express PT IDER Controller + 1028 0211 OptiPlex 755 + 29b7 82Q35 Express Serial KT Controller + 1028 0211 OptiPlex 755 + 29c0 82G33/G31/P35/P31 Express DRAM Controller + 1028 020d Inspiron 530 + 103c 2a6f Asus IPIBL-LB Motherboard + 1043 8276 P5K PRO Motherboard: Intel 82P35 Northbridge + 1043 82b0 P5KPL-VM Motherboard + 1462 7345 MS-7345 Motherboard: Intel 82G33/P35 Northbridge + 1462 7360 G33/P35 Neo + 1af4 1100 QEMU Virtual Machine + 8086 5044 Desktop Board DP35DP + 29c1 82G33/G31/P35/P31 Express PCI Express Root Port + 1028 020d Inspiron 530 + 1043 8276 P5K PRO Motherboard: Intel 82P35 Northbridge + 29c2 82G33/G31 Express Integrated Graphics Controller + 1028 020d Inspiron 530 + 1043 82b0 P5KPL-VM Motherboard + 29c3 82G33/G31 Express Integrated Graphics Controller + 1028 020d Inspiron 530 + 1043 82b0 P5KPL-VM Motherboard + 29c4 82G33/G31/P35/P31 Express MEI Controller + 8086 5044 Desktop Board DP35DP + 29c5 82G33/G31/P35/P31 Express MEI Controller + 29c6 82G33/G31/P35/P31 Express PT IDER Controller + 29c7 82G33/G31/P35/P31 Express Serial KT Controller + 29cf Virtual HECI Controller + 29d0 82Q33 Express DRAM Controller + 29d1 82Q33 Express PCI Express Root Port + 29d2 82Q33 Express Integrated Graphics Controller + 29d3 82Q33 Express Integrated Graphics Controller + 29d4 82Q33 Express MEI Controller + 29d5 82Q33 Express MEI Controller + 29d6 82Q33 Express PT IDER Controller + 29d7 82Q33 Express Serial KT Controller + 29e0 82X38/X48 Express DRAM Controller + 29e1 82X38/X48 Express Host-Primary PCI Express Bridge + 29e4 82X38/X48 Express MEI Controller + 29e5 82X38/X48 Express MEI Controller + 29e6 82X38/X48 Express PT IDER Controller + 29e7 82X38/X48 Express Serial KT Controller + 29e9 82X38/X48 Express Host-Secondary PCI Express Bridge + 29f0 3200/3210 Chipset DRAM Controller + 29f1 3200/3210 Chipset Host-Primary PCI Express Bridge + 29f4 3200/3210 Chipset MEI Controller + 29f5 3200/3210 Chipset MEI Controller + 29f6 3200/3210 Chipset PT IDER Controller + 29f7 3200/3210 Chipset Serial KT Controller + 29f9 3210 Chipset Host-Secondary PCI Express Bridge + 2a00 Mobile PM965/GM965/GL960 Memory Controller Hub + 1025 0121 Aspire 5920G + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30c1 Compaq 6910p + 103c 30c5 Compaq 8510p + 103c 30cc Pavilion dv6700 + 103c 30d9 Presario C700 + 1043 1017 X58LE + 104d 9005 Vaio VGN-FZ260E + 104d 902d VAIO VGN-NR120E + 17aa 20b1 ThinkPad T61 + 17aa 20b3 ThinkPad T61/R61 + 17c0 4082 Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2a01 Mobile PM965/GM965/GL960 PCI Express Root Port + 2a02 Mobile GM965/GL960 Integrated Graphics Controller (primary) + 1028 01f3 Inspiron 1420 + 1028 01f9 Latitude D630 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30d9 Presario C700 + 1043 14e2 X58LE + 104d 902d VAIO VGN-NR120E + 17aa 20b5 GM965 [X3100] on ThinkPad T61/R61 + 17c0 4082 GM965 on Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2a03 Mobile GM965/GL960 Integrated Graphics Controller (secondary) + 1028 01f3 Inspiron 1420 + 1028 022f Inspiron 1525 + 103c 30c0 Compaq 6710b + 103c 30d9 Presario C700 + 1043 14e2 X58LE + 104d 902d VAIO VGN-NR120E + 17aa 20b5 GM965 [X3100] on ThinkPad T61/R61 + 17c0 4082 GM965 on Medion WIM 2210 Notebook PC [MD96850] + e4bf cc47 CCG-RUMBA + 2a04 Mobile PM965/GM965 MEI Controller + 103c 30c1 Compaq 6910p + 2a05 Mobile PM965/GM965 MEI Controller + 2a06 Mobile PM965/GM965 PT IDER Controller + 103c 30c1 Compaq 6910p + 2a07 Mobile PM965/GM965 KT Controller + 103c 30c1 Compaq 6910p + 2a10 Mobile GME965/GLE960 Memory Controller Hub + e4bf cc47 CCG-RUMBA + 2a11 Mobile GME965/GLE960 PCI Express Root Port + 2a12 Mobile GME965/GLE960 Integrated Graphics Controller + e4bf cc47 CCG-RUMBA + 2a13 Mobile GME965/GLE960 Integrated Graphics Controller + e4bf cc47 CCG-RUMBA + 2a14 Mobile GME965/GLE960 MEI Controller + 2a15 Mobile GME965/GLE960 MEI Controller + 2a16 Mobile GME965/GLE960 PT IDER Controller + 2a17 Mobile GME965/GLE960 KT Controller + 2a40 Mobile 4 Series Chipset Memory Controller Hub + 17aa 20e0 ThinkPad T400 + e4bf cc4d CCM-BOOGIE + 2a41 Mobile 4 Series Chipset PCI Express Graphics Port + e4bf cc4d CCM-BOOGIE + 2a42 Mobile 4 Series Chipset Integrated Graphics Controller + 1028 02aa Dell Inspiron 1545 + 17aa 2112 ThinkPad T400 + e4bf cc4d CCM-BOOGIE + 2a43 Mobile 4 Series Chipset Integrated Graphics Controller + 17aa 2112 ThinkPad T400 + e4bf cc4d CCM-BOOGIE + 2a44 Mobile 4 Series Chipset MEI Controller + 17aa 20e6 ThinkPad T400 + 2a45 Mobile 4 Series Chipset MEI Controller + 2a46 Mobile 4 Series Chipset PT IDER Controller + 2a47 Mobile 4 Series Chipset AMT SOL Redirection + 2a50 Cantiga MEI Controller + 2a51 Cantiga MEI Controller + 2a52 Cantiga PT IDER Controller + 2a53 Cantiga AMT SOL Redirection + 2b00 Xeon Processor E7 Product Family System Configuration Controller 1 + 2b02 Xeon Processor E7 Product Family System Configuration Controller 2 + 2b04 Xeon Processor E7 Product Family Power Controller + 2b08 Xeon Processor E7 Product Family Caching Agent 0 + 2b0c Xeon Processor E7 Product Family Caching Agent 1 + 2b10 Xeon Processor E7 Product Family QPI Home Agent 0 + 2b13 Xeon Processor E7 Product Family Memory Controller 0c + 2b14 Xeon Processor E7 Product Family Memory Controller 0a + 2b16 Xeon Processor E7 Product Family Memory Controller 0b + 2b18 Xeon Processor E7 Product Family QPI Home Agent 1 + 2b1b Xeon Processor E7 Product Family Memory Controller 1c + 2b1c Xeon Processor E7 Product Family Memory Controller 1a + 2b1e Xeon Processor E7 Product Family Memory Controller 1b + 2b20 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 0 + 2b22 Xeon Processor E7 Product Family System Configuration Controller 3 + 2b24 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 1 + 2b28 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 2 + 2b2a Xeon Processor E7 Product Family System Configuration Controller 4 + 2b2c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 3 + 2b30 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 4 + 2b34 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 5 + 2b38 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 6 + 2b3c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 7 + 2b40 Xeon Processor E7 Product Family QPI Router Port 0-1 + 2b42 Xeon Processor E7 Product Family QPI Router Port 2-3 + 2b44 Xeon Processor E7 Product Family QPI Router Port 4-5 + 2b46 Xeon Processor E7 Product Family QPI Router Port 6-7 + 2b48 Xeon Processor E7 Product Family Test and Debug 0 + 2b4c Xeon Processor E7 Product Family Test and Debug 1 + 2b50 Xeon Processor E7 Product Family QPI Physical Port 0: REUT control/status + 2b52 Xeon Processor E7 Product Family QPI Physical Port 0: Misc. control/status + 2b54 Xeon Processor E7 Product Family QPI Physical Port 1: REUT control/status + 2b56 Xeon Processor E7 Product Family QPI Physical Port 1: Misc. control/status + 2b58 Xeon Processor E7 Product Family QPI Physical Port 2: REUT control/status + 2b5a Xeon Processor E7 Product Family QPI Physical Port 2: Misc. control/status + 2b5c Xeon Processor E7 Product Family QPI Physical Port 3: REUT control/status + 2b5e Xeon Processor E7 Product Family QPI Physical Port 3: Misc. control/status + 2b60 Xeon Processor E7 Product Family SMI Physical Port 0: REUT control/status + 2b62 Xeon Processor E7 Product Family SMI Physical Port 0: Misc control/status + 2b64 Xeon Processor E7 Product Family SMI Physical Port 1: REUT control/status + 2b66 Xeon Processor E7 Product Family SMI Physical Port 1: Misc control/status + 2b68 Xeon Processor E7 Product Family Last Level Cache Coherence Engine 8 + 2b6c Xeon Processor E7 Product Family Last Level Cache Coherence Engine 9 + 2b80 Atom CE2700 Series [Puma 7] + 2b98 Puma 7 Trusted Execution Engine + 2bb5 Puma 7 xHCI Controller +# Synopsys DesignWare Core SuperSpeed USB 3.0 Controller + 2bb7 Puma 7 USB Device Controller (OTG) + 2bdc Puma 7 Thermal + 2be2 Puma 7 Security Processor + 2c01 Xeon 5500/Core i7 QuickPath Architecture System Address Decoder + 2c10 Xeon 5500/Core i7 QPI Link 0 + 2c11 Xeon 5500/Core i7 QPI Physical 0 + 2c14 Xeon 5500/Core i7 QPI Link 1 + 2c15 Xeon 5500/Core i7 QPI Physical 1 + 2c18 Xeon 5500/Core i7 Integrated Memory Controller + 2c19 Xeon 5500/Core i7 Integrated Memory Controller Target Address Decoder + 2c1a Xeon 5500/Core i7 Integrated Memory Controller RAS Registers + 2c1c Xeon 5500/Core i7 Integrated Memory Controller Test Registers + 2c20 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Control Registers + 2c21 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Address Registers + 2c22 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Rank Registers + 2c23 Xeon 5500/Core i7 Integrated Memory Controller Channel 0 Thermal Control Registers + 2c28 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Control Registers + 2c29 Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Address Registers + 2c2a Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Rank Registers + 2c2b Xeon 5500/Core i7 Integrated Memory Controller Channel 1 Thermal Control Registers + 2c30 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Control Registers + 2c31 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Address Registers + 2c32 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Rank Registers + 2c33 Xeon 5500/Core i7 Integrated Memory Controller Channel 2 Thermal Control Registers + 2c40 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers + 2c41 Xeon 5500/Core i7 QuickPath Architecture Generic Non-Core Registers + 2c50 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c51 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c52 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c53 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c54 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c55 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c56 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c57 Core Processor QuickPath Architecture Generic Non-Core Registers + 2c58 Xeon C5500/C3500 QPI Generic Non-core Registers + 2c59 Xeon C5500/C3500 QPI Generic Non-core Registers + 2c5a Xeon C5500/C3500 QPI Generic Non-core Registers + 2c5b Xeon C5500/C3500 QPI Generic Non-core Registers + 2c5c Xeon C5500/C3500 QPI Generic Non-core Registers + 2c5d Xeon C5500/C3500 QPI Generic Non-core Registers + 2c5e Xeon C5500/C3500 QPI Generic Non-core Registers + 2c5f Xeon C5500/C3500 QPI Generic Non-core Registers + 2c61 Core Processor QuickPath Architecture Generic Non-core Registers + 2c62 Core Processor QuickPath Architecture Generic Non-core Registers + 2c70 Xeon 5600 Series QuickPath Architecture Generic Non-core Registers + 2c81 Core Processor QuickPath Architecture System Address Decoder + 2c90 Core Processor QPI Link 0 + 2c91 Core Processor QPI Physical 0 + 2c98 Core Processor Integrated Memory Controller + 2c99 Core Processor Integrated Memory Controller Target Address Decoder + 2c9a Core Processor Integrated Memory Controller Test Registers + 2c9c Core Processor Integrated Memory Controller Test Registers + 2ca0 Core Processor Integrated Memory Controller Channel 0 Control Registers + 2ca1 Core Processor Integrated Memory Controller Channel 0 Address Registers + 2ca2 Core Processor Integrated Memory Controller Channel 0 Rank Registers + 2ca3 Core Processor Integrated Memory Controller Channel 0 Thermal Control Registers + 2ca8 Core Processor Integrated Memory Controller Channel 1 Control Registers + 2ca9 Core Processor Integrated Memory Controller Channel 1 Address Registers + 2caa Core Processor Integrated Memory Controller Channel 1 Rank Registers + 2cab Core Processor Integrated Memory Controller Channel 1 Thermal Control Registers + 2cc1 Xeon C5500/C3500 QPI System Address Decoder + 2cd0 Xeon C5500/C3500 QPI Link 0 + 2cd1 Xeon C5500/C3500 QPI Physical 0 + 2cd4 Xeon C5500/C3500 QPI Link 1 + 2cd5 Xeon C5500/C3500 QPI Physical 1 + 2cd8 Xeon C5500/C3500 Integrated Memory Controller Registers + 2cd9 Xeon C5500/C3500 Integrated Memory Controller Target Address Decoder + 2cda Xeon C5500/C3500 Integrated Memory Controller RAS Registers + 2cdc Xeon C5500/C3500 Integrated Memory Controller Test Registers + 2ce0 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Control + 2ce1 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Address + 2ce2 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Rank + 2ce3 Xeon C5500/C3500 Integrated Memory Controller Channel 0 Thermal Control + 2ce8 Xeon C5500/C3500 Integrated Memory Controller Channel 1 Control + 2ce9 Xeon C5500/C3500 Integrated Memory Controller Channel 1 Address + 2cea Xeon C5500/C3500 Integrated Memory Controller Channel 1 Rank + 2ceb Xeon C5500/C3500 Integrated Memory Controller Channel 1 Thermal Control + 2cf0 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Control + 2cf1 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Address + 2cf2 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Rank + 2cf3 Xeon C5500/C3500 Integrated Memory Controller Channel 2 Thermal Control + 2d01 Core Processor QuickPath Architecture System Address Decoder + 2d10 Core Processor QPI Link 0 + 2d11 1st Generation Core i3/5/7 Processor QPI Physical 0 + 2d12 1st Generation Core i3/5/7 Processor Reserved + 2d13 1st Generation Core i3/5/7 Processor Reserved + 2d81 Xeon 5600 Series QuickPath Architecture System Address Decoder + 2d90 Xeon 5600 Series QPI Link 0 + 2d91 Xeon 5600 Series QPI Physical 0 + 2d92 Xeon 5600 Series Mirror Port Link 0 + 2d93 Xeon 5600 Series Mirror Port Link 1 + 2d94 Xeon 5600 Series QPI Link 1 + 2d95 Xeon 5600 Series QPI Physical 1 + 2d98 Xeon 5600 Series Integrated Memory Controller Registers + 2d99 Xeon 5600 Series Integrated Memory Controller Target Address Decoder + 2d9a Xeon 5600 Series Integrated Memory Controller RAS Registers + 2d9c Xeon 5600 Series Integrated Memory Controller Test Registers + 2da0 Xeon 5600 Series Integrated Memory Controller Channel 0 Control + 2da1 Xeon 5600 Series Integrated Memory Controller Channel 0 Address + 2da2 Xeon 5600 Series Integrated Memory Controller Channel 0 Rank + 2da3 Xeon 5600 Series Integrated Memory Controller Channel 0 Thermal Control + 2da8 Xeon 5600 Series Integrated Memory Controller Channel 1 Control + 2da9 Xeon 5600 Series Integrated Memory Controller Channel 1 Address + 2daa Xeon 5600 Series Integrated Memory Controller Channel 1 Rank + 2dab Xeon 5600 Series Integrated Memory Controller Channel 1 Thermal Control + 2db0 Xeon 5600 Series Integrated Memory Controller Channel 2 Control + 2db1 Xeon 5600 Series Integrated Memory Controller Channel 2 Address + 2db2 Xeon 5600 Series Integrated Memory Controller Channel 2 Rank + 2db3 Xeon 5600 Series Integrated Memory Controller Channel 2 Thermal Control + 2e00 4 Series Chipset DRAM Controller + 2e01 4 Series Chipset PCI Express Root Port + 2e02 4 Series Chipset Integrated Graphics Controller + 2e03 4 Series Chipset Integrated Graphics Controller + 2e04 4 Series Chipset HECI Controller + 2e05 4 Series Chipset HECI Controller + 2e06 4 Series Chipset PT IDER Controller + 2e07 4 Series Chipset Serial KT Controller + 2e10 4 Series Chipset DRAM Controller + 2e11 4 Series Chipset PCI Express Root Port + 2e12 4 Series Chipset Integrated Graphics Controller + 17aa 3048 ThinkCentre M6258 + 2e13 4 Series Chipset Integrated Graphics Controller + 2e14 4 Series Chipset HECI Controller + 2e15 4 Series Chipset HECI Controller + 2e16 4 Series Chipset PT IDER Controller + 2e17 4 Series Chipset Serial KT Controller + 2e20 4 Series Chipset DRAM Controller + 1028 0283 Vostro 220 + 1043 82d3 P5Q Deluxe Motherboard + 1458 5000 GA-EP45-DS5/GA-EG45M-DS2H Motherboard + 2e21 4 Series Chipset PCI Express Root Port + 1043 82d3 P5Q Deluxe Motherboard + 1458 5000 GA-EP45-DS5 Motherboard + 2e22 4 Series Chipset Integrated Graphics Controller + 1458 d000 GA-EG45M-DS2H Mainboard + 2e23 4 Series Chipset Integrated Graphics Controller + 1458 d000 GA-EG45M-DS2H Mainboard + 2e24 4 Series Chipset HECI Controller + 2e25 4 Series Chipset HECI Controller + 2e26 4 Series Chipset PT IDER Controller + 2e27 4 Series Chipset Serial KT Controller + 2e29 4 Series Chipset PCI Express Root Port + 2e30 4 Series Chipset DRAM Controller + 103c 2a8c Compaq 500B Microtower + 2e31 4 Series Chipset PCI Express Root Port + 2e32 4 Series Chipset Integrated Graphics Controller + 103c 2a8c Compaq 500B Microtower + 2e33 4 Series Chipset Integrated Graphics Controller + 2e34 4 Series Chipset HECI Controller + 2e35 4 Series Chipset HECI Controller + 2e36 4 Series Chipset PT IDER Controller + 2e37 4 Series Chipset Serial KT Controller + 2e40 4 Series Chipset DRAM Controller + 2e41 4 Series Chipset PCI Express Root Port + 2e42 4 Series Chipset Integrated Graphics Controller + 2e43 4 Series Chipset Integrated Graphics Controller + 2e44 4 Series Chipset HECI Controller + 2e45 4 Series Chipset HECI Controller + 2e46 4 Series Chipset PT IDER Controller + 2e47 4 Series Chipset Serial KT Controller + 2e50 CE Media Processor CE3100 + 2e52 CE Media Processor Clock and Reset Controller + 2e58 CE Media Processor Interrupt Controller + 2e5a CE Media Processor CE3100 A/V Bridge + 2e5b Graphics Media Accelerator 500 Graphics + 2e5c CE Media Processor Video Decoder + 2e5d CE Media Processor Transport Stream Interface + 2e5e CE Media Processor Transport Stream Processor 0 + 2e5f CE Media Processor Audio DSP + 2e60 CE Media Processor Audio Interfaces + 2e61 CE Media Processor Video Display Controller + 2e62 CE Media Processor Video Processing Unit + 2e63 CE Media Processor HDMI Tx Interface + 2e64 Atom CE2600/3100/4100/4200/5300 Security Processor + 2e65 CE Media Processor Expansion Bus Interface + 2e66 CE Media Processor UART + 2e67 CE Media Processor General Purpose I/Os + 2e68 CE Media Processor I2C Interface + 2e69 CE Media Processor Smart Card Interface + 2e6a CE Media Processor SPI Master Interface + 2e6e CE Media Processor Gigabit Ethernet Controller + 2e6f CE Media Processor Media Timing Unit + 2e70 CE Media Processor USB + 2e71 CE Media Processor SATA + 2e73 CE Media Processor CE3100 PCI Express + 2e90 4 Series Chipset DRAM Controller + 2e91 4 Series Chipset PCI Express Root Port + 2e92 4 Series Chipset Integrated Graphics Controller + 2e93 4 Series Chipset Integrated Graphics Controller + 2e94 4 Series Chipset HECI Controller + 2e95 4 Series Chipset HECI Controller + 2e96 4 Series Chipset PT IDER Controller + 2f00 Xeon E7 v3/Xeon E5 v3/Core i7 DMI2 + 2f01 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 0 + 2f02 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 1 + 2f03 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 1 + 2f04 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 + 2f05 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 + 2f06 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 + 2f07 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 2 + 2f08 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 + 2f09 Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 + 2f0a Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 + 2f0b Xeon E7 v3/Xeon E5 v3/Core i7 PCI Express Root Port 3 + 2f0d Haswell Xeon Non-Transparent Bridge (Back-to-back) + 2f0e Haswell Xeon Non-Transparent Bridge (Primary Side) + 2f0f Haswell Xeon Non-Transparent Bridge (Secondary Side) + 2f10 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f11 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f12 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f13 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f14 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f15 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f16 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f17 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f18 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f19 Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f1a Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f1b Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f1c Xeon E7 v3/Xeon E5 v3/Core i7 IIO Debug + 2f1d Xeon E7 v3/Xeon E5 v3/Core i7 PCIe Ring Interface + 2f1e Xeon E7 v3/Xeon E5 v3/Core i7 Scratchpad & Semaphore Registers + 2f1f Xeon E7 v3/Xeon E5 v3/Core i7 Scratchpad & Semaphore Registers + 2f20 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 0 + 2f21 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 1 + 2f22 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 2 + 2f23 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 3 + 2f24 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 4 + 2f25 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 5 + 2f26 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 6 + 2f27 Xeon E7 v3/Xeon E5 v3/Core i7 DMA Channel 7 + 2f28 Xeon E7 v3/Xeon E5 v3/Core i7 Address Map, VTd_Misc, System Management + 2f29 Xeon E7 v3/Xeon E5 v3/Core i7 Hot Plug + 2f2a Xeon E7 v3/Xeon E5 v3/Core i7 RAS, Control Status and Global Errors + 2f2c Xeon E7 v3/Xeon E5 v3/Core i7 I/O APIC + 2f2e Xeon E7 v3/Xeon E5 v3/Core i7 RAID 5/6 + 2f2f Xeon E7 v3/Xeon E5 v3/Core i7 RAID 5/6 + 2f30 Xeon E7 v3/Xeon E5 v3/Core i7 Home Agent 0 + 2f32 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 0 + 2f33 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 1 + 2f34 Xeon E7 v3/Xeon E5 v3/Core i7 PCIe Ring Interface + 2f36 Xeon E7 v3/Xeon E5 v3/Core i7 R3 QPI Link 0 & 1 Monitoring + 2f37 Xeon E7 v3/Xeon E5 v3/Core i7 R3 QPI Link 0 & 1 Monitoring + 2f38 Xeon E7 v3/Xeon E5 v3/Core i7 Home Agent 1 + 2f39 Xeon E7 v3/Xeon E5 v3/Core i7 I/O Performance Monitoring + 2f3a Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 2 + 2f3e Xeon E7 v3/Xeon E5 v3/Core i7 R3 QPI Link 2 Monitoring + 2f3f Xeon E7 v3/Xeon E5 v3/Core i7 R3 QPI Link 2 Monitoring + 2f40 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 2 + 2f41 Xeon E7 v3/Xeon E5 v3/Core i7 R3 QPI Link 2 Monitoring + 2f43 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 2 + 2f45 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 2 Debug + 2f46 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 2 Debug + 2f47 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 2 Debug + 2f60 Xeon E7 v3/Xeon E5 v3/Core i7 Home Agent 1 + 2f68 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Target Address, Thermal & RAS Registers + 2f6a Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder + 2f6b Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder + 2f6c Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder + 2f6d Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder + 2f6e Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO Channel 2/3 Broadcast + 2f6f Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO Global Broadcast + 2f70 Xeon E7 v3/Xeon E5 v3/Core i7 Home Agent 0 Debug + 2f71 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Target Address, Thermal & RAS Registers + 2f76 Xeon E7 v3/Xeon E5 v3/Core i7 E3 QPI Link Debug + 2f78 Xeon E7 v3/Xeon E5 v3/Core i7 Home Agent 1 Debug + 2f79 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Target Address, Thermal & RAS Registers + 2f7d Xeon E7 v3/Xeon E5 v3/Core i7 Scratchpad & Semaphore Registers + 2f7e Xeon E7 v3/Xeon E5 v3/Core i7 E3 QPI Link Debug + 2f80 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 0 + 2f81 Xeon E7 v3/Xeon E5 v3/Core i7 R3 QPI Link 0 & 1 Monitoring + 2f83 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 0 + 2f85 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 0 Debug + 2f86 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 0 Debug + 2f87 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 0 Debug + 2f88 Xeon E7 v3/Xeon E5 v3/Core i7 VCU + 2f8a Xeon E7 v3/Xeon E5 v3/Core i7 VCU + 2f90 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 1 + 2f93 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 1 + 2f95 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 1 Debug + 2f96 Xeon E7 v3/Xeon E5 v3/Core i7 QPI Link 1 Debug + 2f98 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2f99 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2f9a Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2f9c Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2fa0 Xeon E7 v3/Xeon E5 v3/Core i7 Home Agent 0 + 2fa8 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Target Address, Thermal & RAS Registers + 2faa Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder + 2fab Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder + 2fac Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder + 2fad Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder + 2fae Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO Channel 0/1 Broadcast + 2faf Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO Global Broadcast + 2fb0 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 0 Thermal Control + 2fb1 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 1 Thermal Control + 2fb2 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 0 ERROR Registers + 2fb3 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 1 ERROR Registers + 2fb4 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 2 Thermal Control + 2fb5 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 3 Thermal Control + 2fb6 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 2 ERROR Registers + 2fb7 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 3 ERROR Registers + 2fb8 Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 + 2fb9 Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 + 2fba Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 + 2fbb Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 + 2fbc Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 + 2fbd Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 + 2fbe Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 + 2fbf Xeon E7 v3/Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 + 2fc0 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2fc1 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2fc2 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2fc3 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2fc4 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2fc5 Xeon E7 v3/Xeon E5 v3/Core i7 Power Control Unit + 2fd0 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 0 Thermal Control + 2fd1 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 1 Thermal Control + 2fd2 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 0 ERROR Registers + 2fd3 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 1 ERROR Registers + 2fd4 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 2 Thermal Control + 2fd5 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 3 Thermal Control + 2fd6 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 2 ERROR Registers + 2fd7 Xeon E7 v3/Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 3 ERROR Registers + 2fe0 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe1 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe2 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe3 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe4 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe5 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe6 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe7 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe8 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fe9 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fea Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2feb Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fec Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fed Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fee Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2fef Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff0 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff1 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff2 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff3 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff4 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff5 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff6 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff7 Xeon E7 v3/Xeon E5 v3/Core i7 Unicast Registers + 2ff8 Xeon E7 v3/Xeon E5 v3/Core i7 Buffered Ring Agent + 2ff9 Xeon E7 v3/Xeon E5 v3/Core i7 Buffered Ring Agent + 2ffa Xeon E7 v3/Xeon E5 v3/Core i7 Buffered Ring Agent + 2ffb Xeon E7 v3/Xeon E5 v3/Core i7 Buffered Ring Agent + 2ffc Xeon E7 v3/Xeon E5 v3/Core i7 System Address Decoder & Broadcast Registers + 2ffd Xeon E7 v3/Xeon E5 v3/Core i7 System Address Decoder & Broadcast Registers + 2ffe Xeon E7 v3/Xeon E5 v3/Core i7 System Address Decoder & Broadcast Registers + 3140 Easel/Monette Hill Image Processor [Pixel Visual Core] + 3165 Wireless 3165 +# Stone Peak 1x1 + 8086 4010 Dual Band Wireless AC 3165 +# Stone Peak 1x1 + 8086 4210 Dual Band Wireless AC 3165 + 3166 Dual Band Wireless-AC 3165 Plus Bluetooth + 8086 4210 Dual Band Wireless-AC 3165 + 3184 GeminiLake [UHD Graphics 605] + 3185 GeminiLake [UHD Graphics 600] + 318c Celeron/Pentium Silver Processor Dynamic Platform and Thermal Framework Processor Participant + 318e Celeron/Pentium Silver Processor NorthPeak + 3190 Celeron/Pentium Silver Processor Gaussian Mixture Model + 3192 Gemini Lake P2SB + 3197 Celeron/Pentium Silver Processor PCI-default ISA-bridge + 3198 Celeron/Pentium Silver Processor High Definition Audio + 17aa 380b V130-15IGM Laptop (Lenovo) - Type 81HL + 319a Celeron/Pentium Silver Processor Trusted Execution Engine Interface + 31a2 Celeron/Pentium Silver Processor Integrated Sensor Solution + 31a8 Celeron/Pentium Silver Processor USB 3.0 xHCI Controller + 1849 31a8 Celeron/Pentium Silver Processor USB 3.0 xHCI Controller + 31ac Celeron/Pentium Silver Processor I2C 0 + 31ae Celeron/Pentium Silver Processor I2C 1 + 31b0 Celeron/Pentium Silver Processor I2C 2 + 31b2 Celeron/Pentium Silver Processor I2C 3 + 31b4 Celeron/Pentium Silver Processor I2C 4 + 31b6 Celeron/Pentium Silver Processor I2C 5 + 31b8 Celeron/Pentium Silver Processor I2C 6 + 31ba Celeron/Pentium Silver Processor I2C 7 + 31bc Celeron/Pentium Silver Processor Serial IO UART Host Controller + 31be Celeron/Pentium Silver Processor Serial IO UART Host Controller + 31c0 Celeron/Pentium Silver Processor Serial IO UART Host Controller + 31c2 Celeron/Pentium Silver Processor Serial IO SPI Host Controller + 31c4 Celeron/Pentium Silver Processor Serial IO SPI Host Controller + 31c6 Celeron/Pentium Silver Processor Serial IO SPI Host Controller + 31cc Celeron/Pentium Silver Processor SDA Standard Compliant SD Host Controller + 31d4 Celeron/Pentium Silver Processor Gaussian Mixture Model + 31d6 Gemini Lake PCI Express Root Port + 31d7 Gemini Lake PCI Express Root Port + 31d8 Gemini Lake PCI Express Root Port + 31d9 Gemini Lake PCI Express Root Port + 31da Gemini Lake PCI Express Root Port + 31db Gemini Lake PCI Express Root Port + 31dc Gemini Lake PCH CNVi WiFi + 1a56 1552 Killer(R) Wireless-AC 1550i Wireless Network Adapter (9560NGW) + 8086 0034 Wireless-AC 9560 + 31e3 Celeron/Pentium Silver Processor SATA Controller + 31e8 Celeron/Pentium Silver Processor LPC Controller + 31ee Celeron/Pentium Silver Processor Serial IO UART Host Controller + 31f0 Gemini Lake Host Bridge + 3200 GD31244 PCI-X SATA HBA + 1775 c200 C2K onboard SATA host bus adapter + 3310 IOP348 I/O Processor + 1054 3030 HRA380 Hitachi RAID Adapter to PCIe + 1054 3034 HRA381 Hitachi RAID Adapter to PCIe + 3313 IOP348 I/O Processor (SL8e) in IOC Mode SAS/SATA + 331b IOP348 I/O Processor (SL8x) in IOC Mode SAS/SATA + 3331 IOC340 I/O Controller (VV8e) SAS/SATA + 3339 IOC340 I/O Controller (VV8x) SAS/SATA + 3340 82855PM Processor to I/O Controller + 1014 0529 Thinkpad T40 series + 1025 005a TravelMate 290 + 103c 088c NC8000 laptop + 103c 0890 NC6000 laptop + 103c 08b0 tc1100 tablet + 144d c005 X10 Laptop + 144d c00c P30/P35 notebook + 3341 82855PM Processor to AGP Controller + 144d c00c P30 notebook + 3363 IOC340 I/O Controller in IOC Mode SAS/SATA + 3382 81342 [Chevelon] I/O Processor (ATUe) + 33c3 IOP348 I/O Processor (SL8De) in IOC Mode SAS/SATA + 33cb IOP348 I/O Processor (SL8Dx) in IOC Mode SAS/SATA + 3400 5520/5500/X58 I/O Hub to ESI Port + 3401 5520/5500/X58 I/O Hub to ESI Port + 3402 5520/5500/X58 I/O Hub to ESI Port + 3403 5500 I/O Hub to ESI Port + 1028 0236 PowerEdge R610 I/O Hub to ESI Port + 1028 0287 PowerEdge M610 I/O Hub to ESI Port + 1028 028c PowerEdge R410 I/O Hub to ESI Port + 1028 028d PowerEdge T410 I/O Hub to ESI Port + 103c 330b ProLiant ML150 G6 Server + 3404 5520/5500/X58 I/O Hub to ESI Port + 3405 5520/5500/X58 I/O Hub to ESI Port + 3406 5520 I/O Hub to ESI Port + 103c 330b ProLiant G6 series + 3407 5520/5500/X58 I/O Hub to ESI Port + 3408 5520/5500/X58 I/O Hub PCI Express Root Port 1 + 103c 330b ProLiant G6 series + 3409 5520/5500/X58 I/O Hub PCI Express Root Port 2 + 340a 5520/5500/X58 I/O Hub PCI Express Root Port 3 + 103c 330b ProLiant ML150 G6 Server + 340b 5520/X58 I/O Hub PCI Express Root Port 4 + 340c 5520/X58 I/O Hub PCI Express Root Port 5 + 340d 5520/X58 I/O Hub PCI Express Root Port 6 + 340e 5520/5500/X58 I/O Hub PCI Express Root Port 7 + 103c 330b ProLiant ML150 G6 Server + 340f 5520/5500/X58 I/O Hub PCI Express Root Port 8 + 3410 7500/5520/5500/X58 I/O Hub PCI Express Root Port 9 + 3411 7500/5520/5500/X58 I/O Hub PCI Express Root Port 10 + 3418 7500/5520/5500/X58 Physical Layer Port 0 + 3419 7500/5520/5500 Physical Layer Port 1 + 3420 7500/5520/5500/X58 I/O Hub PCI Express Root Port 0 + 3421 7500/5520/5500/X58 I/O Hub PCI Express Root Port 0 + 3422 7500/5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers + 103c 330b ProLiant G6 series + 3423 7500/5520/5500/X58 I/O Hub Control Status and RAS Registers + 103c 330b ProLiant G6 series + 3425 7500/5520/5500/X58 Physical and Link Layer Registers Port 0 + 3426 7500/5520/5500/X58 Routing and Protocol Layer Registers Port 0 + 3427 7500/5520/5500 Physical and Link Layer Registers Port 1 + 3428 7500/5520/5500 Routing & Protocol Layer Register Port 1 + 3429 5520/5500/X58 Chipset QuickData Technology Device + 342a 5520/5500/X58 Chipset QuickData Technology Device + 342b 5520/5500/X58 Chipset QuickData Technology Device + 342c 5520/5500/X58 Chipset QuickData Technology Device + 342d 7500/5520/5500/X58 I/O Hub I/OxAPIC Interrupt Controller + 342e 7500/5520/5500/X58 I/O Hub System Management Registers + 103c 330b ProLiant G6 series + 342f 7500/5520/5500/X58 Trusted Execution Technology Registers + 3430 5520/5500/X58 Chipset QuickData Technology Device + 3431 5520/5500/X58 Chipset QuickData Technology Device + 3432 5520/5500/X58 Chipset QuickData Technology Device + 3433 5520/5500/X58 Chipset QuickData Technology Device + 3438 7500/5520/5500/X58 I/O Hub Throttle Registers + 347e Ice Lake Xeon Non-Transparent Bridge + 3482 Ice Lake-LP LPC Controller + 34a3 Ice Lake-LP SMBus Controller + 34a4 Ice Lake-LP SPI Controller + 34a8 Ice Lake-LP Serial IO UART Controller #0 + 34a9 Ice Lake-LP Serial IO UART Controller #1 + 34aa Ice Lake-LP Serial IO SPI Controller #0 + 34ab Ice Lake-LP Serial IO SPI Controller #1 + 34b0 Ice Lake-LP PCI Express Root Port #9 + 34b7 Ice Lake-LP PCI Express Root Port #16 + 34ba Ice Lake-LP PCI Express Root Port #3 + 34bc Ice Lake-LP PCI Express Root Port #5 + 34c4 Ice Lake-LP SD Host Controller + 34c5 Ice Lake-LP Serial IO I2c Controller #4 + 34c6 Ice Lake-LP Serial IO I2c Controller #5 + 34c8 Ice Lake-LP Smart Sound Technology Audio Controller + 34d3 Ice Lake-LP SATA Controller [AHCI mode] + 34e0 Ice Lake-LP Management Engine + 34e8 Ice Lake-LP Serial IO I2C Controller #0 + 34e9 Ice Lake-LP Serial IO I2C Controller #1 + 34ea Ice Lake-LP Serial IO I2C Controller #2 + 34eb Ice Lake-LP Serial IO I2C Controller #3 + 34ed Ice Lake-LP USB 3.1 xHCI Host Controller + 34ef Ice Lake-LP DRAM Controller + 34f0 Ice Lake-LP PCH CNVi WiFi + 1a56 1552 Killer(R) Wireless-AC 1550i Wireless Network Adapter (9560NGW) + 8086 0074 Wi-Fi 6 AX201 + 8086 0264 Wireless-AC 9461 + 34f8 Ice Lake-LP SD Controller + 34fc Ice Lake-LP Integrated Sensor Solution + 3500 6311ESB/6321ESB PCI Express Upstream Port + 103c 31fe ProLiant DL140 G3 + 15d9 9680 X7DBN Motherboard + 3501 6310ESB PCI Express Upstream Port + 3504 6311ESB/6321ESB I/OxAPIC Interrupt Controller + 3505 6310ESB I/OxAPIC Interrupt Controller + 350c 6311ESB/6321ESB PCI Express to PCI-X Bridge + 103c 31fe ProLiant DL140 G3 + 15d9 9680 X7DBN Motherboard + 350d 6310ESB PCI Express to PCI-X Bridge + 3510 6311ESB/6321ESB PCI Express Downstream Port E1 + 103c 31fe ProLiant DL140 G3 + 15d9 9680 X7DBN Motherboard + 3511 6310ESB PCI Express Downstream Port E1 + 3514 6311ESB/6321ESB PCI Express Downstream Port E2 + 3515 6310ESB PCI Express Downstream Port E2 + 3518 6311ESB/6321ESB PCI Express Downstream Port E3 + 15d9 9680 X7DBN Motherboard + 3519 6310ESB PCI Express Downstream Port E3 + 3575 82830M/MG/MP Host Bridge + 0e11 0030 Evo N600c + 1014 021d ThinkPad A/T/X Series + 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP + 3576 82830M/MP AGP Bridge + 3577 82830M/MG Integrated Graphics Controller + 1014 0513 ThinkPad A/T/X Series + 3578 82830M/MG/MP Host Bridge + 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller + 1014 055c ThinkPad R50e + 1025 0064 Extensa 3000 series laptop + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0152 Latitude D500 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 114a 0582 PC8 + 1734 1055 Amilo M1420 + 1775 10d0 V5D Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller + 1734 1055 Amilo M1420 + 3582 82852/855GM Integrated Graphics Device + 1014 0562 ThinkPad R50e + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0152 Latitude D500 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 114a 0582 PC8 integrated graphics + 1775 10d0 V5D Single Board Computer VGA + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + e4bf 0cc9 CC9-SAMBA + e4bf 0cd2 CD2-BEBOP + 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller + 1014 055d ThinkPad R50e + 1025 0064 Extensa 3000 series laptop + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0152 Latitude D500 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 114a 0582 PC8 + 1734 1055 Amilo M1420 + 1775 10d0 V5D Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller + 1014 055e ThinkPad R50e + 1025 0064 Extensa 3000 series laptop + 1028 0139 Latitude D400 + 1028 014f Latitude X300 + 1028 0152 Latitude D500 + 1028 0163 Latitude D505 + 1028 018d Inspiron 700m/710m + 1028 0196 Inspiron 5160 + 114a 0582 PC8 + 1734 1055 Amilo M1420 + 1775 10d0 V5D Single Board Computer + 1775 ce90 CE9 + 4c53 10b0 CL9 mainboard + 4c53 10e0 PSL09 PrPMC + 358c 82854 GMCH + 358e 82854 GMCH Integrated Graphics Device + 3590 E7520 Memory Controller Hub + 1014 02dd eServer xSeries server mainboard + 1028 016c PowerEdge 1850 Memory Controller Hub + 1028 016d PowerEdge 2850 Memory Controller Hub + 1028 019a PowerEdge SC1425 + 1734 103e PRIMERGY RX/TX S2 series + 1775 1100 CR11/VR11 Single Board Computer + 4c53 10d0 Telum ASLP10 Processor AMC + 3591 E7525/E7520 Error Reporting Registers + 1014 02dd eServer xSeries server mainboard + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 103c 3208 ProLiant DL140 G2 + 4c53 10d0 Telum ASLP10 Processor AMC + 3592 E7320 Memory Controller Hub + 1734 1073 Primergy Econel 200 D2020 mainboard + 3593 E7320 Error Reporting Registers + 1734 1073 Primergy Econel 200 D2020 mainboard + 3594 E7520 DMA Controller + 1775 1100 CR11/VR11 Single Board Computer + 4c53 10d0 Telum ASLP10 Processor AMC + 3595 E7525/E7520/E7320 PCI Express Port A + 1775 1100 CR11/VR11 Single Board Computer + 3596 E7525/E7520/E7320 PCI Express Port A1 + 3597 E7525/E7520 PCI Express Port B + 1775 1100 CR11/VR11 Single Board Computer + 3598 E7520 PCI Express Port B1 + 1775 1100 CR11/VR11 Single Board Computer + 3599 E7520 PCI Express Port C + 1775 1100 CR11/VR11 Single Board Computer + 359a E7520 PCI Express Port C1 + 359b E7525/E7520/E7320 Extended Configuration Registers + 1014 02dd eServer xSeries server mainboard + 359e E7525 Memory Controller Hub + 1028 0168 Precision Workstation 670 Mainboard + 1028 0169 Precision 470 + 35b0 3100 Chipset Memory I/O Controller Hub + 35b1 3100 DRAM Controller Error Reporting Registers + 35b5 3100 Chipset Enhanced DMA Controller + 35b6 3100 Chipset PCI Express Port A + 35b7 3100 Chipset PCI Express Port A1 + 35c8 3100 Extended Configuration Test Overflow Registers + 3600 7300 Chipset Memory Controller Hub + 3604 7300 Chipset PCI Express Port 1 + 3605 7300 Chipset PCI Express Port 2 + 3606 7300 Chipset PCI Express Port 3 + 3607 7300 Chipset PCI Express Port 4 + 3608 7300 Chipset PCI Express Port 5 + 3609 7300 Chipset PCI Express Port 6 + 360a 7300 Chipset PCI Express Port 7 + 360b 7300 Chipset QuickData Technology Device + 360c 7300 Chipset FSB Registers + 1028 01f0 PowerEdge R900 7300 Chipset FSB Registers + 360d 7300 Chipset Snoop Filter Registers + 360e 7300 Chipset Debug and Miscellaneous Registers + 360f 7300 Chipset FBD Branch 0 Registers + 3610 7300 Chipset FBD Branch 1 Registers + 3700 Xeon C5500/C3500 DMI + 3701 Xeon C5500/C3500 DMI + 3702 Xeon C5500/C3500 DMI + 3703 Xeon C5500/C3500 DMI + 3704 Xeon C5500/C3500 DMI + 3705 Xeon C5500/C3500 DMI + 3706 Xeon C5500/C3500 DMI + 3707 Xeon C5500/C3500 DMI + 3708 Xeon C5500/C3500 DMI + 3709 Xeon C5500/C3500 DMI + 370a Xeon C5500/C3500 DMI + 370b Xeon C5500/C3500 DMI + 370c Xeon C5500/C3500 DMI + 370d Xeon C5500/C3500 DMI + 370e Xeon C5500/C3500 DMI + 370f Xeon C5500/C3500 DMI + 3710 Xeon C5500/C3500 CB3 DMA + 3711 Xeon C5500/C3500 CB3 DMA + 3712 Xeon C5500/C3500 CB3 DMA + 3713 Xeon C5500/C3500 CB3 DMA + 3714 Xeon C5500/C3500 CB3 DMA + 3715 Xeon C5500/C3500 CB3 DMA + 3716 Xeon C5500/C3500 CB3 DMA + 3717 Xeon C5500/C3500 CB3 DMA + 3718 Xeon C5500/C3500 CB3 DMA + 3719 Xeon C5500/C3500 CB3 DMA + 371a Xeon C5500/C3500 QPI Link + 371b Xeon C5500/C3500 QPI Routing and Protocol + 371d Xeon C5500/C3500 QPI Routing and Protocol + 3720 Xeon C5500/C3500 PCI Express Root Port 0 + 3721 Xeon C5500/C3500 PCI Express Root Port 1 + 3722 Xeon C5500/C3500 PCI Express Root Port 2 + 3723 Xeon C5500/C3500 PCI Express Root Port 3 + 3724 Xeon C5500/C3500 PCI Express Root Port 4 + 3725 Xeon C5500/C3500 NTB Primary + 3726 Xeon C5500/C3500 NTB Primary + 3727 Xeon C5500/C3500 NTB Secondary + 3728 Xeon C5500/C3500 Core + 3729 Xeon C5500/C3500 Core + 372a Xeon C5500/C3500 Core + 372b Xeon C5500/C3500 Core + 372c Xeon C5500/C3500 Reserved + 373f Xeon C5500/C3500 IOxAPIC + 37c8 C62x Chipset QuickAssist Technology + 8086 0001 QuickAssist Adapter 8960 + 8086 0002 QuickAssist Adapter 8970 + 37c9 C62x Chipset QuickAssist Technology Virtual Function + 37cc Ethernet Connection X722 + 37cd Ethernet Virtual Function 700 Series + 37ce Ethernet Connection X722 for 10GbE backplane + 1590 0215 Ethernet 10Gb 2-port 568i Adapter + 17aa 4023 Intel Ethernet Connection X722 for 10GbE backplane + 17aa 4025 Ethernet Connection X722 for 10GbE backplane + 37cf Ethernet Connection X722 for 10GbE QSFP+ + 37d0 Ethernet Connection X722 for 10GbE SFP+ + 17aa 4020 Intel Ethernet Connection X722 for 10G SFP+ + 17aa 4021 Intel Ethernet Connection X722 for 10G SFP+ + 17aa 4022 Ethernet Connection X722 for 10GbE SFP+ + 8086 0001 Ethernet Network Adapter X722-2 + 8086 0002 Ethernet Network Adapter X722-2 + 8086 0003 Ethernet Network Adapter X722-4 + 8086 0004 Ethernet Network Adapter X722-4 + 37d1 Ethernet Connection X722 for 1GbE + 14cd 0010 88E1514 Ethernet OCP 2x1G RJ45 Phy Card [USI-1514-1GbaseT] + 1590 0216 Ethernet 1Gb 2-port 368i Adapter + 1590 0217 Ethernet 1Gb 2-port 368FLR-MMT Adapter + 1590 0247 Ethernet 1Gb 4-port 369i Adapter + 17aa 4020 Ethernet Connection X722 for 1GbE + 17aa 4021 Ethernet Connection X722 for 1GbE + 17aa 4022 Ethernet Connection X722 for 1GbE + 17aa 4024 Ethernet Connection X722 for 1GbE + 37d2 Ethernet Connection X722 for 10GBASE-T + 1059 0180 RD10019 10GbE interface + 1170 37d2 Ethernet Connection X722 for 10GBASE-T + 14cd 0030 Ethernet OCP 2x10G RJ45 Phy Card [USI-X557-10GbaseT] + 1590 0218 Ethernet 10Gb 2-port 568FLR-MMT Adapter + 17aa 4020 Ethernet Connection X722 for 10GBASE-T + 17aa 4021 Ethernet Connection X722 for 10GBASE-T + 17aa 4022 Ethernet Connection X722 for 10GBASE-T + 17aa 4024 Ethernet Connection X722 for 10GBASE-T + 17aa 4025 Ethernet Connection X722 for 10GBASE-T + 37d3 Ethernet Connection X722 for 10GbE SFP+ + 1590 0219 Ethernet 10Gb 2-port 568FLR-MMSFP+ Adapter + 17aa 4020 Ethernet Connection X722 for 10GbE SFP+ + 17aa 4021 Ethernet Connection X722 for 10GbE SFP+ + 17aa 4025 Ethernet Connection X722 for 10GbE SFP+ + 37d4 Ethernet Connection X722 for 10GbE QSFP+ + 37d9 X722 Hyper-V Virtual Function + 3882 Ice Lake LPC Controller + 38a4 Ice Lake SPI Controller + 38e0 Ice Lake Management Engine Interface + 3a00 82801JD/DO (ICH10 Family) 4-port SATA IDE Controller + 3a02 82801JD/DO (ICH10 Family) SATA AHCI Controller + 3a05 82801JD/DO (ICH10 Family) SATA RAID Controller + 3a06 82801JD/DO (ICH10 Family) 2-port SATA IDE Controller + 3a14 82801JDO (ICH10DO) LPC Interface Controller + 3a16 82801JIR (ICH10R) LPC Interface Controller + 1028 028c PowerEdge R410 LPC Interface Controller + 1028 028d PowerEdge T410 LPC Interface Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 5001 GA-EP45-DS5 Motherboard + 3a18 82801JIB (ICH10) LPC Interface Controller + 3a1a 82801JD (ICH10D) LPC Interface Controller + 3a20 82801JI (ICH10 Family) 4 port SATA IDE Controller #1 + 1028 028c PowerEdge R410 SATA IDE Controller + 1028 028d PowerEdge T410 SATA IDE Controller + 3a22 82801JI (ICH10 Family) SATA AHCI Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 b005 GA-EP45-DS5/GA-EG45M-DS2H Motherboard + 3a25 82801JIR (ICH10R) SATA RAID Controller + 1028 028c PERC S100 Controller (PE R410) + 1028 028d PERC S100 Controller (PE T410) + 1028 02f1 PERC S100 Controller (PE R510) + 3a26 82801JI (ICH10 Family) 2 port SATA IDE Controller #2 + 1028 028c PowerEdge R410 SATA IDE Controller + 1028 028d PowerEdge T410 SATA IDE Controller + 3a30 82801JI (ICH10 Family) SMBus Controller + 1043 82d4 P5Q Deluxe Motherboard + 1458 5001 GA-EP45-DS5/GA-EG45M-DS2H Motherboard + 3a32 82801JI (ICH10 Family) Thermal Subsystem + 3a34 82801JI (ICH10 Family) USB UHCI Controller #1 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 5004 GA-EP45-DS5 Motherboard + 3a35 82801JI (ICH10 Family) USB UHCI Controller #2 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 5004 GA-EP45-DS5 Motherboard + 3a36 82801JI (ICH10 Family) USB UHCI Controller #3 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 5004 GA-EP45-DS5 Motherboard + 3a37 82801JI (ICH10 Family) USB UHCI Controller #4 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 5004 Motherboard + 3a38 82801JI (ICH10 Family) USB UHCI Controller #5 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 103c 330b ProLiant ML150 G6 Server + 1043 82d4 P5Q Deluxe Motherboard + 1458 5004 Motherboard + 3a39 82801JI (ICH10 Family) USB UHCI Controller #6 + 1028 028c PowerEdge R410 USB UHCI Controller + 1028 028d PowerEdge T410 USB UHCI Controller + 103c 330b ProLiant ML150 G6 Server + 1043 82d4 P5Q Deluxe Motherboard + 1458 5004 Motherboard + 3a3a 82801JI (ICH10 Family) USB2 EHCI Controller #1 + 1028 028c PowerEdge R410 USB EHCI Controller + 1028 028d PowerEdge T410 USB EHCI Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 5006 GA-EP45-DS5 Motherboard + 3a3c 82801JI (ICH10 Family) USB2 EHCI Controller #2 + 1028 028c PowerEdge R410 USB EHCI Controller + 1028 028d PowerEdge T410 USB EHCI Controller + 103c 330b ProLiant G6 series + 1043 82d4 P5Q Deluxe Motherboard + 1458 5006 Motherboard + 3a3e 82801JI (ICH10 Family) HD Audio Controller + 1043 8311 P5Q Deluxe Motherboard + 1458 a002 GA-EP45-UD3R Motherboard + 1458 a102 GA-EP45-DS5/GA-EG45M-DS2H Motherboard + 3a40 82801JI (ICH10 Family) PCI Express Root Port 1 + 1028 028c PowerEdge R410 PCI Express Port 1 + 1028 028d PowerEdge T410 PCI Express Port 1 + 103c 330b ProLiant ML150 G6 Server + 1043 82d4 P5Q Deluxe Motherboard + 1043 82ea P6T DeLuxe Motherboard + 1458 5001 GA-EP45-DS5/GA-EG45M-DS2H Motherboard + 3a42 82801JI (ICH10 Family) PCI Express Port 2 + 3a44 82801JI (ICH10 Family) PCI Express Root Port 3 + 1043 82ea P6T DeLuxe Motherboard + 3a46 82801JI (ICH10 Family) PCI Express Root Port 4 + 1043 82ea P6T DeLuxe Motherboard + 1458 5001 GA-EP45-DS5 Motherboard + 3a48 82801JI (ICH10 Family) PCI Express Root Port 5 + 103c 330b ProLiant ML150 G6 Server + 1043 82ea P6T Deluxe Motherboard + 1458 5001 GA-EP45-DS5 Motherboard + 3a4a 82801JI (ICH10 Family) PCI Express Root Port 6 + 103c 330b ProLiant ML150 G6 Server + 1043 82d4 P5Q Deluxe Motherboard + 1043 82ea P6T DeLuxe Motherboard + 1458 5001 GA-EP45-DS5/GA-EG45M-DS2H Motherboard + 3a4c 82801JI (ICH10 Family) Gigabit Ethernet Controller + 3a51 82801JDO (ICH10DO) VECI Controller + 3a55 82801JD/DO (ICH10 Family) Virtual SATA Controller + 3a60 82801JD/DO (ICH10 Family) SMBus Controller + 3a62 82801JD/DO (ICH10 Family) Thermal Subsystem + 3a64 82801JD/DO (ICH10 Family) USB UHCI Controller #1 + 3a65 82801JD/DO (ICH10 Family) USB UHCI Controller #2 + 3a66 82801JD/DO (ICH10 Family) USB UHCI Controller #3 + 3a67 82801JD/DO (ICH10 Family) USB UHCI Controller #4 + 3a68 82801JD/DO (ICH10 Family) USB UHCI Controller #5 + 3a69 82801JD/DO (ICH10 Family) USB UHCI Controller #6 + 3a6a 82801JD/DO (ICH10 Family) USB2 EHCI Controller #1 + 3a6c 82801JD/DO (ICH10 Family) USB2 EHCI Controller #2 + 3a6e 82801JD/DO (ICH10 Family) HD Audio Controller + 3a70 82801JD/DO (ICH10 Family) PCI Express Port 1 + 3a72 82801JD/DO (ICH10 Family) PCI Express Port 2 + 3a74 82801JD/DO (ICH10 Family) PCI Express Port 3 + 3a76 82801JD/DO (ICH10 Family) PCI Express Port 4 + 3a78 82801JD/DO (ICH10 Family) PCI Express Port 5 + 3a7a 82801JD/DO (ICH10 Family) PCI Express Port 6 + 3a7c 82801JD/DO (ICH10 Family) Gigabit Ethernet Controller + 3b00 5 Series/3400 Series Chipset LPC Interface Controller + 3b01 Mobile 5 Series Chipset LPC Interface Controller + 3b02 P55 Chipset LPC Interface Controller + 3b03 PM55 Chipset LPC Interface Controller + 3b04 5 Series Chipset LPC Interface Controller + 3b05 Mobile 5 Series Chipset LPC Interface Controller + 3b06 H55 Chipset LPC Interface Controller + 3b07 QM57 Chipset LPC Interface Controller + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + e4bf 50c1 PC1-GROOVE + 3b08 H57 Chipset LPC Interface Controller + 3b09 HM55 Chipset LPC Interface Controller + 1025 0347 Aspire 7740G + 144d c06a R730 Laptop + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b0a Q57 Chipset LPC Interface Controller + 1028 02da OptiPlex 980 + 15d9 060d C7SIM-Q Motherboard + 3b0b HM57 Chipset LPC Interface Controller + 3b0c 5 Series Chipset LPC Interface Controller + 3b0d 5 Series/3400 Series Chipset LPC Interface Controller + 3b0e 5 Series/3400 Series Chipset LPC Interface Controller + 3b0f QS57 Chipset LPC Interface Controller + 3b10 5 Series/3400 Series Chipset LPC Interface Controller + 3b11 5 Series/3400 Series Chipset LPC Interface Controller + 3b12 3400 Series Chipset LPC Interface Controller + 3b13 5 Series/3400 Series Chipset LPC Interface Controller + 3b14 3420 Chipset LPC Interface Controller + 15d9 0605 X8SIL + 3b15 5 Series/3400 Series Chipset LPC Interface Controller + 3b16 3450 Chipset LPC Interface Controller + 3b17 5 Series/3400 Series Chipset LPC Interface Controller + 3b18 5 Series/3400 Series Chipset LPC Interface Controller + 3b19 5 Series/3400 Series Chipset LPC Interface Controller + 3b1a 5 Series/3400 Series Chipset LPC Interface Controller + 3b1b 5 Series/3400 Series Chipset LPC Interface Controller + 3b1c 5 Series/3400 Series Chipset LPC Interface Controller + 3b1d 5 Series/3400 Series Chipset LPC Interface Controller + 3b1e 5 Series/3400 Series Chipset LPC Interface Controller + 3b1f 5 Series/3400 Series Chipset LPC Interface Controller + 3b20 5 Series/3400 Series Chipset 4 port SATA IDE Controller + 3b21 5 Series/3400 Series Chipset 2 port SATA IDE Controller + 3b22 5 Series/3400 Series Chipset 6 port SATA AHCI Controller + 1028 02da OptiPlex 980 + 15d9 0605 X8SIL + 15d9 060d C7SIM-Q Motherboard + 3b23 5 Series/3400 Series Chipset 4 port SATA AHCI Controller + 3b25 5 Series/3400 Series Chipset SATA RAID Controller + 103c 3118 Smart Array B110i SATA RAID Controller + 3b26 5 Series/3400 Series Chipset 2 port SATA IDE Controller + 3b28 5 Series/3400 Series Chipset 4 port SATA IDE Controller + 144d c06a R730 Laptop + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b29 5 Series/3400 Series Chipset 4 port SATA AHCI Controller + 1025 0347 Aspire 7740G + 144d c06a R730 Laptop + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b2c 5 Series/3400 Series Chipset SATA RAID Controller + 3b2d 5 Series/3400 Series Chipset 2 port SATA IDE Controller + 144d c06a R730 Laptop + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 3b2e 5 Series/3400 Series Chipset 4 port SATA IDE Controller + e4bf 50c1 PC1-GROOVE + 3b2f 5 Series/3400 Series Chipset 6 port SATA AHCI Controller + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + e4bf 50c1 PC1-GROOVE + 3b30 5 Series/3400 Series Chipset SMBus Controller + 1025 0347 Aspire 7740G + 1028 02da OptiPlex 980 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 1043 3838 P7P55-M Motherboard + 1043 8383 P7P55-M Motherboard + 144d c06a R730 Laptop + 15d9 0605 X8SIL + 15d9 060d C7SIM-Q Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 3b32 5 Series/3400 Series Chipset Thermal Subsystem + 1025 0347 Aspire 7740G + 1028 040a Latitude E6410 + 144d c06a R730 Laptop + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b34 5 Series/3400 Series Chipset USB2 Enhanced Host Controller + 1025 0347 Aspire 7740G + 1028 02da OptiPlex 980 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 144d c06a R730 Laptop + 15d9 0605 X8SIL + 15d9 060d C7SIM-Q Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 3b36 5 Series/3400 Series Chipset USB Universal Host Controller + 3b37 5 Series/3400 Series Chipset USB Universal Host Controller + 3b38 5 Series/3400 Series Chipset USB Universal Host Controller + 3b39 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3a 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3b 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3c 5 Series/3400 Series Chipset USB2 Enhanced Host Controller + 1025 0347 Aspire 7740G + 1028 02da OptiPlex 980 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 144d c06a R730 Laptop + 15d9 0605 X8SIL + 15d9 060d C7SIM-Q Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 3b3e 5 Series/3400 Series Chipset USB Universal Host Controller + 3b3f 5 Series/3400 Series Chipset USB Universal Host Controller + 3b40 5 Series/3400 Series Chipset USB Universal Host Controller + 3b41 5 Series/3400 Series Chipset LAN Controller + 3b42 5 Series/3400 Series Chipset PCI Express Root Port 1 + 1028 02da OptiPlex 980 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 103c 1521 EliteBook 8540p + 144d c06a R730 Laptop + 15d9 060d C7SIM-Q Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b44 5 Series/3400 Series Chipset PCI Express Root Port 2 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 15d9 060d C7SIM-Q Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b46 5 Series/3400 Series Chipset PCI Express Root Port 3 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 144d c06a R730 Laptop + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b48 5 Series/3400 Series Chipset PCI Express Root Port 4 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 144d c06a R730 Laptop + 3b4a 5 Series/3400 Series Chipset PCI Express Root Port 5 + 1028 02da OptiPlex 980 + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + 3b4c 5 Series/3400 Series Chipset PCI Express Root Port 6 + 3b4e 5 Series/3400 Series Chipset PCI Express Root Port 7 + 3b50 5 Series/3400 Series Chipset PCI Express Root Port 8 + 3b53 5 Series/3400 Series Chipset VECI Controller + 3b56 5 Series/3400 Series Chipset High Definition Audio + 1025 0347 Aspire 7740G + 1028 02da OptiPlex 980 + 1028 040a Latitude E6410 + 1028 040b Latitude E6510 + 1043 1373 G73-series gaming laptop + 144d c06a R730 Laptop + 15d9 060d C7SIM-Q Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 3b57 5 Series/3400 Series Chipset High Definition Audio + 3b64 5 Series/3400 Series Chipset HECI Controller + 1025 0347 Aspire 7740G + 15d9 060d C7SIM-Q Motherboard + 17c0 10d2 Medion Akoya E7214 Notebook PC [MD98410] + e4bf 50c1 PC1-GROOVE + 3b65 5 Series/3400 Series Chipset HECI Controller + 3b66 5 Series/3400 Series Chipset PT IDER Controller + 3b67 5 Series/3400 Series Chipset KT Controller + e4bf 50c1 PC1-GROOVE + 3c00 Xeon E5/Core i7 DMI2 + 3c01 Xeon E5/Core i7 DMI2 in PCI Express Mode + 3c02 Xeon E5/Core i7 IIO PCI Express Root Port 1a + 3c03 Xeon E5/Core i7 IIO PCI Express Root Port 1b + 3c04 Xeon E5/Core i7 IIO PCI Express Root Port 2a + 3c05 Xeon E5/Core i7 IIO PCI Express Root Port 2b + 3c06 Xeon E5/Core i7 IIO PCI Express Root Port 2c + 3c07 Xeon E5/Core i7 IIO PCI Express Root Port 2d + 3c08 Xeon E5/Core i7 IIO PCI Express Root Port 3a in PCI Express Mode + 3c09 Xeon E5/Core i7 IIO PCI Express Root Port 3b + 3c0a Xeon E5/Core i7 IIO PCI Express Root Port 3c + 3c0b Xeon E5/Core i7 IIO PCI Express Root Port 3d + 3c0d Xeon E5/Core i7 Non-Transparent Bridge + 3c0e Xeon E5/Core i7 Non-Transparent Bridge + 3c0f Xeon E5/Core i7 Non-Transparent Bridge + 3c20 Xeon E5/Core i7 DMA Channel 0 + 3c21 Xeon E5/Core i7 DMA Channel 1 + 3c22 Xeon E5/Core i7 DMA Channel 2 + 3c23 Xeon E5/Core i7 DMA Channel 3 + 3c24 Xeon E5/Core i7 DMA Channel 4 + 3c25 Xeon E5/Core i7 DMA Channel 5 + 3c26 Xeon E5/Core i7 DMA Channel 6 + 3c27 Xeon E5/Core i7 DMA Channel 7 + 3c28 Xeon E5/Core i7 Address Map, VTd_Misc, System Management + 3c2a Xeon E5/Core i7 Control Status and Global Errors + 3c2c Xeon E5/Core i7 I/O APIC + 3c2e Xeon E5/Core i7 DMA + 3c2f Xeon E5/Core i7 DMA + 3c40 Xeon E5/Core i7 IIO Switch and IRP Performance Monitor + 3c43 Xeon E5/Core i7 Ring to PCI Express Performance Monitor + 3c44 Xeon E5/Core i7 Ring to QuickPath Interconnect Link 0 Performance Monitor + 3c45 Xeon E5/Core i7 Ring to QuickPath Interconnect Link 1 Performance Monitor + 3c46 Xeon E5/Core i7 Processor Home Agent Performance Monitoring + 3c71 Xeon E5/Core i7 Integrated Memory Controller RAS Registers + 3c80 Xeon E5/Core i7 QPI Link 0 + 3c83 Xeon E5/Core i7 QPI Link Reut 0 + 3c84 Xeon E5/Core i7 QPI Link Reut 0 + 3c90 Xeon E5/Core i7 QPI Link 1 + 3c93 Xeon E5/Core i7 QPI Link Reut 1 + 3c94 Xeon E5/Core i7 QPI Link Reut 1 + 3ca0 Xeon E5/Core i7 Processor Home Agent + 3ca8 Xeon E5/Core i7 Integrated Memory Controller Registers + 3caa Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 0 + 3cab Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 1 + 3cac Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 2 + 3cad Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 3 + 3cae Xeon E5/Core i7 Integrated Memory Controller Target Address Decoder 4 + 3cb0 Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 0 + 3cb1 Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 1 + 3cb2 Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 0 + 3cb3 Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 1 + 3cb4 Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 2 + 3cb5 Xeon E5/Core i7 Integrated Memory Controller Channel 0-3 Thermal Control 3 + 3cb6 Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 2 + 3cb7 Xeon E5/Core i7 Integrated Memory Controller ERROR Registers 3 + 3cb8 Xeon E5/Core i7 DDRIO + 3cc0 Xeon E5/Core i7 Power Control Unit 0 + 3cc1 Xeon E5/Core i7 Power Control Unit 1 + 3cc2 Xeon E5/Core i7 Power Control Unit 2 + 3cd0 Xeon E5/Core i7 Power Control Unit 3 + 3ce0 Xeon E5/Core i7 Interrupt Control Registers + 3ce3 Xeon E5/Core i7 Semaphore and Scratchpad Configuration Registers + 3ce4 Xeon E5/Core i7 R2PCIe + 3ce6 Xeon E5/Core i7 QuickPath Interconnect Agent Ring Registers + 3ce8 Xeon E5/Core i7 Unicast Register 0 + 3ce9 Xeon E5/Core i7 Unicast Register 5 + 3cea Xeon E5/Core i7 Unicast Register 1 + 3ceb Xeon E5/Core i7 Unicast Register 6 + 3cec Xeon E5/Core i7 Unicast Register 3 + 3ced Xeon E5/Core i7 Unicast Register 7 + 3cee Xeon E5/Core i7 Unicast Register 4 + 3cef Xeon E5/Core i7 Unicast Register 8 + 3cf4 Xeon E5/Core i7 Integrated Memory Controller System Address Decoder 0 + 3cf5 Xeon E5/Core i7 Integrated Memory Controller System Address Decoder 1 + 3cf6 Xeon E5/Core i7 System Address Decoder + 3e10 8th Gen Core 4-core Processor Host Bridge/DRAM Registers [Coffee Lake H] + 3e18 8th Gen Core 4-core Workstation Processor Host Bridge/DRAM Registers [Coffee Lake S] + 3e1f 8th Gen Core 4-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] + 1458 5000 Z370 AORUS Gaming K3-CF + 3e30 8th/9th Gen Core 8-core Desktop Processor Host Bridge/DRAM Registers [Coffee Lake S] + 3e33 8th/9th Gen Core Processor Host Bridge/DRAM Registers [Coffee Lake] + 3e34 Coffee Lake HOST and DRAM Controller + 3e35 Coffee Lake Host Bridge/DRAM Registers + 3e81 8th Gen Core Processor PCIe Controller (x16) + 3e85 8th Gen Core Processor PCIe Controller (x8) + 3e89 8th Gen Core Processor PCIe Controller (x4) + 3e90 CoffeeLake-S GT1 [UHD Graphics 610] + 3e91 CoffeeLake-S GT2 [UHD Graphics 630] + 3e92 CoffeeLake-S GT2 [UHD Graphics 630] + 1028 0869 Vostro 3470 + 3e93 CoffeeLake-S GT1 [UHD Graphics 610] + 3e96 CoffeeLake-S GT2 [UHD Graphics P630] + 3e98 CoffeeLake-S GT2 [UHD Graphics 630] + 3e9b CoffeeLake-H GT2 [UHD Graphics 630] + 3ea0 WhiskeyLake-U GT2 [UHD Graphics 620] + 1028 089e Inspiron 5482 + 3ea5 CoffeeLake-U GT3e [Iris Plus Graphics 655] + 3ec2 8th Gen Core Processor Host Bridge/DRAM Registers + 1028 0869 Vostro 3470 + 1043 8694 PRIME H310M-D + 3ec4 8th Gen Core Processor Host Bridge/DRAM Registers + 3ec6 8th Gen Core Processor Host Bridge/DRAM Registers + 3eca 8th Gen Core Processor Host Bridge/DRAM Registers + 3ed0 8th Gen Core Processor Host Bridge/DRAM Registers + 4000 5400 Chipset Memory Controller Hub + 4001 5400 Chipset Memory Controller Hub + 4003 5400 Chipset Memory Controller Hub + 4021 5400 Chipset PCI Express Port 1 + 4022 5400 Chipset PCI Express Port 2 + 4023 5400 Chipset PCI Express Port 3 + 4024 5400 Chipset PCI Express Port 4 + 4025 5400 Chipset PCI Express Port 5 + 4026 5400 Chipset PCI Express Port 6 + 4027 5400 Chipset PCI Express Port 7 + 4028 5400 Chipset PCI Express Port 8 + 4029 5400 Chipset PCI Express Port 9 + 402d 5400 Chipset IBIST Registers + 402e 5400 Chipset IBIST Registers + 402f 5400 Chipset QuickData Technology Device + 4030 5400 Chipset FSB Registers + 4031 5400 Chipset CE/SF Registers + 4032 5400 Chipset IOxAPIC + 4035 5400 Chipset FBD Registers + 4036 5400 Chipset FBD Registers + 4041 NVMe Datacenter SSD [Optane] + 4100 Moorestown Graphics and Video + 4108 Atom Processor E6xx Integrated Graphics Controller + 4109 Atom Processor E6xx Integrated Graphics Controller + 410a Atom Processor E6xx Integrated Graphics Controller + 410b Atom Processor E6xx Integrated Graphics Controller + 410c Atom Processor E6xx Integrated Graphics Controller + 410d Atom Processor E6xx Integrated Graphics Controller + 410e Atom Processor E6xx Integrated Graphics Controller + 410f Atom Processor E6xx Integrated Graphics Controller + 4114 Atom Processor E6xx PCI Host Bridge #1 + 4115 Atom Processor E6xx PCI Host Bridge #2 + 4116 Atom Processor E6xx PCI Host Bridge #3 + 4117 Atom Processor E6xx PCI Host Bridge #4 + 4140 NVMe Datacenter SSD [Optane] + 1028 2134 NVMe Datacenter SSD [Optane] SED 400GB 2.5" U.2 (P5800X) + 1028 2135 NVMe Datacenter SSD [Optane] SED 800GB 2.5" U.2 (P5800X) + 1028 2136 NVMe Datacenter SSD [Optane] SED 1.6TB 2.5" U.2 (P5800X) + 1028 2137 NVMe Datacenter SSD [Optane] 400GB 2.5" U.2 (P5800X) + 1028 2138 NVMe Datacenter SSD [Optane] 800GB 2.5" U.2 (P5800X) + 1028 2139 NVMe Datacenter SSD [Optane] 1.6TB 2.5" U.2 (P5800X) + 4220 PRO/Wireless 2200BG [Calexico2] Network Connection + 103c 0934 Compaq nw8240/nx8220 + 103c 12f6 nc6120/nc6220/nw8240/nx8220 + 8086 2701 WM3B2200BG Mini-PCI Card + 8086 2712 IBM ThinkPad R50e + 8086 2721 Dell B130 laptop integrated WLAN + 8086 2722 Dell Latitude D600 + 8086 2731 Samsung P35 integrated WLAN + 4222 PRO/Wireless 3945ABG [Golan] Network Connection + 103c 135c PRO/Wireless 3945ABG [Golan] Network Connection + 8086 1000 PRO/Wireless 3945ABG Network Connection + 8086 1001 WM3945ABG MOW2 + 8086 1005 PRO/Wireless 3945BG Network Connection + 8086 1034 PRO/Wireless 3945BG Network Connection + 8086 1044 PRO/Wireless 3945BG Network Connection + 8086 1c00 PRO/Wireless 3945ABG Network Connection + 4223 PRO/Wireless 2915ABG [Calexico2] Network Connection + 1000 8086 mPCI 3B Americas/Europe ZZA + 1001 8086 mPCI 3B Europe ZZE + 1002 8086 mPCI 3B Japan ZZJ + 1003 8086 mPCI 3B High-Band ZZH + 103c 1351 Compaq nc6220 + 4224 PRO/Wireless 2915ABG [Calexico2] Network Connection + 4227 PRO/Wireless 3945ABG [Golan] Network Connection + 8086 1010 ThinkPad R60e + 8086 1011 ThinkPad T60/R60e/X60s/R61 + 8086 1014 PRO/Wireless 3945BG Network Connection + 4229 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection + 8086 1100 Vaio VGN-SZ79SN_C + 8086 1101 PRO/Wireless 4965 AG or AGN + 422b Centrino Ultimate-N 6300 + 8086 1101 Centrino Ultimate-N 6300 3x3 AGN + 8086 1121 Centrino Ultimate-N 6300 3x3 AGN + 422c Centrino Advanced-N 6200 + 8086 1301 Centrino Advanced-N 6200 2x2 AGN + 8086 1306 Centrino Advanced-N 6200 2x2 ABG + 8086 1307 Centrino Advanced-N 6200 2x2 BG + 8086 1321 Centrino Advanced-N 6200 2x2 AGN + 8086 1326 Centrino Advanced-N 6200 2x2 ABG + 4230 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection + 8086 1110 Lenovo ThinkPad T51 + 8086 1111 Lenovo ThinkPad T61 + 4232 WiFi Link 5100 + 8086 1201 WiFi Link 5100 AGN + 8086 1204 WiFi Link 5100 AGN + 8086 1205 WiFi Link 5100 BGN + 8086 1206 WiFi Link 5100 ABG + 8086 1221 WiFi Link 5100 AGN + 8086 1224 WiFi Link 5100 AGN + 8086 1225 WiFi Link 5100 BGN + 8086 1226 WiFi Link 5100 ABG + 8086 1301 WiFi Link 5100 AGN + 8086 1304 WiFi Link 5100 AGN + 8086 1305 WiFi Link 5100 BGN + 8086 1306 WiFi Link 5100 ABG + 8086 1321 WiFi Link 5100 AGN + 8086 1324 WiFi Link 5100 AGN + 8086 1325 WiFi Link 5100 BGN + 8086 1326 WiFi Link 5100 ABG + 4235 Ultimate N WiFi Link 5300 + 4236 Ultimate N WiFi Link 5300 + 4237 PRO/Wireless 5100 AGN [Shiloh] Network Connection + 8086 1211 WiFi Link 5100 AGN + 8086 1214 WiFi Link 5100 AGN + 8086 1215 WiFi Link 5100 BGN + 8086 1216 WiFi Link 5100 ABG + 8086 1311 WiFi Link 5100 AGN + 8086 1314 WiFi Link 5100 AGN + 8086 1315 WiFi Link 5100 BGN + 8086 1316 WiFi Link 5100 ABG + 4238 Centrino Ultimate-N 6300 + 8086 1111 Centrino Ultimate-N 6300 3x3 AGN + 4239 Centrino Advanced-N 6200 + 8086 1311 Centrino Advanced-N 6200 2x2 AGN + 8086 1316 Centrino Advanced-N 6200 2x2 ABG + 423a PRO/Wireless 5350 AGN [Echo Peak] Network Connection + 423b PRO/Wireless 5350 AGN [Echo Peak] Network Connection + 423c WiMAX/WiFi Link 5150 + 8086 1201 WiMAX/WiFi Link 5150 AGN + 8086 1206 WiMAX/WiFi Link 5150 ABG + 8086 1221 WiMAX/WiFi Link 5150 AGN + 8086 1301 WiMAX/WiFi Link 5150 AGN + 8086 1306 WiMAX/WiFi Link 5150 ABG + 8086 1321 WiMAX/WiFi Link 5150 AGN + 423d WiMAX/WiFi Link 5150 + 8086 1211 WiMAX/WiFi Link 5150 AGN + 8086 1216 WiMAX/WiFi Link 5150 ABG + 8086 1311 WiMAX/WiFi Link 5150 AGN + 8086 1316 WiMAX/WiFi Link 5150 ABG + 438b Tiger Lake-H LPC/eSPI Controller + 43a3 Tiger Lake-H SMBus Controller + 43a4 Tiger Lake-H SPI Controller + 43b0 Tiger Lake-H PCI Express Root Port #9 + 43bc Tiger Lake-H PCI Express Root Port #5 + 43c8 Tiger Lake-H HD Audio Controller + 43e0 Tiger Lake-H Management Engine Interface + 43e8 Tiger Lake-H Serial IO I2C Controller #0 + 43ed Tiger Lake-H USB 3.2 Gen 2x1 xHCI Host Controller + 43ef Tiger Lake-H Shared SRAM + 43f0 Tiger Lake PCH CNVi WiFi + 8086 0034 Wireless-AC 9560 + 8086 0074 Wi-Fi 6 AX201 160MHz + 8086 0264 Wireless-AC 9461 + 8086 02a4 Wireless-AC 9462 + 444e Turbo Memory Controller + 460d 12th Gen Core Processor PCI Express x16 Controller #1 + 461d Alder Lake Innovation Platform Framework Processor Participant + 461e Alder Lake-P Thunderbolt 4 USB Controller + 461f Alder Lake-P Thunderbolt 4 PCI Express Root Port #3 + 4626 Alder Lake-P Integrated Graphics Controller + 4629 12th Gen Core Processor Host Bridge/DRAM Registers + 462f Alder Lake-P Thunderbolt 4 PCI Express Root Port #2 + 463d 12th Gen Core Processor PCI Express x4 Controller #2 + 463e Alder Lake-P Thunderbolt 4 NHI #0 + 463f Alder Lake-P Thunderbolt 4 PCI Express Root Port #1 + 4641 12th Gen Core Processor Host Bridge/DRAM Registers + 464d 12th Gen Core Processor PCI Express x4 Controller #0 + 464f 12th Gen Core Processor Gaussian & Neural Accelerator + 4660 12th Gen Core Processor Host Bridge/DRAM Registers + 466d Alder Lake-P Thunderbolt 4 NHI #1 + 466e Alder Lake-P Thunderbolt 4 PCI Express Root Port #0 + 467d Platform Monitoring Technology + 467f Volume Management Device NVMe RAID Controller + 4680 AlderLake-S GT1 + 46a0 AlderLake-P GT2 + 46a1 UHD Graphics + 46a3 Alder Lake-P GT1 [UHD Graphics] + 46a6 Alder Lake-P Integrated Graphics Controller + 46c0 AlderLake-M GT1 + 4905 DG1 [Iris Xe MAX Graphics] + 4906 DG1 [Iris Xe Pod] + 4907 SG1 [Server GPU SG-18M] + 193d 4000 UN-GPU-XG310-32GB-FHFL + 4908 DG1 [Iris Xe Graphics] + 4c3d Volume Management Device NVMe RAID Controller + 4c8a RocketLake-S GT1 [UHD Graphics 750] + 4c8b RocketLake-S GT1 [UHD Graphics 730] + 4c90 RocketLake-S GT1 [UHD Graphics P750] + 4c9a RocketLake-S [UHD Graphics] + 4da3 Jasper Lake SMBus + 4da4 Jasper Lake SPI Controller + 4dc8 Jasper Lake HD Audio + 4de0 Management Engine Interface + 4de8 Serial IO I2C Host Controller + 4de9 Serial IO I2C Host Controller + 4df0 Wi-Fi 6 AX201 160MHz + 4e03 Dynamic Tuning service + 4e19 JasperLake IPU + 4e55 JasperLake [UHD Graphics] + 4e61 JasperLake [UHD Graphics] + 4e71 JasperLake [UHD Graphics] + 4f80 DG2 + 4f81 DG2 + 4f82 DG2 + 5001 LE80578 + 5002 LE80578 Graphics Processor Unit + 5009 LE80578 Video Display Controller + 500d LE80578 Expansion Bus + 500e LE80578 UART Controller + 500f LE80578 General Purpose IO + 5010 LE80578 I2C Controller + 5012 LE80578 Serial Peripheral Interface Bus + 5020 EP80579 Memory Controller Hub + 5021 EP80579 DRAM Error Reporting Registers + 5023 EP80579 EDMA Controller + 5024 EP80579 PCI Express Port PEA0 + 5025 EP80579 PCI Express Port PEA1 + 5028 EP80579 S-ATA IDE + 5029 EP80579 S-ATA AHCI + 502a EP80579 S-ATA Reserved + 502b EP80579 S-ATA Reserved + 502c EP80579 Integrated Processor ASU + 502d EP80579 Integrated Processor with QuickAssist ASU + 502e EP80579 Reserved + 502f EP80579 Reserved + 5030 EP80579 Reserved + 5031 EP80579 LPC Bus + 5032 EP80579 SMBus Controller + 5033 EP80579 USB 1.1 Controller + 5035 EP80579 USB 2.0 Controller + 5037 EP80579 PCI-PCI Bridge (transparent mode) + 5039 EP80579 Controller Area Network (CAN) interface #1 + 503a EP80579 Controller Area Network (CAN) interface #2 + 503b EP80579 Synchronous Serial Port (SPP) + 503c EP80579 IEEE 1588 Hardware Assist + 503d EP80579 Local Expansion Bus + 503e EP80579 Global Control Unit (GCU) + 503f EP80579 Reserved + 5040 EP80579 Integrated Processor Gigabit Ethernet MAC + 5041 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC + 5042 EP80579 Reserved + 5043 EP80579 Reserved + 5044 EP80579 Integrated Processor Gigabit Ethernet MAC + 5045 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC + 5046 EP80579 Reserved + 5047 EP80579 Reserved + 5048 EP80579 Integrated Processor Gigabit Ethernet MAC + 5049 EP80579 Integrated Processor with QuickAssist Gigabit Ethernet MAC + 504a EP80579 Reserved + 504b EP80579 Reserved + 504c EP80579 Integrated Processor with QuickAssist TDM + 5181 Alder Lake PCH-P LPC/eSPI Controller + 5182 Alder Lake PCH eSPI Controller + 51a3 Alder Lake PCH-P SMBus Host Controller + 51a4 Alder Lake-P PCH SPI Controller + 51a8 Alder Lake PCH UART #0 + 51a9 Alder Lake PCH UART #1 + 51bf Alder Lake PCH-P PCI Express Root Port #9 + 51c5 Alder Lake-P Serial IO I2C Controller #0 + 51c6 Alder Lake-P Serial IO I2C Controller #1 + 51c8 Alder Lake PCH-P High Definition Audio Controller + 51d3 Alder Lake-P SATA AHCI Controller + 51d8 Alder Lake-P Serial IO I2C Controller #2 + 51d9 Alder Lake-P Serial IO I2C Controller #3 + 51e0 Alder Lake PCH HECI Controller + 51e8 Alder Lake PCH Serial IO I2C Controller #0 + 51e9 Alder Lake PCH Serial IO I2C Controller #1 + 51ea Alder Lake PCH Serial IO I2C Controller #2 + 51eb Alder Lake PCH Serial IO I2C Controller #3 + 51ed Alder Lake PCH USB 3.2 xHCI Host Controller + 51ef Alder Lake PCH Shared SRAM + 51f0 Alder Lake-P PCH CNVi WiFi + 8086 0034 Wireless-AC 9560 160MHz + 8086 0070 Wi-Fi 6 AX201 160MHz + 8086 0074 Wi-Fi 6 AX201 160MHz + 8086 4070 Wi-Fi 6 AX201 160MHz + 5200 EtherExpress PRO/100 Intelligent Server PCI Bridge + 5201 EtherExpress PRO/100 Intelligent Server Fast Ethernet Controller + 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter + 530d 80310 (IOP) IO Processor + 5502 Ethernet Controller (2) I225-LMvP + 5845 QEMU NVM Express Controller + 1af4 1100 QEMU Virtual Machine + 5900 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 5901 Xeon E3-1200 v6/7th Gen Core Processor PCIe Controller (x16) + 5902 HD Graphics 610 + 5904 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 1025 115f Aspire E5-575G + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 5905 Xeon E3-1200 v6/7th Gen Core Processor PCIe Controller (x8) + 5909 Xeon E3-1200 v6/7th Gen Core Processor PCIe Controller (x4) + 590c Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 590f Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 1462 7a68 B250 KRAIT GAMING (MS-7A68) + 1462 7a72 H270 PC MATE + 5910 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 5911 Xeon E3-1200 v6/7th Gen Core Processor Gaussian Mixture Model + 5912 HD Graphics 630 + 1462 7a72 H270 PC MATE + 5914 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 17aa 225d ThinkPad T480 + 5916 HD Graphics 620 + 1025 1094 Aspire E5-575G + 17aa 2248 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 5917 UHD Graphics 620 + 17aa 225e ThinkPad T480 + 5918 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 591b HD Graphics 630 + 591c UHD Graphics 615 + 591d HD Graphics P630 + 591e HD Graphics 615 + 591f Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 5923 HD Graphics 635 + 5926 Iris Plus Graphics 640 + 5927 Iris Plus Graphics 650 + 5a84 Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Graphics Controller + 5a85 HD Graphics 500 + 5a88 Celeron N3350/Pentium N4200/Atom E3900 Series Imaging Unit + 5a98 Celeron N3350/Pentium N4200/Atom E3900 Series Audio Cluster + 5a9a Celeron N3350/Pentium N4200/Atom E3900 Series Trusted Execution Engine + 5aa2 Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Sensor Hub + 5aa8 Celeron N3350/Pentium N4200/Atom E3900 Series USB xHCI + 5aac Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #1 + 5aae Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #2 + 5ab0 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #3 + 5ab2 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #4 + 5ab4 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #5 + 5ab6 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #6 + 5ab8 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #7 + 5aba Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #8 + 5abc Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #1 + 5abe Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #2 + 5ac0 Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #3 + 5ac2 Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #1 + 5ac4 Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #2 + 5ac6 Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #3 + 5ac8 Celeron N3350/Pentium N4200/Atom E3900 Series PWM Pin Controller + 5aca Celeron N3350/Pentium N4200/Atom E3900 Series SDXC/MMC Host Controller + 5acc Celeron N3350/Pentium N4200/Atom E3900 Series eMMC Controller + 5ad0 Celeron N3350/Pentium N4200/Atom E3900 Series SDIO Controller + 5ad4 Celeron N3350/Pentium N4200/Atom E3900 Series SMBus Controller + 5ad6 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port B #1 + 5ad7 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port B #2 + 5ad8 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #1 + 5ad9 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #2 + 5ada Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #3 + 5adb Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #4 + 5ae3 Celeron N3350/Pentium N4200/Atom E3900 Series SATA AHCI Controller + 5ae8 Celeron N3350/Pentium N4200/Atom E3900 Series Low Pin Count Interface + 5aee Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #4 + 5af0 Celeron N3350/Pentium N4200/Atom E3900 Series Host Bridge + 65c0 5100 Chipset Memory Controller Hub + 65e2 5100 Chipset PCI Express x4 Port 2 + 65e3 5100 Chipset PCI Express x4 Port 3 + 65e4 5100 Chipset PCI Express x4 Port 4 + 65e5 5100 Chipset PCI Express x4 Port 5 + 65e6 5100 Chipset PCI Express x4 Port 6 + 65e7 5100 Chipset PCI Express x4 Port 7 + 65f0 5100 Chipset FSB Registers + 1028 020f PowerEdge R300 + 1028 0210 PowerEdge T300 + 65f1 5100 Chipset Reserved Registers + 1028 0210 PowerEdge T300 + 65f3 5100 Chipset Reserved Registers + 65f5 5100 Chipset DDR Channel 0 Registers + 65f6 5100 Chipset DDR Channel 1 Registers + 65f7 5100 Chipset PCI Express x8 Port 2-3 + 65f8 5100 Chipset PCI Express x8 Port 4-5 + 65f9 5100 Chipset PCI Express x8 Port 6-7 + 65fa 5100 Chipset PCI Express x16 Port 4-7 + 65ff 5100 Chipset DMA Engine + 6f00 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2 + 15d9 0832 X10SRL-F + 6f01 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 0 + 6f02 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 1 + 6f03 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 1 + 6f04 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 + 6f05 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 + 6f06 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 + 6f07 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 + 6f08 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 + 6f09 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 + 6f0a Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 + 6f0b Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 + 6f10 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f11 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f12 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f13 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f14 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f15 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f16 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f17 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f18 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f19 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f1a Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f1b Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f1c Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug + 6f1d Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent + 6f1e Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox + 6f1f Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox + 6f20 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 0 + 15d9 0832 X10SRL-F + 6f21 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 1 + 15d9 0832 X10SRL-F + 6f22 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 2 + 15d9 0832 X10SRL-F + 6f23 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 3 + 15d9 0832 X10SRL-F + 6f24 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 4 + 15d9 0832 X10SRL-F + 6f25 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 5 + 15d9 0832 X10SRL-F + 6f26 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 6 + 15d9 0832 X10SRL-F + 6f27 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 7 + 15d9 0832 X10SRL-F + 6f28 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Map/VTd_Misc/System Management + 15d9 0832 X10SRL-F + 6f29 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Hot Plug + 15d9 0832 X10SRL-F + 6f2a Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO RAS/Control Status/Global Errors + 15d9 0832 X10SRL-F + 6f2c Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D I/O APIC + 15d9 0832 X10SRL-F + 6f30 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 + 6f32 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 0 + 6f33 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 1 + 6f34 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent + 6f36 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 + 6f37 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 + 6f38 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 1 + 6f39 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IO Performance Monitoring + 6f3a Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 2 + 6f3e Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 2 + 6f3f Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 2 + 6f40 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 2 + 6f41 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 2 + 6f43 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 2 + 6f45 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 2 Debug + 6f46 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 2 Debug + 6f47 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 2 Debug + 6f50 Xeon Processor D Family QuickData Technology Register DMA Channel 0 + 6f51 Xeon Processor D Family QuickData Technology Register DMA Channel 1 + 6f52 Xeon Processor D Family QuickData Technology Register DMA Channel 2 + 6f53 Xeon Processor D Family QuickData Technology Register DMA Channel 3 + 6f54 Xeon Processor D Family QuickAssist Technology + 6f55 Xeon Processor D Family QuickAssist Technology Virtual Fuction + 6f60 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 1 + 6f68 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Target Address/Thermal/RAS + 6f6a Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Channel Target Address Decoder + 6f6b Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Channel Target Address Decoder + 6f6c Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Channel Target Address Decoder + 6f6d Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Channel Target Address Decoder + 6f6e Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Broadcast + 6f6f Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Global Broadcast + 6f70 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 Debug + 6f71 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS + 6f76 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link Debug + 6f78 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 1 Debug + 6f79 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Target Address/Thermal/RAS + 6f7d Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox + 6f7e Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link Debug + 6f80 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 0 + 6f81 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 + 6f83 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 0 + 6f85 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 0 Debug + 6f86 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 0 Debug + 6f87 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 0 Debug + 6f88 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6f8a Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6f90 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 1 + 6f93 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 1 + 6f95 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 1 Debug + 6f96 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D QPI Link 1 Debug + 6f98 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6f99 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6f9a Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6f9c Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fa0 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 + 6fa8 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS + 6faa Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder + 6fab Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder + 6fac Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder + 6fad Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder + 6fae Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Broadcast + 6faf Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Global Broadcast + 6fb0 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Thermal Control + 6fb1 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Thermal Control + 6fb2 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Error + 6fb3 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Error + 6fb4 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Thermal Control + 6fb5 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Thermal Control + 6fb6 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Error + 6fb7 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Error + 6fb8 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface + 6fb9 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface + 6fba Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface + 6fbb Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface + 6fbc Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface + 6fbd Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface + 6fbe Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface + 6fbf Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface + 6fc0 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc1 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc2 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc3 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc4 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc5 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc6 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc7 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc8 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fc9 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fca Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fcb Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fcc Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fcd Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fce Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fcf Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit + 6fd0 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 0 Thermal Control + 6fd1 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 1 Thermal Control + 6fd2 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 0 Error + 6fd3 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 1 Error + 6fd4 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 2 Thermal Control + 6fd5 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 3 Thermal Control + 6fd6 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 2 Error + 6fd7 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 3 Error + 6fe0 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe1 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe2 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe3 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe4 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe5 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe6 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe7 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe8 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fe9 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fea Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6feb Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fec Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fed Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fee Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6fef Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ff0 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ff1 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ff8 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ff9 Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ffa Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ffb Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ffc Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ffd Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 6ffe Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent + 7000 82371SB PIIX3 ISA [Natoma/Triton II] + 01de fffd Propolis Virtual PIIX3 ISA Controller + 1af4 1100 Qemu virtual machine + 7010 82371SB PIIX3 IDE [Natoma/Triton II] + 1af4 1100 Qemu virtual machine + 7020 82371SB PIIX3 USB [Natoma/Triton II] + 1af4 1100 QEMU Virtual Machine + 7030 430VX - 82437VX TVX [Triton VX] + 7050 Intercast Video Capture Card + 7051 PB 642365-003 (Business Video Conferencing Card) + 7100 430TX - 82439TX MTXC + 7110 82371AB/EB/MB PIIX4 ISA + 15ad 1976 Virtual Machine Chipset + 7111 82371AB/EB/MB PIIX4 IDE + 15ad 1976 Virtual Machine Chipset + 7112 82371AB/EB/MB PIIX4 USB + 15ad 1976 Virtual Machine Chipset + 1af4 1100 QEMU Virtual Machine + 7113 82371AB/EB/MB PIIX4 ACPI + 01de fffc Propolis Virtual PIIX4 PM Controller + 15ad 1976 Virtual Machine Chipset + 1af4 1100 Qemu virtual machine + 7120 82810 GMCH (Graphics Memory Controller Hub) + 4c53 1040 CL7 mainboard + 4c53 1060 PC7 mainboard + 7121 82810 (CGC) Chipset Graphics Controller + 4c53 1040 CL7 mainboard + 4c53 1060 PC7 mainboard + 8086 4341 Cayman (CA810) Mainboard + 7122 82810 DC-100 (GMCH) Graphics Memory Controller Hub + 7123 82810 DC-100 (CGC) Chipset Graphics Controller + 7124 82810E DC-133 (GMCH) Graphics Memory Controller Hub + 1028 00b4 OptiPlex GX110 + 7125 82810E DC-133 (CGC) Chipset Graphics Controller + 1028 00b4 OptiPlex GX110 + 7126 82810 DC-133 System and Graphics Controller + 7128 82810-M DC-100 System and Graphics Controller + 712a 82810-M DC-133 System and Graphics Controller + 7180 440LX/EX - 82443LX/EX Host bridge + 7181 440LX/EX - 82443LX/EX AGP bridge + 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge + 0e11 0500 Armada 1750 Laptop System Chipset + 0e11 b110 Armada M700/E500 + 1028 008e PowerEdge 1300 mainboard + 1043 803b CUBX-L/E Mainboard + 1179 0001 Toshiba Tecra 8100 Laptop System Chipset + 15ad 1976 Virtual Machine Chipset + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge + 1028 008e PowerEdge 1300 mainboard + 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) + 0e11 0460 Armada 1700 Laptop System Chipset + 1179 0001 Satellite 4010 + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 8086 7190 Dell PowerEdge 350 + 7194 82440MX Host Bridge + 1033 0000 Versa Note Vxi + 4c53 10a0 CA3/CR3 mainboard + 7195 82440MX AC'97 Audio Controller + 1033 80cc Versa Note VXi + 10cf 1099 QSound_SigmaTel Stac97 PCI Audio + 11d4 0040 SoundMAX Integrated Digital Audio + 11d4 0048 SoundMAX Integrated Digital Audio + 7196 82440MX AC'97 Modem Controller + 7198 82440MX ISA Bridge + 7199 82440MX EIDE Controller + 719a 82440MX USB Universal Host Controller + 719b 82440MX Power Management Controller + 71a0 440GX - 82443GX Host bridge + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + 71a1 440GX - 82443GX AGP bridge + 71a2 440GX - 82443GX Host bridge (AGP disabled) + 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard + 7360 XMM7360 LTE Advanced Modem + 7600 82372FB PIIX5 ISA + 7601 82372FB PIIX5 IDE + 7602 82372FB PIIX5 USB + 7603 82372FB PIIX5 SMBus + 7800 82740 (i740) AGP Graphics Accelerator + 003d 0008 Starfighter AGP + 003d 000b Starfighter AGP + 1092 0100 Stealth II G460 + 10b4 201a Lightspeed 740 + 10b4 202f Lightspeed 740 + 8086 0000 Terminator 2x/i + 8086 0100 Intel740 Graphics Accelerator +# Unlike other PCH components. The eSPI controller is specific to each chipset model + 7a84 Z690 Chipset LPC/eSPI Controller + 7aa3 Alder Lake-S PCH SMBus Controller + 7aa4 Alder Lake-S PCH SPI Controller + 7aa7 Alder Lake-S PCH Shared SRAM + 7ab4 Alder Lake-S PCH PCI Express Root Port #13 + 7ab8 Alder Lake-S PCH PCI Express Root Port #1 + 7ab9 Alder Lake-S PCH PCI Express Root Port #2 + 7abc Alder Lake-S PCH PCI Express Root Port #5 + 7abd Alder Lake-S PCH PCI Express Root Port #6 + 7acc Alder Lake-S PCH I2C Controller #0 + 7ad0 Alder Lake-S HD Audio Controller + 7ae0 Alder Lake-S PCH USB 3.2 Gen 2x2 XHCI Controller + 7ae2 Alder Lake-S PCH SATA Controller [AHCI Mode] + 7ae8 Alder Lake-S PCH HECI Controller #1 + 7af0 Alder Lake-S PCH CNVi WiFi + 8086 0094 Wi-Fi 6 AX201 160MHz + 8002 Trusted Execution Technology Registers + 8003 Trusted Execution Technology Registers + 8100 US15W/US15X SCH [Poulsbo] Host Bridge + 8101 US15L/UL11L SCH [Poulsbo] Host Bridge + 8108 US15W/US15X SCH [Poulsbo] Graphics Controller + 8109 US15L/UL11L SCH [Poulsbo] Graphics Controller + 8110 US15W/US15X/US15L/UL11L SCH [Poulsbo] PCI Express Port 1 + 8112 US15W/US15X/US15L/UL11L SCH [Poulsbo] PCI Express Port 2 + 8114 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB UHCI Controller #1 + 8115 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB UHCI Controller #2 + 8116 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB UHCI Controller #3 + 8117 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB EHCI Controller + 8118 US15W/US15X/US15L/UL11L SCH [Poulsbo] USB Client Controller + 8119 US15W/US15X/US15L/UL11L SCH [Poulsbo] LPC Bridge + 811a US15W/US15X/US15L/UL11L SCH [Poulsbo] IDE Controller + 811b US15W/US15X/US15L/UL11L SCH [Poulsbo] HD Audio Controller + 811c US15W/US15X/US15L/UL11L SCH [Poulsbo] SDIO/MMC Controller #1 + 811d US15W/US15X/US15L/UL11L SCH [Poulsbo] SDIO/MMC Controller #2 + 811e US15W/US15X/US15L/UL11L SCH [Poulsbo] SDIO/MMC Controller #3 + 8180 Atom Processor E6xx PCI Express Port 3 + 8181 Atom Processor E6xx PCI Express Port 4 + 8182 Atom Processor E6xx Integrated Graphics Controller + 8183 Atom Processor E6xx Configuration Unit + 8184 Atom Processor E6xx PCI Express Port 1 + 8185 Atom Processor E6xx PCI Express Port 2 + 8186 Atom Processor E6xx LPC Bridge + 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge + 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller + 84ca 450NX - 82451NX Memory & I/O Controller + 84cb 450NX - 82454NX/84460GX PCI Expander Bridge + 84e0 460GX - 84460GX System Address Controller (SAC) + 84e1 460GX - 84460GX System Data Controller (SDC) + 84e2 460GX - 84460GX AGP Bridge (GXB function 2) + 84e3 460GX - 84460GX Memory Address Controller (MAC) + 84e4 460GX - 84460GX Memory Data Controller (MDC) + 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB) + 84ea 460GX - 84460GX AGP Bridge (GXB function 1) + 8500 IXP4XX Network Processor (IXP420/421/422/425/IXC1100) + 1993 0ded mGuard-PCI AV#2 + 1993 0dee mGuard-PCI AV#1 + 1993 0def mGuard-PCI AV#0 + 8603 Ice Lake-LP Dynamic Tuning Processor Participant + 87c0 UHD Graphics 617 + 8800 Platform Controller Hub EG20T PCI Express Port + 8801 Platform Controller Hub EG20T Packet Hub + 8802 Platform Controller Hub EG20T Gigabit Ethernet Controller + 8803 Platform Controller Hub EG20T General Purpose IO Controller + 8804 Platform Controller Hub EG20T USB OHCI Controller #4 + 8805 Platform Controller Hub EG20T USB OHCI Controller #5 + 8806 Platform Controller Hub EG20T USB OHCI Controller #6 + 8807 Platform Controller Hub EG20T USB2 EHCI Controller #2 + 8808 Platform Controller Hub EG20T USB Client Controller + 8809 Platform Controller Hub EG20T SDIO Controller #1 + 880a Platform Controller Hub EG20T SDIO Controller #2 + 880b Platform Controller Hub EG20T SATA AHCI Controller + 880c Platform Controller Hub EG20T USB OHCI Controller #1 + 880d Platform Controller Hub EG20T USB OHCI Controller #2 + 880e Platform Controller Hub EG20T USB OHCI Controller #3 + 880f Platform Controller Hub EG20T USB2 EHCI Controller #1 + 8810 Platform Controller Hub EG20T DMA Controller #1 + 8811 Platform Controller Hub EG20T UART Controller 0 + 8812 Platform Controller Hub EG20T UART Controller 1 + 8813 Platform Controller Hub EG20T UART Controller 2 + 8814 Platform Controller Hub EG20T UART Controller 3 + 8815 Platform Controller Hub EG20T DMA Controller #2 + 8816 Platform Controller Hub EG20T Serial Peripheral Interface Bus + 8817 Platform Controller Hub EG20T I2C Controller + 8818 Platform Controller Hub EG20T Controller Area Network (CAN) Controller + 8819 Platform Controller Hub EG20T IEEE 1588 Hardware Assist + 8a03 Processor Power and Thermal Controller + 8a0d Ice Lake Thunderbolt 3 NHI #1 + 8a12 Ice Lake-LP Processor Host Bridge/DRAM Registers + 8a13 Ice Lake Thunderbolt 3 USB Controller + 8a14 Ice Lake Processor Host Bridge/DRAM Registers + 8a17 Ice Lake Thunderbolt 3 NHI #0 + 8a19 Image Signal Processor + 8a1d Ice Lake Thunderbolt 3 PCI Express Root Port #0 + 8a1f Ice Lake Thunderbolt 3 PCI Express Root Port #1 + 8a21 Ice Lake Thunderbolt 3 PCI Express Root Port #2 + 8a23 Ice Lake Thunderbolt 3 PCI Express Root Port #3 + 8a51 Iris Plus Graphics G7 (Ice Lake) + 8a52 Iris Plus Graphics G7 + 8a53 Iris Plus Graphics G7 + 8a56 Iris Plus Graphics G1 (Ice Lake) + 8a5a Iris Plus Graphics G4 (Ice Lake) + 8a5c Iris Plus Graphics G4 (Ice Lake) + 8c00 8 Series/C220 Series Chipset Family 4-port SATA Controller 1 [IDE mode] + 8c01 8 Series Chipset Family 4-port SATA Controller 1 [IDE mode] - Mobile + 8c02 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] + 1028 05d7 Alienware X51 R2 + 103c 1998 EliteDesk 800 G1 + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 8c03 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] + 103c 1909 ZBook 15 + 17aa 220e ThinkPad T440p + 8c04 8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode] + 8c05 8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode] + 8c06 8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode] + 8c07 8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode] + 8c08 8 Series/C220 Series Chipset Family 2-port SATA Controller 2 [IDE mode] + 8c09 8 Series/C220 Series Chipset Family 2-port SATA Controller 2 [IDE mode] + 8c0e 8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode] + 8c0f 8 Series/C220 Series Chipset Family SATA Controller 1 [RAID mode] + 8c10 8 Series/C220 Series Chipset Family PCI Express Root Port #1 + 103c 1998 EliteDesk 800 G1 + 1043 8534 ASUS H81I-PLUS + 17aa 220e ThinkPad T440p + 17aa 3098 ThinkCentre E73 + 8c11 8 Series/C220 Series Chipset Family PCI Express Root Port #1 + 8c12 8 Series/C220 Series Chipset Family PCI Express Root Port #2 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 8c13 8 Series/C220 Series Chipset Family PCI Express Root Port #2 + 8c14 8 Series/C220 Series Chipset Family PCI Express Root Port #3 + 8c15 8 Series/C220 Series Chipset Family PCI Express Root Port #3 + 8c16 8 Series/C220 Series Chipset Family PCI Express Root Port #4 + 8c17 8 Series/C220 Series Chipset Family PCI Express Root Port #4 + 8c18 8 Series/C220 Series Chipset Family PCI Express Root Port #5 + 8c19 8 Series/C220 Series Chipset Family PCI Express Root Port #5 + 8c1a 8 Series/C220 Series Chipset Family PCI Express Root Port #6 + 17aa 3098 ThinkCentre E73 + 8c1b 8 Series/C220 Series Chipset Family PCI Express Root Port #6 + 8c1c 8 Series/C220 Series Chipset Family PCI Express Root Port #7 + 8c1d 8 Series/C220 Series Chipset Family PCI Express Root Port #7 + 8c1e 8 Series/C220 Series Chipset Family PCI Express Root Port #8 + 8c1f 8 Series/C220 Series Chipset Family PCI Express Root Port #8 + 8c20 8 Series/C220 Series Chipset High Definition Audio Controller + 1028 05d7 Alienware X51 R2 + 103c 1909 ZBook 15 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 309f ThinkCentre M83 + 8c21 8 Series/C220 Series Chipset High Definition Audio Controller + 8c22 8 Series/C220 Series Chipset Family SMBus Controller + 1028 05d7 Alienware X51 R2 + 103c 1909 ZBook 15 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 8c23 8 Series Chipset Family CHAP Counters + 8c24 8 Series Chipset Family Thermal Management Controller + 8c26 8 Series/C220 Series Chipset Family USB EHCI #1 + 1028 05d7 Alienware X51 R2 + 103c 1909 ZBook 15 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 2210 ThinkPad T540p + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 2210 17aa ThinkPad T540p + 8c2d 8 Series/C220 Series Chipset Family USB EHCI #2 + 1028 05d7 Alienware X51 R2 + 103c 1909 ZBook 15 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 8c31 8 Series/C220 Series Chipset Family USB xHCI + 1028 05d7 Alienware X51 R2 + 103c 1909 ZBook 15 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 8c33 8 Series/C220 Series Chipset Family LAN Controller + 8c34 8 Series/C220 Series Chipset Family NAND Controller + 8c3a 8 Series/C220 Series Chipset Family MEI Controller #1 + 1028 05d7 Alienware X51 R2 + 103c 1909 ZBook 15 + 103c 1998 EliteDesk 800 G1 + 17aa 220e ThinkPad T440p + 17aa 3098 ThinkCentre E73 + 17aa 309f ThinkCentre M83 + 8c3b 8 Series/C220 Series Chipset Family MEI Controller #2 + 8c3c 8 Series/C220 Series Chipset Family IDE-r Controller + 8c3d 8 Series/C220 Series Chipset Family KT Controller + 103c 1998 EliteDesk 800 G1 + 8c40 8 Series/C220 Series Chipset Family LPC Controller + 8c41 8 Series Chipset Family Mobile Super SKU LPC Controller + 8c42 8 Series/C220 Series Chipset Family Desktop Super SKU LPC Controller + 8c43 8 Series/C220 Series Chipset Family LPC Controller + 8c44 Z87 Express LPC Controller + 8c45 8 Series/C220 Series Chipset Family LPC Controller + 8c46 Z85 Express LPC Controller + 8c47 8 Series/C220 Series Chipset Family LPC Controller + 8c48 8 Series/C220 Series Chipset Family LPC Controller + 8c49 HM86 Express LPC Controller + 8c4a H87 Express LPC Controller + 1028 05d7 Alienware X51 R2 + 8c4b HM87 Express LPC Controller + 8c4c Q85 Express LPC Controller + 17aa 309f ThinkCentre M83 + 8c4d 8 Series/C220 Series Chipset Family LPC Controller + 8c4e Q87 Express LPC Controller + 103c 1998 EliteDesk 800 G1 + 8c4f QM87 Express LPC Controller + 103c 1909 ZBook 15 + 17aa 220e ThinkPad T440p + 8c50 B85 Express LPC Controller + 8c51 8 Series/C220 Series Chipset Family LPC Controller + 8c52 C222 Series Chipset Family Server Essential SKU LPC Controller + 8c53 8 Series/C220 Series Chipset Family LPC Controller + 8c54 C224 Series Chipset Family Server Standard SKU LPC Controller + 8c55 8 Series/C220 Series Chipset Family LPC Controller + 8c56 C226 Series Chipset Family Server Advanced SKU LPC Controller + 8c57 8 Series/C220 Series Chipset Family LPC Controller + 8c58 8 Series/C220 Series Chipset Family WS SKU LPC Controller + 8c59 8 Series/C220 Series Chipset Family LPC Controller + 8c5a 8 Series/C220 Series Chipset Family LPC Controller + 8c5b 8 Series/C220 Series Chipset Family LPC Controller + 8c5c H81 Express LPC Controller + 17aa 3098 ThinkCentre E73 + 8c5d 8 Series/C220 Series Chipset Family LPC Controller + 8c5e 8 Series/C220 Series Chipset Family LPC Controller + 8c5f 8 Series/C220 Series Chipset Family LPC Controller + 8c80 9 Series Chipset Family SATA Controller [IDE Mode] + 8c81 9 Series Chipset Family SATA Controller [IDE Mode] + 8c82 9 Series Chipset Family SATA Controller [AHCI Mode] + 8c83 9 Series Chipset Family SATA Controller [AHCI Mode] + 8c84 9 Series Chipset Family SATA Controller [RAID Mode] + 8c85 9 Series Chipset Family SATA Controller [RAID Mode] + 8c86 9 Series Chipset Family SATA Controller [RAID Mode] + 8c87 9 Series Chipset Family SATA Controller [RAID Mode] + 8c88 9 Series Chipset Family SATA Controller [IDE Mode] + 8c89 9 Series Chipset Family SATA Controller [IDE Mode] + 8c8e 9 Series Chipset Family SATA Controller [RAID Mode] + 8c8f 9 Series Chipset Family SATA Controller [RAID Mode] + 8c90 9 Series Chipset Family PCI Express Root Port 1 + 8c92 9 Series Chipset Family PCI Express Root Port 2 + 8c94 9 Series Chipset Family PCI Express Root Port 3 + 8c96 9 Series Chipset Family PCI Express Root Port 4 + 8c98 9 Series Chipset Family PCI Express Root Port 5 + 8c9a 9 Series Chipset Family PCI Express Root Port 6 + 8c9c 9 Series Chipset Family PCI Express Root Port 7 + 8c9e 9 Series Chipset Family PCI Express Root Port 8 + 8ca0 9 Series Chipset Family HD Audio Controller + 8ca2 9 Series Chipset Family SMBus Controller + 8ca4 9 Series Chipset Family Thermal Controller + 8ca6 9 Series Chipset Family USB EHCI Controller #1 + 8cad 9 Series Chipset Family USB EHCI Controller #2 + 8cb1 9 Series Chipset Family USB xHCI Controller + 8cb3 9 Series Chipset Family LAN Controller + 8cba 9 Series Chipset Family ME Interface #1 + 8cbb 9 Series Chipset Family ME Interface #2 + 8cbc 9 Series Chipset Family IDE-R Controller + 8cbd 9 Series Chipset Family KT Controller + 8cc1 9 Series Chipset Family LPC Controller + 8cc2 9 Series Chipset Family LPC Controller + 8cc3 HM97 Chipset LPC Controller + 8cc4 Z97 Chipset LPC Controller + 8cc5 QM97 Chipset LPC Controller + 8cc6 H97 Chipset LPC Controller + 8d00 C610/X99 series chipset 4-port SATA Controller [IDE mode] + 8d02 C610/X99 series chipset 6-Port SATA Controller [AHCI mode] + 8d04 C610/X99 series chipset SATA Controller [RAID mode] + 8d06 C610/X99 series chipset SATA Controller [RAID mode] + 17aa 1031 ThinkServer RAID 110i + 8d08 C610/X99 series chipset 2-port SATA Controller [IDE mode] + 8d0e C610/X99 series chipset SATA Controller [RAID mode] + 8d10 C610/X99 series chipset PCI Express Root Port #1 + 8d11 C610/X99 series chipset PCI Express Root Port #1 + 8d12 C610/X99 series chipset PCI Express Root Port #2 + 8d13 C610/X99 series chipset PCI Express Root Port #2 + 8d14 C610/X99 series chipset PCI Express Root Port #3 + 8d15 C610/X99 series chipset PCI Express Root Port #3 + 8d16 C610/X99 series chipset PCI Express Root Port #4 + 8d17 C610/X99 series chipset PCI Express Root Port #4 + 8d18 C610/X99 series chipset PCI Express Root Port #5 + 8d19 C610/X99 series chipset PCI Express Root Port #5 + 8d1a C610/X99 series chipset PCI Express Root Port #6 + 8d1b C610/X99 series chipset PCI Express Root Port #6 + 8d1c C610/X99 series chipset PCI Express Root Port #7 + 8d1d C610/X99 series chipset PCI Express Root Port #7 + 8d1e C610/X99 series chipset PCI Express Root Port #8 + 8d1f C610/X99 series chipset PCI Express Root Port #8 + 8d20 C610/X99 series chipset HD Audio Controller + 8d21 C610/X99 series chipset HD Audio Controller + 8d22 C610/X99 series chipset SMBus Controller + 15d9 0832 X10SRL-F + 8d24 C610/X99 series chipset Thermal Subsystem + 8d26 C610/X99 series chipset USB Enhanced Host Controller #1 + 15d9 0832 X10SRL-F + 8d2d C610/X99 series chipset USB Enhanced Host Controller #2 + 15d9 0832 X10SRL-F + 8d31 C610/X99 series chipset USB xHCI Host Controller + 15d9 0832 X10SRL-F + 8d33 C610/X99 series chipset LAN Controller + 8d34 C610/X99 series chipset NAND Controller + 8d3a C610/X99 series chipset MEI Controller #1 + 15d9 0832 X10SRL-F + 8d3b C610/X99 series chipset MEI Controller #2 + 15d9 0832 X10SRL-F + 8d3c C610/X99 series chipset IDE-r Controller + 8d3d C610/X99 series chipset KT Controller + 8d40 C610/X99 series chipset LPC Controller + 8d41 C610/X99 series chipset LPC Controller + 8d42 C610/X99 series chipset LPC Controller + 8d43 C610/X99 series chipset LPC Controller + 8d44 C610/X99 series chipset LPC Controller + 15d9 0832 X10SRL-F + 8d45 C610/X99 series chipset LPC Controller + 8d46 C610/X99 series chipset LPC Controller + 8d47 C610/X99 series chipset LPC Controller + 8d48 C610/X99 series chipset LPC Controller + 8d49 C610/X99 series chipset LPC Controller + 8d4a C610/X99 series chipset LPC Controller + 8d4b C610/X99 series chipset LPC Controller + 8d4c C610/X99 series chipset LPC Controller + 8d4d C610/X99 series chipset LPC Controller + 8d4e C610/X99 series chipset LPC Controller + 8d4f C610/X99 series chipset LPC Controller + 8d60 C610/X99 series chipset sSATA Controller [IDE mode] + 8d62 C610/X99 series chipset sSATA Controller [AHCI mode] + 8d64 C610/X99 series chipset sSATA Controller [RAID mode] + 8d66 C610/X99 series chipset sSATA Controller [RAID mode] + 8d68 C610/X99 series chipset sSATA Controller [IDE mode] + 8d6e C610/X99 series chipset sSATA Controller [RAID mode] + 8d7c C610/X99 series chipset SPSR + 15d9 0832 X10SRL-F + 8d7d C610/X99 series chipset MS SMBus 0 + 8d7e C610/X99 series chipset MS SMBus 1 + 8d7f C610/X99 series chipset MS SMBus 2 + 9000 IXP2000 Family Network Processor + 9001 IXP2400 Network Processor + 9002 IXP2300 Network Processor + 9004 IXP2800 Network Processor + 9621 Integrated RAID + 9622 Integrated RAID + 9641 Integrated RAID + 96a1 Integrated RAID + 9a01 11th Gen Core Processor PCIe Controller #1 + 9a03 TigerLake-LP Dynamic Tuning Processor Participant + 9a09 11th Gen Core Processor PCIe Controller + 9a0b Volume Management Device NVMe RAID Controller + 9a0d Tigerlake Telemetry Aggregator Driver + 9a0f 11th Gen Core Processor PCIe Controller #0 + 9a11 GNA Scoring Accelerator module + 9a13 Tiger Lake-LP Thunderbolt 4 USB Controller + 9a14 11th Gen Core Processor Host Bridge/DRAM Registers + 9a17 Tiger Lake-H Thunderbolt 4 USB Controller + 9a1b Tiger Lake-LP Thunderbolt 4 NHI #0 + 9a1d Tiger Lake-LP Thunderbolt 4 NHI #1 + 9a1f Tiger Lake-H Thunderbolt 4 NHI #0 + 9a21 Tiger Lake-H Thunderbolt 4 NHI #1 + 9a23 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #0 + 9a25 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #1 + 9a26 11th Gen Core Processor Host Bridge/DRAM Registers + 9a27 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #2 + 9a29 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #3 + 9a2b Tiger Lake-H Thunderbolt 4 PCI Express Root Port #0 + 9a2d Tiger Lake-H Thunderbolt 4 PCI Express Root Port #1 + 9a2f Tiger Lake-H Thunderbolt 4 PCI Express Root Port #2 + 9a31 Tiger Lake-H Thunderbolt 4 PCI Express Root Port #3 + 9a33 Tiger Lake Trace Hub + 9a36 11th Gen Core Processor Host Bridge/DRAM Registers + 9a49 TigerLake-LP GT2 [Iris Xe Graphics] + 9a60 TigerLake-H GT1 [UHD Graphics] + 9a68 TigerLake-H GT1 [UHD Graphics] + 9b33 Comet Lake-S 6c Host Bridge/DRAM Controller + 9b41 CometLake-U GT2 [UHD Graphics] + 1028 09bd Latitude 7310 + 1028 09be Latitude 7410 + 9b44 10th Gen Core Processor Host Bridge/DRAM Registers + 9b53 Comet Lake-S 6c Host Bridge/DRAM Controller + 9b54 10th Gen Core Processor Host Bridge/DRAM Registers + 9b61 Comet Lake-U v1 4c Host Bridge/DRAM Controller + 1028 09be Latitude 7410 + 9b63 10th Gen Core Processor Host Bridge/DRAM Registers + 9b64 10th Gen Core Processor Host Bridge/DRAM Registers + 9ba8 CometLake-S GT1 [UHD Graphics 610] + 9bc4 CometLake-H GT2 [UHD Graphics] + 9bc5 CometLake-S GT2 [UHD Graphics 630] + 9bc8 CometLake-S GT2 [UHD Graphics 630] + 9bca Comet Lake UHD Graphics + 9c00 8 Series SATA Controller 1 [IDE mode] + 9c01 8 Series SATA Controller 1 [IDE mode] + 9c02 8 Series SATA Controller 1 [AHCI mode] + 9c03 8 Series SATA Controller 1 [AHCI mode] + 17aa 2214 ThinkPad X240 + 9c04 8 Series SATA Controller 1 [RAID mode] + 9c05 8 Series SATA Controller 1 [RAID mode] + 9c06 8 Series SATA Controller 1 [RAID mode] + 9c07 8 Series SATA Controller 1 [RAID mode] + 9c08 8 Series SATA Controller 2 [IDE mode] + 9c09 8 Series SATA Controller 2 [IDE mode] + 9c0a 8 Series SATA Controller [Reserved] + 9c0b 8 Series SATA Controller [Reserved] + 9c0c 8 Series SATA Controller [Reserved] + 9c0d 8 Series SATA Controller [Reserved] + 9c0e 8 Series SATA Controller 1 [RAID mode] + 9c0f 8 Series SATA Controller 1 [RAID mode] + 9c10 8 Series PCI Express Root Port 1 + 9c11 8 Series PCI Express Root Port 1 + 9c12 8 Series PCI Express Root Port 2 + 9c13 8 Series PCI Express Root Port 2 + 9c14 8 Series PCI Express Root Port 3 + 9c15 8 Series PCI Express Root Port 3 + 9c16 8 Series PCI Express Root Port 4 + 9c17 8 Series PCI Express Root Port 4 + 9c18 8 Series PCI Express Root Port 5 + 9c19 8 Series PCI Express Root Port 5 + 9c1a 8 Series PCI Express Root Port 6 + 9c1b 8 Series PCI Express Root Port 6 + 9c1c 8 Series PCI Express Root Port 7 + 9c1d 8 Series PCI Express Root Port 7 + 9c1e 8 Series PCI Express Root Port 8 + 9c1f 8 Series PCI Express Root Port 8 + 9c20 8 Series HD Audio Controller + 17aa 2214 ThinkPad X240 + 9c21 8 Series HD Audio Controller + 9c22 8 Series SMBus Controller + 17aa 2214 ThinkPad X240 + 9c23 8 Series CHAP Counters + 9c24 8 Series Thermal + 9c26 8 Series USB EHCI #1 + 17aa 220c T440s + 17aa 2214 ThinkPad X240 + 9c2d 8 Series USB EHCI #2 + 9c31 8 Series USB xHCI HC + 17aa 2214 ThinkPad X240 + 8086 7270 Apple MacBookAir6,2 / MacBookPro11,1 + 9c35 8 Series SDIO Controller + 9c36 8 Series Audio DSP Controller + 9c3a 8 Series HECI #0 + 17aa 2214 ThinkPad X240 + 9c3b 8 Series HECI #1 + 9c3c 8 Series HECI IDER + 9c3d 8 Series HECI KT + 9c40 8 Series LPC Controller + 9c41 8 Series LPC Controller + 9c42 8 Series LPC Controller + 9c43 8 Series LPC Controller + 17aa 2214 ThinkPad X240 + 9c44 8 Series LPC Controller + 9c45 8 Series LPC Controller + 9c46 8 Series LPC Controller + 9c47 8 Series LPC Controller + 9c60 8 Series Low Power Sub-System DMA + 9c61 8 Series I2C Controller #0 + 9c62 8 Series I2C Controller #1 + 9c63 8 Series UART Controller #0 + 9c64 8 Series UART Controller #1 + 9c65 8 Series SPI Controller #0 + 9c66 8 Series SPI Controller #1 + 9c83 Wildcat Point-LP SATA Controller [AHCI Mode] + 9c85 Wildcat Point-LP SATA Controller [RAID Mode] + 9c87 Wildcat Point-LP SATA Controller [RAID Mode] + 9c8f Wildcat Point-LP SATA Controller [RAID Mode] + 9c90 Wildcat Point-LP PCI Express Root Port #1 + 9c92 Wildcat Point-LP PCI Express Root Port #2 + 9c94 Wildcat Point-LP PCI Express Root Port #3 + 9c96 Wildcat Point-LP PCI Express Root Port #4 + 9c98 Wildcat Point-LP PCI Express Root Port #5 + 9c9a Wildcat Point-LP PCI Express Root Port #6 + 9ca0 Wildcat Point-LP High Definition Audio Controller + 9ca2 Wildcat Point-LP SMBus Controller + 9ca4 Wildcat Point-LP Thermal Management Controller + 9ca6 Wildcat Point-LP USB EHCI Controller + 9cb1 Wildcat Point-LP USB xHCI Controller + 9cb5 Wildcat Point-LP Secure Digital IO Controller + 9cb6 Wildcat Point-LP Smart Sound Technology Controller + 9cba Wildcat Point-LP MEI Controller #1 + 9cbb Wildcat Point-LP MEI Controller #2 + 9cbc Wildcat Point-LP IDE-r Controller + 9cbd Wildcat Point-LP KT Controller + 9cc1 Wildcat Point-LP LPC Controller + 9cc2 Wildcat Point-LP LPC Controller + 9cc3 Wildcat Point-LP LPC Controller + 9cc5 Wildcat Point-LP LPC Controller + 9cc6 Wildcat Point-LP LPC Controller + 9cc7 Wildcat Point-LP LPC Controller + 9cc9 Wildcat Point-LP LPC Controller + 9ce0 Wildcat Point-LP Serial IO DMA Controller + 9ce1 Wildcat Point-LP Serial IO I2C Controller #0 + 9ce2 Wildcat Point-LP Serial IO I2C Controller #1 + 9ce3 Wildcat Point-LP Serial IO UART Controller #0 + 9ce4 Wildcat Point-LP Serial IO UART Controller #1 + 9ce5 Wildcat Point-LP Serial IO GSPI Controller #0 + 9ce6 Wildcat Point-LP Serial IO GSPI Controller #1 + 9d03 Sunrise Point-LP SATA Controller [AHCI mode] + 1025 115f Acer Aspire E5-575G + 1028 06dc Latitude E7470 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 225d ThinkPad T480 + 17aa 382a B51-80 Laptop + 9d10 Sunrise Point-LP PCI Express Root Port #1 + 9d11 Sunrise Point-LP PCI Express Root Port #2 + 9d12 Sunrise Point-LP PCI Express Root Port #3 + 9d13 Sunrise Point-LP PCI Express Root Port #4 + 9d14 Sunrise Point-LP PCI Express Root Port #5 + 17aa 382a B51-80 Laptop + 9d15 Sunrise Point-LP PCI Express Root Port #6 + 17aa 382a B51-80 Laptop + 9d16 Sunrise Point-LP PCI Express Root Port #7 + 9d17 Sunrise Point-LP PCI Express Root Port #8 + 9d18 Sunrise Point-LP PCI Express Root Port #9 + 17aa 2247 ThinkPad T570 + 17aa 382a B51-80 Laptop + 9d19 Sunrise Point-LP PCI Express Root Port #10 + 9d1a Sunrise Point-LP PCI Express Root Port #11 + 9d21 Sunrise Point-LP PMC + 1025 115f Acer Aspire E5-575G + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 17aa 225d ThinkPad T480 + 17aa 382a B51-80 Laptop + 9d23 Sunrise Point-LP SMBus + 1025 115f Acer Aspire E5-575G + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 17aa 225d ThinkPad T480 + 17aa 382a B51-80 Laptop + 9d27 Sunrise Point-LP Serial IO UART Controller #0 + 9d28 Sunrise Point-LP Serial IO UART Controller #1 + 9d29 Sunrise Point-LP Serial IO SPI Controller #0 + 9d2a Sunrise Point-LP Serial IO SPI Controller #1 + 9d2d Sunrise Point-LP Secure Digital IO Controller + 9d2f Sunrise Point-LP USB 3.0 xHCI Controller + 1025 115f Acer Aspire E5-575G + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 17aa 225d ThinkPad T480 + 17aa 382a B51-80 Laptop + 9d31 Sunrise Point-LP Thermal subsystem + 1025 115f Acer Aspire E5-575G + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 17aa 225d ThinkPad T480 + 17aa 382a B51-80 Laptop + 9d32 CSI-2 Host Controller + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 9d35 Sunrise Point-LP Integrated Sensor Hub + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 9d3a Sunrise Point-LP CSME HECI #1 + 1025 115f Acer Aspire E5-575G + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 17aa 225d ThinkPad T480 + 17aa 382a B51-80 Laptop + 9d3d Sunrise Point-LP Active Management Technology - SOL + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 9d3e iTouch Controller + 9d43 Sunrise Point-LP LPC Controller + 17aa 382a B51-80 Laptop + 9d46 LPC/eSPI Controller + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 9d48 Sunrise Point-LP LPC Controller + 1028 06dc Latitude E7470 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 9d4e Sunrise Point LPC Controller/eSPI Controller + 17aa 225d ThinkPad T480 + 9d50 Sunrise Point LPC Controller + 9d56 Sunrise Point-LP LPC Controller + 9d58 Sunrise Point-LP LPC Controller + 1025 115f Acer Aspire E5-575G + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 9d60 Sunrise Point-LP Serial IO I2C Controller #0 + 1025 115f Acer Aspire E5-575G + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 225d ThinkPad T480 + 8086 9d60 100 Series PCH/Sunrise Point PCH I2C0 [Skylake/Kaby Lake LPSS I2C] + 9d61 Sunrise Point-LP Serial IO I2C Controller #1 + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 9d62 Sunrise Point-LP Serial IO I2C Controller #2 + 1028 06d6 Latitude 7275 tablet + 1028 06e6 Latitude 11 5175 2-in-1 + 9d63 Sunrise Point-LP Serial IO I2C Controller #3 + 9d64 Sunrise Point-LP Serial IO I2C Controller #4 + 9d65 Sunrise Point-LP Serial IO I2C Controller #5 + 9d66 Sunrise Point-LP Serial IO UART Controller #2 + 9d70 Sunrise Point-LP HD Audio + 1028 06d6 Latitude 7275 tablet + 1028 06dc Latitude E7470 + 1028 06e6 Latitude 11 5175 2-in-1 + 1028 06f3 Latitude 3570 + 103c 8079 EliteBook 840 G3 + 17aa 2247 ThinkPad T570 + 17aa 382a B51-80 Laptop + 9d71 Sunrise Point-LP HD Audio + 1025 1094 Acer Aspire E5-575G + 17aa 224f ThinkPad X1 Carbon 5th Gen + 17aa 225d ThinkPad T480 + 9d84 Cannon Point-LP LPC Controller + 1028 089e Inspiron 5482 + 9da3 Cannon Point-LP SMBus Controller + 9da4 Cannon Point-LP SPI Controller + 9da8 Cannon Point-LP Serial IO UART Controller #2 + 9daa Cannon Point-LP Serial IO SPI Controller + 9dab Cannon Point-LP Serial IO SPI Controller + 9db0 Cannon Point-LP PCI Express Root Port #9 + 9db1 Cannon Point-LP PCI Express Root Port #10 + 9db2 Cannon Point-LP PCI Express Root Port #1 + 9db4 Cannon Point-LP PCI Express Root Port #13 + 1028 089e Inspiron 5482 + 9db6 Cannon Point-LP PCI Express Root Port #15 + 9db8 Cannon Point-LP PCI Express Root Port #1 + 9dbc Cannon Point-LP PCI Express Root Port #5 + 9dbe Cannon Point-LP PCI Express Root Port #7 + 9dbf Cannon Point PCI Express Root Port #8 + 9dc4 Cannon Point-LP SD Host Controller + 9dc5 Cannon Point-LP Serial IO I2C Host Controller + 9dc8 Cannon Point-LP High Definition Audio Controller + 1028 089e Inspiron 5482 + 9dd3 Cannon Point-LP SATA Controller [AHCI Mode] + 9de0 Cannon Point-LP MEI Controller #1 + 9de3 Cannon Point-LP Keyboard and Text (KT) Redirection + 9de8 Cannon Point-LP Serial IO I2C Controller #0 + 1028 089e Inspiron 5482 + 9de9 Cannon Point-LP Serial IO I2C Controller #1 + 1028 089e Inspiron 5482 + 9ded Cannon Point-LP USB 3.1 xHCI Controller + 9def Cannon Point-LP Shared SRAM + 9df0 Cannon Point-LP CNVi [Wireless-AC] + 9df5 BayHubTech Integrated SD controller + 9df9 Cannon Point-LP Thermal Controller + 9dfc Cannon Point-LP Integrated Sensor Hub + a000 Atom Processor D4xx/D5xx/N4xx/N5xx DMI Bridge + 1458 5000 GA-D525TUD + 8086 4f4d DeskTop Board D510MO + 8086 544b Desktop Board D425KT + a001 Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics Controller + 1458 d000 GA-D525TUD + 8086 4f4d DeskTop Board D510MO + 8086 544b Desktop Board D425KT + a002 Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics Controller + a003 Atom Processor D4xx/D5xx/N4xx/N5xx CHAPS counter + a010 Atom Processor D4xx/D5xx/N4xx/N5xx DMI Bridge + 1043 83ac Eee PC 1015PX + 144d c072 Notebook N150P + a011 Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics Controller + 1043 83ac Eee PC 1015PX + 144d c072 Notebook N150P + a012 Atom Processor D4xx/D5xx/N4xx/N5xx Integrated Graphics Controller + 1043 83ac Eee PC 1015PX + 144d c072 Notebook N150P + a013 Atom Processor D4xx/D5xx/N4xx/N5xx CHAPS counter + a082 Tiger Lake-LP LPC Controller + a0a3 Tiger Lake-LP SMBus Controller + a0a4 Tiger Lake-LP SPI Controller + a0a6 Tiger Lake-LP Trace Hub + a0a8 Tiger Lake-LP Serial IO UART Controller #0 + a0a9 Tiger Lake-LP Serial IO UART Controller #1 + a0ab Tiger Lake-LP Serial IO SPI Controller #1 + a0b0 Tiger Lake-LP PCI Express Root Port #9 + a0bd Tigerlake PCH-LP PCI Express Root Port #6 + a0bf Tiger Lake-LP PCI Express Root Port #8 + a0c5 Tiger Lake-LP Serial IO I2C Controller #4 + a0c6 Tiger Lake-LP Serial IO I2C Controller #5 + a0c8 Tiger Lake-LP Smart Sound Technology Audio Controller + a0e0 Tiger Lake-LP Management Engine Interface + a0e3 Tiger Lake-LP Active Management Technology - SOL + a0e8 Tiger Lake-LP Serial IO I2C Controller #0 + a0e9 Tiger Lake-LP Serial IO I2C Controller #1 + a0ea Tiger Lake-LP Serial IO I2C Controller #2 + a0eb Tiger Lake-LP Serial IO I2C Controller #3 + a0ed Tiger Lake-LP USB 3.2 Gen 2x1 xHCI Host Controller + a0ef Tiger Lake-LP Shared SRAM + a0f0 Wi-Fi 6 AX201 + a0fc Tiger Lake-LP Integrated Sensor Hub + a102 Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode] + a103 HM170/QM170 Chipset SATA Controller [AHCI Mode] + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a105 Sunrise Point-H SATA Controller [RAID mode] + a106 Q170/H170/Z170/CM236 Chipset SATA Controller [RAID Mode] + a107 HM170/QM170 Chipset SATA Controller [RAID Mode] + a10f Sunrise Point-H SATA Controller [RAID mode] + a110 100 Series/C230 Series Chipset Family PCI Express Root Port #1 + a111 100 Series/C230 Series Chipset Family PCI Express Root Port #2 + a112 100 Series/C230 Series Chipset Family PCI Express Root Port #3 + a113 100 Series/C230 Series Chipset Family PCI Express Root Port #4 + a114 100 Series/C230 Series Chipset Family PCI Express Root Port #5 + a115 100 Series/C230 Series Chipset Family PCI Express Root Port #6 + a116 100 Series/C230 Series Chipset Family PCI Express Root Port #7 + a117 100 Series/C230 Series Chipset Family PCI Express Root Port #8 + a118 100 Series/C230 Series Chipset Family PCI Express Root Port #9 + a119 100 Series/C230 Series Chipset Family PCI Express Root Port #10 + a11a 100 Series/C230 Series Chipset Family PCI Express Root Port #11 + a11b 100 Series/C230 Series Chipset Family PCI Express Root Port #12 + a11c 100 Series/C230 Series Chipset Family PCI Express Root Port #13 + a11d 100 Series/C230 Series Chipset Family PCI Express Root Port #14 + a11e 100 Series/C230 Series Chipset Family PCI Express Root Port #15 + a11f 100 Series/C230 Series Chipset Family PCI Express Root Port #16 + a120 100 Series/C230 Series Chipset Family P2SB + a121 100 Series/C230 Series Chipset Family Power Management Controller + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a122 Sunrise Point-H cAVS + a123 100 Series/C230 Series Chipset Family SMBus + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a124 100 Series/C230 Series Chipset Family SPI Controller + a125 100 Series/C230 Series Chipset Family Gigabit Ethernet Controller + a126 100 Series/C230 Series Chipset Family Trace Hub + a127 100 Series/C230 Series Chipset Family Serial IO UART #0 + a128 100 Series/C230 Series Chipset Family Serial IO UART #1 + a129 100 Series/C230 Series Chipset Family Serial IO GSPI #0 + a12a 100 Series/C230 Series Chipset Family Serial IO GSPI #1 + a12f 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a130 100 Series/C230 Series Chipset Family USB Device Controller (OTG) + a131 100 Series/C230 Series Chipset Family Thermal Subsystem + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a133 Sunrise Point-H Northpeak ACPI Function + a135 100 Series/C230 Series Chipset Family Integrated Sensor Hub + a13a 100 Series/C230 Series Chipset Family MEI Controller #1 + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a13b 100 Series/C230 Series Chipset Family MEI Controller #2 + a13c 100 Series/C230 Series Chipset Family IDE Redirection + a13d 100 Series/C230 Series Chipset Family KT Redirection + a13e 100 Series/C230 Series Chipset Family MEI Controller #3 + a140 Sunrise Point-H LPC Controller + a141 Sunrise Point-H LPC Controller + a142 Sunrise Point-H LPC Controller + a143 H110 Chipset LPC/eSPI Controller + a144 H170 Chipset LPC/eSPI Controller + a145 Z170 Chipset LPC/eSPI Controller + a146 Q170 Chipset LPC/eSPI Controller + a147 Q150 Chipset LPC/eSPI Controller + a148 B150 Chipset LPC/eSPI Controller + a149 C236 Chipset LPC/eSPI Controller + a14a C232 Chipset LPC/eSPI Controller + a14b Sunrise Point-H LPC Controller + a14c Sunrise Point-H LPC Controller + a14d QM170 Chipset LPC/eSPI Controller + a14e HM170 Chipset LPC/eSPI Controller + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a14f Sunrise Point-H LPC Controller + a150 CM236 Chipset LPC/eSPI Controller + a151 Sunrise Point-H LPC Controller + a152 HM175 Chipset LPC/eSPI Controller + a153 QM175 Chipset LPC/eSPI Controller + a154 CM238 Chipset LPC/eSPI Controller + a155 Sunrise Point-H LPC Controller + a156 Sunrise Point-H LPC Controller + a157 Sunrise Point-H LPC Controller + a158 Sunrise Point-H LPC Controller + a159 Sunrise Point-H LPC Controller + a15a Sunrise Point-H LPC Controller + a15b Sunrise Point-H LPC Controller + a15c Sunrise Point-H LPC Controller + a15d Sunrise Point-H LPC Controller + a15e Sunrise Point-H LPC Controller + a15f Sunrise Point-H LPC Controller + a160 100 Series/C230 Series Chipset Family Serial IO I2C Controller #0 + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a161 100 Series/C230 Series Chipset Family Serial IO I2C Controller #1 + 1028 06e4 XPS 15 9550 + a162 100 Series/C230 Series Chipset Family Serial IO I2C Controller #2 + a163 100 Series/C230 Series Chipset Family Serial IO I2C Controller #3 + a166 100 Series/C230 Series Chipset Family Serial IO UART Controller #2 + a167 100 Series/C230 Series Chipset Family PCI Express Root Port #17 + a168 100 Series/C230 Series Chipset Family PCI Express Root Port #18 + a169 100 Series/C230 Series Chipset Family PCI Express Root Port #19 + a16a 100 Series/C230 Series Chipset Family PCI Express Root Port #20 + a170 100 Series/C230 Series Chipset Family HD Audio Controller + 1028 06e4 XPS 15 9550 + 103c 825b OMEN-17-w001nv + a171 CM238 HD Audio Controller + a182 C620 Series Chipset Family SATA Controller [AHCI mode] + a186 C620 Series Chipset Family SATA Controller [RAID mode] + a190 C620 Series Chipset Family PCI Express Root Port #1 + a191 C620 Series Chipset Family PCI Express Root Port #2 + a192 C620 Series Chipset Family PCI Express Root Port #3 + a193 C620 Series Chipset Family PCI Express Root Port #4 + a194 C620 Series Chipset Family PCI Express Root Port #5 + a195 C620 Series Chipset Family PCI Express Root Port #6 + a196 C620 Series Chipset Family PCI Express Root Port #7 + a197 C620 Series Chipset Family PCI Express Root Port #8 + a198 C620 Series Chipset Family PCI Express Root Port #9 + a199 C620 Series Chipset Family PCI Express Root Port #10 + a19a C620 Series Chipset Family PCI Express Root Port #11 + a19b C620 Series Chipset Family PCI Express Root Port #12 + a19c C620 Series Chipset Family PCI Express Root Port #13 + a19d C620 Series Chipset Family PCI Express Root Port #14 + a19e C620 Series Chipset Family PCI Express Root Port #15 + a19f C620 Series Chipset Family PCI Express Root Port #16 + a1a0 C620 Series Chipset Family P2SB + a1a1 C620 Series Chipset Family Power Management Controller + 15d9 095d X11SPM-TF + a1a2 C620 Series Chipset Family cAVS + a1a3 C620 Series Chipset Family SMBus + 15d9 095d X11SPM-TF + a1a4 C620 Series Chipset Family SPI Controller + 15d9 095d X11SPM-TF + a1a6 C620 Series Chipset Family Trace Hub + a1af C620 Series Chipset Family USB 3.0 xHCI Controller + 15d9 095d X11SPM-TF + a1b1 C620 Series Chipset Family Thermal Subsystem + 15d9 095d X11SPM-TF + a1ba C620 Series Chipset Family MEI Controller #1 + 15d9 095d X11SPM-TF + a1bb C620 Series Chipset Family MEI Controller #2 + 15d9 095d X11SPM-TF + a1bc C620 Series Chipset Family IDE Redirection + a1bd C620 Series Chipset Family KT Redirection + a1be C620 Series Chipset Family MEI Controller #3 + 15d9 095d X11SPM-TF + a1c1 C621 Series Chipset LPC/eSPI Controller + a1c2 C622 Series Chipset LPC/eSPI Controller + 15d9 095d X11SPM-TF + a1c3 C624 Series Chipset LPC/eSPI Controller + a1c4 C625 Series Chipset LPC/eSPI Controller + a1c5 C626 Series Chipset LPC/eSPI Controller + a1c6 C627 Series Chipset LPC/eSPI Controller + a1c7 C628 Series Chipset LPC/eSPI Controller + a1d2 C620 Series Chipset Family SSATA Controller [AHCI mode] + a1d6 C620 Series Chipset Family SSATA Controller [RAID mode] + a1e7 C620 Series Chipset Family PCI Express Root Port #17 + a1e8 C620 Series Chipset Family PCI Express Root Port #18 + a1e9 C620 Series Chipset Family PCI Express Root Port #19 + a1ea C620 Series Chipset Family PCI Express Root Port #20 + a1ec C620 Series Chipset Family MROM 0 + a1ed C620 Series Chipset Family MROM 1 + a1f8 Lewisburg IE: HECI #1 + a1f9 Lewisburg IE: HECI #2 + a1fa Lewisburg IE: IDE-r + a1fb Lewisburg IE: KT Controller + a1fc Lewisburg IE: HECI #3 + a202 Lewisburg SATA Controller [AHCI mode] + a206 Lewisburg SATA Controller [RAID mode] + a223 Lewisburg SMBus + a224 Lewisburg SPI Controller + a242 Lewisburg LPC or eSPI Controller + a243 Lewisburg LPC or eSPI Controller + a252 Lewisburg SSATA Controller [AHCI mode] + a256 Lewisburg SSATA Controller [RAID mode] + a282 200 Series PCH SATA controller [AHCI mode] + 1462 7a72 H270 PC MATE + a286 200 Series PCH SATA controller [RAID mode] + a290 200 Series PCH PCI Express Root Port #1 + a291 200 Series PCH PCI Express Root Port #2 + a292 200 Series PCH PCI Express Root Port #3 + a293 200 Series PCH PCI Express Root Port #4 + a294 200 Series PCH PCI Express Root Port #5 + 1462 7a72 H270 PC MATE + a295 200 Series PCH PCI Express Root Port #6 + a296 200 Series PCH PCI Express Root Port #7 + 1462 7a72 H270 PC MATE + a297 200 Series PCH PCI Express Root Port #8 + a298 200 Series PCH PCI Express Root Port #9 + 1462 7a72 H270 PC MATE + a299 200 Series PCH PCI Express Root Port #10 + a29a 200 Series PCH PCI Express Root Port #11 + a29b 200 Series PCH PCI Express Root Port #12 + a29c 200 Series PCH PCI Express Root Port #13 + a29d 200 Series PCH PCI Express Root Port #14 + a29e 200 Series PCH PCI Express Root Port #15 + a29f 200 Series PCH PCI Express Root Port #16 + a2a0 200 Series/Z370 Chipset Family P2SB + a2a1 200 Series/Z370 Chipset Family Power Management Controller + 1462 7a72 H270 PC MATE + a2a3 200 Series/Z370 Chipset Family SMBus Controller + 1462 7a72 H270 PC MATE + a2a4 200 Series/Z370 Chipset Family SPI Controller + a2a5 200 Series/Z370 Chipset Family Gigabit Ethernet Controller + a2a6 200 Series/Z370 Chipset Family Trace Hub + a2a7 200 Series/Z370 Chipset Family Serial IO UART Controller #0 + a2a8 200 Series/Z370 Chipset Family Serial IO UART Controller #1 + a2a9 200 Series/Z370 Chipset Family Serial IO SPI Controller #0 + a2aa 200 Series/Z370 Chipset Family Serial IO SPI Controller #1 + a2af 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller + 1462 7a72 H270 PC MATE + a2b1 200 Series PCH Thermal Subsystem + 1462 7a72 H270 PC MATE + a2ba 200 Series PCH CSME HECI #1 + 1462 7a72 H270 PC MATE + a2bb 200 Series PCH CSME HECI #2 + a2c4 200 Series PCH LPC Controller (H270) + 1462 7a72 H270 PC MATE + a2c5 200 Series PCH LPC Controller (Z270) + a2c6 200 Series PCH LPC Controller (Q270) + a2c7 200 Series PCH LPC Controller (Q250) + a2c8 200 Series PCH LPC Controller (B250) + a2c9 Z370 Chipset LPC/eSPI Controller + a2d2 X299 Chipset LPC/eSPI Controller + a2d3 C422 Chipset LPC/eSPI Controller + a2e0 200 Series PCH Serial IO I2C Controller #0 + a2e1 200 Series PCH Serial IO I2C Controller #1 + a2e2 200 Series PCH Serial IO I2C Controller #2 + a2e3 200 Series PCH Serial IO I2C Controller #3 + a2e6 200 Series PCH Serial IO UART Controller #2 + a2e7 200 Series PCH PCI Express Root Port #17 + a2e8 200 Series PCH PCI Express Root Port #18 + a2e9 200 Series PCH PCI Express Root Port #19 + a2ea 200 Series PCH PCI Express Root Port #20 + a2eb 200 Series PCH PCI Express Root Port #21 + a2ec 200 Series PCH PCI Express Root Port #22 + a2ed 200 Series PCH PCI Express Root Port #23 + a2ee 200 Series PCH PCI Express Root Port #24 + a2f0 200 Series PCH HD Audio + 1462 7a72 H270 PC MATE + 1462 fa72 H270 PC MATE + a303 H310 Chipset LPC/eSPI Controller + a304 H370 Chipset LPC/eSPI Controller + 1028 0869 Vostro 3470 + a305 Z390 Chipset LPC/eSPI Controller + a306 Q370 Chipset LPC/eSPI Controller + a309 Cannon Point-LP LPC Controller + a30c QM370 Chipset LPC/eSPI Controller + a30d HM470 Chipset LPC/eSPI Controller + a30e Cannon Lake LPC Controller + a323 Cannon Lake PCH SMBus Controller + 1028 0869 Vostro 3470 + a324 Cannon Lake PCH SPI Controller + 1028 0869 Vostro 3470 + a328 Cannon Lake PCH Serial IO UART Host Controller + a32b Cannon Lake PCH SPI Host Controller + a32c Cannon Lake PCH PCI Express Root Port #21 + a32d Cannon Lake PCH PCI Express Root Port #22 + a32e Cannon Lake PCH PCI Express Root Port #23 + a32f Cannon Lake PCH PCI Express Root Port #24 + a330 Cannon Lake PCH PCI Express Root Port #9 + a331 Cannon Lake PCH PCI Express Root Port #10 + a332 Cannon Lake PCH PCI Express Root Port #11 + a333 Cannon Lake PCH PCI Express Root Port #12 + a334 Cannon Lake PCH PCI Express Root Port #13 + a335 Cannon Lake PCH PCI Express Root Port #14 + a336 Cannon Lake PCH PCI Express Root Port #15 + a337 Cannon Lake PCH PCI Express Root Port #16 + a338 Cannon Lake PCH PCI Express Root Port #1 + a339 Cannon Lake PCH PCI Express Root Port #2 + a33a Cannon Lake PCH PCI Express Root Port #3 + a33b Cannon Lake PCH PCI Express Root Port #4 + a33c Cannon Lake PCH PCI Express Root Port #5 + a33d Cannon Lake PCH PCI Express Root Port #6 + a33e Cannon Lake PCH PCI Express Root Port #7 + a33f Cannon Lake PCH PCI Express Root Port #8 + a340 Cannon Lake PCH PCI Express Root Port #17 + a341 Cannon Lake PCH PCI Express Root Port #18 + a342 Cannon Lake PCH PCI Express Root Port #19 + a343 Cannon Lake PCH PCI Express Root Port #20 + a348 Cannon Lake PCH cAVS + 1028 0869 Vostro 3470 + a352 Cannon Lake PCH SATA AHCI Controller + 1028 0869 Vostro 3470 + a353 Cannon Lake Mobile PCH SATA AHCI Controller + a360 Cannon Lake PCH HECI Controller + 1028 0869 Vostro 3470 + a363 Cannon Lake PCH Active Management Technology - SOL + a364 Cannon Lake PCH HECI Controller #2 + a368 Cannon Lake PCH Serial IO I2C Controller #0 + a369 Cannon Lake PCH Serial IO I2C Controller #1 + a36a Cannon Lake PCH Serial IO I2C Controller #2 + a36b Cannon Lake PCH Serial IO I2C Controller #3 + a36d Cannon Lake PCH USB 3.1 xHCI Host Controller + 1028 0869 Vostro 3470 + a36f Cannon Lake PCH Shared SRAM + a370 Cannon Lake PCH CNVi WiFi + 1a56 1552 Killer(R) Wireless-AC 1550i Wireless Network Adapter (9560NGW) + 8086 0034 Wireless-AC 9560 + a379 Cannon Lake PCH Thermal Controller + 1028 0869 Vostro 3470 + a382 400 Series Chipset Family SATA AHCI Controller + a394 Comet Lake PCI Express Root Port #05 + a397 Comet Lake PCI Express Root Port #08 + a398 Comet Lake PCI Express Root Port 9 + a39a Comet Lake PCI Express Root Port 11 + a3a1 Cannon Lake PCH Power Management Controller + a3a3 Comet Lake PCH-V SMBus Host Controller + a3af Comet Lake PCH-V USB Controller + a3b1 Comet Lake PCH-V Thermal Subsystem + a3ba Comet Lake PCH-V HECI Controller + a3c8 B460 Chipset LPC/eSPI Controller + a3da H410 Chipset LPC/eSPI Controller + a3eb Comet Lake PCI Express Root Port #21 + a3f0 Comet Lake PCH-V cAVS + a620 6400/6402 Advanced Memory Buffer (AMB) + abc0 Omni-Path Fabric Switch Silicon 100 Series + b152 21152 PCI-to-PCI Bridge + 8086 b152 21152 PCI-to-PCI Bridge +# observed, and documented in Intel revision note; new mask of 1011:0026 + b154 21154 PCI-to-PCI Bridge + b555 21555 Non transparent PCI-to-PCI Bridge + 12c7 5005 SS7HD PCI Adaptor Card + 12c7 5006 SS7HDC cPCI Adaptor Card + 12d9 000a PCI VoIP Gateway + 4c53 1050 CT7 mainboard + 4c53 1051 CE7 mainboard + e4bf 1000 CC8-1-BLUES + d130 Core Processor DMI + 15d9 0605 X8SIL + d131 Core Processor DMI + 1028 02da OptiPlex 980 + 15d9 060d C7SIM-Q Motherboard + d132 Core Processor DMI + 1028 040b Latitude E6510 + d133 Core Processor DMI + d134 Core Processor DMI + d135 Core Processor DMI + d136 Core Processor DMI + d137 Core Processor DMI + d138 Core Processor PCI Express Root Port 1 + 1028 02da OptiPlex 980 + 1028 040b Latitude E6510 + 15d9 060d C7SIM-Q Motherboard + d139 Core Processor PCI Express Root Port 2 + d13a Core Processor PCI Express Root Port 3 + d13b Core Processor PCI Express Root Port 4 + d150 Core Processor QPI Link + d151 Core Processor QPI Routing and Protocol Registers + d155 Core Processor System Management Registers + d156 Core Processor Semaphore and Scratchpad Registers + d157 Core Processor System Control and Status Registers + d158 Core Processor Miscellaneous Registers + f1a5 SSD 600P Series +# M.2 22 x 80mm, NVMe + 8086 390a SSDPEKKW256G7 256GB + f1a6 SSD Pro 7600p/760p/E 6100p Series + 8086 390b SSD Pro 7600p/760p/E 6100p Series [NVM Express] + f1a8 SSD 660P Series +8088 Beijing Wangxun Technology Co., Ltd. + 0100 WX1860AL-W Gigabit Ethernet Controller + 0101 WX1860A2 Gigabit Ethernet Controller + 8088 0201 Dual-Port Ethernet Network Adaptor SF200T + 8088 4201 Dual-Port Ethernet Network Adaptor SF200T (WOL) + 8088 8201 Dual-Port Ethernet Network Adaptor SF200T (NCSI) + 8088 c201 Dual-Port Ethernet Network Adaptor SF200T (WOL, NCSI) + 0102 WX1860A2S Gigabit Ethernet Controller + 8088 0210 Dual-Port Ethernet Network Adaptor SF200T-S + 0103 WX1860A4 Gigabit Ethernet Controller + 8088 0401 Qual-Port Ethernet Network Adaptor SF400T + 8088 0440 Qual-Port Ethernet Network Adaptor SF400-OCP + 8088 4103 Quad-Port Ethernet Network Adaptor SF400T (WOL) + 8088 8103 Quad-Port Ethernet Network Adaptor SF400T (NCSI) + 8088 c103 Quad-Port Ethernet Network Adaptor SF400T (WOL, NCSI) + 0104 WX1860A4S Gigabit Ethernet Controller + 8088 0410 Qual-Port Ethernet Network Adaptor SF400T-S + 0105 WX1860AL2 Gigabit Ethernet Controller + 8088 0202 Dual-Port Ethernet Network Adaptor SF200HT + 8088 4202 Dual-Port Ethernet Network Adaptor SF200HT (WOL) + 8088 8202 Dual-Port Ethernet Network Adaptor SF200HT (NCSI) + 8088 c202 Dual-Port Ethernet Network Adaptor SF200HT (WOL, NCSI) + 0106 WX1860AL2S Gigabit Ethernet Controller + 8088 0220 Dual-Port Ethernet Network Adaptor SF200HT-S + 0107 WX1860AL4 Gigabit Ethernet Controller + 8088 0402 Qual-Port Ethernet Network Adaptor SF400HT + 8088 4402 Quad-Port Ethernet Network Adaptor SF400HT (WOL) + 8088 8402 Quad-Port Ethernet Network Adaptor SF400HT (NCSI) + 8088 c402 Quad-Port Ethernet Network Adaptor SF400HT (WOL, NCSI) + 0108 WX1860AL4S Gigabit Ethernet Controller + 8088 0420 Qual-Port Ethernet Network Adaptor SF400HT-S + 0109 WX1860-LC Gigabit Ethernet Controller + 010a WX1860A1 Gigabit Ethernet Controller +# add new device ID + 010b WX1860AL1 Gigabit Ethernet Controller + 8088 0102 Single-Port Ethernet Network Adaptor SF100HT + 8088 4102 Single-Port Ethernet Network Adaptor SF100HT (WOL) + 8088 8102 Single-Port Ethernet Network Adaptor SF100HT (NCSI) + 8088 c102 Single-Port Ethernet Network Adaptor SF100HT (WOL, NCSI) + 0111 WX1860A2 Ethernet Controller Virtual Function + 0113 WX1860A4 Ethernet Controller Virtual Function + 0115 WX1860AL2 Ethernet Controller Virtual Function + 0117 WX1860AL4 Ethernet Controller Virtual Function + 0119 WX1860-LC Gigabit Ethernet Controller Virtual Function + 011a WX1860A1 Gigabit Ethernet Controller Virtual Function + 011b WX1860AL1 Gigabit Ethernet Controller Virtual Function + 1000 Ethernet Controller RP1000 Virtual Function for 10GbE SFP+ + 1001 Ethernet Controller RP1000 for 10GbE SFP+ + 8088 0000 Ethernet Network Adaptor RP1000 for 10GbE SFP+ + 2000 Ethernet Controller RP2000 Virtual Function for 10GbE SFP+ + 2001 Ethernet Controller RP2000 for 10GbE SFP+ + 8088 2000 Ethernet Network Adaptor RP2000 for 10GbE SFP+ +80ee InnoTek Systemberatung GmbH + beef VirtualBox Graphics Adapter + cafe VirtualBox Guest Service +8322 Sodick America Corp. +8384 SigmaTel +8401 TRENDware International Inc. +# nee ScaleMP +8686 SAP + 1010 vSMP Foundation controller [vSMP CTL] + 1011 vSMP Foundation MEX/FLX controller [vSMP CTL] +8800 Trigem Computer Inc. + 2008 Video assistant component +8820 Stryker Corporation + 2724 Mako Front Side Motor Controller [cPCI] +8848 Wuxi Micro Innovation Integrated Circuit Design Co.,Ltd +8866 T-Square Design Inc. +8888 Silicon Magic +8912 TRX +# 8c4a is not Winbond but there is a board misprogrammed +8c4a Winbond + 1980 W89C940 misprogrammed [ne2k] +8e0e Computone Corporation +8e2e KTI + 3000 ET32P2 +9004 Adaptec + 0078 AHA-2940U_CN + 1078 AIC-7810 + 1160 AIC-1160 [Family Fibre Channel Adapter] + 2178 AIC-7821 + 3860 AHA-2930CU + 3b78 AHA-4844W/4844UW + 5075 AIC-755x + 5078 AIC-7850T/7856T [AVA-2902/4/6 / AHA-2910] + 9004 7850 AIC-7850T/7856T [AVA-290x / AHA-2910] + 5175 AIC-755x + 5178 AIC-7851 + 5275 AIC-755x + 5278 AIC-7852 + 5375 AIC-755x + 5378 AIC-7850 + 5475 AIC-755x + 5478 AIC-7850 + 5575 AVA-2930 + 5578 AIC-7855 + 5647 ANA-7711 TCP Offload Engine + 9004 7710 ANA-7711F TCP Offload Engine - Optical + 9004 7711 ANA-7711LP TCP Offload Engine - Copper + 5675 AIC-755x + 5678 AIC-7856 + 5775 AIC-755x + 5778 AIC-7850 + 5800 AIC-5800 + 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter + 5905 ANA-5910A/5930A/5940A ATM Adapter + 6038 AIC-3860 + 6075 AIC-1480 / APA-1480 + 9004 7560 AIC-1480 / APA-1480 Cardbus + 6078 AIC-7860 + 6178 AIC-7861 + 9004 7861 AHA-2940AU Single + 6278 AIC-7860 + 6378 AIC-7860 + 6478 AIC-786x + 6578 AIC-786x + 6678 AIC-786x + 6778 AIC-786x + 6915 ANA620xx/ANA69011A + 9004 0008 ANA69011A/TX 10/100 + 9004 0009 ANA69011A/TX 10/100 + 9004 0010 ANA62022 2-port 10/100 + 9004 0018 ANA62044 4-port 10/100 + 9004 0019 ANA62044 4-port 10/100 + 9004 0020 ANA62022 2-port 10/100 + 9004 0028 ANA69011A/TX 10/100 + 9004 8008 ANA69011A/TX 64 bit 10/100 + 9004 8009 ANA69011A/TX 64 bit 10/100 + 9004 8010 ANA62022 2-port 64 bit 10/100 + 9004 8018 ANA62044 4-port 64 bit 10/100 + 9004 8019 ANA62044 4-port 64 bit 10/100 + 9004 8020 ANA62022 2-port 64 bit 10/100 + 9004 8028 ANA69011A/TX 64 bit 10/100 + 7078 AHA-294x / AIC-7870 + 7178 AIC-7870P/7871 [AHA-2940/W/S76] + 7278 AHA-3940/3940W / AIC-7872 + 7378 AHA-3985 / AIC-7873 + 7478 AHA-2944/2944W / AIC-7874 + 7578 AHA-3944/3944W / AIC-7875 + 7678 AHA-4944W/UW / AIC-7876 + 7710 ANA-7711F Network Accelerator Card (NAC) - Optical + 7711 ANA-7711C Network Accelerator Card (NAC) - Copper + 7778 AIC-787x + 7810 AIC-7810 + 7815 AIC-7815 RAID+Memory Controller IC + 9004 7815 ARO-1130U2 RAID Controller + 9004 7840 AIC-7815 RAID+Memory Controller IC + 7850 AIC-7850 + 7855 AHA-2930 + 7860 AIC-7860 + 7870 AIC-7870 + 7871 AHA-2940 + 7872 AHA-3940 + 7873 AHA-3980 + 7874 AHA-2944 + 7880 AIC-7880P + 7890 AIC-7890 + 7891 AIC-789x + 7892 AIC-789x + 7893 AIC-789x + 7894 AIC-789x + 7895 AHA-2940U/UW / AHA-39xx / AIC-7895 + 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 9004 7891 AHA-2940U/2940UW Dual + 9004 7892 AHA-3940AU/AUW/AUWD/UWD + 9004 7894 AHA-3944AUWD + 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B + 7896 AIC-789x + 7897 AIC-789x + 8078 AIC-7880U + 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset + 8178 AIC-7870P/7881U [AHA-2940U/UW/D/S76] + 9004 7881 AHA-2940UW SCSI Host Adapter + 8278 AHA-3940U/UW/UWD / AIC-7882U + 8378 AHA-3940U/UW / AIC-7883U + 8478 AHA-2944UW / AIC-7884U + 8578 AHA-3944U/UWD / AIC-7885 + 8678 AHA-4944UW / AIC-7886 + 8778 AHA-2940UW Pro / AIC-788x + 9004 7887 2940UW Pro Ultra-Wide SCSI Controller + 8878 AHA-2930UW / AIC-7888 + 9004 7888 AHA-2930UW SCSI Controller + 8b78 ABA-1030 + ec78 AHA-4944W/UW +# Acquired by Microchip Technology +9005 Adaptec + 0010 AHA-2940U2/U2W + 9005 2180 AHA-2940U2 SCSI Controller + 9005 8100 AHA-2940U2B SCSI Controller + 9005 a100 AHA-2940U2B SCSI Controller + 9005 a180 AIC-3860Q [AHA-2940U2W/GE] SCSI Controller + 9005 e100 AHA-2950U2B SCSI Controller + 0011 AHA-2930U2 + 0013 78902 + 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller + 9005 000f AIC7890_ARO + 001f AHA-2940U2/U2W / 7890/7891 + 9005 000f 2940U2W SCSI Controller + 9005 a180 2940U2W SCSI Controller + 0020 AIC-7890 + 002f AIC-7890 + 0030 AIC-7890 + 003f AIC-7890 + 0050 AHA-3940U2x/395U2x + 9005 f500 AHA-3950U2B + 9005 ffff AHA-3950U2B + 0051 AHA-3950U2D + 9005 b500 AHA-3950U2D + 0053 AIC-7896 SCSI Controller + 9005 ffff AIC-7896 SCSI Controller mainboard implementation + 005f AIC-7896U2/7897U2 + 0080 AIC-7892A U160/m + 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter + 9005 6220 AHA-29160C + 9005 62a0 29160N Ultra160 SCSI Controller + 9005 e220 29160LP Low Profile Ultra160 SCSI Controller + 9005 e2a0 29160 Ultra160 SCSI Controller + 0081 AIC-7892B U160/m + 9005 62a1 19160 Ultra160 SCSI Controller + 0083 AIC-7892D U160/m + 008f AIC-7892P U160/m + 1179 0001 Magnia Z310 + 15d9 9005 Onboard SCSI Host Adapter + 0092 AVC-2010 [VideoH!] + 0093 AVC-2410 [VideoH!] + 00c0 AHA-3960D / AIC-7899A U160/m + 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter + 9005 f620 AHA-3960D U160/m + 00c1 AIC-7899B U160/m + 00c3 AIC-7899D U160/m + 00c5 RAID subsystem HBA + 1028 00c5 PowerEdge 2400,2500,2550,4400 + 00cf AIC-7899P U160/m + 1028 00ce PowerEdge 1400 + 1028 00d1 PowerEdge 2550 + 1028 00d9 PowerEdge 2500 + 10f1 2462 Thunder K7 S2462 + 15d9 9005 Onboard SCSI Host Adapter + 8086 3411 SDS2 Mainboard + 0241 Serial ATA II RAID 1420SA + 0242 Serial ATA II RAID 1220SA + 0243 Serial ATA II RAID 1430SA + 0244 eSATA II RAID 1225SA + 0250 ServeRAID Controller + 1014 0279 ServeRAID 6M + 1014 028c ServeRAID 6i/6i+ + 1014 028e ServeRAID 7k + 0279 ServeRAID 6M + 0283 AAC-RAID + 9005 0283 Catapult + 0284 AAC-RAID + 9005 0284 Tomcat + 0285 AAC-RAID + 0e11 0295 SATA 6Ch (Bearcat) + 1014 02f2 ServeRAID 8i + 1028 0287 PowerEdge Expandable RAID Controller 320/DC + 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) + 103c 3227 AAR-2610SA + 108e 0286 Sun StorageTek SAS RAID HBA, Internal + 108e 0287 STK RAID EXT + 108e 7aac STK RAID REM + 108e 7aae STK RAID EX + 15d9 02b5 SMC AOC-USAS-S4i + 15d9 02b6 SMC AOC-USAS-S8i + 15d9 02c9 SMC AOC-USAS-S4iR + 15d9 02ca SMC AOC-USAS-S8iR + 15d9 02d2 SMC AOC-USAS-S8i-LP + 15d9 02d3 SMC AOC-USAS-S8iR-LP + 17aa 0286 Legend S220 (Legend Crusader) + 17aa 0287 Legend S230 (Legend Vulcan) + 9005 0285 2200S (Vulcan) + 9005 0286 2120S (Crusader) + 9005 0287 2200S (Vulcan-2m) + 9005 0288 3230S (Harrier) + 9005 0289 3240S (Tornado) +# Some early versions reported 2020S + 9005 028a ASR-2020ZCR +# Some early versions reported 2025S + 9005 028b ASR-2025ZCR (Terminator) + 9005 028e ASR-2020SA (Skyhawk) + 9005 028f ASR-2025SA + 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II) + 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8) + 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16) + 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler) + 9005 0296 ASR-2240S + 9005 0297 ASR-4005SAS + 9005 0298 ASR-4000 + 9005 0299 ASR-4800SAS + 9005 029a 4805SAS + 9005 02a4 ICP ICP9085LI + 9005 02a5 ICP ICP5085BR + 9005 02b5 ASR5800 + 9005 02b6 ASR5805 + 9005 02b7 ASR5808 + 9005 02b8 ICP5445SL + 9005 02b9 ICP5085SL + 9005 02ba ICP5805SL + 9005 02bb 3405 + 9005 02bc 3805 + 9005 02bd 31205 + 9005 02be 31605 + 9005 02bf ICP ICP5045BL + 9005 02c0 ICP ICP5085BL + 9005 02c1 ICP ICP5125BR + 9005 02c2 ICP ICP5165BR + 9005 02c3 51205 + 9005 02c4 51605 + 9005 02c5 ICP ICP5125SL + 9005 02c6 ICP ICP5165SL + 9005 02c7 3085 + 9005 02c8 ICP5805BL + 9005 02ce 51245 + 9005 02cf 51645 + 9005 02d0 52445 + 9005 02d1 5405 + 9005 02d4 ASR-2045 + 9005 02d5 ASR-2405 + 9005 02d6 ASR-2445 + 9005 02d7 ASR-2805 + 9005 02d8 5405G + 9005 02d9 5445G + 9005 02da 5805G + 9005 02db 5085G + 9005 02dc 51245G + 9005 02dd 51645G + 9005 02de 52445G + 9005 02df ASR-2045G + 9005 02e0 ASR-2405G + 9005 02e1 ASR-2445G + 9005 02e2 ASR-2805G + 0286 AAC-RAID (Rocket) + 1014 034d 8s + 1014 9540 ServeRAID 8k/8k-l4 + 1014 9580 ServeRAID 8k/8k-l8 + 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer) + 9005 028d ASR-2130S + 9005 029b ASR-2820SA + 9005 029c ASR-2620SA + 9005 029d ASR-2420SA + 9005 029e ICP ICP9024R0 + 9005 029f ICP ICP9014R0 + 9005 02a0 ICP ICP9047MA + 9005 02a1 ICP ICP9087MA + 9005 02a2 3800 + 9005 02a3 ICP ICP5445AU + 9005 02a4 ICP ICP9085LI + 9005 02a5 ICP ICP5085BR + 9005 02a6 ICP9067MA + 9005 02a7 3805 + 9005 02a8 3400 + 9005 02a9 ICP ICP5085AU + 9005 02aa ICP ICP5045AU + 9005 02ac 1800 + 9005 02b3 2400 + 9005 02b4 ICP ICP5045AL + 9005 0800 Callisto + 028b Series 6 - 6G SAS/PCIe 2 + 9005 0200 Series 6 Entry Level - ASR-6405E - 4 internal 6G SAS ports + 9005 0201 Series 6 Entry Level - ASR-6805E - 8 internal 6G SAS ports + 9005 0300 Series 6 - ASR-6405 - 4 internal 6G SAS ports + 9005 0301 Series 6 - ASR-6805 - 8 internal 6G SAS ports + 9005 0302 Series 6 - ASR-6445 - 4 internal and 4 external 6G SAS ports + 9005 0310 Series 6 Connectors on Top - ASR-6405T - 4 internal 6G SAS ports + 9005 0311 Series 6 Connectors on Top - ASR-6805T - 8 internal 6G SAS + 9005 0400 Series 6 - ASR-61205 - 12 internal 6G SAS ports + 9005 0401 Series 6 - ASR-61605 - 16 internal 6G SAS ports + 9005 0403 Series 6 - ASR-62405 - 24 internal 6G SAS ports + 028c Series 7 6G SAS/PCIe 3 + 9005 0500 Series 7 - ASR-7805 - 8 internal 6G SAS Port/PCIe 3.0 + 9005 0501 Series 7 - ASR-71605 - 16 internal 6G SAS Port/PCIe 3.0 + 9005 0502 Series 7 - ASR-71685 - 16 internal 8 external 6G SAS Port/PCIe 3.0 + 9005 0503 Series 7 - ASR-72405 - 24 internal 0 external 6G SAS Port/PCIe 3.0 + 9005 0504 Series 7 - ASR-7885 - 8 internal 8 external 6G SAS Port/PCIe 3.0 + 9005 0505 Series 7 Entry Level - ASR-71685E - 16 internal 8 external 6G SAS Port/PCIe 3.0 + 9005 0506 Series 7 Entry Level - ASR-72405E - 24 internal 0 external 6G SAS Port/PCIe 3.0 + 028d Series 8 12G SAS/PCIe 3 + 9005 0550 Series 8 - ASR-82405 - 24 internal 0 external 12G SAS Port/PCIe 3.0 + 9005 0551 Series 8 - ASR-81605 - 16 internal 0 external 12G SAS Port/PCIe 3.0 + 9005 0552 Series 8 - ASR-8805 - 8 internal 0 external 12G SAS Port/PCIe 3.0 + 9005 0553 Series 8 - ASR-8085 - 0 internal 8 external 12G SAS Port/PCIe 3.0 + 9005 0554 Series 8 - ASR-8885 - 8 internal 8 external 12G SAS Port/PCIe 3.0 + 028f Smart Storage PQI SAS + 103c 0600 Smart Array P408i-p SR Gen10 + 103c 0601 Smart Array P408e-p SR Gen10 + 103c 0602 Smart Array P408i-a SR Gen10 + 103c 0603 Smart Array P408i-c SR Gen10 + 103c 0650 Smart Array E208i-p SR Gen10 + 103c 0651 Smart Array E208e-p SR Gen10 + 103c 0652 Smart Array E208i-c SR Gen10 + 103c 0654 Smart Array E208i-a SR Gen10 + 103c 0655 Smart Array P408e-m SR Gen10 + 103c 0700 Smart Array P204i-c SR Gen10 + 103c 0701 Smart Array P204i-b SR Gen10 + 103c 1100 Smart Array P816i-a SR Gen10 + 103c 1101 Smart Array P416ie-m SR G10 + 105b 1211 HBA 8238-16i + 105b 1321 HBA 8242-24i + 13fe 8312 SKY-9200 MIC-8312BridgeB + 152d 8a22 QS-8204-8i + 152d 8a23 QS-8238-16i + 152d 8a24 QS-8236-16i + 152d 8a36 QS-8240-24i + 152d 8a37 QS-8242-24i + 1590 0294 SR932i-p Gen10+ + 1590 02dc SR416i-a Gen10+ + 193d 1104 RAID P2404-Mf-4i-2GB + 193d 1105 RAID P4408-Mf-8i-2GB + 193d 1106 RAID P2404-Mf-4i-1GB + 193d 1107 RAID P4408-Mf-8i-4GB + 193d 8460 HBA H460-M1 + 193d 8461 HBA H460-B1 + 193d c460 RAID P460-M2 + 193d c461 RAID P460-B2 + 193d f460 RAID P460-M4 + 193d f461 RAID P460-B4 + 19e5 d227 SmartROC-HD SR465C-M 4G + 19e5 d228 SmartROC SR455C-M 2G + 19e5 d229 SmartIOC SR155-M + 19e5 d22a SmartIOC-HD SR765-M + 19e5 d22b SmartROC-e SR455C-ME 4G + 19e5 d22c SmartROC SR455C-M 4G + 1bd4 0045 SMART-HBA 8242-24i + 1bd4 0046 RAID 8236-16i + 1bd4 0047 RAID 8240-24i + 1bd4 0048 SMART-HBA 8238-16i + 1bd4 004a PM8222-SHBA + 1bd4 004b RAID PM8204-2GB + 1bd4 004c RAID PM8204-4GB + 1bd4 004f PM8222-HBA + 1bd4 006b RS0800M5H24I + 1bd4 006c RS0800M5E8i + 1bd4 006d RS0800M5H8i + 1bd4 006f RS0804M5R16i + 1bd4 0070 RS0800M5E24i + 1bd4 0071 RS0800M5H16i + 1bd4 0072 RS0800M5E16i + 1bd4 0077 RS0800M5E16iM + 1bd4 0078 RS0800M5E24iM + 1bd4 0079 RS0800M5H24iM + 1bd4 0080 RS0804M5R16iM + 1cc4 0101 Ramaxel FBGF-RAD PM8204 + 1cc4 0201 Ramaxel FBGF-RAD PM8222 + 1d49 0220 ThinkSystem 4350-8i SAS/SATA 12Gb HBA + 1d49 0221 ThinkSystem 4350-16i SAS/SATA 12Gb HBA + 1d49 0520 ThinkSystem RAID 5350-8i PCIe 12Gb Adapter + 1d49 0620 ThinkSystem RAID 9350-8i 2GB Flash PCIe 12Gb Adapter + 1d49 0621 ThinkSystem RAID 9350-8i 2GB Flash PCIe 12Gb Internal Adapter + 1d49 0622 ThinkSystem RAID 9350-16i 4GB Flash PCIe 12Gb Adapter + 1d49 0623 ThinkSystem RAID 9350-16i 4GB Flash PCIe 12Gb Internal Adapter + 9005 0608 SmartRAID 3162-8i /e + 9005 0800 SmartRAID 3154-8i + 9005 0801 SmartRAID 3152-8i + 9005 0802 SmartRAID 3151-4i + 9005 0803 SmartRAID 3101-4i + 9005 0804 SmartRAID 3154-8e + 9005 0805 SmartRAID 3102-8i + 9005 0806 SmartRAID 3100 + 9005 0807 SmartRAID 3162-8i + 9005 0808 SmartRAID 3101E-4i + 9005 0809 SmartRAID 3102E-8i + 9005 0900 SmartHBA 2100-8i + 9005 0901 SmartHBA 2100-4i + 9005 0902 HBA 1100-8i + 9005 0903 HBA 1100-4i + 9005 0904 SmartHBA 2100-8e + 9005 0905 HBA 1100-8e + 9005 0906 SmartHBA 2100-4i4e + 9005 0907 HBA 1100 + 9005 0908 SmartHBA 2100 + 9005 090a SmartHBA 2100A-8i + 9005 1200 SmartRAID 3154-24i + 9005 1201 SmartRAID 3154-8i16e + 9005 1202 SmartRAID 3154-8i8e + 9005 1280 HBA 1100-16i + 9005 1281 HBA 1100-16e + 9005 1282 SmartHBA 2100-16i + 9005 1300 HBA 1100-8i8e + 9005 1301 HBA 1100-24i + 9005 1302 SmartHBA 2100-8i8e + 9005 1303 SmartHBA 2100-24i + 9005 1380 SmartRAID 3154-16i + 9005 1400 SmartRAID Ultra 3258p-16i /e + 9005 1402 HBA Ultra 1200p-16i + 9005 1410 HBA Ultra 1200-16e + 9005 1430 SmartRAID Ultra 3254-16e /e + 9005 1441 HBA Ultra 1200p-32i + 9005 1450 SmartRAID Ultra 3258p-32i /e + 9005 1462 HBA 1200-8i + 9005 1471 SmartRAID 3254-16i /e + 9005 1472 SmartRAID 3258-16i /e + 9005 14a0 SmartRAID 3254-8i + 9005 14a1 SmartRAID 3204-8i + 9005 14a2 SmartRAID 3252-8i + 9005 14c0 SmartHBA 2200-16i + 9005 14c1 HBA 1200-16i + 0410 AIC-9410W SAS (Razor HBA RAID) + 9005 0410 ASC-48300(Spirit RAID) + 9005 0411 ASC-58300 (Oakmont RAID) + 0412 AIC-9410W SAS (Razor HBA non-RAID) + 9005 0412 ASC-48300 (Spirit non-RAID) + 9005 0413 ASC-58300 (Oakmont non-RAID) + 0415 ASC-58300 SAS (Razor-External HBA RAID) + 0416 ASC-58300 SAS (Razor-External HBA non-RAID) + 041e AIC-9410W SAS (Razor ASIC non-RAID) + 041f AIC-9410W SAS (Razor ASIC RAID) + 9005 041f AIC-9410W SAS (Razor ASIC RAID) + 042f VSC7250/7251 SAS (Aurora ASIC non-RAID) + 0430 AIC-9405W SAS (Razor-Lite HBA RAID) + 9005 0430 ASC-44300 (Spirit-Lite RAID) + 0432 AIC-9405W SAS (Razor-Lite HBA non-RAID) + 9005 0432 ASC-44300 (Spirit-Lite non-RAID) + 043e AIC-9405W SAS (Razor-Lite ASIC non-RAID) + 043f AIC-9405W SAS (Razor-Lite ASIC RAID) + 0450 ASC-1405 Unified Serial HBA + 0500 Obsidian chipset SCSI controller + 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C) + 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/572D) + 0503 Scamp chipset SCSI controller + 1014 02bf Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E) + 1014 02c3 PCI-X DDR 3Gb SAS RAID Adapter (572F) + 1014 02d5 Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571F) + 0910 AUA-3100B + 091e AUA-3100B + 8000 ASC-29320A U320 + 800f AIC-7901 U320 + 8010 ASC-39320 U320 + 8011 ASC-39320D + 0e11 00ac ASC-39320D U320 + 9005 0041 ASC-39320D U320 + 8012 ASC-29320 U320 + 8013 ASC-29320B U320 + 8014 ASC-29320LP U320 + 8015 ASC-39320B U320 + 8016 ASC-39320A U320 + 8017 ASC-29320ALP U320 + 9005 0044 ASC-29320ALP PCIx U320 + 9005 0045 ASC-29320LPE PCIe U320 + 801c ASC-39320D U320 + 801d AIC-7902B U320 + 1014 02cc ServeRAID 7e + 801e AIC-7901A U320 + 801f AIC-7902 U320 + 1734 1011 PRIMERGY RX300 onboard SCSI + 8080 ASC-29320A U320 w/HostRAID + 8081 PMC-Sierra PM8001 SAS HBA [Series 6H] + 8088 PMC-Sierra PM8018 SAS HBA [Series 7H] + 8089 PMC-Sierra PM8019 SAS encryption HBA [Series 7He] + 808f AIC-7901 U320 w/HostRAID + 1028 0168 Precision Workstation 670 Mainboard + 8090 ASC-39320 U320 w/HostRAID + 8091 ASC-39320D U320 w/HostRAID + 8092 ASC-29320 U320 w/HostRAID + 8093 ASC-29320B U320 w/HostRAID + 8094 ASC-29320LP U320 w/HostRAID + 8095 ASC-39320(B) U320 w/HostRAID + 8096 ASC-39320A U320 w/HostRAID + 8097 ASC-29320ALP U320 w/HostRAID + 809c ASC-39320D(B) U320 w/HostRAID + 809d AIC-7902(B) U320 w/HostRAID + 1014 02cc ServeRAID 7e + 809e AIC-7901A U320 w/HostRAID + 809f AIC-7902 U320 w/HostRAID +907f Atronics + 2015 IDE-2015PL +919a Gigapixel Corp +9412 Holtek + 6565 6565 +9413 Softlogic Co., Ltd. + 6010 SOLO6010 MPEG-4 Video encoder/decoder + 6110 SOLO6110 H.264 Video encoder/decoder +9618 JusonTech Corporation + 0001 JusonTech Gigabit Ethernet Controller +9699 Omni Media Technology Inc + 6565 6565 +# nee Netmos Technology +9710 MosChip Semiconductor Technology Ltd. + 9250 PCI-to-PCI bridge [MCS9250] + 9805 PCI 1 port parallel adapter + 9815 PCI 9815 Multi-I/O Controller + 1000 0020 2P0S (2 port parallel adaptor) + 9820 PCI 9820 Multi-I/O Controller + 9835 PCI 9835 Multi-I/O Controller + 1000 0002 2S (16C550 UART) + 1000 0012 1P2S + 9845 PCI 9845 Multi-I/O Controller +# Serial ports at BAR0-3 + 1000 0004 0P4S (4 port 16550A serial card) + 1000 0006 0P6S (6 port 16550a serial card) +# Serial ports at BAR0-3, Parallel port at BAR4 + 1000 0014 1P4S (1 Parallel / 4 16550A Serial Port Adapter) + 9855 PCI 9855 Multi-I/O Controller +# Parallel port at BAR0. Serial ports at BAR2-5 + 1000 0014 1P4S +# Parallel ports at BAR0,BAR2. Serial ports at BAR4-5 + 1000 0022 2P2S (2 Parallel / 2 16550A Serial Port Adapter) + 9865 PCI 9865 Multi-I/O Controller + 9900 MCS9900 Multi-I/O Controller + 9901 PCIe 9901 Multi-I/O Controller + 9904 4-Port PCIe Serial Adapter +# 2-port Serial 1-port Parallel Adaptor + 9912 PCIe 9912 Multi-I/O Controller + 9922 MCS9922 PCIe Multi-I/O Controller + 9990 MCS9990 PCIe to 4‐Port USB 2.0 Host Controller +# Subsystem ID on a 3c985B-SX network card +9850 3Com (wrong ID) +9902 Stargen Inc. + 0001 SG2010 PCI over Starfabric Bridge + 0002 SG2010 PCI to Starfabric Gateway + 0003 SG1010 Starfabric Switch and PCI Bridge +9a11 Tiger Lake-H Gaussian & Neural Accelerator +9d32 Beijing Starblaze Technology Co. Ltd. + 0000 STAR1000 PCIe NVMe SSD Controller + 1001 STAR1000P PCIe NVMe SSD Controller + 1201 STAR1200C NVMe SSD + 1202 STAR1200I NVMe SSD + 1203 STAR1200L NVMe SSD + 1204 STAR1200E NVMe SSD +a000 Asix Electronics Corporation (Wrong ID) +a0a0 AOPEN Inc. +a0f1 UNISYS Corporation +a200 NEC Corporation +a259 Hewlett Packard +a25b Hewlett Packard GmbH PL24-MKT +a304 Sony +a727 3Com Corporation + 0013 3CRPAG175 Wireless PC Card + 6803 3CRDAG675B Wireless 11a/b/g Adapter +aa00 iTuner +aa01 iTuner +aa02 iTuner +aa03 iTuner +aa04 iTuner +aa05 iTuner +aa06 iTuner +aa07 iTuner +aa08 iTuner +aa09 iTuner +aa0a iTuner +aa0b iTuner +aa0c iTuner +aa0d iTuner +aa0e iTuner +aa0f iTuner +aa42 Scitex Digital Video +aa55 Ncomputing X300 PCI-Engine +aaaa Adnaco Technology Inc. + 0001 H1 PCIe over fiber optic host controller + 0002 R1BP1 PCIe over fiber optic expansion chassis +abcd Vadatech Inc. +ac1e Digital Receiver Technology Inc +ac3d Actuality Systems +ad00 Alta Data Technologies LLC +aecb Adrienne Electronics Corporation + 6250 VITC/LTC Timecode Reader card [PCI-VLTC/RDR] +affe Sirrix AG security technologies + 01e1 PCI1E1 1-port ISDN E1 interface + 02e1 PCI2E1 2-port ISDN E1 interface + 450e PCI4S0EC 4-port ISDN S0 interface + dead Sirrix.PCI4S0 4-port ISDN S0 interface +b100 OpenVox Communication Co. Ltd. +# Not registered officially +b10b Uakron PCI Project +b1b3 Shiva Europe Limited +b1d9 ATCOM Technology co., LTD. +# Pinnacle should be 11bd, but they got it wrong several times --mj +bd11 Pinnacle Systems, Inc. (Wrong ID) +bdbd Blackmagic Design + a106 Multibridge Extreme + a117 Intensity Pro + a11a DeckLink HD Extreme 2 + a11b DeckLink SDI/Duo/Quad + a11c DeckLink HD Extreme 3 + a11d DeckLink Studio + a11e DeckLink Optical Fibre + a120 Decklink Studio 2 + a121 DeckLink HD Extreme 3D/3D+ + a124 Intensity Extreme + a126 Intensity Shuttle + a127 UltraStudio Express + a129 UltraStudio Mini Recorder + a12a UltraStudio Mini Monitor + a12d UltraStudio 4K + a12e DeckLink 4K Extreme + a12f DeckLink Mini Monitor + a130 DeckLink Mini Recorder + a132 UltraStudio 4K + a136 DeckLink 4K Extreme 12G + a137 DeckLink Studio 4K + a138 Decklink SDI 4K + a139 Intensity Pro 4K + a13b DeckLink Micro Recorder + a13d DeckLink 4K Pro + a13e UltraStudio 4K Extreme + a13f DeckLink Quad 2 + a140 DeckLink Duo 2 + a141 UltraStudio 4K Extreme 3 + a142 UltraStudio HD Mini + a143 DeckLink Mini Recorder 4K + a144 DeckLink Mini Monitor 4K + a148 DeckLink SDI Micro + a14b DeckLink 8K Pro + a14e DeckLink Quad HDMI Recorder + a1ff eGPU RX580 +c001 TSI Telsys +c0a9 Micron/Crucial Technology + 2263 P1 NVMe PCIe SSD + 540a P2 NVMe PCIe SSD +c0de Motorola +c0fe Motion Engineering, Inc. +ca3b Cambrionix Ltd. +ca50 Varian Australia Pty Ltd +cace CACE Technologies, Inc. + 0001 TurboCap Port A + 0002 TurboCap Port B + 0023 AirPcap N +caed Canny Edge +cafe Chrysalis-ITS + 0003 Luna K3 Hardware Security Module + 0006 Luna PCI-e 3000 Hardware Security Module + 0007 Luna K6 Hardware Security Module + 0008 Luna K7 Hardware Security Module +cc53 ScaleFlux Inc. +cccc Catapult Communications +ccec Curtiss-Wright Controls Embedded Computing +cddd Tyzx, Inc. + 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber + 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber +ceba KEBA AG +cf86 Spectrum-4TOR + 0276 Spectrum-4TOR in Flash Recovery Mode +d161 Digium, Inc. + 0120 Wildcard TE120P single-span T1/E1/J1 card + 0205 Wildcard TE205P/TE207P dual-span T1/E1/J1 card 5.0V + 0210 Wildcard TE210P/TE212P dual-span T1/E1/J1 card 3.3V + 0220 Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express) + 0405 Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V + 0410 Wildcard TE410P/TE412P quad-span T1/E1/J1 card 3.3V + 0420 Wildcard TE420P quad-span T1/E1/J1 card 3.3V (PCI-Express) + 0800 Wildcard TDM800P 8-port analog card + 1205 Wildcard TE205P/TE207P dual-span T1/E1/J1 card 5.0V (u1) + 1220 Wildcard TE220 dual-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen) + 1405 Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V (u1) + 1410 Wildcard TE410P quad-span T1/E1/J1 card 3.3V (5th Gen) + 1420 Wildcard TE420 quad-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen) + 1820 Wildcard TE820 octal-span T1/E1/J1 card 3.3V (PCI-Express) + 2400 Wildcard TDM2400P 24-port analog card + 3400 Wildcard TC400P transcoder base card + 8000 Wildcard TE121 single-span T1/E1/J1 card (PCI-Express) + 8001 Wildcard TE122 single-span T1/E1/J1 card + 8002 Wildcard AEX800 8-port analog card (PCI-Express) + 8003 Wildcard AEX2400 24-port analog card (PCI-Express) + 8004 Wildcard TCE400P transcoder base card + 8005 Wildcard TDM410 4-port analog card + 8006 Wildcard AEX410 4-port analog card (PCI-Express) + 8007 Hx8 Series 8-port Base Card + 8008 Hx8 Series 8-port Base Card (PCI-Express) + 800a Wildcard TE133 single-span T1/E1/J1 card (PCI Express) + 800b Wildcard TE134 single-span T1/E1/J1 card + 800c Wildcard A8A 8-port analog card + 800d Wildcard A8B 8-port analog card (PCI-Express) + 800e Wildcard TE235/TE435 quad-span T1/E1/J1 card (PCI-Express) + 800f Wildcard A4A 4-port analog card + 8010 Wildcard A4B 4-port analog card (PCI-Express) + 8013 Wildcard TE236/TE436 quad-span T1/E1/J1 card + b410 Wildcard B410 quad-BRI card +d209 Ultimarc + 1500 PAC Drive + 15a2 SpinTrak + 1601 AimTrak +d4d4 Dy4 Systems Inc + 0601 PCI Mezzanine Card +d531 I+ME ACTIA GmbH +d84d Exsys +dada Datapath Limited + 0133 VisionRGB-X2 + 0139 VisionRGB-E1 + 0144 VisionSD8 + 0150 VisionRGB-E2 + 0151 VisionSD4+1 + 0159 VisionAV + 0161 DGC161 + 0165 DGC165 + 0167 DGC167 + 0168 DGC168 + 1139 VisionRGB-E1S + 1150 VisionRGB-E2S + 1151 VisionSD4+1S + 1153 VisionDVI-DL + 1154 VisionSDI2 +db10 Diablo Technologies +dc93 Dawicontrol GmbH +dcba Dynamic Engineering + 0046 PCIe Altera Cyclone IV +# VPX format Receiver Controller Board + 0047 VPX-RCB +# PMC Format FPGA design with 8 high speed UART channels + 0048 PMC-Biserial-III-BAE9 + 004e PC104p-Biserial-III-NVY5 + 004f PC104p-Biserial-III-NVY6 + 0052 PCIeBiSerialDb37 BA22 LVDS IO +# 8 port 16550 compatible UART, PMC format, RS-232 IO, RTS, CTS, DTR, DSR supported + 0066 PMC-OctalUART-232 +dd01 Digital Devices GmbH + 0003 Octopus DVB Adapter + dd01 0001 Octopus DVB adapter + dd01 0002 Octopus LE DVB adapter + dd01 0003 Octopus OEM + dd01 0004 Octopus V3 DVB adapter + dd01 0010 Octopus Mini + dd01 0020 Cine S2 V6 DVB adapter + dd01 0021 Cine S2 V6.5 DVB adapter + dd01 0030 Cine CT V6.1 DVB adapter + dd01 db03 Mystique SaTiX-S2 V3 DVB adapter + 0006 Cine V7 + 0007 Max + dd01 0023 Max S8 4/8 + 0011 Octopus CI DVB Adapter + dd01 0040 Octopus CI + dd01 0041 Octopus CI Single + 0201 Resi DVB-C Modulator + dd01 0001 Resi DVB-C Modulator +dead Indigita Corporation +deaf Middle Digital Inc. + 9050 PC Weasel Virtual VGA + 9051 PC Weasel Serial Port + 9052 PC Weasel Watchdog Timer +# formerly SoftHard Technology Ltd. +deda XIMEA + 4001 CB or MX camera + 4021 MT camera +e000 Winbond + e000 W89C940 +e159 Tiger Jet Network Inc. / ICP DAS + 0001 Tiger3XX Modem/ISDN interface + 0059 0001 128k ISDN-S/T Adapter + 0059 0003 128k ISDN-U Adapter + 00a7 0001 TELES.S0/PCI 2.x ISDN Adapter + 8086 0003 Digium X100P/X101P analogue PSTN FXO interface + b100 0003 OpenVox A400P 4-port analog card + b1d9 0003 AX400P 4-port analog card + 0002 Tiger100APC ISDN chipset +e1c5 Elcus +e4bf EKF Elektronik GmbH + 0ccd CCD-CALYPSO + 0cd1 CD1-OPERA + 0cd2 CD2-BEBOP + 0cd3 CD3-JIVE + 50c1 PC1-GROOVE + 50c2 PC2-LIMBO + 53c1 SC1-ALLEGRO + cc47 CCG-RUMBA + cc4d CCM-BOOGIE +e4e4 Xorcom +e55e Essence Technology, Inc. +ea01 Eagle Technology + 000a PCI-773 Temperature Card + 0032 PCI-730 & PC104P-30 Card + 003e PCI-762 Opto-Isolator Card + 0041 PCI-763 Reed Relay Card + 0043 PCI-769 Opto-Isolator Reed Relay Combo Card + 0046 PCI-766 Analog Output Card + 0052 PCI-703 Analog I/O Card + 0800 PCI-800 Digital I/O Card +ea50 Emerson Automation Solutions +# The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID. +ea60 RME + 9896 Digi32 + 9897 Digi32 Pro + 9898 Digi32/8 +eabb Aashima Technology B.V. +eace Endace Measurement Systems, Ltd + 3100 DAG 3.10 OC-3/OC-12 + 3200 DAG 3.2x OC-3/OC-12 + 320e DAG 3.2E Fast Ethernet + 340e DAG 3.4E Fast Ethernet + 341e DAG 3.41E Fast Ethernet + 3500 DAG 3.5 OC-3/OC-12 + 351c DAG 3.5ECM Fast Ethernet + 360d DAG 3.6D DS3 + 360e DAG 3.6E Fast Ethernet + 368e DAG 3.6E Gig Ethernet + 3707 DAG 3.7T T1/E1/J1 + 370d DAG 3.7D DS3/E3 + 378e DAG 3.7G Gig Ethernet + 3800 DAG 3.8S OC-3/OC-12 + 4100 DAG 4.10 OC-48 + 4110 DAG 4.11 OC-48 + 4220 DAG 4.2 OC-48 + 422e DAG 4.2GE Gig Ethernet + 4230 DAG 4.2S OC-48 + 423e DAG 4.2GE Gig Ethernet + 4300 DAG 4.3S OC-48 + 430e DAG 4.3GE Gig Ethernet + 452e DAG 4.5G2 Gig Ethernet + 454e DAG 4.5G4 Gig Ethernet + 45b8 DAG 4.5Z8 Gig Ethernet + 45be DAG 4.5Z2 Gig Ethernet + 520e DAG 5.2X 10G Ethernet + 521a DAG 5.2SXA 10G Ethernet/OC-192 + 5400 DAG 5.4S-12 OC-3/OC-12 + 5401 DAG 5.4SG-48 Gig Ethernet/OC-3/OC-12/OC-48 + 540a DAG 5.4GA Gig Ethernet + 541a DAG 5.4SA-12 OC-3/OC-12 + 542a DAG 5.4SGA-48 Gig Ethernet/OC-3/OC-12/OC-48 + 6000 DAG 6.0SE 10G Ethernet/OC-192 + 6100 DAG 6.1SE 10G Ethernet/OC-192 + 6200 DAG 6.2SE 10G Ethernet/OC-192 + 7100 DAG 7.1S OC-3/OC-12 + 7400 DAG 7.4S OC-3/OC-12 + 7401 DAG 7.4S48 OC-48 + 752e DAG 7.5G2 Gig Ethernet + 754e DAG 7.5G4 Gig Ethernet + 8100 DAG 8.1X 10G Ethernet + 8101 DAG 8.1SX 10G Ethernet/OC-192 + 8102 DAG 8.1X 10G Ethernet + 820e DAG 8.2X 10G Ethernet + 820f DAG 8.2X 10G Ethernet (2nd bus) + 8400 DAG 8.4I Infiniband x4 SDR + 8500 DAG 8.5I Infiniband x4 DDR + 9200 DAG 9.2SX2 10G Ethernet + 920e DAG 9.2X2 10G Ethernet + 9540 DAG 9.5G4 Gig Ethernet + 954f DAG 9.5G4F Gig Ethernet + a120 DAG 10X2-P 10G Ethernet + a12e DAG 10X2-S 10G Ethernet + a140 DAG 10X4-P 10/40G Ethernet + a14e DAG 10X4-S 10/40G Ethernet + eace vDAG virtual device +ec80 Belkin Corporation + ec00 F5D6000 +ecc0 Echo Digital Audio Corporation +edd8 ARK Logic Inc + a091 1000PV [Stingray] + a099 2000PV [Stingray] + a0a1 2000MT + a0a9 2000MI +# Found on M2N68-AM Motherboard +f043 ASUSTeK Computer Inc. (Wrong ID) +f05b Foxconn International, Inc. (Wrong ID) +f15e SiFive, Inc. + 0000 FU740-C000 RISC-V SoC PCI Express x8 to AXI4 Bridge +f1d0 AJA Video + c0fe Xena HS/HD-R + c0ff Kona/Xena 2 + cafe Kona SD + cfee Xena LS/SD-22-DA/SD-DA + dafe Corvid 1 + daff KONA LHi + db00 IoExpress + db01 Corvid22 + db02 Kona 3G + db03 Corvid 3G + db04 Kona 3G QUAD + db05 Kona LHe+ + db06 IoXT + db07 Kona 3G P2P + db08 Kona 3G QUAD P2P + db09 Corvid 24 + db11 T-Tap + dcaf Kona HD + dfee Xena HD-DA + eb07 Io4K + eb0a Io4K UFC + eb0b Kona 4 + eb0c Kona 4 UFC + eb0d Corvid 88 + eb0e Corvid 44 + eb16 Corvid HEVC + 10cf 1049 Corvid HEVC M31 + eb18 Corvid HB-R + eb1a Kona IP 1SFP + eb1c Kona IP 2SFP + eb1d Io4KPlus + eb1e IoIP + eb1f Kona 5 + eb23 Kona 1 + eb24 Kona HDMI + eb25 Corvid 44 12g + eb26 T-Tap Pro + efac Xena SD-MM/SD-22-MM + facd Xena HD-MM +f5f5 F5 Networks, Inc. +# Subsystem ID for PATA controller on nForce motherboard +f849 ASRock Incorporation (Wrong ID) +fa57 Interagon AS + 0001 PMC [Pattern Matching Chip] +fab7 Fabric7 Systems, Inc. +febd Ultraview Corp. +# Nee Epigram +feda Broadcom Inc + a0fa BCM4210 iLine10 HomePNA 2.0 + a10e BCM4230 iLine10 HomePNA 2.0 +fede Fedetec Inc. + 0003 TABIC PCI v3 +fffd XenSource, Inc. + 0101 PCI Event Channel Controller +# Used in some old VMWare products before they got a real ID assigned +fffe VMWare Inc (temporary ID) + 0710 Virtual SVGA +ffff Illegal Vendor ID + + +# List of known device classes, subclasses and programming interfaces + +# Syntax: +# C class class_name +# subclass subclass_name <-- single tab +# prog-if prog-if_name <-- two tabs + +C 00 Unclassified device + 00 Non-VGA unclassified device + 01 VGA compatible unclassified device + 05 Image coprocessor +C 01 Mass storage controller + 00 SCSI storage controller + 01 IDE interface + 00 ISA Compatibility mode-only controller + 05 PCI native mode-only controller + 0a ISA Compatibility mode controller, supports both channels switched to PCI native mode + 0f PCI native mode controller, supports both channels switched to ISA compatibility mode + 80 ISA Compatibility mode-only controller, supports bus mastering + 85 PCI native mode-only controller, supports bus mastering + 8a ISA Compatibility mode controller, supports both channels switched to PCI native mode, supports bus mastering + 8f PCI native mode controller, supports both channels switched to ISA compatibility mode, supports bus mastering + 02 Floppy disk controller + 03 IPI bus controller + 04 RAID bus controller + 05 ATA controller + 20 ADMA single stepping + 30 ADMA continuous operation + 06 SATA controller + 00 Vendor specific + 01 AHCI 1.0 + 02 Serial Storage Bus + 07 Serial Attached SCSI controller + 01 Serial Storage Bus + 08 Non-Volatile memory controller + 01 NVMHCI + 02 NVM Express + 80 Mass storage controller +C 02 Network controller + 00 Ethernet controller + 01 Token ring network controller + 02 FDDI network controller + 03 ATM network controller + 04 ISDN controller + 05 WorldFip controller + 06 PICMG controller + 07 Infiniband controller + 08 Fabric controller + 80 Network controller +C 03 Display controller + 00 VGA compatible controller + 00 VGA controller + 01 8514 controller + 01 XGA compatible controller + 02 3D controller + 80 Display controller +C 04 Multimedia controller + 00 Multimedia video controller + 01 Multimedia audio controller + 02 Computer telephony device + 03 Audio device + 80 Multimedia controller +C 05 Memory controller + 00 RAM memory + 01 FLASH memory + 02 CXL + 00 CXL Memory Device - vendor specific + 10 CXL Memory Device (CXL 2.x) + 80 Memory controller +C 06 Bridge + 00 Host bridge + 01 ISA bridge + 02 EISA bridge + 03 MicroChannel bridge + 04 PCI bridge + 00 Normal decode + 01 Subtractive decode + 05 PCMCIA bridge + 06 NuBus bridge + 07 CardBus bridge + 08 RACEway bridge + 00 Transparent mode + 01 Endpoint mode + 09 Semi-transparent PCI-to-PCI bridge + 40 Primary bus towards host CPU + 80 Secondary bus towards host CPU + 0a InfiniBand to PCI host bridge + 80 Bridge +C 07 Communication controller + 00 Serial controller + 00 8250 + 01 16450 + 02 16550 + 03 16650 + 04 16750 + 05 16850 + 06 16950 + 01 Parallel controller + 00 SPP + 01 BiDir + 02 ECP + 03 IEEE1284 + fe IEEE1284 Target + 02 Multiport serial controller + 03 Modem + 00 Generic + 01 Hayes/16450 + 02 Hayes/16550 + 03 Hayes/16650 + 04 Hayes/16750 + 04 GPIB controller + 05 Smard Card controller + 80 Communication controller +C 08 Generic system peripheral + 00 PIC + 00 8259 + 01 ISA PIC + 02 EISA PIC + 10 IO-APIC + 20 IO(X)-APIC + 01 DMA controller + 00 8237 + 01 ISA DMA + 02 EISA DMA + 02 Timer + 00 8254 + 01 ISA Timer + 02 EISA Timers + 03 HPET + 03 RTC + 00 Generic + 01 ISA RTC + 04 PCI Hot-plug controller + 05 SD Host controller + 06 IOMMU + 80 System peripheral + 99 Timing Card +# PTP Grandmaster Source Clock + 01 TAP Timing Card +C 09 Input device controller + 00 Keyboard controller + 01 Digitizer Pen + 02 Mouse controller + 03 Scanner controller + 04 Gameport controller + 00 Generic + 10 Extended + 80 Input device controller +C 0a Docking station + 00 Generic Docking Station + 80 Docking Station +C 0b Processor + 00 386 + 01 486 + 02 Pentium + 10 Alpha + 20 Power PC + 30 MIPS + 40 Co-processor +C 0c Serial bus controller + 00 FireWire (IEEE 1394) + 00 Generic + 10 OHCI + 01 ACCESS Bus + 02 SSA + 03 USB controller + 00 UHCI + 10 OHCI + 20 EHCI + 30 XHCI + 40 USB4 Host Interface + 80 Unspecified + fe USB Device + 04 Fibre Channel + 05 SMBus + 06 InfiniBand + 07 IPMI Interface + 00 SMIC + 01 KCS + 02 BT (Block Transfer) + 08 SERCOS interface + 09 CANBUS + 80 Serial bus controller +C 0d Wireless controller + 00 IRDA controller + 01 Consumer IR controller + 10 RF controller + 11 Bluetooth + 12 Broadband + 20 802.1a controller + 21 802.1b controller + 80 Wireless controller +C 0e Intelligent controller + 00 I2O +C 0f Satellite communications controller + 01 Satellite TV controller + 02 Satellite audio communication controller + 03 Satellite voice communication controller + 04 Satellite data communication controller +C 10 Encryption controller + 00 Network and computing encryption device + 10 Entertainment encryption device + 80 Encryption controller +C 11 Signal processing controller + 00 DPIO module + 01 Performance counters + 10 Communication synchronizer + 20 Signal processing management + 80 Signal processing controller +C 12 Processing accelerators + 00 Processing accelerators + 01 SNIA Smart Data Accelerator Interface (SDXI) controller +C 13 Non-Essential Instrumentation +C 40 Coprocessor +C ff Unassigned class diff --git a/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids/pciids.go b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids/pciids.go new file mode 100644 index 0000000..8af94d9 --- /dev/null +++ b/vendor/gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids/pciids.go @@ -0,0 +1,404 @@ +package pciids + +import ( + "bufio" + "bytes" + _ "embed" // Fallback is the embedded pci.ids db file + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// token what the Lexer retruns +type token int + +const ( + // ILLEGAL a token which the Lexer does not understand + ILLEGAL token = iota + // EOF end of file + EOF + // WS whitespace + WS + // NEWLINE '\n' + NEWLINE + // COMMENT '# something' + COMMENT + // VENDOR PCI vendor + VENDOR + // SUBVENDOR PCI subvendor + SUBVENDOR + // DEVICE PCI device + DEVICE + // CLASS PCI class + CLASS + // SUBCLASS PCI subclass + SUBCLASS + // PROGIF PCI programming interface + PROGIF +) + +// literal values from the Lexer +type literal struct { + ID string + name string + SubName string +} + +// scanner a lexical scanner +type scanner struct { + r *bufio.Reader + isVendor bool +} + +// newScanner well a new scanner ... +func newScanner(r io.Reader) *scanner { + return &scanner{r: bufio.NewReader(r)} +} + +// Since the pci.ids is line base we're consuming a whole line rather then only +// a single rune/char +func (s *scanner) readline() []byte { + ln, err := s.r.ReadBytes('\n') + if err == io.EOF { + return []byte{'E', 'O', 'F'} + } + if err != nil { + fmt.Printf("ReadBytes failed with %v", err) + return []byte{} + } + return ln +} + +func scanClass(line []byte) (token, literal) { + class := string(line[1:]) + return CLASS, scanEntry([]byte(class), 2) +} + +func scanSubVendor(line []byte) (token, literal) { + trim0 := strings.TrimSpace(string(line)) + subv := string(trim0[:4]) + trim1 := strings.TrimSpace(trim0[4:]) + subd := string(trim1[:4]) + subn := strings.TrimSpace(trim1[4:]) + + return SUBVENDOR, literal{subv, subd, subn} +} + +func scanEntry(line []byte, offset uint) literal { + trim := strings.TrimSpace(string(line)) + id := string(trim[:offset]) + name := strings.TrimSpace(trim[offset:]) + + return literal{id, name, ""} +} + +func isLeadingOneTab(ln []byte) bool { return (ln[0] == '\t') && (ln[1] != '\t') } +func isLeadingTwoTabs(ln []byte) bool { return (ln[0] == '\t') && (ln[1] == '\t') } + +func isHexDigit(ln []byte) bool { return (ln[0] >= '0' && ln[0] <= '9') } +func isHexLetter(ln []byte) bool { return (ln[0] >= 'a' && ln[0] <= 'f') } + +func isVendor(ln []byte) bool { return isHexDigit(ln) || isHexLetter(ln) } +func isEOF(ln []byte) bool { return (ln[0] == 'E' && ln[1] == 'O' && ln[2] == 'F') } +func isComment(ln []byte) bool { return (ln[0] == '#') } +func isSubVendor(ln []byte) bool { return isLeadingTwoTabs(ln) } +func isDevice(ln []byte) bool { return isLeadingOneTab(ln) } +func isNewline(ln []byte) bool { return (ln[0] == '\n') } + +// List of known device classes, subclasses and programming interfaces +func isClass(ln []byte) bool { return (ln[0] == 'C') } +func isProgIf(ln []byte) bool { return isLeadingTwoTabs(ln) } +func isSubClass(ln []byte) bool { return isLeadingOneTab(ln) } + +// unread places the previously read rune back on the reader. +func (s *scanner) unread() { _ = s.r.UnreadRune() } + +// scan returns the next token and literal value. +func (s *scanner) scan() (tok token, lit literal) { + + line := s.readline() + + if isEOF(line) { + return EOF, literal{} + } + + if isNewline(line) { + return NEWLINE, literal{ID: string('\n')} + } + + if isComment(line) { + return COMMENT, literal{ID: string(line)} + } + + // vendors + if isVendor(line) { + s.isVendor = true + return VENDOR, scanEntry(line, 4) + } + + if isSubVendor(line) && s.isVendor { + return scanSubVendor(line) + } + + if isDevice(line) && s.isVendor { + return DEVICE, scanEntry(line, 4) + } + + // classes + if isClass(line) { + s.isVendor = false + return scanClass(line) + } + if isProgIf(line) && !s.isVendor { + return PROGIF, scanEntry(line, 2) + } + + if isSubClass(line) && !s.isVendor { + return SUBCLASS, scanEntry(line, 2) + } + + return ILLEGAL, literal{ID: string(line)} +} + +// parser reads the tokens returned by the Lexer and constructs the AST +type parser struct { + s *scanner + buf struct { + tok token + lit literal + n int + } +} + +// This is a fallback if all of the locations fail +//go:embed default_pci.ids +var defaultPCIdb []byte + +// NewDB Parse the PCI DB in its default locations or use the default +// builtin pci.ids db. +func NewDB() Interface { + // Various locations of pci.ids for differente distributions these may be more + // up to date then the embedded pci.ids db + pcidbs := []string{ + "/usr/share/misc/pci.ids", // Ubuntu + "/usr/local/share/pci.ids", // RHEL like with manual update + "/usr/share/hwdata/pci.ids", // RHEL like + "/usr/share/pci.ids", // SUSE + } + return newParser(pcidbs).parse() +} + +// newParser will attempt to read the db pci.ids from well known places or fall +// back to an internal db +func newParser(pcidbs []string) *parser { + + for _, db := range pcidbs { + file, err := os.ReadFile(db) + if err != nil { + continue + } + return newParserFromReader(bufio.NewReader(bytes.NewReader(file))) + + } + // We're using go embed above to have the byte array + // correctly initialized with the internal shipped db + // if we cannot find an up to date in the filesystem + return newParserFromReader(bufio.NewReader(bytes.NewReader(defaultPCIdb))) +} + +func newParserFromReader(r *bufio.Reader) *parser { + return &parser{s: newScanner(r)} +} + +func (p *parser) scan() (tok token, lit literal) { + + if p.buf.n != 0 { + p.buf.n = 0 + return p.buf.tok, p.buf.lit + } + tok, lit = p.s.scan() + p.buf.tok, p.buf.lit = tok, lit + return +} + +func (p *parser) unscan() { p.buf.n = 1 } + +var _ Interface = (*pcidb)(nil) + +// Interface returns textual description of specific attributes of PCI devices +type Interface interface { + GetDeviceName(uint16, uint16) string + GetClassName(uint32) string +} + +// GetDeviceName return the textual description of the PCI device +func (d *pcidb) GetDeviceName(vendorID uint16, deviceID uint16) string { + return d.vendors[vendorID].devices[deviceID].name +} + +// GetClassName resturn the textual description of the PCI device class +func (d *pcidb) GetClassName(classID uint32) string { + return d.classes[classID].name +} + +// pcidb The complete set of PCI vendors and PCI classes +type pcidb struct { + vendors map[uint16]vendor + classes map[uint32]class +} + +// vendor PCI vendors/devices/subVendors/SubDevices +type vendor struct { + name string + devices map[uint16]device +} + +// subVendor PCI subVendor +type subVendor struct { + SubDevices map[uint16]SubDevice +} + +// SubDevice PCI SubDevice +type SubDevice struct { + name string +} + +// device PCI device +type device struct { + name string + subVendors map[uint16]subVendor +} + +// class PCI classes/subClasses/Programming Interfaces +type class struct { + name string + subClasses map[uint32]subClass +} + +// subClass PCI subClass +type subClass struct { + name string + progIfs map[uint8]progIf +} + +// progIf PCI Programming Interface +type progIf struct { + name string +} + +// parse parses a PCI IDS entry +func (p *parser) parse() Interface { + + db := &pcidb{ + vendors: map[uint16]vendor{}, + classes: map[uint32]class{}, + } + + // Used for housekeeping, breadcrumb for aggregated types + var hkVendor vendor + var hkDevice device + + var hkClass class + var hkSubClass subClass + + var hkFullID uint32 = 0 + var hkFullName [2]string + + for { + tok, lit := p.scan() + + // We're ignoring COMMENT, NEWLINE + // An EOF will break the loop + if tok == EOF { + break + } + + // PCI vendors ------------------------------------------------- + if tok == VENDOR { + id, _ := strconv.ParseUint(lit.ID, 16, 16) + db.vendors[uint16(id)] = vendor{ + name: lit.name, + devices: map[uint16]device{}, + } + hkVendor = db.vendors[uint16(id)] + } + + if tok == DEVICE { + id, _ := strconv.ParseUint(lit.ID, 16, 16) + hkVendor.devices[uint16(id)] = device{ + name: lit.name, + subVendors: map[uint16]subVendor{}, + } + hkDevice = hkVendor.devices[uint16(id)] + } + + if tok == SUBVENDOR { + id, _ := strconv.ParseUint(lit.ID, 16, 16) + hkDevice.subVendors[uint16(id)] = subVendor{ + SubDevices: map[uint16]SubDevice{}, + } + subvendor := hkDevice.subVendors[uint16(id)] + subid, _ := strconv.ParseUint(lit.name, 16, 16) + subvendor.SubDevices[uint16(subid)] = SubDevice{ + name: lit.SubName, + } + } + + // PCI classes ------------------------------------------------- + if tok == CLASS { + id, _ := strconv.ParseUint(lit.ID, 16, 32) + db.classes[uint32(id)] = class{ + name: lit.name, + subClasses: map[uint32]subClass{}, + } + hkClass = db.classes[uint32(id)] + + hkFullID = uint32(id) << 16 + hkFullID = hkFullID & 0xFFFF0000 + hkFullName[0] = fmt.Sprintf("%s (%02x)", lit.name, id) + } + + if tok == SUBCLASS { + id, _ := strconv.ParseUint(lit.ID, 16, 8) + hkClass.subClasses[uint32(id)] = subClass{ + name: lit.name, + progIfs: map[uint8]progIf{}, + } + hkSubClass = hkClass.subClasses[uint32(id)] + + // Clear the last detected sub class + hkFullID = hkFullID & 0xFFFF0000 + hkFullID = hkFullID | uint32(id)<<8 + // Clear the last detected prog iface + hkFullID = hkFullID & 0xFFFFFF00 + hkFullName[1] = fmt.Sprintf("%s (%02x)", lit.name, id) + + db.classes[uint32(hkFullID)] = class{ + name: hkFullName[0] + " | " + hkFullName[1], + } + } + + if tok == PROGIF { + id, _ := strconv.ParseUint(lit.ID, 16, 8) + hkSubClass.progIfs[uint8(id)] = progIf{ + name: lit.name, + } + + finalID := hkFullID | uint32(id) + + name := fmt.Sprintf("%s (%02x)", lit.name, id) + finalName := hkFullName[0] + " | " + hkFullName[1] + " | " + name + + db.classes[finalID] = class{ + name: finalName, + } + } + + if tok == ILLEGAL { + fmt.Printf("warning: illegal token %s %s cannot parse PCI IDS, database may be incomplete ", lit.ID, lit.name) + } + } + return db +} diff --git a/vendor/golang.org/x/mod/LICENSE b/vendor/golang.org/x/mod/LICENSE new file mode 100644 index 0000000..6a66aea --- /dev/null +++ b/vendor/golang.org/x/mod/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/mod/PATENTS b/vendor/golang.org/x/mod/PATENTS new file mode 100644 index 0000000..7330990 --- /dev/null +++ b/vendor/golang.org/x/mod/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/mod/semver/semver.go b/vendor/golang.org/x/mod/semver/semver.go new file mode 100644 index 0000000..a30a22b --- /dev/null +++ b/vendor/golang.org/x/mod/semver/semver.go @@ -0,0 +1,401 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package semver implements comparison of semantic version strings. +// In this package, semantic version strings must begin with a leading "v", +// as in "v1.0.0". +// +// The general form of a semantic version string accepted by this package is +// +// vMAJOR[.MINOR[.PATCH[-PRERELEASE][+BUILD]]] +// +// where square brackets indicate optional parts of the syntax; +// MAJOR, MINOR, and PATCH are decimal integers without extra leading zeros; +// PRERELEASE and BUILD are each a series of non-empty dot-separated identifiers +// using only alphanumeric characters and hyphens; and +// all-numeric PRERELEASE identifiers must not have leading zeros. +// +// This package follows Semantic Versioning 2.0.0 (see semver.org) +// with two exceptions. First, it requires the "v" prefix. Second, it recognizes +// vMAJOR and vMAJOR.MINOR (with no prerelease or build suffixes) +// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0. +package semver + +import "sort" + +// parsed returns the parsed form of a semantic version string. +type parsed struct { + major string + minor string + patch string + short string + prerelease string + build string +} + +// IsValid reports whether v is a valid semantic version string. +func IsValid(v string) bool { + _, ok := parse(v) + return ok +} + +// Canonical returns the canonical formatting of the semantic version v. +// It fills in any missing .MINOR or .PATCH and discards build metadata. +// Two semantic versions compare equal only if their canonical formattings +// are identical strings. +// The canonical invalid semantic version is the empty string. +func Canonical(v string) string { + p, ok := parse(v) + if !ok { + return "" + } + if p.build != "" { + return v[:len(v)-len(p.build)] + } + if p.short != "" { + return v + p.short + } + return v +} + +// Major returns the major version prefix of the semantic version v. +// For example, Major("v2.1.0") == "v2". +// If v is an invalid semantic version string, Major returns the empty string. +func Major(v string) string { + pv, ok := parse(v) + if !ok { + return "" + } + return v[:1+len(pv.major)] +} + +// MajorMinor returns the major.minor version prefix of the semantic version v. +// For example, MajorMinor("v2.1.0") == "v2.1". +// If v is an invalid semantic version string, MajorMinor returns the empty string. +func MajorMinor(v string) string { + pv, ok := parse(v) + if !ok { + return "" + } + i := 1 + len(pv.major) + if j := i + 1 + len(pv.minor); j <= len(v) && v[i] == '.' && v[i+1:j] == pv.minor { + return v[:j] + } + return v[:i] + "." + pv.minor +} + +// Prerelease returns the prerelease suffix of the semantic version v. +// For example, Prerelease("v2.1.0-pre+meta") == "-pre". +// If v is an invalid semantic version string, Prerelease returns the empty string. +func Prerelease(v string) string { + pv, ok := parse(v) + if !ok { + return "" + } + return pv.prerelease +} + +// Build returns the build suffix of the semantic version v. +// For example, Build("v2.1.0+meta") == "+meta". +// If v is an invalid semantic version string, Build returns the empty string. +func Build(v string) string { + pv, ok := parse(v) + if !ok { + return "" + } + return pv.build +} + +// Compare returns an integer comparing two versions according to +// semantic version precedence. +// The result will be 0 if v == w, -1 if v < w, or +1 if v > w. +// +// An invalid semantic version string is considered less than a valid one. +// All invalid semantic version strings compare equal to each other. +func Compare(v, w string) int { + pv, ok1 := parse(v) + pw, ok2 := parse(w) + if !ok1 && !ok2 { + return 0 + } + if !ok1 { + return -1 + } + if !ok2 { + return +1 + } + if c := compareInt(pv.major, pw.major); c != 0 { + return c + } + if c := compareInt(pv.minor, pw.minor); c != 0 { + return c + } + if c := compareInt(pv.patch, pw.patch); c != 0 { + return c + } + return comparePrerelease(pv.prerelease, pw.prerelease) +} + +// Max canonicalizes its arguments and then returns the version string +// that compares greater. +// +// Deprecated: use Compare instead. In most cases, returning a canonicalized +// version is not expected or desired. +func Max(v, w string) string { + v = Canonical(v) + w = Canonical(w) + if Compare(v, w) > 0 { + return v + } + return w +} + +// ByVersion implements sort.Interface for sorting semantic version strings. +type ByVersion []string + +func (vs ByVersion) Len() int { return len(vs) } +func (vs ByVersion) Swap(i, j int) { vs[i], vs[j] = vs[j], vs[i] } +func (vs ByVersion) Less(i, j int) bool { + cmp := Compare(vs[i], vs[j]) + if cmp != 0 { + return cmp < 0 + } + return vs[i] < vs[j] +} + +// Sort sorts a list of semantic version strings using ByVersion. +func Sort(list []string) { + sort.Sort(ByVersion(list)) +} + +func parse(v string) (p parsed, ok bool) { + if v == "" || v[0] != 'v' { + return + } + p.major, v, ok = parseInt(v[1:]) + if !ok { + return + } + if v == "" { + p.minor = "0" + p.patch = "0" + p.short = ".0.0" + return + } + if v[0] != '.' { + ok = false + return + } + p.minor, v, ok = parseInt(v[1:]) + if !ok { + return + } + if v == "" { + p.patch = "0" + p.short = ".0" + return + } + if v[0] != '.' { + ok = false + return + } + p.patch, v, ok = parseInt(v[1:]) + if !ok { + return + } + if len(v) > 0 && v[0] == '-' { + p.prerelease, v, ok = parsePrerelease(v) + if !ok { + return + } + } + if len(v) > 0 && v[0] == '+' { + p.build, v, ok = parseBuild(v) + if !ok { + return + } + } + if v != "" { + ok = false + return + } + ok = true + return +} + +func parseInt(v string) (t, rest string, ok bool) { + if v == "" { + return + } + if v[0] < '0' || '9' < v[0] { + return + } + i := 1 + for i < len(v) && '0' <= v[i] && v[i] <= '9' { + i++ + } + if v[0] == '0' && i != 1 { + return + } + return v[:i], v[i:], true +} + +func parsePrerelease(v string) (t, rest string, ok bool) { + // "A pre-release version MAY be denoted by appending a hyphen and + // a series of dot separated identifiers immediately following the patch version. + // Identifiers MUST comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]. + // Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes." + if v == "" || v[0] != '-' { + return + } + i := 1 + start := 1 + for i < len(v) && v[i] != '+' { + if !isIdentChar(v[i]) && v[i] != '.' { + return + } + if v[i] == '.' { + if start == i || isBadNum(v[start:i]) { + return + } + start = i + 1 + } + i++ + } + if start == i || isBadNum(v[start:i]) { + return + } + return v[:i], v[i:], true +} + +func parseBuild(v string) (t, rest string, ok bool) { + if v == "" || v[0] != '+' { + return + } + i := 1 + start := 1 + for i < len(v) { + if !isIdentChar(v[i]) && v[i] != '.' { + return + } + if v[i] == '.' { + if start == i { + return + } + start = i + 1 + } + i++ + } + if start == i { + return + } + return v[:i], v[i:], true +} + +func isIdentChar(c byte) bool { + return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '-' +} + +func isBadNum(v string) bool { + i := 0 + for i < len(v) && '0' <= v[i] && v[i] <= '9' { + i++ + } + return i == len(v) && i > 1 && v[0] == '0' +} + +func isNum(v string) bool { + i := 0 + for i < len(v) && '0' <= v[i] && v[i] <= '9' { + i++ + } + return i == len(v) +} + +func compareInt(x, y string) int { + if x == y { + return 0 + } + if len(x) < len(y) { + return -1 + } + if len(x) > len(y) { + return +1 + } + if x < y { + return -1 + } else { + return +1 + } +} + +func comparePrerelease(x, y string) int { + // "When major, minor, and patch are equal, a pre-release version has + // lower precedence than a normal version. + // Example: 1.0.0-alpha < 1.0.0. + // Precedence for two pre-release versions with the same major, minor, + // and patch version MUST be determined by comparing each dot separated + // identifier from left to right until a difference is found as follows: + // identifiers consisting of only digits are compared numerically and + // identifiers with letters or hyphens are compared lexically in ASCII + // sort order. Numeric identifiers always have lower precedence than + // non-numeric identifiers. A larger set of pre-release fields has a + // higher precedence than a smaller set, if all of the preceding + // identifiers are equal. + // Example: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < + // 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0." + if x == y { + return 0 + } + if x == "" { + return +1 + } + if y == "" { + return -1 + } + for x != "" && y != "" { + x = x[1:] // skip - or . + y = y[1:] // skip - or . + var dx, dy string + dx, x = nextIdent(x) + dy, y = nextIdent(y) + if dx != dy { + ix := isNum(dx) + iy := isNum(dy) + if ix != iy { + if ix { + return -1 + } else { + return +1 + } + } + if ix { + if len(dx) < len(dy) { + return -1 + } + if len(dx) > len(dy) { + return +1 + } + } + if dx < dy { + return -1 + } else { + return +1 + } + } + } + if x == "" { + return -1 + } else { + return +1 + } +} + +func nextIdent(x string) (dx, rest string) { + i := 0 + for i < len(x) && x[i] != '.' { + i++ + } + return x[:i], x[i:] +} diff --git a/vendor/golang.org/x/sys/unix/ioctl_signed.go b/vendor/golang.org/x/sys/unix/ioctl_signed.go new file mode 100644 index 0000000..7def958 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ioctl_signed.go @@ -0,0 +1,70 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || solaris +// +build aix solaris + +package unix + +import ( + "unsafe" +) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req int, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +// IoctlSetPointerInt performs an ioctl operation which sets an +// integer value on fd, using the specified request number. The ioctl +// argument is called with a pointer to the integer value, rather than +// passing the integer value directly. +func IoctlSetPointerInt(fd int, req int, value int) error { + v := int32(value) + return ioctlPtr(fd, req, unsafe.Pointer(&v)) +} + +// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. +// +// To change fd's window size, the req argument should be TIOCSWINSZ. +func IoctlSetWinsize(fd int, req int, value *Winsize) error { + // TODO: if we get the chance, remove the req parameter and + // hardcode TIOCSWINSZ. + return ioctlPtr(fd, req, unsafe.Pointer(value)) +} + +// IoctlSetTermios performs an ioctl on fd with a *Termios. +// +// The req value will usually be TCSETA or TIOCSETA. +func IoctlSetTermios(fd int, req int, value *Termios) error { + // TODO: if we get the chance, remove the req parameter. + return ioctlPtr(fd, req, unsafe.Pointer(value)) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +// +// A few ioctl requests use the return value as an output parameter; +// for those, IoctlRetInt should be used instead of this function. +func IoctlGetInt(fd int, req int) (int, error) { + var value int + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return value, err +} + +func IoctlGetWinsize(fd int, req int) (*Winsize, error) { + var value Winsize + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return &value, err +} + +func IoctlGetTermios(fd int, req int) (*Termios, error) { + var value Termios + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) + return &value, err +} diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go similarity index 92% rename from vendor/golang.org/x/sys/unix/ioctl.go rename to vendor/golang.org/x/sys/unix/ioctl_unsigned.go index 7ce8dd4..649913d 100644 --- a/vendor/golang.org/x/sys/unix/ioctl.go +++ b/vendor/golang.org/x/sys/unix/ioctl_unsigned.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build aix || darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris +//go:build darwin || dragonfly || freebsd || hurd || linux || netbsd || openbsd +// +build darwin dragonfly freebsd hurd linux netbsd openbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl_zos.go b/vendor/golang.org/x/sys/unix/ioctl_zos.go index 6532f09..cdc21bf 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_zos.go +++ b/vendor/golang.org/x/sys/unix/ioctl_zos.go @@ -17,14 +17,14 @@ import ( // IoctlSetInt performs an ioctl operation which sets an integer value // on fd, using the specified request number. -func IoctlSetInt(fd int, req uint, value int) error { +func IoctlSetInt(fd int, req int, value int) error { return ioctl(fd, req, uintptr(value)) } // IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. // // To change fd's window size, the req argument should be TIOCSWINSZ. -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func IoctlSetWinsize(fd int, req int, value *Winsize) error { // TODO: if we get the chance, remove the req parameter and // hardcode TIOCSWINSZ. return ioctlPtr(fd, req, unsafe.Pointer(value)) @@ -33,7 +33,7 @@ func IoctlSetWinsize(fd int, req uint, value *Winsize) error { // IoctlSetTermios performs an ioctl on fd with a *Termios. // // The req value is expected to be TCSETS, TCSETSW, or TCSETSF -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func IoctlSetTermios(fd int, req int, value *Termios) error { if (req != TCSETS) && (req != TCSETSW) && (req != TCSETSF) { return ENOSYS } @@ -47,13 +47,13 @@ func IoctlSetTermios(fd int, req uint, value *Termios) error { // // A few ioctl requests use the return value as an output parameter; // for those, IoctlRetInt should be used instead of this function. -func IoctlGetInt(fd int, req uint) (int, error) { +func IoctlGetInt(fd int, req int) (int, error) { var value int err := ioctlPtr(fd, req, unsafe.Pointer(&value)) return value, err } -func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { +func IoctlGetWinsize(fd int, req int) (*Winsize, error) { var value Winsize err := ioctlPtr(fd, req, unsafe.Pointer(&value)) return &value, err @@ -62,7 +62,7 @@ func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { // IoctlGetTermios performs an ioctl on fd with a *Termios. // // The req value is expected to be TCGETS -func IoctlGetTermios(fd int, req uint) (*Termios, error) { +func IoctlGetTermios(fd int, req int) (*Termios, error) { var value Termios if req != TCGETS { return &value, ENOSYS diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 7456d9d..2045d3d 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -66,6 +66,7 @@ includes_Darwin=' #include #include #include +#include #include #include #include @@ -521,6 +522,7 @@ ccflags="$@" $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || $2 ~ /^NFC_.*_(MAX)?SIZE$/ || $2 ~ /^RAW_PAYLOAD_/ || + $2 ~ /^[US]F_/ || $2 ~ /^TP_STATUS_/ || $2 ~ /^FALLOC_/ || $2 ~ /^ICMPV?6?_(FILTER|SEC)/ || diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index d9f5544..c406ae0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -408,8 +408,8 @@ func (w WaitStatus) CoreDump() bool { return w&0x80 == 0x80 } func (w WaitStatus) TrapCause() int { return -1 } -//sys ioctl(fd int, req uint, arg uintptr) (err error) -//sys ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = ioctl +//sys ioctl(fd int, req int, arg uintptr) (err error) +//sys ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = ioctl // fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX // There is no way to create a custom fcntl and to keep //sys fcntl easily, diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go index e92a0be..f2871fa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go @@ -8,7 +8,6 @@ package unix //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = getrlimit64 -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) = setrlimit64 //sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek64 //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go index 16eed17..75718ec 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go @@ -8,7 +8,6 @@ package unix //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek //sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) = mmap64 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 7064d6e..2069215 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -613,6 +613,7 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys Rmdir(path string) (err error) //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) //sys Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) @@ -622,7 +623,6 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys Setprivexec(flag int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) @@ -676,7 +676,6 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { // Kqueue_from_portset_np // Kqueue_portset // Getattrlist -// Setattrlist // Getdirentriesattr // Searchfs // Delete diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 221efc2..d4ce988 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -326,7 +326,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 5bdde03..afb1010 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -433,7 +433,6 @@ func Dup3(oldfd, newfd, flags int) error { //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 9735331..fbaeb5f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -1873,7 +1873,6 @@ func Getpgrp() (pid int) { //sys OpenTree(dfd int, fileName string, flags uint) (r int, err error) //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT -//sysnb Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 //sys read(fd int, p []byte) (n int, err error) @@ -1887,6 +1886,15 @@ func Getpgrp() (pid int) { //sysnb Settimeofday(tv *Timeval) (err error) //sys Setns(fd int, nstype int) (err error) +//go:linkname syscall_prlimit syscall.prlimit +func syscall_prlimit(pid, resource int, newlimit, old *syscall.Rlimit) error + +func Prlimit(pid, resource int, newlimit, old *Rlimit) error { + // Just call the syscall version, because as of Go 1.21 + // it will affect starting a new process. + return syscall_prlimit(pid, resource, (*syscall.Rlimit)(newlimit), (*syscall.Rlimit)(old)) +} + // PrctlRetInt performs a prctl operation specified by option and further // optional arguments arg2 through arg5 depending on option. It returns a // non-negative integer that is returned by the prctl syscall. diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index ff5b589..c7d9945 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -97,33 +97,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { newoffset, errno := seek(fd, offset, whence) if errno != 0 { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 9b27035..5b21fcf 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -46,7 +46,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 856ad1d..da29864 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -171,33 +171,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 6422704..a81f574 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -39,7 +39,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) @@ -143,15 +142,6 @@ func Getrlimit(resource int, rlim *Rlimit) error { return getrlimit(resource, rlim) } -// Setrlimit prefers the prlimit64 system call. See issue 38604. -func Setrlimit(resource int, rlim *Rlimit) error { - err := Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - return setrlimit(resource, rlim) -} - func (r *PtraceRegs) PC() uint64 { return r.Pc } func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 59dab51..69d2d7c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -126,11 +126,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - return -} - func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) { if tv == nil { return utimensat(dirfd, path, nil, 0) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index bfef09a..76d5640 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -37,7 +37,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Statfs(path string, buf *Statfs_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index ab30250..aae7f0f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -151,33 +151,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func (r *PtraceRegs) PC() uint64 { return r.Epc } func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index eac1cf1..66eff19 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -159,33 +159,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { return } -//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT - -func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = Prlimit(0, resource, rlim, nil) - if err != ENOSYS { - return err - } - - rl := rlimit32{} - if rlim.Cur == rlimInf64 { - rl.Cur = rlimInf32 - } else if rlim.Cur < uint64(rlimInf32) { - rl.Cur = uint32(rlim.Cur) - } else { - return EINVAL - } - if rlim.Max == rlimInf64 { - rl.Max = rlimInf32 - } else if rlim.Max < uint64(rlimInf32) { - rl.Max = uint32(rlim.Max) - } else { - return EINVAL - } - - return setrlimit(resource, &rl) -} - func (r *PtraceRegs) PC() uint32 { return r.Nip } func (r *PtraceRegs) SetPC(pc uint32) { r.Nip = pc } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 4df5661..806aa25 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -34,7 +34,6 @@ package unix //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 5f4243d..35851ef 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -38,7 +38,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index d0a7d40..2f89e8f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -34,7 +34,6 @@ import ( //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, buf *Statfs_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index f5c793b..7ca064a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -31,7 +31,6 @@ package unix //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) //sys setfsgid(gid int) (prev int, err error) //sys setfsuid(uid int) (prev int, err error) -//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) //sys Shutdown(fd int, how int) (err error) //sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) //sys Stat(path string, stat *Stat_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index e66865d..018d7d4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -340,7 +340,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) //sysnb Setuid(uid int) (err error) @@ -501,7 +500,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { // compat_43_osendmsg // compat_43_osethostid // compat_43_osethostname -// compat_43_osetrlimit // compat_43_osigblock // compat_43_osigsetmask // compat_43_osigstack diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 5e9de23..f9c7a96 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -294,7 +294,6 @@ func Uname(uname *Utsname) error { //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setresgid(rgid int, egid int, sgid int) (err error) //sysnb Setresuid(ruid int, euid int, suid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setrtable(rtable int) (err error) //sysnb Setsid() (pid int, err error) //sysnb Settimeofday(tp *Timeval) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index d3444b6..b600a28 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -545,24 +545,24 @@ func Minor(dev uint64) uint32 { * Expose the ioctl function */ -//sys ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) = libc.ioctl -//sys ioctlPtrRet(fd int, req uint, arg unsafe.Pointer) (ret int, err error) = libc.ioctl +//sys ioctlRet(fd int, req int, arg uintptr) (ret int, err error) = libc.ioctl +//sys ioctlPtrRet(fd int, req int, arg unsafe.Pointer) (ret int, err error) = libc.ioctl -func ioctl(fd int, req uint, arg uintptr) (err error) { +func ioctl(fd int, req int, arg uintptr) (err error) { _, err = ioctlRet(fd, req, arg) return err } -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { _, err = ioctlPtrRet(fd, req, arg) return err } -func IoctlSetTermio(fd int, req uint, value *Termio) error { +func IoctlSetTermio(fd int, req int, value *Termio) error { return ioctlPtr(fd, req, unsafe.Pointer(value)) } -func IoctlGetTermio(fd int, req uint) (*Termio, error) { +func IoctlGetTermio(fd int, req int) (*Termio, error) { var value Termio err := ioctlPtr(fd, req, unsafe.Pointer(&value)) return &value, err @@ -665,7 +665,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) -//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sysnb Setsid() (pid int, err error) //sysnb Setuid(uid int) (err error) //sys Shutdown(s int, how int) (err error) = libsocket.shutdown @@ -1080,11 +1079,11 @@ func Getmsg(fd int, cl []byte, data []byte) (retCl []byte, retData []byte, flags return retCl, retData, flags, nil } -func IoctlSetIntRetInt(fd int, req uint, arg int) (int, error) { +func IoctlSetIntRetInt(fd int, req int, arg int) (int, error) { return ioctlRet(fd, req, uintptr(arg)) } -func IoctlSetString(fd int, req uint, val string) error { +func IoctlSetString(fd int, req int, val string) error { bs := make([]byte, len(val)+1) copy(bs[:len(bs)-1], val) err := ioctlPtr(fd, req, unsafe.Pointer(&bs[0])) @@ -1120,7 +1119,7 @@ func (l *Lifreq) GetLifruUint() uint { return *(*uint)(unsafe.Pointer(&l.Lifru[0])) } -func IoctlLifreq(fd int, req uint, l *Lifreq) error { +func IoctlLifreq(fd int, req int, l *Lifreq) error { return ioctlPtr(fd, req, unsafe.Pointer(l)) } @@ -1131,6 +1130,6 @@ func (s *Strioctl) SetInt(i int) { s.Dp = (*int8)(unsafe.Pointer(&i)) } -func IoctlSetStrioctlRetInt(fd int, req uint, s *Strioctl) (int, error) { +func IoctlSetStrioctlRetInt(fd int, req int, s *Strioctl) (int, error) { return ioctlPtrRet(fd, req, unsafe.Pointer(s)) } diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 00f0aa3..8e48c29 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -587,3 +587,10 @@ func emptyIovecs(iov []Iovec) bool { } return true } + +// Setrlimit sets a resource limit. +func Setrlimit(resource int, rlim *Rlimit) error { + // Just call the syscall version, because as of Go 1.21 + // it will affect starting a new process. + return syscall.Setrlimit(resource, (*syscall.Rlimit)(rlim)) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index b295497..d3d49ec 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -212,8 +212,8 @@ func (cmsg *Cmsghdr) SetLen(length int) { //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___SENDMSG_A //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) = SYS_MMAP //sys munmap(addr uintptr, length uintptr) (err error) = SYS_MUNMAP -//sys ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL -//sys ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL +//sys ioctl(fd int, req int, arg uintptr) (err error) = SYS_IOCTL +//sys ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = SYS_IOCTL //sys Access(path string, mode uint32) (err error) = SYS___ACCESS_A //sys Chdir(path string) (err error) = SYS___CHDIR_A diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index 476a1c7..1430076 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -1270,6 +1270,16 @@ const ( SEEK_END = 0x2 SEEK_HOLE = 0x3 SEEK_SET = 0x0 + SF_APPEND = 0x40000 + SF_ARCHIVED = 0x10000 + SF_DATALESS = 0x40000000 + SF_FIRMLINK = 0x800000 + SF_IMMUTABLE = 0x20000 + SF_NOUNLINK = 0x100000 + SF_RESTRICTED = 0x80000 + SF_SETTABLE = 0x3fff0000 + SF_SUPPORTED = 0x9f0000 + SF_SYNTHETIC = 0xc0000000 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1543,6 +1553,15 @@ const ( TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 + UF_APPEND = 0x4 + UF_COMPRESSED = 0x20 + UF_DATAVAULT = 0x80 + UF_HIDDEN = 0x8000 + UF_IMMUTABLE = 0x2 + UF_NODUMP = 0x1 + UF_OPAQUE = 0x8 + UF_SETTABLE = 0xffff + UF_TRACKED = 0x40 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index e36f517..ab044a7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -1270,6 +1270,16 @@ const ( SEEK_END = 0x2 SEEK_HOLE = 0x3 SEEK_SET = 0x0 + SF_APPEND = 0x40000 + SF_ARCHIVED = 0x10000 + SF_DATALESS = 0x40000000 + SF_FIRMLINK = 0x800000 + SF_IMMUTABLE = 0x20000 + SF_NOUNLINK = 0x100000 + SF_RESTRICTED = 0x80000 + SF_SETTABLE = 0x3fff0000 + SF_SUPPORTED = 0x9f0000 + SF_SYNTHETIC = 0xc0000000 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1543,6 +1553,15 @@ const ( TIOCTIMESTAMP = 0x40107459 TIOCUCNTL = 0x80047466 TOSTOP = 0x400000 + UF_APPEND = 0x4 + UF_COMPRESSED = 0x20 + UF_DATAVAULT = 0x80 + UF_HIDDEN = 0x8000 + UF_IMMUTABLE = 0x2 + UF_NODUMP = 0x1 + UF_OPAQUE = 0x8 + UF_SETTABLE = 0xffff + UF_TRACKED = 0x40 VDISCARD = 0xf VDSUSP = 0xb VEOF = 0x0 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index ef9dcd1..9a25721 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -124,7 +124,6 @@ int utime(uintptr_t, uintptr_t); unsigned long long getsystemcfg(int); int umount(uintptr_t); int getrlimit64(int, uintptr_t); -int setrlimit64(int, uintptr_t); long long lseek64(int, long long, int); uintptr_t mmap(uintptr_t, uintptr_t, int, int, int, long long); @@ -213,7 +212,7 @@ func wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctl(fd int, req uint, arg uintptr) (err error) { +func ioctl(fd int, req int, arg uintptr) (err error) { r0, er := C.ioctl(C.int(fd), C.int(req), C.uintptr_t(arg)) if r0 == -1 && er != nil { err = er @@ -223,7 +222,7 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { r0, er := C.ioctl(C.int(fd), C.int(req), C.uintptr_t(uintptr(arg))) if r0 == -1 && er != nil { err = er @@ -1464,16 +1463,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - r0, er := C.setrlimit64(C.int(resource), C.uintptr_t(uintptr(unsafe.Pointer(rlim)))) - if r0 == -1 && er != nil { - err = er - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, er := C.lseek64(C.int(fd), C.longlong(offset), C.int(whence)) off = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index f86a945..6de80c2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -93,8 +93,8 @@ func wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctl(fd int, req uint, arg uintptr) (err error) { - _, e1 := callioctl(fd, int(req), arg) +func ioctl(fd int, req int, arg uintptr) (err error) { + _, e1 := callioctl(fd, req, arg) if e1 != 0 { err = errnoErr(e1) } @@ -103,8 +103,8 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { - _, e1 := callioctl_ptr(fd, int(req), arg) +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { + _, e1 := callioctl_ptr(fd, req, arg) if e1 != 0 { err = errnoErr(e1) } @@ -1422,16 +1422,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, e1 := callsetrlimit(resource, uintptr(unsafe.Pointer(rlim))) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, e1 := calllseek(fd, offset, whence) off = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index d32a84c..c4d50ae 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -124,7 +124,6 @@ import ( //go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o" //go:cgo_import_dynamic libc_umount umount "libc.a/shr_64.o" //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.a/shr_64.o" -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.a/shr_64.o" //go:cgo_import_dynamic libc_lseek lseek "libc.a/shr_64.o" //go:cgo_import_dynamic libc_mmap64 mmap64 "libc.a/shr_64.o" @@ -242,7 +241,6 @@ import ( //go:linkname libc_getsystemcfg libc_getsystemcfg //go:linkname libc_umount libc_umount //go:linkname libc_getrlimit libc_getrlimit -//go:linkname libc_setrlimit libc_setrlimit //go:linkname libc_lseek libc_lseek //go:linkname libc_mmap64 libc_mmap64 @@ -363,7 +361,6 @@ var ( libc_getsystemcfg, libc_umount, libc_getrlimit, - libc_setrlimit, libc_lseek, libc_mmap64 syscallFunc ) @@ -1179,13 +1176,6 @@ func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { - r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setrlimit)), 2, uintptr(resource), rlim, 0, 0, 0, 0) - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) { r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_lseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) return diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index d7d8baf..6903d3b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -123,7 +123,6 @@ int utime(uintptr_t, uintptr_t); unsigned long long getsystemcfg(int); int umount(uintptr_t); int getrlimit(int, uintptr_t); -int setrlimit(int, uintptr_t); long long lseek(int, long long, int); uintptr_t mmap64(uintptr_t, uintptr_t, int, int, int, long long); @@ -131,6 +130,7 @@ uintptr_t mmap64(uintptr_t, uintptr_t, int, int, int, long long); import "C" import ( "syscall" + "unsafe" ) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1055,14 +1055,6 @@ func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { - r1 = uintptr(C.setrlimit(C.int(resource), C.uintptr_t(rlim))) - e1 = syscall.GetErrno() - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) { r1 = uintptr(C.lseek(C.int(fd), C.longlong(offset), C.int(whence))) e1 = syscall.GetErrno() diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index a29ffdd..4037ccf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -1992,6 +1992,31 @@ var libc_select_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(attrBuf) > 0 { + _p1 = unsafe.Pointer(&attrBuf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(attrlist)), uintptr(_p1), uintptr(len(attrBuf)), uintptr(options), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_setattrlist_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setegid(egid int) (err error) { _, _, e1 := syscall_syscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { @@ -2123,20 +2148,6 @@ var libc_setreuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 95fe4c0..4baaed0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -705,6 +705,11 @@ TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) +TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setattrlist(SB) +GLOBL ·libc_setattrlist_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB) + TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) @@ -759,12 +764,6 @@ TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) - -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 2fd4590..51d6f3f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -1992,6 +1992,31 @@ var libc_select_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Setattrlist(path string, attrlist *Attrlist, attrBuf []byte, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(attrBuf) > 0 { + _p1 = unsafe.Pointer(&attrBuf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall6(libc_setattrlist_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(attrlist)), uintptr(_p1), uintptr(len(attrBuf)), uintptr(options), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_setattrlist_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setegid(egid int) (err error) { _, _, e1 := syscall_syscall(libc_setegid_trampoline_addr, uintptr(egid), 0, 0) if e1 != 0 { @@ -2123,20 +2148,6 @@ var libc_setreuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := syscall_rawSyscall(libc_setsid_trampoline_addr, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index efa5b4c..c3b82c0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -705,6 +705,11 @@ TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) +TEXT libc_setattrlist_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_setattrlist(SB) +GLOBL ·libc_setattrlist_trampoline_addr(SB), RODATA, $8 +DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB) + TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) @@ -759,12 +764,6 @@ TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) - -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 3b85134..0eabac7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1410,16 +1410,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index 1129065..ee313eb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 55f5abf..4c986e4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index d39651c..5552169 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index ddb7408..67a226f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go index 09a53a6..f0b9dda 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go @@ -1645,16 +1645,6 @@ func Setresuid(ruid int, euid int, suid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 430cb24..da63d9d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1346,16 +1346,6 @@ func PivotRoot(newroot string, putold string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { - _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index c81b0ad..07b549c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -411,16 +411,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 2206bce..5f481bf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -334,16 +334,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index edf6b39..824cd52 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -578,16 +578,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func armSyncFileRange(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_ARM_SYNC_FILE_RANGE, uintptr(fd), uintptr(flags), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 190609f..e77aecf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -289,16 +289,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 5f984cb..961a3af 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -644,16 +644,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Alarm(seconds uint) (remaining uint, err error) { r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) remaining = uint(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 46fc380..ed05005 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -278,16 +278,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index cbd0d4d..d365b71 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -278,16 +278,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 0c13d15..c3f1b8b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -644,16 +644,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Alarm(seconds uint) (remaining uint, err error) { r0, _, e1 := Syscall(SYS_ALARM, uintptr(seconds), 0, 0) remaining = uint(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go index e01432a..a6574cf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go @@ -624,16 +624,6 @@ func getrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setrlimit(resource int, rlim *rlimit32) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func syncFileRange2(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 13c7ee7..f409902 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -349,16 +349,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 02d0c0f..9dfcc29 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -349,16 +349,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 9fee3b1..0b29239 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -269,16 +269,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 647bbfe..6cde322 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -319,16 +319,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) n = int64(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index ada057f..5253d65 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -329,16 +329,6 @@ func setfsuid(uid int) (prev int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(resource int, rlim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Shutdown(fd int, how int) (err error) { _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 8e1d9c8..cdb2af5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 21c6950..9d25f76 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 298168f..d3f8035 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 68b8bd4..887188a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1607,16 +1607,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 0b0f910..6699a78 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1894,20 +1894,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s index 0874442..04f0de3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -573,11 +573,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $4 DATA ·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $4 -DATA ·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 48ff5de..1e775fe 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1894,20 +1894,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s index 5782cd1..27b6f4d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -573,11 +573,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 2452a64..7f64278 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -1894,20 +1894,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s index cf31042..b797045 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s @@ -573,11 +573,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $4 DATA ·libc_setresuid_trampoline_addr(SB)/4, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $4 -DATA ·libc_setrlimit_trampoline_addr(SB)/4, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 5e35600..756ef7b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -1894,20 +1894,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s index 484bb42..a871266 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -573,11 +573,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index b04cef1..7bc2e24 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -1894,20 +1894,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s index 55af272..05d4bff 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s @@ -573,11 +573,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index 47a07ee..739be62 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go @@ -1894,20 +1894,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s index 4028255..74a25f8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s @@ -687,12 +687,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - CALL libc_setrlimit(SB) - RET -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 CALL libc_setrtable(SB) RET diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index 573378f..7d95a19 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go @@ -1894,20 +1894,6 @@ var libc_setresuid_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := syscall_rawSyscall(libc_setrlimit_trampoline_addr, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -var libc_setrlimit_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setrtable(rtable int) (err error) { _, _, e1 := syscall_rawSyscall(libc_setrtable_trampoline_addr, uintptr(rtable), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s index e1fbd4d..990be24 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s @@ -573,11 +573,6 @@ TEXT libc_setresuid_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_setresuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setresuid_trampoline_addr(SB)/8, $libc_setresuid_trampoline<>(SB) -TEXT libc_setrlimit_trampoline<>(SB),NOSPLIT,$0-0 - JMP libc_setrlimit(SB) -GLOBL ·libc_setrlimit_trampoline_addr(SB), RODATA, $8 -DATA ·libc_setrlimit_trampoline_addr(SB)/8, $libc_setrlimit_trampoline<>(SB) - TEXT libc_setrtable_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setrtable(SB) GLOBL ·libc_setrtable_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 4873a1e..609d1c5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -110,7 +110,6 @@ import ( //go:cgo_import_dynamic libc_setpriority setpriority "libc.so" //go:cgo_import_dynamic libc_setregid setregid "libc.so" //go:cgo_import_dynamic libc_setreuid setreuid "libc.so" -//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" //go:cgo_import_dynamic libc_setsid setsid "libc.so" //go:cgo_import_dynamic libc_setuid setuid "libc.so" //go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" @@ -250,7 +249,6 @@ import ( //go:linkname procSetpriority libc_setpriority //go:linkname procSetregid libc_setregid //go:linkname procSetreuid libc_setreuid -//go:linkname procSetrlimit libc_setrlimit //go:linkname procSetsid libc_setsid //go:linkname procSetuid libc_setuid //go:linkname procshutdown libc_shutdown @@ -391,7 +389,6 @@ var ( procSetpriority, procSetregid, procSetreuid, - procSetrlimit, procSetsid, procSetuid, procshutdown, @@ -646,7 +643,7 @@ func __minor(version int, dev uint64) (val uint) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) { +func ioctlRet(fd int, req int, arg uintptr) (ret int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) ret = int(r0) if e1 != 0 { @@ -657,7 +654,7 @@ func ioctlRet(fd int, req uint, arg uintptr) (ret int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtrRet(fd int, req uint, arg unsafe.Pointer) (ret int, err error) { +func ioctlPtrRet(fd int, req int, arg unsafe.Pointer) (ret int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) ret = int(r0) if e1 != 0 { @@ -1650,16 +1647,6 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Setrlimit(which int, lim *Rlimit) (err error) { - _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) - if e1 != 0 { - err = e1 - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Setsid() (pid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) pid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go index 07bfe2e..c316817 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go @@ -257,7 +257,7 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctl(fd int, req uint, arg uintptr) (err error) { +func ioctl(fd int, req int, arg uintptr) (err error) { _, _, e1 := syscall_syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) @@ -267,7 +267,7 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { +func ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index e2a64f0..690cefc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -151,6 +151,16 @@ type Dirent struct { _ [3]byte } +type Attrlist struct { + Bitmapcount uint16 + Reserved uint16 + Commonattr uint32 + Volattr uint32 + Dirattr uint32 + Fileattr uint32 + Forkattr uint32 +} + const ( PathMax = 0x400 ) @@ -610,6 +620,7 @@ const ( AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 + AT_EACCESS = 0x10 ) type PollFd struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index 34aa775..5bffc10 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -151,6 +151,16 @@ type Dirent struct { _ [3]byte } +type Attrlist struct { + Bitmapcount uint16 + Reserved uint16 + Commonattr uint32 + Volattr uint32 + Dirattr uint32 + Fileattr uint32 + Forkattr uint32 +} + const ( PathMax = 0x400 ) @@ -610,6 +620,7 @@ const ( AT_REMOVEDIR = 0x80 AT_SYMLINK_FOLLOW = 0x40 AT_SYMLINK_NOFOLLOW = 0x20 + AT_EACCESS = 0x10 ) type PollFd struct { diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 857acf1..0dbb208 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -2229,10 +2229,10 @@ const ( JobObjectExtendedLimitInformation = 9 JobObjectGroupInformation = 11 JobObjectGroupInformationEx = 14 - JobObjectLimitViolationInformation2 = 35 + JobObjectLimitViolationInformation2 = 34 JobObjectNetRateControlInformation = 32 JobObjectNotificationLimitInformation = 12 - JobObjectNotificationLimitInformation2 = 34 + JobObjectNotificationLimitInformation2 = 33 JobObjectSecurityLimitInformation = 5 ) diff --git a/vendor/modules.txt b/vendor/modules.txt index b86dc4d..6f81264 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -2,6 +2,32 @@ ## explicit; go 1.16 github.com/BurntSushi/toml github.com/BurntSushi/toml/internal +# github.com/NVIDIA/go-nvml v0.12.0-0 +## explicit; go 1.15 +github.com/NVIDIA/go-nvml/pkg/dl +github.com/NVIDIA/go-nvml/pkg/nvml +# github.com/NVIDIA/nvidia-container-toolkit v1.13.5 +## explicit; go 1.20 +github.com/NVIDIA/nvidia-container-toolkit/internal/config/image +github.com/NVIDIA/nvidia-container-toolkit/internal/discover +github.com/NVIDIA/nvidia-container-toolkit/internal/discover/csv +github.com/NVIDIA/nvidia-container-toolkit/internal/dxcore +github.com/NVIDIA/nvidia-container-toolkit/internal/edits +github.com/NVIDIA/nvidia-container-toolkit/internal/info/drm +github.com/NVIDIA/nvidia-container-toolkit/internal/info/proc +github.com/NVIDIA/nvidia-container-toolkit/internal/ldcache +github.com/NVIDIA/nvidia-container-toolkit/internal/lookup +github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda +github.com/NVIDIA/nvidia-container-toolkit/internal/nvcaps +github.com/NVIDIA/nvidia-container-toolkit/internal/oci +github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi +github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec +github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/transform +# github.com/container-orchestrated-devices/container-device-interface v0.5.4-0.20230111111500-5b3b5d81179a +## explicit; go 1.17 +github.com/container-orchestrated-devices/container-device-interface/internal/multierror +github.com/container-orchestrated-devices/container-device-interface/pkg/cdi +github.com/container-orchestrated-devices/container-device-interface/specs-go # github.com/cpuguy83/go-md2man/v2 v2.0.2 ## explicit; go 1.11 github.com/cpuguy83/go-md2man/v2/md2man @@ -12,6 +38,9 @@ github.com/davecgh/go-spew/spew ## explicit; go 1.13 github.com/emicklei/go-restful/v3 github.com/emicklei/go-restful/v3/log +# github.com/fsnotify/fsnotify v1.5.4 +## explicit; go 1.16 +github.com/fsnotify/fsnotify # github.com/go-logr/logr v1.2.3 ## explicit; go 1.16 github.com/go-logr/logr @@ -83,6 +112,17 @@ github.com/opencontainers/go-digest ## explicit; go 1.17 github.com/opencontainers/image-spec/specs-go github.com/opencontainers/image-spec/specs-go/v1 +# github.com/opencontainers/runc v1.1.6 +## explicit; go 1.17 +github.com/opencontainers/runc/libcontainer/devices +# github.com/opencontainers/runtime-spec v1.1.0-rc.2 +## explicit +github.com/opencontainers/runtime-spec/specs-go +# github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 +## explicit; go 1.16 +github.com/opencontainers/runtime-tools/generate +github.com/opencontainers/runtime-tools/generate/seccomp +github.com/opencontainers/runtime-tools/validate/capabilities # github.com/pelletier/go-toml v1.9.5 ## explicit; go 1.12 github.com/pelletier/go-toml @@ -99,6 +139,9 @@ github.com/sirupsen/logrus ## explicit; go 1.13 github.com/stretchr/testify/assert github.com/stretchr/testify/require +# github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 +## explicit +github.com/syndtr/gocapability/capability # github.com/urfave/cli/v2 v2.25.1 ## explicit; go 1.18 github.com/urfave/cli/v2 @@ -106,6 +149,18 @@ github.com/urfave/cli/v2/altsrc # github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 ## explicit github.com/xrash/smetrics +# gitlab.com/nvidia/cloud-native/go-nvlib v0.0.0-20230209143738-95328d8c4438 +## explicit; go 1.16 +gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/device +gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvlib/info +gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml +gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci +gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/bytes +gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvpci/mmio +gitlab.com/nvidia/cloud-native/go-nvlib/pkg/pciids +# golang.org/x/mod v0.8.0 +## explicit; go 1.17 +golang.org/x/mod/semver # golang.org/x/net v0.8.0 ## explicit; go 1.17 golang.org/x/net/context @@ -122,7 +177,7 @@ golang.org/x/oauth2/internal ## explicit golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.6.0 +# golang.org/x/sys v0.7.0 ## explicit; go 1.17 golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9