Lines Matching refs:acr
33 nvkm_acr_hsfw_find(struct nvkm_acr *acr, const char *name) in nvkm_acr_hsfw_find() argument
37 list_for_each_entry(hsfw, &acr->hsfw, head) { in nvkm_acr_hsfw_find()
46 nvkm_acr_hsfw_boot(struct nvkm_acr *acr, const char *name) in nvkm_acr_hsfw_boot() argument
48 struct nvkm_subdev *subdev = &acr->subdev; in nvkm_acr_hsfw_boot()
51 hsfw = nvkm_acr_hsfw_find(acr, name); in nvkm_acr_hsfw_boot()
60 nvkm_acr_rtos(struct nvkm_acr *acr) in nvkm_acr_rtos() argument
64 if (acr) { in nvkm_acr_rtos()
65 list_for_each_entry(lsf, &acr->lsf, head) { in nvkm_acr_rtos()
75 nvkm_acr_unload(struct nvkm_acr *acr) in nvkm_acr_unload() argument
77 if (acr->done) { in nvkm_acr_unload()
78 if (acr->rtos) { in nvkm_acr_unload()
79 nvkm_subdev_unref(acr->rtos->falcon->owner); in nvkm_acr_unload()
80 acr->rtos = NULL; in nvkm_acr_unload()
83 nvkm_acr_hsfw_boot(acr, "unload"); in nvkm_acr_unload()
84 acr->done = false; in nvkm_acr_unload()
89 nvkm_acr_load(struct nvkm_acr *acr) in nvkm_acr_load() argument
91 struct nvkm_subdev *subdev = &acr->subdev; in nvkm_acr_load()
92 struct nvkm_acr_lsf *rtos = nvkm_acr_rtos(acr); in nvkm_acr_load()
96 if (list_empty(&acr->lsf)) { in nvkm_acr_load()
101 ret = acr->func->init(acr); in nvkm_acr_load()
105 acr->func->wpr_check(acr, &start, &limit); in nvkm_acr_load()
107 if (start != acr->wpr_start || limit != acr->wpr_end) { in nvkm_acr_load()
110 acr->wpr_start, acr->wpr_end, start, limit); in nvkm_acr_load()
114 acr->done = true; in nvkm_acr_load()
121 acr->rtos = rtos; in nvkm_acr_load()
128 nvkm_acr_reload(struct nvkm_acr *acr) in nvkm_acr_reload() argument
130 nvkm_acr_unload(acr); in nvkm_acr_reload()
131 return nvkm_acr_load(acr); in nvkm_acr_reload()
137 struct nvkm_acr *acr = device->acr; in nvkm_acr_bootstrap_falcons() local
138 struct nvkm_acr_lsf *rtos = nvkm_acr_rtos(acr); in nvkm_acr_bootstrap_falcons()
146 if ((mask & acr->func->bootstrap_falcons) == mask) { in nvkm_acr_bootstrap_falcons()
147 int ret = nvkm_acr_reload(acr); in nvkm_acr_bootstrap_falcons()
151 return acr->done ? 0 : -EINVAL; in nvkm_acr_bootstrap_falcons()
174 struct nvkm_acr *acr = device->acr; in nvkm_acr_managed_falcon() local
176 if (acr) { in nvkm_acr_managed_falcon()
177 if (acr->managed_falcons & BIT_ULL(id)) in nvkm_acr_managed_falcon()
197 struct nvkm_acr *acr = nvkm_acr(subdev); in nvkm_acr_init() local
199 if (!nvkm_acr_rtos(acr)) in nvkm_acr_init()
202 return nvkm_acr_load(acr); in nvkm_acr_init()
206 nvkm_acr_cleanup(struct nvkm_acr *acr) in nvkm_acr_cleanup() argument
208 nvkm_acr_lsfw_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
227 if (list_empty(&acr->hsfw) || !acr->func || !acr->func->wpr_layout) { in nvkm_acr_oneinit()
229 nvkm_acr_cleanup(acr); in nvkm_acr_oneinit()
236 list_for_each_entry_safe(lsfw, lsft, &acr->lsfw, head) { in nvkm_acr_oneinit()
238 if (acr->wpr_fw) { in nvkm_acr_oneinit()
244 wpr_size = acr->wpr_fw->size; in nvkm_acr_oneinit()
259 list_add_tail(&lsf->head, &acr->lsf); in nvkm_acr_oneinit()
260 acr->managed_falcons |= BIT_ULL(lsf->id); in nvkm_acr_oneinit()
264 rtos = nvkm_acr_rtos(acr); in nvkm_acr_oneinit()
267 list_move(&rtos->head, &acr->lsf); in nvkm_acr_oneinit()
269 falcons = acr->func->bootstrap_falcons; in nvkm_acr_oneinit()
275 list_for_each_entry_safe(lsfw, lsft, &acr->lsfw, head) { in nvkm_acr_oneinit()
283 if (!acr->wpr_fw || acr->wpr_comp) in nvkm_acr_oneinit()
284 wpr_size = acr->func->wpr_layout(acr); in nvkm_acr_oneinit()
292 ret = acr->func->wpr_alloc(acr, wpr_size); in nvkm_acr_oneinit()
297 acr->wpr_start, acr->wpr_end, acr->shadow_start); in nvkm_acr_oneinit()
300 nvkm_kmap(acr->wpr); in nvkm_acr_oneinit()
301 if (acr->wpr_fw && !acr->wpr_comp) in nvkm_acr_oneinit()
302 nvkm_wobj(acr->wpr, 0, acr->wpr_fw->data, acr->wpr_fw->size); in nvkm_acr_oneinit()
304 if (!acr->wpr_fw || acr->wpr_comp) in nvkm_acr_oneinit()
305 acr->func->wpr_build(acr, rtos); in nvkm_acr_oneinit()
306 acr->func->wpr_patch(acr, (s64)acr->wpr_start - acr->wpr_prev); in nvkm_acr_oneinit()
308 if (acr->wpr_fw && acr->wpr_comp) { in nvkm_acr_oneinit()
309 nvkm_kmap(acr->wpr); in nvkm_acr_oneinit()
310 for (i = 0; i < acr->wpr_fw->size; i += 4) { in nvkm_acr_oneinit()
311 u32 us = nvkm_ro32(acr->wpr, i); in nvkm_acr_oneinit()
312 u32 fw = ((u32 *)acr->wpr_fw->data)[i/4]; in nvkm_acr_oneinit()
320 nvkm_done(acr->wpr); in nvkm_acr_oneinit()
324 &acr->inst); in nvkm_acr_oneinit()
328 ret = nvkm_vmm_new(device, 0, 0, NULL, 0, NULL, "acr", &acr->vmm); in nvkm_acr_oneinit()
332 acr->vmm->debug = acr->subdev.debug; in nvkm_acr_oneinit()
334 ret = nvkm_vmm_join(acr->vmm, acr->inst); in nvkm_acr_oneinit()
339 list_for_each_entry(hsfw, &acr->hsfw, head) { in nvkm_acr_oneinit()
349 ret = nvkm_falcon_fw_oneinit(&hsfw->fw, falcon, acr->vmm, acr->inst); in nvkm_acr_oneinit()
355 nvkm_acr_cleanup(acr); in nvkm_acr_oneinit()
362 struct nvkm_acr *acr = nvkm_acr(subdev); in nvkm_acr_dtor() local
366 list_for_each_entry_safe(hsfw, hsft, &acr->hsfw, head) { in nvkm_acr_dtor()
372 nvkm_vmm_part(acr->vmm, acr->inst); in nvkm_acr_dtor()
373 nvkm_vmm_unref(&acr->vmm); in nvkm_acr_dtor()
374 nvkm_memory_unref(&acr->inst); in nvkm_acr_dtor()
376 nvkm_memory_unref(&acr->wpr); in nvkm_acr_dtor()
378 list_for_each_entry_safe(lsf, lst, &acr->lsf, head) { in nvkm_acr_dtor()
383 nvkm_acr_cleanup(acr); in nvkm_acr_dtor()
384 return acr; in nvkm_acr_dtor()
396 nvkm_acr_ctor_wpr(struct nvkm_acr *acr, int ver) in nvkm_acr_ctor_wpr() argument
398 struct nvkm_subdev *subdev = &acr->subdev; in nvkm_acr_ctor_wpr()
402 ret = nvkm_firmware_get(subdev, "acr/wpr", ver, &acr->wpr_fw); in nvkm_acr_ctor_wpr()
409 ret = acr->func->wpr_parse(acr); in nvkm_acr_ctor_wpr()
413 acr->wpr_comp = nvkm_boolopt(device->cfgopt, "NvAcrWprCompare", false); in nvkm_acr_ctor_wpr()
414 acr->wpr_prev = nvkm_longopt(device->cfgopt, "NvAcrWprPrevAddr", 0); in nvkm_acr_ctor_wpr()
422 struct nvkm_acr *acr; in nvkm_acr_new_() local
425 if (!(acr = *pacr = kzalloc(sizeof(*acr), GFP_KERNEL))) in nvkm_acr_new_()
427 nvkm_subdev_ctor(&nvkm_acr, device, type, inst, &acr->subdev); in nvkm_acr_new_()
428 INIT_LIST_HEAD(&acr->hsfw); in nvkm_acr_new_()
429 INIT_LIST_HEAD(&acr->lsfw); in nvkm_acr_new_()
430 INIT_LIST_HEAD(&acr->lsf); in nvkm_acr_new_()
432 fwif = nvkm_firmware_load(&acr->subdev, fwif, "Acr", acr); in nvkm_acr_new_()
436 acr->func = fwif->func; in nvkm_acr_new_()
440 int ret = nvkm_acr_ctor_wpr(acr, wprfw); in nvkm_acr_new_()