aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/nouveau/include/nvkm/core/firmware.h7
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/core/firmware.c30
2 files changed, 31 insertions, 6 deletions
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/firmware.h b/drivers/gpu/drm/nouveau/include/nvkm/core/firmware.h
index d0fe98bd50fd..54da9c6bc8d5 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/core/firmware.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/core/firmware.h
@@ -3,7 +3,10 @@
3#define __NVKM_FIRMWARE_H__ 3#define __NVKM_FIRMWARE_H__
4#include <core/subdev.h> 4#include <core/subdev.h>
5 5
6int nvkm_firmware_get_version(const struct nvkm_subdev *, const char *fwname,
7 int min_version, int max_version,
8 const struct firmware **);
6int nvkm_firmware_get(const struct nvkm_subdev *, const char *fwname, 9int nvkm_firmware_get(const struct nvkm_subdev *, const char *fwname,
7 const struct firmware **fw); 10 const struct firmware **);
8void nvkm_firmware_put(const struct firmware *fw); 11void nvkm_firmware_put(const struct firmware *);
9#endif 12#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/firmware.c b/drivers/gpu/drm/nouveau/nvkm/core/firmware.c
index 87728133ff93..092acdec2c39 100644
--- a/drivers/gpu/drm/nouveau/nvkm/core/firmware.c
+++ b/drivers/gpu/drm/nouveau/nvkm/core/firmware.c
@@ -32,8 +32,9 @@
32 * Firmware files released by NVIDIA will always follow this format. 32 * Firmware files released by NVIDIA will always follow this format.
33 */ 33 */
34int 34int
35nvkm_firmware_get(const struct nvkm_subdev *subdev, const char *fwname, 35nvkm_firmware_get_version(const struct nvkm_subdev *subdev, const char *fwname,
36 const struct firmware **fw) 36 int min_version, int max_version,
37 const struct firmware **fw)
37{ 38{
38 struct nvkm_device *device = subdev->device; 39 struct nvkm_device *device = subdev->device;
39 char f[64]; 40 char f[64];
@@ -49,8 +50,29 @@ nvkm_firmware_get(const struct nvkm_subdev *subdev, const char *fwname,
49 cname[i] = tolower(cname[i]); 50 cname[i] = tolower(cname[i]);
50 } 51 }
51 52
52 snprintf(f, sizeof(f), "nvidia/%s/%s.bin", cname, fwname); 53 for (i = max_version; i >= min_version; i--) {
53 return request_firmware(fw, f, device->dev); 54 if (i != 0)
55 snprintf(f, sizeof(f), "nvidia/%s/%s-%d.bin", cname, fwname, i);
56 else
57 snprintf(f, sizeof(f), "nvidia/%s/%s.bin", cname, fwname);
58
59 if (!firmware_request_nowarn(fw, f, device->dev)) {
60 nvkm_debug(subdev, "firmware \"%s\" loaded\n", f);
61 return i;
62 }
63
64 nvkm_debug(subdev, "firmware \"%s\" unavailable\n", f);
65 }
66
67 nvkm_error(subdev, "failed to load firmware \"%s\"", fwname);
68 return -ENOENT;
69}
70
71int
72nvkm_firmware_get(const struct nvkm_subdev *subdev, const char *fwname,
73 const struct firmware **fw)
74{
75 return nvkm_firmware_get_version(subdev, fwname, 0, 0, fw);
54} 76}
55 77
56/** 78/**