Commit c3463aed authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fb/gp102-: allow module to load even when scrubber binary is missing



Without relaxing this requirement, TU10x boards will fail to load without
an updated linux-firmware, and TU11x will completely fail to load because
FW isn't available yet.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 1c338ed5
Loading
Loading
Loading
Loading
+29 −10
Original line number Diff line number Diff line
@@ -125,6 +125,34 @@ nvkm_fb_oneinit(struct nvkm_subdev *subdev)
	return nvkm_mm_init(&fb->tags, 0, 0, tags, 1);
}

static int
nvkm_fb_init_scrub_vpr(struct nvkm_fb *fb)
{
	struct nvkm_subdev *subdev = &fb->subdev;
	int ret;

	nvkm_debug(subdev, "VPR locked, running scrubber binary\n");

	if (!fb->vpr_scrubber.size) {
		nvkm_warn(subdev, "VPR locked, but no scrubber binary!\n");
		return 0;
	}

	ret = fb->func->vpr.scrub(fb);
	if (ret) {
		nvkm_error(subdev, "VPR scrubber binary failed\n");
		return ret;
	}

	if (fb->func->vpr.scrub_required(fb)) {
		nvkm_error(subdev, "VPR still locked after scrub!\n");
		return -EIO;
	}

	nvkm_debug(subdev, "VPR scrubber binary successful\n");
	return 0;
}

static int
nvkm_fb_init(struct nvkm_subdev *subdev)
{
@@ -157,18 +185,9 @@ nvkm_fb_init(struct nvkm_subdev *subdev)

	if (fb->func->vpr.scrub_required &&
	    fb->func->vpr.scrub_required(fb)) {
		nvkm_debug(subdev, "VPR locked, running scrubber binary\n");

		ret = fb->func->vpr.scrub(fb);
		ret = nvkm_fb_init_scrub_vpr(fb);
		if (ret)
			return ret;

		if (fb->func->vpr.scrub_required(fb)) {
			nvkm_error(subdev, "VPR still locked after scrub!\n");
			return -EIO;
		}

		nvkm_debug(subdev, "VPR scrubber binary successful\n");
	}

	return 0;
+3 −2
Original line number Diff line number Diff line
@@ -120,8 +120,9 @@ gp102_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
	if (ret)
		return ret;

	return nvkm_firmware_load_blob(&(*pfb)->subdev, "nvdec/scrubber", "", 0,
	nvkm_firmware_load_blob(&(*pfb)->subdev, "nvdec/scrubber", "", 0,
				&(*pfb)->vpr_scrubber);
	return 0;
}

int