diff options
| -rw-r--r-- | drivers/gpu/drm/nouveau/include/nvkm/core/firmware.h | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/core/firmware.c | 30 |
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 | ||
| 6 | int nvkm_firmware_get_version(const struct nvkm_subdev *, const char *fwname, | ||
| 7 | int min_version, int max_version, | ||
| 8 | const struct firmware **); | ||
| 6 | int nvkm_firmware_get(const struct nvkm_subdev *, const char *fwname, | 9 | int nvkm_firmware_get(const struct nvkm_subdev *, const char *fwname, |
| 7 | const struct firmware **fw); | 10 | const struct firmware **); |
| 8 | void nvkm_firmware_put(const struct firmware *fw); | 11 | void 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 | */ |
| 34 | int | 34 | int |
| 35 | nvkm_firmware_get(const struct nvkm_subdev *subdev, const char *fwname, | 35 | nvkm_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 | |||
| 71 | int | ||
| 72 | nvkm_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 | /** |
