Skip to content

Commit 0a37f87

Browse files
committed
Add firmware search paths when generating CDI specifications
Path to locate the GSP firmware is explicitly set to /lib/firmware/nvidia. Users may chose to install the GSP firmware in alternate locations where the kernel would look for firmware on the root filesystem. Add locate functionality which looks for the GSP firmware files in the same location as the kernel would (https://docs.kernel.org/driver-api/firmware/fw_search_path.html). The paths searched in order are: - path described in /sys/module/firmware_class/parameters/path - /lib/firmware/updates/UTS_RELEASE/ - /lib/firmware/updates/ - /lib/firmware/UTS_RELEASE/ - /lib/firmware/ Signed-off-by: Evan Lezar <elezar@nvidia.com>
1 parent 4f89b60 commit 0a37f87

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

pkg/nvcdi/driver-nvml.go

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package nvcdi
1818

1919
import (
2020
"fmt"
21+
"os"
2122
"path/filepath"
2223
"strings"
2324

@@ -26,6 +27,7 @@ import (
2627
"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup"
2728
"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda"
2829
"gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml"
30+
"golang.org/x/sys/unix"
2931
)
3032

3133
// NewDriverDiscoverer creates a discoverer for the libraries and binaries associated with a driver installation.
@@ -55,7 +57,10 @@ func newDriverVersionDiscoverer(logger logger.Interface, driverRoot string, nvid
5557
return nil, fmt.Errorf("failed to create discoverer for IPC sockets: %v", err)
5658
}
5759

58-
firmwares := NewDriverFirmwareDiscoverer(logger, driverRoot, version)
60+
firmwares, err := NewDriverFirmwareDiscoverer(logger, driverRoot, version)
61+
if err != nil {
62+
return nil, fmt.Errorf("failed to create discoverer for GSP firmware: %v", err)
63+
}
5964

6065
binaries := NewDriverBinariesDiscoverer(logger, driverRoot)
6166

@@ -96,18 +101,54 @@ func NewDriverLibraryDiscoverer(logger logger.Interface, driverRoot string, nvid
96101
return d, nil
97102
}
98103

104+
func getUTSRelease(logger logger.Interface) (string, error) {
105+
utsname := &unix.Utsname{}
106+
if err := unix.Uname(utsname); err != nil {
107+
return "", err
108+
}
109+
return unix.ByteSliceToString(utsname.Release[:]), nil
110+
}
111+
112+
func getFirmwareSearchPaths(logger logger.Interface) ([]string, error) {
113+
utsRelease, err := getUTSRelease(logger)
114+
if err != nil {
115+
return nil, fmt.Errorf("failed to get UTS_RELEASE: %v", err)
116+
}
117+
118+
firmwarePaths := []string{
119+
filepath.Join("/lib/firmware/updates/", utsRelease),
120+
filepath.Join("/lib/firmware/updates/"),
121+
filepath.Join("/lib/firmware/", utsRelease),
122+
filepath.Join("/lib/firmware/"),
123+
}
124+
125+
customFirmwareClassPath, err := os.ReadFile("/sys/module/firmware_class/parameters/path")
126+
if err != nil {
127+
return nil, fmt.Errorf("failed to get custom firmware class path for driver version: %v", err)
128+
}
129+
if !(len(customFirmwareClassPath) == 1 && customFirmwareClassPath[0] == byte(10)) {
130+
firmwarePaths = append(firmwarePaths, string(customFirmwareClassPath))
131+
}
132+
return firmwarePaths, nil
133+
}
134+
99135
// NewDriverFirmwareDiscoverer creates a discoverer for GSP firmware associated with the specified driver version.
100-
func NewDriverFirmwareDiscoverer(logger logger.Interface, driverRoot string, version string) discover.Discover {
101-
gspFirmwarePath := filepath.Join("/lib/firmware/nvidia", version, "gsp*.bin")
136+
func NewDriverFirmwareDiscoverer(logger logger.Interface, driverRoot string, version string) (discover.Discover, error) {
137+
gspFirmwareSearchPaths, err := getFirmwareSearchPaths(logger)
138+
if err != nil {
139+
return nil, fmt.Errorf("failed to get libraries for driver version: %v", err)
140+
}
141+
gspFirmwarePaths := filepath.Join("nvidia", version, "gsp*.bin")
102142
return discover.NewMounts(
103143
logger,
104144
lookup.NewFileLocator(
105145
lookup.WithLogger(logger),
106146
lookup.WithRoot(driverRoot),
147+
lookup.WithSearchPaths(gspFirmwareSearchPaths...),
107148
),
108149
driverRoot,
109-
[]string{gspFirmwarePath},
110-
)
150+
[]string{gspFirmwarePaths},
151+
), nil
111152
}
112153

113154
// NewDriverBinariesDiscoverer creates a discoverer for GSP firmware associated with the GPU driver.

0 commit comments

Comments
 (0)