aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nvkm/core/firmware.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2022-06-01 20:47:51 +1000
committerBen Skeggs <bskeggs@redhat.com>2022-11-09 10:44:58 +1000
commit0e44c21708761977dcbea9b846b51a6fb684907a (patch)
tree47e980cd3ae55c9971c1f78ff5b419de183f68bc /drivers/gpu/drm/nouveau/nvkm/core/firmware.c
parentdrm/nouveau/flcn: rework falcon reset (diff)
downloadlinux-0e44c21708761977dcbea9b846b51a6fb684907a.tar.gz
linux-0e44c21708761977dcbea9b846b51a6fb684907a.zip
drm/nouveau/flcn: new code to load+boot simple HS FWs (VPR scrubber)
Adds the start of common interfaces to load and boot the HS binaries provided by NVIDIA that enable the usage of GR. ACR already handles most of this, but it's very much tied into ACR's init process, and there's other code that could benefit from reusing a lot of this stuff too (ie. VBIOS DEVINIT/PreOS, VPR scrubber). The VPR scrubber code is fairly independent, and a good first target. - adds better debug output to fw loading process, to ease bring-up/debug v2: - whitespace, 0->false Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Lyude Paul <lyude@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/core/firmware.c')
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/core/firmware.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/firmware.c b/drivers/gpu/drm/nouveau/nvkm/core/firmware.c
index ca1f8463cff5..aa1bf6b5a8cd 100644
--- a/drivers/gpu/drm/nouveau/nvkm/core/firmware.c
+++ b/drivers/gpu/drm/nouveau/nvkm/core/firmware.c
@@ -107,3 +107,45 @@ nvkm_firmware_put(const struct firmware *fw)
{
release_firmware(fw);
}
+
+void
+nvkm_firmware_dtor(struct nvkm_firmware *fw)
+{
+ if (!fw->img)
+ return;
+
+ switch (fw->func->type) {
+ case NVKM_FIRMWARE_IMG_RAM:
+ kfree(fw->img);
+ break;
+ default:
+ WARN_ON(1);
+ break;
+ }
+
+ fw->img = NULL;
+}
+
+int
+nvkm_firmware_ctor(const struct nvkm_firmware_func *func, const char *name,
+ struct nvkm_device *device, const void *src, int len, struct nvkm_firmware *fw)
+{
+ fw->func = func;
+ fw->name = name;
+ fw->device = device;
+
+ switch (fw->func->type) {
+ case NVKM_FIRMWARE_IMG_RAM:
+ fw->len = len;
+ fw->img = kmemdup(src, fw->len, GFP_KERNEL);
+ break;
+ default:
+ WARN_ON(1);
+ return -EINVAL;
+ }
+
+ if (!fw->img)
+ return -ENOMEM;
+
+ return 0;
+}