Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9469aae authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Ben Skeggs
Browse files

drm/nouveau/gr/gf100: add support for securely-managed falcons



Start securely-managed falcons using secboot functions since the process
for them is different from just writing CPUCTL.

Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 7d12388a
Loading
Loading
Loading
Loading
+24 −4
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <core/client.h>
#include <core/option.h>
#include <core/firmware.h>
#include <subdev/secboot.h>
#include <subdev/fb.h>
#include <subdev/mc.h>
#include <subdev/pmu.h>
@@ -1428,20 +1429,39 @@ gf100_gr_init_ctxctl(struct gf100_gr *gr)
	const struct gf100_grctx_func *grctx = gr->func->grctx;
	struct nvkm_subdev *subdev = &gr->base.engine.subdev;
	struct nvkm_device *device = subdev->device;
	struct nvkm_secboot *sb = device->secboot;
	int i;

	if (gr->firmware) {
		/* load fuc microcode */
		nvkm_mc_unk260(device->mc, 0);
		gf100_gr_init_fw(gr, 0x409000, &gr->fuc409c, &gr->fuc409d);
		gf100_gr_init_fw(gr, 0x41a000, &gr->fuc41ac, &gr->fuc41ad);

		/* securely-managed falcons must be reset using secure boot */
		if (nvkm_secboot_is_managed(sb, NVKM_SECBOOT_FALCON_FECS))
			nvkm_secboot_reset(sb, NVKM_SECBOOT_FALCON_FECS);
		else
			gf100_gr_init_fw(gr, 0x409000, &gr->fuc409c,
					 &gr->fuc409d);
		if (nvkm_secboot_is_managed(sb, NVKM_SECBOOT_FALCON_GPCCS))
			nvkm_secboot_reset(sb, NVKM_SECBOOT_FALCON_GPCCS);
		else
			gf100_gr_init_fw(gr, 0x41a000, &gr->fuc41ac,
					 &gr->fuc41ad);

		nvkm_mc_unk260(device->mc, 1);

		/* start both of them running */
		nvkm_wr32(device, 0x409840, 0xffffffff);
		nvkm_wr32(device, 0x41a10c, 0x00000000);
		nvkm_wr32(device, 0x40910c, 0x00000000);

		if (nvkm_secboot_is_managed(sb, NVKM_SECBOOT_FALCON_GPCCS))
			nvkm_secboot_start(sb, NVKM_SECBOOT_FALCON_GPCCS);
		else
			nvkm_wr32(device, 0x41a100, 0x00000002);
		if (nvkm_secboot_is_managed(sb, NVKM_SECBOOT_FALCON_FECS))
			nvkm_secboot_start(sb, NVKM_SECBOOT_FALCON_FECS);
		else
			nvkm_wr32(device, 0x409100, 0x00000002);
		if (nvkm_msec(device, 2000,
			if (nvkm_rd32(device, 0x409800) & 0x00000001)