Lines Matching refs:perfmon
18 void vc4_perfmon_get(struct vc4_perfmon *perfmon)
22 if (!perfmon)
25 vc4 = perfmon->dev;
29 refcount_inc(&perfmon->refcnt);
32 void vc4_perfmon_put(struct vc4_perfmon *perfmon)
36 if (!perfmon)
39 vc4 = perfmon->dev;
43 if (refcount_dec_and_test(&perfmon->refcnt))
44 kfree(perfmon);
47 void vc4_perfmon_start(struct vc4_dev *vc4, struct vc4_perfmon *perfmon)
55 if (WARN_ON_ONCE(!perfmon || vc4->active_perfmon))
58 for (i = 0; i < perfmon->ncounters; i++)
59 V3D_WRITE(V3D_PCTRS(i), perfmon->events[i]);
61 mask = GENMASK(perfmon->ncounters - 1, 0);
64 vc4->active_perfmon = perfmon;
67 void vc4_perfmon_stop(struct vc4_dev *vc4, struct vc4_perfmon *perfmon,
76 perfmon != vc4->active_perfmon))
80 for (i = 0; i < perfmon->ncounters; i++)
81 perfmon->counters[i] += V3D_READ(V3D_PCTR(i));
91 struct vc4_perfmon *perfmon;
96 mutex_lock(&vc4file->perfmon.lock);
97 perfmon = idr_find(&vc4file->perfmon.idr, id);
98 vc4_perfmon_get(perfmon);
99 mutex_unlock(&vc4file->perfmon.lock);
101 return perfmon;
111 mutex_init(&vc4file->perfmon.lock);
112 idr_init_base(&vc4file->perfmon.idr, VC4_PERFMONID_MIN);
118 struct vc4_perfmon *perfmon = elem;
120 vc4_perfmon_put(perfmon);
132 mutex_lock(&vc4file->perfmon.lock);
133 idr_for_each(&vc4file->perfmon.idr, vc4_perfmon_idr_del, NULL);
134 idr_destroy(&vc4file->perfmon.idr);
135 mutex_unlock(&vc4file->perfmon.lock);
136 mutex_destroy(&vc4file->perfmon.lock);
145 struct vc4_perfmon *perfmon;
153 DRM_DEBUG("Creating perfmon no VC4 V3D probed\n");
168 perfmon = kzalloc(struct_size(perfmon, counters, req->ncounters),
170 if (!perfmon)
172 perfmon->dev = vc4;
175 perfmon->events[i] = req->events[i];
177 perfmon->ncounters = req->ncounters;
179 refcount_set(&perfmon->refcnt, 1);
181 mutex_lock(&vc4file->perfmon.lock);
182 ret = idr_alloc(&vc4file->perfmon.idr, perfmon, VC4_PERFMONID_MIN,
184 mutex_unlock(&vc4file->perfmon.lock);
187 kfree(perfmon);
201 struct vc4_perfmon *perfmon;
207 DRM_DEBUG("Destroying perfmon no VC4 V3D probed\n");
211 mutex_lock(&vc4file->perfmon.lock);
212 perfmon = idr_remove(&vc4file->perfmon.idr, req->id);
213 mutex_unlock(&vc4file->perfmon.lock);
215 if (!perfmon)
218 vc4_perfmon_put(perfmon);
228 struct vc4_perfmon *perfmon;
235 DRM_DEBUG("Getting perfmon no VC4 V3D probed\n");
239 mutex_lock(&vc4file->perfmon.lock);
240 perfmon = idr_find(&vc4file->perfmon.idr, req->id);
241 vc4_perfmon_get(perfmon);
242 mutex_unlock(&vc4file->perfmon.lock);
244 if (!perfmon)
247 if (copy_to_user(u64_to_user_ptr(req->values_ptr), perfmon->counters,
248 perfmon->ncounters * sizeof(u64)))
253 vc4_perfmon_put(perfmon);