Lines Matching +full:1 +full:- +full:v0
41 list_for_each_entry(dom, &pm->domains, head) in nvkm_pm_count_perfdom()
53 for (i = 0; i < dom->signal_nr; i++) { in nvkm_perfdom_count_perfsig()
54 if (dom->signal[i].name) in nvkm_perfdom_count_perfsig()
67 list_for_each_entry(dom, &pm->domains, head) { in nvkm_perfdom_find()
86 if (!dom->signal[si].name) in nvkm_perfsig_find()
88 return &dom->signal[si]; in nvkm_perfsig_find()
96 for (i = 0; i < ARRAY_SIZE(sig->source); i++) { in nvkm_perfsig_count_perfsrc()
97 if (sig->source[i]) in nvkm_perfsig_count_perfsrc()
108 int tmp = 1; /* Sources ID start from 1 */ in nvkm_perfsrc_find()
111 for (i = 0; i < ARRAY_SIZE(sig->source) && sig->source[i]; i++) { in nvkm_perfsrc_find()
112 if (sig->source[i] == si) { in nvkm_perfsrc_find()
119 list_for_each_entry(src, &pm->sources, head) { in nvkm_perfsrc_find()
131 struct nvkm_subdev *subdev = &pm->engine.subdev; in nvkm_perfsrc_enable()
132 struct nvkm_device *device = subdev->device; in nvkm_perfsrc_enable()
140 for (j = 0; j < 8 && ctr->source[i][j]; j++) { in nvkm_perfsrc_enable()
141 sig = nvkm_perfsig_find(pm, ctr->domain, in nvkm_perfsrc_enable()
142 ctr->signal[i], &dom); in nvkm_perfsrc_enable()
144 return -EINVAL; in nvkm_perfsrc_enable()
146 src = nvkm_perfsrc_find(pm, sig, ctr->source[i][j]); in nvkm_perfsrc_enable()
148 return -EINVAL; in nvkm_perfsrc_enable()
152 if (src->enable) in nvkm_perfsrc_enable()
154 mask |= (src->mask << src->shift); in nvkm_perfsrc_enable()
155 value |= ((ctr->source[i][j] >> 32) << src->shift); in nvkm_perfsrc_enable()
158 nvkm_mask(device, src->addr, mask, value); in nvkm_perfsrc_enable()
161 src->addr, mask, value); in nvkm_perfsrc_enable()
170 struct nvkm_subdev *subdev = &pm->engine.subdev; in nvkm_perfsrc_disable()
171 struct nvkm_device *device = subdev->device; in nvkm_perfsrc_disable()
179 for (j = 0; j < 8 && ctr->source[i][j]; j++) { in nvkm_perfsrc_disable()
180 sig = nvkm_perfsig_find(pm, ctr->domain, in nvkm_perfsrc_disable()
181 ctr->signal[i], &dom); in nvkm_perfsrc_disable()
183 return -EINVAL; in nvkm_perfsrc_disable()
185 src = nvkm_perfsrc_find(pm, sig, ctr->source[i][j]); in nvkm_perfsrc_disable()
187 return -EINVAL; in nvkm_perfsrc_disable()
191 if (src->enable) in nvkm_perfsrc_disable()
193 mask |= (src->mask << src->shift); in nvkm_perfsrc_disable()
196 nvkm_mask(device, src->addr, mask, 0); in nvkm_perfsrc_disable()
198 src->addr, mask); in nvkm_perfsrc_disable()
213 struct nvkm_object *object = &dom->object; in nvkm_perfdom_init()
214 struct nvkm_pm *pm = dom->perfmon->pm; in nvkm_perfdom_init()
215 int ret = -ENOSYS, i; in nvkm_perfdom_init()
218 if (!(ret = nvif_unvers(ret, &data, &size, args->none))) { in nvkm_perfdom_init()
224 if (dom->ctr[i]) { in nvkm_perfdom_init()
225 dom->func->init(pm, dom, dom->ctr[i]); in nvkm_perfdom_init()
228 nvkm_perfsrc_enable(pm, dom->ctr[i]); in nvkm_perfdom_init()
233 dom->func->next(pm, dom); in nvkm_perfdom_init()
243 struct nvkm_object *object = &dom->object; in nvkm_perfdom_sample()
244 struct nvkm_pm *pm = dom->perfmon->pm; in nvkm_perfdom_sample()
245 int ret = -ENOSYS; in nvkm_perfdom_sample()
248 if (!(ret = nvif_unvers(ret, &data, &size, args->none))) { in nvkm_perfdom_sample()
252 pm->sequence++; in nvkm_perfdom_sample()
255 list_for_each_entry(dom, &pm->domains, head) in nvkm_perfdom_sample()
256 dom->func->next(pm, dom); in nvkm_perfdom_sample()
265 struct nvif_perfdom_read_v0 v0; in nvkm_perfdom_read() member
267 struct nvkm_object *object = &dom->object; in nvkm_perfdom_read()
268 struct nvkm_pm *pm = dom->perfmon->pm; in nvkm_perfdom_read()
269 int ret = -ENOSYS, i; in nvkm_perfdom_read()
272 if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { in nvkm_perfdom_read()
273 nvif_ioctl(object, "perfdom read vers %d\n", args->v0.version); in nvkm_perfdom_read()
278 if (dom->ctr[i]) in nvkm_perfdom_read()
279 dom->func->read(pm, dom, dom->ctr[i]); in nvkm_perfdom_read()
282 if (!dom->clk) in nvkm_perfdom_read()
283 return -EAGAIN; in nvkm_perfdom_read()
286 if (dom->ctr[i]) in nvkm_perfdom_read()
287 args->v0.ctr[i] = dom->ctr[i]->ctr; in nvkm_perfdom_read()
288 args->v0.clk = dom->clk; in nvkm_perfdom_read()
306 return -EINVAL; in nvkm_perfdom_mthd()
313 struct nvkm_pm *pm = dom->perfmon->pm; in nvkm_perfdom_dtor()
317 struct nvkm_perfctr *ctr = dom->ctr[i]; in nvkm_perfdom_dtor()
320 if (ctr->head.next) in nvkm_perfdom_dtor()
321 list_del(&ctr->head); in nvkm_perfdom_dtor()
338 return -EINVAL; in nvkm_perfctr_new()
342 return -ENOMEM; in nvkm_perfctr_new()
344 ctr->domain = domain; in nvkm_perfctr_new()
345 ctr->logic_op = logic_op; in nvkm_perfctr_new()
346 ctr->slot = slot; in nvkm_perfctr_new()
349 ctr->signal[i] = signal[i] - dom->signal; in nvkm_perfctr_new()
351 ctr->source[i][j] = source[i][j]; in nvkm_perfctr_new()
354 list_add_tail(&ctr->head, &dom->list); in nvkm_perfctr_new()
371 struct nvif_perfdom_v0 v0; in nvkm_perfdom_new_() member
373 struct nvkm_pm *pm = perfmon->pm; in nvkm_perfdom_new_()
374 struct nvkm_object *parent = oclass->parent; in nvkm_perfdom_new_()
379 int ret = -ENOSYS; in nvkm_perfdom_new_()
382 if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { in nvkm_perfdom_new_()
384 args->v0.version, args->v0.domain, args->v0.mode); in nvkm_perfdom_new_()
388 for (c = 0; c < ARRAY_SIZE(args->v0.ctr); c++) { in nvkm_perfdom_new_()
392 for (s = 0; s < ARRAY_SIZE(args->v0.ctr[c].signal); s++) { in nvkm_perfdom_new_()
393 sig[s] = nvkm_perfsig_find(pm, args->v0.domain, in nvkm_perfdom_new_()
394 args->v0.ctr[c].signal[s], in nvkm_perfdom_new_()
396 if (args->v0.ctr[c].signal[s] && !sig[s]) in nvkm_perfdom_new_()
397 return -EINVAL; in nvkm_perfdom_new_()
400 src[s][m] = args->v0.ctr[c].source[s][m]; in nvkm_perfdom_new_()
403 return -EINVAL; in nvkm_perfdom_new_()
407 ret = nvkm_perfctr_new(sdom, c, args->v0.domain, sig, src, in nvkm_perfdom_new_()
408 args->v0.ctr[c].logic_op, &ctr[c]); in nvkm_perfdom_new_()
414 return -EINVAL; in nvkm_perfdom_new_()
417 return -ENOMEM; in nvkm_perfdom_new_()
418 nvkm_object_ctor(&nvkm_perfdom, oclass, &dom->object); in nvkm_perfdom_new_()
419 dom->perfmon = perfmon; in nvkm_perfdom_new_()
420 *pobject = &dom->object; in nvkm_perfdom_new_()
422 dom->func = sdom->func; in nvkm_perfdom_new_()
423 dom->addr = sdom->addr; in nvkm_perfdom_new_()
424 dom->mode = args->v0.mode; in nvkm_perfdom_new_()
426 dom->ctr[c] = ctr[c]; in nvkm_perfdom_new_()
438 struct nvif_perfmon_query_domain_v0 v0; in nvkm_perfmon_mthd_query_domain() member
440 struct nvkm_object *object = &perfmon->object; in nvkm_perfmon_mthd_query_domain()
441 struct nvkm_pm *pm = perfmon->pm; in nvkm_perfmon_mthd_query_domain()
444 int di, ret = -ENOSYS; in nvkm_perfmon_mthd_query_domain()
447 if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { in nvkm_perfmon_mthd_query_domain()
449 args->v0.version, args->v0.iter); in nvkm_perfmon_mthd_query_domain()
450 di = (args->v0.iter & 0xff) - 1; in nvkm_perfmon_mthd_query_domain()
456 return -EINVAL; in nvkm_perfmon_mthd_query_domain()
461 return -EINVAL; in nvkm_perfmon_mthd_query_domain()
463 args->v0.id = di; in nvkm_perfmon_mthd_query_domain()
464 args->v0.signal_nr = nvkm_perfdom_count_perfsig(dom); in nvkm_perfmon_mthd_query_domain()
465 strncpy(args->v0.name, dom->name, sizeof(args->v0.name) - 1); in nvkm_perfmon_mthd_query_domain()
469 args->v0.counter_nr = 4; in nvkm_perfmon_mthd_query_domain()
473 args->v0.iter = ++di; in nvkm_perfmon_mthd_query_domain()
477 args->v0.iter = 0xff; in nvkm_perfmon_mthd_query_domain()
486 struct nvif_perfmon_query_signal_v0 v0; in nvkm_perfmon_mthd_query_signal() member
488 struct nvkm_object *object = &perfmon->object; in nvkm_perfmon_mthd_query_signal()
489 struct nvkm_pm *pm = perfmon->pm; in nvkm_perfmon_mthd_query_signal()
490 struct nvkm_device *device = pm->engine.subdev.device; in nvkm_perfmon_mthd_query_signal()
493 const bool all = nvkm_boolopt(device->cfgopt, "NvPmShowAll", false); in nvkm_perfmon_mthd_query_signal()
494 const bool raw = nvkm_boolopt(device->cfgopt, "NvPmUnnamed", all); in nvkm_perfmon_mthd_query_signal()
495 int ret = -ENOSYS, si; in nvkm_perfmon_mthd_query_signal()
498 if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { in nvkm_perfmon_mthd_query_signal()
501 args->v0.version, args->v0.domain, args->v0.iter); in nvkm_perfmon_mthd_query_signal()
502 si = (args->v0.iter & 0xffff) - 1; in nvkm_perfmon_mthd_query_signal()
506 dom = nvkm_perfdom_find(pm, args->v0.domain); in nvkm_perfmon_mthd_query_signal()
507 if (dom == NULL || si >= (int)dom->signal_nr) in nvkm_perfmon_mthd_query_signal()
508 return -EINVAL; in nvkm_perfmon_mthd_query_signal()
511 sig = &dom->signal[si]; in nvkm_perfmon_mthd_query_signal()
512 if (raw || !sig->name) { in nvkm_perfmon_mthd_query_signal()
513 snprintf(args->v0.name, sizeof(args->v0.name), in nvkm_perfmon_mthd_query_signal()
514 "/%s/%02x", dom->name, si); in nvkm_perfmon_mthd_query_signal()
516 strncpy(args->v0.name, sig->name, in nvkm_perfmon_mthd_query_signal()
517 sizeof(args->v0.name) - 1); in nvkm_perfmon_mthd_query_signal()
520 args->v0.signal = si; in nvkm_perfmon_mthd_query_signal()
521 args->v0.source_nr = nvkm_perfsig_count_perfsrc(sig); in nvkm_perfmon_mthd_query_signal()
524 while (++si < dom->signal_nr) { in nvkm_perfmon_mthd_query_signal()
525 if (all || dom->signal[si].name) { in nvkm_perfmon_mthd_query_signal()
526 args->v0.iter = ++si; in nvkm_perfmon_mthd_query_signal()
531 args->v0.iter = 0xffff; in nvkm_perfmon_mthd_query_signal()
540 struct nvif_perfmon_query_source_v0 v0; in nvkm_perfmon_mthd_query_source() member
542 struct nvkm_object *object = &perfmon->object; in nvkm_perfmon_mthd_query_source()
543 struct nvkm_pm *pm = perfmon->pm; in nvkm_perfmon_mthd_query_source()
548 int si, ret = -ENOSYS; in nvkm_perfmon_mthd_query_source()
551 if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) { in nvkm_perfmon_mthd_query_source()
554 args->v0.version, args->v0.domain, args->v0.signal, in nvkm_perfmon_mthd_query_source()
555 args->v0.iter); in nvkm_perfmon_mthd_query_source()
556 si = (args->v0.iter & 0xff) - 1; in nvkm_perfmon_mthd_query_source()
560 sig = nvkm_perfsig_find(pm, args->v0.domain, args->v0.signal, &dom); in nvkm_perfmon_mthd_query_source()
562 return -EINVAL; in nvkm_perfmon_mthd_query_source()
566 return -EINVAL; in nvkm_perfmon_mthd_query_source()
569 src = nvkm_perfsrc_find(pm, sig, sig->source[si]); in nvkm_perfmon_mthd_query_source()
571 return -EINVAL; in nvkm_perfmon_mthd_query_source()
573 args->v0.source = sig->source[si]; in nvkm_perfmon_mthd_query_source()
574 args->v0.mask = src->mask; in nvkm_perfmon_mthd_query_source()
575 strncpy(args->v0.name, src->name, sizeof(args->v0.name) - 1); in nvkm_perfmon_mthd_query_source()
579 args->v0.iter = ++si; in nvkm_perfmon_mthd_query_source()
583 args->v0.iter = 0xff; in nvkm_perfmon_mthd_query_source()
601 return -EINVAL; in nvkm_perfmon_mthd()
608 struct nvkm_perfmon *perfmon = nvkm_perfmon(oclass->parent); in nvkm_perfmon_child_new()
617 oclass->base.oclass = NVIF_CLASS_PERFDOM; in nvkm_perfmon_child_get()
618 oclass->base.minver = 0; in nvkm_perfmon_child_get()
619 oclass->base.maxver = 0; in nvkm_perfmon_child_get()
620 oclass->ctor = nvkm_perfmon_child_new; in nvkm_perfmon_child_get()
623 return -EINVAL; in nvkm_perfmon_child_get()
630 struct nvkm_pm *pm = perfmon->pm; in nvkm_perfmon_dtor()
631 mutex_lock(&pm->engine.subdev.mutex); in nvkm_perfmon_dtor()
632 if (pm->perfmon == &perfmon->object) in nvkm_perfmon_dtor()
633 pm->perfmon = NULL; in nvkm_perfmon_dtor()
634 mutex_unlock(&pm->engine.subdev.mutex); in nvkm_perfmon_dtor()
652 return -ENOMEM; in nvkm_perfmon_new()
653 nvkm_object_ctor(&nvkm_perfmon, oclass, &perfmon->object); in nvkm_perfmon_new()
654 perfmon->pm = pm; in nvkm_perfmon_new()
655 *pobject = &perfmon->object; in nvkm_perfmon_new()
667 struct nvkm_pm *pm = nvkm_pm(oclass->engine); in nvkm_pm_oclass_new()
674 mutex_lock(&pm->engine.subdev.mutex); in nvkm_pm_oclass_new()
675 if (pm->perfmon == NULL) in nvkm_pm_oclass_new()
676 pm->perfmon = *pobject; in nvkm_pm_oclass_new()
677 ret = (pm->perfmon == *pobject) ? 0 : -EBUSY; in nvkm_pm_oclass_new()
678 mutex_unlock(&pm->engine.subdev.mutex); in nvkm_pm_oclass_new()
685 .base.minver = -1,
686 .base.maxver = -1,
695 oclass->base = nvkm_pm_oclass.base; in nvkm_pm_oclass_get()
699 return 1; in nvkm_pm_oclass_get()
717 while (ssrc->name) { in nvkm_perfsrc_new()
718 smux = ssrc->mux; in nvkm_perfsrc_new()
719 while (smux->name) { in nvkm_perfsrc_new()
724 list_for_each_entry(src, &pm->sources, head) { in nvkm_perfsrc_new()
725 if (src->addr == ssrc->addr && in nvkm_perfsrc_new()
726 src->shift == smux->shift) { in nvkm_perfsrc_new()
736 return -ENOMEM; in nvkm_perfsrc_new()
738 src->addr = ssrc->addr; in nvkm_perfsrc_new()
739 src->mask = smux->mask; in nvkm_perfsrc_new()
740 src->shift = smux->shift; in nvkm_perfsrc_new()
741 src->enable = smux->enable; in nvkm_perfsrc_new()
743 len = strlen(ssrc->name) + in nvkm_perfsrc_new()
744 strlen(smux->name) + 2; in nvkm_perfsrc_new()
745 src->name = kzalloc(len, GFP_KERNEL); in nvkm_perfsrc_new()
746 if (!src->name) { in nvkm_perfsrc_new()
748 return -ENOMEM; in nvkm_perfsrc_new()
750 snprintf(src->name, len, "%s_%s", ssrc->name, in nvkm_perfsrc_new()
751 smux->name); in nvkm_perfsrc_new()
753 list_add_tail(&src->head, &pm->sources); in nvkm_perfsrc_new()
756 sig->source[source_nr++] = source_id + 1; in nvkm_perfsrc_new()
777 if (i && !(mask & (1 << i))) in nvkm_perfdom_new()
781 while (sdom->signal_nr) { in nvkm_perfdom_new()
782 dom = kzalloc(struct_size(dom, signal, sdom->signal_nr), in nvkm_perfdom_new()
785 return -ENOMEM; in nvkm_perfdom_new()
788 snprintf(dom->name, sizeof(dom->name), in nvkm_perfdom_new()
790 (int)(sdom - spec)); in nvkm_perfdom_new()
792 snprintf(dom->name, sizeof(dom->name), in nvkm_perfdom_new()
793 "%s/%02x", name, (int)(sdom - spec)); in nvkm_perfdom_new()
796 list_add_tail(&dom->head, &pm->domains); in nvkm_perfdom_new()
797 INIT_LIST_HEAD(&dom->list); in nvkm_perfdom_new()
798 dom->func = sdom->func; in nvkm_perfdom_new()
799 dom->addr = addr; in nvkm_perfdom_new()
800 dom->signal_nr = sdom->signal_nr; in nvkm_perfdom_new()
802 ssig = (sdom++)->signal; in nvkm_perfdom_new()
803 while (ssig->name) { in nvkm_perfdom_new()
805 &dom->signal[ssig->signal]; in nvkm_perfdom_new()
806 sig->name = ssig->name; in nvkm_perfdom_new()
807 ret = nvkm_perfsrc_new(pm, sig, ssig->source); in nvkm_perfdom_new()
816 mask &= ~(1 << i); in nvkm_perfdom_new()
826 if (pm->func->fini) in nvkm_pm_fini()
827 pm->func->fini(pm); in nvkm_pm_fini()
838 list_for_each_entry_safe(dom, next_dom, &pm->domains, head) { in nvkm_pm_dtor()
839 list_del(&dom->head); in nvkm_pm_dtor()
843 list_for_each_entry_safe(src, next_src, &pm->sources, head) { in nvkm_pm_dtor()
844 list_del(&src->head); in nvkm_pm_dtor()
845 kfree(src->name); in nvkm_pm_dtor()
863 pm->func = func; in nvkm_pm_ctor()
864 INIT_LIST_HEAD(&pm->domains); in nvkm_pm_ctor()
865 INIT_LIST_HEAD(&pm->sources); in nvkm_pm_ctor()
866 return nvkm_engine_ctor(&nvkm_pm, device, index, true, &pm->engine); in nvkm_pm_ctor()