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: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Родитель
90e9cf749a
Коммит
587debc9a7
|
@ -141,12 +141,19 @@ 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) {
|
||||
int ret = nvkm_acr_reload(acr);
|
||||
if (ret)
|
||||
return ret;
|
||||
/* 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 acr->done ? 0 : -EINVAL;
|
||||
}
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
if (acrflcn->func->bootstrap_multiple_falcons) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче