Commit 587debc9 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/acr: store a mask of LS falcons the HSFW can bootstrap



This will prevent reloading of HS FW where it's pointless, and bypass
hitting some timeouts.

Not a situation one should generally hit, but can occur with a messed
up firmware installation.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 90e9cf74
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -141,13 +141,20 @@ nvkm_acr_bootstrap_falcons(struct nvkm_device *device, unsigned long mask)
	struct nvkm_acr *acr = device->acr;
	unsigned long id;

	/* If there's no LS FW managing bootstrapping of other LS falcons,
	 * we depend on the HS firmware being able to do it instead.
	 */
	if (!acrflcn) {
		/* Which isn't possible everywhere... */
		if ((mask & acr->func->bootstrap_falcons) == mask) {
			int ret = nvkm_acr_reload(acr);
			if (ret)
				return ret;

			return acr->done ? 0 : -EINVAL;
		}
		return -ENOSYS;
	}

	if (acrflcn->func->bootstrap_multiple_falcons) {
		return acrflcn->func->
+2 −0
Original line number Diff line number Diff line
@@ -446,6 +446,8 @@ gm200_acr_0 = {
	.wpr_patch = gm200_acr_wpr_patch,
	.wpr_check = gm200_acr_wpr_check,
	.init = gm200_acr_init,
	.bootstrap_falcons = BIT_ULL(NVKM_ACR_LSF_FECS) |
			     BIT_ULL(NVKM_ACR_LSF_GPCCS),
};

static int
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ struct nvkm_acr_func {
	void (*wpr_check)(struct nvkm_acr *, u64 *start, u64 *limit);
	int (*init)(struct nvkm_acr *);
	void (*fini)(struct nvkm_acr *);
	u64 bootstrap_falcons;
};

extern const struct nvkm_acr_func gm200_acr;