Lines Matching refs:acr
29 nvkm_acr_hsf_find(struct nvkm_acr *acr, const char *name) in nvkm_acr_hsf_find() argument
32 list_for_each_entry(hsf, &acr->hsf, head) { in nvkm_acr_hsf_find()
40 nvkm_acr_hsf_boot(struct nvkm_acr *acr, const char *name) in nvkm_acr_hsf_boot() argument
42 struct nvkm_subdev *subdev = &acr->subdev; in nvkm_acr_hsf_boot()
46 hsf = nvkm_acr_hsf_find(acr, name); in nvkm_acr_hsf_boot()
55 ret = hsf->func->boot(acr, hsf); in nvkm_acr_hsf_boot()
67 nvkm_acr_unload(struct nvkm_acr *acr) in nvkm_acr_unload() argument
69 if (acr->done) { in nvkm_acr_unload()
70 nvkm_acr_hsf_boot(acr, "unload"); in nvkm_acr_unload()
71 acr->done = false; in nvkm_acr_unload()
76 nvkm_acr_load(struct nvkm_acr *acr) in nvkm_acr_load() argument
78 struct nvkm_subdev *subdev = &acr->subdev; in nvkm_acr_load()
83 if (list_empty(&acr->lsf)) { in nvkm_acr_load()
88 ret = acr->func->init(acr); in nvkm_acr_load()
92 acr->func->wpr_check(acr, &start, &limit); in nvkm_acr_load()
94 if (start != acr->wpr_start || limit != acr->wpr_end) { in nvkm_acr_load()
97 acr->wpr_start, acr->wpr_end, start, limit); in nvkm_acr_load()
101 acr->done = true; in nvkm_acr_load()
103 list_for_each_entry(lsf, &acr->lsf, head) { in nvkm_acr_load()
115 nvkm_acr_reload(struct nvkm_acr *acr) in nvkm_acr_reload() argument
117 nvkm_acr_unload(acr); in nvkm_acr_reload()
118 return nvkm_acr_load(acr); in nvkm_acr_reload()
124 struct nvkm_acr *acr = device->acr; in nvkm_acr_falcon() local
127 if (acr) { in nvkm_acr_falcon()
128 list_for_each_entry(lsf, &acr->lsf, head) { in nvkm_acr_falcon()
141 struct nvkm_acr *acr = device->acr; in nvkm_acr_bootstrap_falcons() local
149 if ((mask & acr->func->bootstrap_falcons) == mask) { in nvkm_acr_bootstrap_falcons()
150 int ret = nvkm_acr_reload(acr); in nvkm_acr_bootstrap_falcons()
154 return acr->done ? 0 : -EINVAL; in nvkm_acr_bootstrap_falcons()
179 struct nvkm_acr *acr = device->acr; in nvkm_acr_managed_falcon() local
181 if (acr) { in nvkm_acr_managed_falcon()
182 if (acr->managed_falcons & BIT_ULL(id)) in nvkm_acr_managed_falcon()
206 nvkm_acr_cleanup(struct nvkm_acr *acr) in nvkm_acr_cleanup() argument
208 nvkm_acr_lsfw_del_all(acr); in nvkm_acr_cleanup()
209 nvkm_acr_hsfw_del_all(acr); in nvkm_acr_cleanup()
210 nvkm_firmware_put(acr->wpr_fw); in nvkm_acr_cleanup()
211 acr->wpr_fw = NULL; in nvkm_acr_cleanup()
218 struct nvkm_acr *acr = nvkm_acr(subdev); in nvkm_acr_oneinit() local
226 if (list_empty(&acr->hsfw)) { in nvkm_acr_oneinit()
228 nvkm_acr_cleanup(acr); in nvkm_acr_oneinit()
235 list_for_each_entry_safe(lsfw, lsft, &acr->lsfw, head) { in nvkm_acr_oneinit()
237 if (acr->wpr_fw) { in nvkm_acr_oneinit()
243 wpr_size = acr->wpr_fw->size; in nvkm_acr_oneinit()
258 list_add_tail(&lsf->head, &acr->lsf); in nvkm_acr_oneinit()
259 acr->managed_falcons |= BIT_ULL(lsf->id); in nvkm_acr_oneinit()
266 list_move(&lsf->head, &acr->lsf); in nvkm_acr_oneinit()
268 falcons = acr->func->bootstrap_falcons; in nvkm_acr_oneinit()
274 list_for_each_entry_safe(lsfw, lsft, &acr->lsfw, head) { in nvkm_acr_oneinit()
282 if (!acr->wpr_fw || acr->wpr_comp) in nvkm_acr_oneinit()
283 wpr_size = acr->func->wpr_layout(acr); in nvkm_acr_oneinit()
291 ret = acr->func->wpr_alloc(acr, wpr_size); in nvkm_acr_oneinit()
296 acr->wpr_start, acr->wpr_end, acr->shadow_start); in nvkm_acr_oneinit()
299 nvkm_kmap(acr->wpr); in nvkm_acr_oneinit()
300 if (acr->wpr_fw && !acr->wpr_comp) in nvkm_acr_oneinit()
301 nvkm_wobj(acr->wpr, 0, acr->wpr_fw->data, acr->wpr_fw->size); in nvkm_acr_oneinit()
303 if (!acr->wpr_fw || acr->wpr_comp) in nvkm_acr_oneinit()
304 acr->func->wpr_build(acr, nvkm_acr_falcon(device)); in nvkm_acr_oneinit()
305 acr->func->wpr_patch(acr, (s64)acr->wpr_start - acr->wpr_prev); in nvkm_acr_oneinit()
307 if (acr->wpr_fw && acr->wpr_comp) { in nvkm_acr_oneinit()
308 nvkm_kmap(acr->wpr); in nvkm_acr_oneinit()
309 for (i = 0; i < acr->wpr_fw->size; i += 4) { in nvkm_acr_oneinit()
310 u32 us = nvkm_ro32(acr->wpr, i); in nvkm_acr_oneinit()
311 u32 fw = ((u32 *)acr->wpr_fw->data)[i/4]; in nvkm_acr_oneinit()
319 nvkm_done(acr->wpr); in nvkm_acr_oneinit()
323 &acr->inst); in nvkm_acr_oneinit()
327 ret = nvkm_vmm_new(device, 0, 0, NULL, 0, NULL, "acr", &acr->vmm); in nvkm_acr_oneinit()
331 acr->vmm->debug = acr->subdev.debug; in nvkm_acr_oneinit()
333 ret = nvkm_vmm_join(acr->vmm, acr->inst); in nvkm_acr_oneinit()
338 list_for_each_entry(hsfw, &acr->hsfw, head) { in nvkm_acr_oneinit()
340 ret = hsfw->func->load(acr, hsfw); in nvkm_acr_oneinit()
346 nvkm_acr_cleanup(acr); in nvkm_acr_oneinit()
353 struct nvkm_acr *acr = nvkm_acr(subdev); in nvkm_acr_dtor() local
357 list_for_each_entry_safe(hsf, hst, &acr->hsf, head) { in nvkm_acr_dtor()
358 nvkm_vmm_put(acr->vmm, &hsf->vma); in nvkm_acr_dtor()
365 nvkm_vmm_part(acr->vmm, acr->inst); in nvkm_acr_dtor()
366 nvkm_vmm_unref(&acr->vmm); in nvkm_acr_dtor()
367 nvkm_memory_unref(&acr->inst); in nvkm_acr_dtor()
369 nvkm_memory_unref(&acr->wpr); in nvkm_acr_dtor()
371 list_for_each_entry_safe(lsf, lst, &acr->lsf, head) { in nvkm_acr_dtor()
376 nvkm_acr_cleanup(acr); in nvkm_acr_dtor()
377 return acr; in nvkm_acr_dtor()
389 nvkm_acr_ctor_wpr(struct nvkm_acr *acr, int ver) in nvkm_acr_ctor_wpr() argument
391 struct nvkm_subdev *subdev = &acr->subdev; in nvkm_acr_ctor_wpr()
395 ret = nvkm_firmware_get(subdev, "acr/wpr", ver, &acr->wpr_fw); in nvkm_acr_ctor_wpr()
402 ret = acr->func->wpr_parse(acr); in nvkm_acr_ctor_wpr()
406 acr->wpr_comp = nvkm_boolopt(device->cfgopt, "NvAcrWprCompare", false); in nvkm_acr_ctor_wpr()
407 acr->wpr_prev = nvkm_longopt(device->cfgopt, "NvAcrWprPrevAddr", 0); in nvkm_acr_ctor_wpr()
415 struct nvkm_acr *acr; in nvkm_acr_new_() local
418 if (!(acr = *pacr = kzalloc(sizeof(*acr), GFP_KERNEL))) in nvkm_acr_new_()
420 nvkm_subdev_ctor(&nvkm_acr, device, type, inst, &acr->subdev); in nvkm_acr_new_()
421 INIT_LIST_HEAD(&acr->hsfw); in nvkm_acr_new_()
422 INIT_LIST_HEAD(&acr->lsfw); in nvkm_acr_new_()
423 INIT_LIST_HEAD(&acr->hsf); in nvkm_acr_new_()
424 INIT_LIST_HEAD(&acr->lsf); in nvkm_acr_new_()
426 fwif = nvkm_firmware_load(&acr->subdev, fwif, "Acr", acr); in nvkm_acr_new_()
430 acr->func = fwif->func; in nvkm_acr_new_()
434 int ret = nvkm_acr_ctor_wpr(acr, wprfw); in nvkm_acr_new_()