summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/nv_perfmon.c6
-rw-r--r--drm/nouveau/include/nvif/class.h11
-rw-r--r--drm/nouveau/nvkm/engine/pm/base.c52
3 files changed, 23 insertions, 46 deletions
diff --git a/bin/nv_perfmon.c b/bin/nv_perfmon.c
index 043d8643a..50c777779 100644
--- a/bin/nv_perfmon.c
+++ b/bin/nv_perfmon.c
@@ -255,6 +255,7 @@ struct ui_perfmon_dom {
struct ui_perfmon_sig {
struct list_head head;
char *name;
+ u8 signal;
};
struct ui_main {
@@ -299,6 +300,7 @@ ui_perfmon_query_signals(struct nvif_object *perfmon,
if (prev_iter) {
nr_signals++;
sig = calloc(1, sizeof(*sig));
+ sig->signal = args.signal;
sig->name = malloc(sizeof(args.name));
strncpy(sig->name, args.name, sizeof(args.name));
list_add_tail(&sig->head, &dom->list);
@@ -392,14 +394,14 @@ ui_main_select(void)
list_for_each_entry(sig, &dom->list, head) {
struct nvif_perfctr_v0 args = {
.logic_op = 0xaaaa,
+ .domain = dom->id,
};
item = calloc(1, sizeof(*item));
item->handle = ui_main_handle++;
item->name = sig->name;
- strncpy(args.name[0], item->name, sizeof(args.name[0]));
-
+ args.signal[0] = sig->signal;
ret = nvif_object_init(nvif_object(device), NULL,
item->handle,
NVIF_IOCTL_NEW_V0_PERFCTR,
diff --git a/drm/nouveau/include/nvif/class.h b/drm/nouveau/include/nvif/class.h
index 871247c65..9e4db3aaa 100644
--- a/drm/nouveau/include/nvif/class.h
+++ b/drm/nouveau/include/nvif/class.h
@@ -267,7 +267,8 @@ struct nvif_perfmon_query_signal_v0 {
__u8 version;
__u8 domain;
__u16 iter;
- __u8 pad03[4];
+ __u8 signal;
+ __u8 pad04[3];
char name[64];
};
@@ -278,10 +279,12 @@ struct nvif_perfmon_query_signal_v0 {
struct nvif_perfctr_v0 {
__u8 version;
- __u8 pad01[1];
+ __u8 domain;
+ __u8 pad02[2];
__u16 logic_op;
- __u8 pad04[4];
- char name[4][64];
+ __u8 pad04[2];
+ __u8 signal[4];
+ __u8 pad06[4];
};
#define NVIF_PERFCTR_V0_SAMPLE 0x00
diff --git a/drm/nouveau/nvkm/engine/pm/base.c b/drm/nouveau/nvkm/engine/pm/base.c
index fab05985b..71834b96c 100644
--- a/drm/nouveau/nvkm/engine/pm/base.c
+++ b/drm/nouveau/nvkm/engine/pm/base.c
@@ -73,49 +73,22 @@ nvkm_perfdom_find(struct nvkm_pm *ppm, int di)
return NULL;
}
-static struct nvkm_perfsig *
-nvkm_perfsig_find_(struct nvkm_perfdom *dom, const char *name, u32 size)
-{
- char path[64];
- int i;
-
- if (name[0] != '/') {
- for (i = 0; i < dom->signal_nr; i++) {
- if ( dom->signal[i].name &&
- !strncmp(name, dom->signal[i].name, size))
- return &dom->signal[i];
- }
- } else {
- for (i = 0; i < dom->signal_nr; i++) {
- snprintf(path, sizeof(path), "/%s/%02x", dom->name, i);
- if (!strncmp(name, path, size))
- return &dom->signal[i];
- }
- }
-
- return NULL;
-}
-
struct nvkm_perfsig *
-nvkm_perfsig_find(struct nvkm_pm *ppm, const char *name, u32 size,
+nvkm_perfsig_find(struct nvkm_pm *ppm, uint8_t di, uint8_t si,
struct nvkm_perfdom **pdom)
{
struct nvkm_perfdom *dom = *pdom;
- struct nvkm_perfsig *sig;
if (dom == NULL) {
- list_for_each_entry(dom, &ppm->domains, head) {
- sig = nvkm_perfsig_find_(dom, name, size);
- if (sig) {
- *pdom = dom;
- return sig;
- }
- }
-
- return NULL;
+ dom = nvkm_perfdom_find(ppm, di);
+ if (dom == NULL)
+ return NULL;
+ *pdom = dom;
}
- return nvkm_perfsig_find_(dom, name, size);
+ if (!dom->signal[si].name)
+ return NULL;
+ return &dom->signal[si];
}
/*******************************************************************************
@@ -200,6 +173,7 @@ nvkm_perfmon_mthd_query_signal(struct nvkm_object *object, void *data, u32 size)
} else {
strncpy(args->v0.name, name, sizeof(args->v0.name));
}
+ args->v0.signal = si;
}
while (++si < dom->signal_nr) {
@@ -359,11 +333,9 @@ nvkm_perfctr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
} else
return ret;
- for (i = 0; i < ARRAY_SIZE(args->v0.name) && args->v0.name[i][0]; i++) {
- sig[i] = nvkm_perfsig_find(ppm, args->v0.name[i],
- strnlen(args->v0.name[i],
- sizeof(args->v0.name[i])),
- &dom);
+ for (i = 0; i < ARRAY_SIZE(args->v0.signal) && args->v0.signal[i]; i++) {
+ sig[i] = nvkm_perfsig_find(ppm, args->v0.domain,
+ args->v0.signal[i], &dom);
if (!sig[i])
return -EINVAL;
}