drm/nouveau/pm: use hardware signals indexes instead of user-readable names

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Samuel Pitoiset 2015-06-07 22:40:20 +02:00 committed by Ben Skeggs
parent e4047599ae
commit 10a4d2b248
2 changed files with 19 additions and 44 deletions

View File

@ -267,7 +267,8 @@ struct nvif_perfmon_query_signal_v0 {
__u8 version; __u8 version;
__u8 domain; __u8 domain;
__u16 iter; __u16 iter;
__u8 pad03[4]; __u8 signal;
__u8 pad04[3];
char name[64]; char name[64];
}; };
@ -278,10 +279,12 @@ struct nvif_perfmon_query_signal_v0 {
struct nvif_perfctr_v0 { struct nvif_perfctr_v0 {
__u8 version; __u8 version;
__u8 pad01[1]; __u8 domain;
__u8 pad02[2];
__u16 logic_op; __u16 logic_op;
__u8 pad04[4]; __u8 pad04[2];
char name[4][64]; __u8 signal[4];
__u8 pad06[4];
}; };
#define NVIF_PERFCTR_V0_SAMPLE 0x00 #define NVIF_PERFCTR_V0_SAMPLE 0x00

View File

@ -73,49 +73,22 @@ nvkm_perfdom_find(struct nvkm_pm *ppm, int di)
return NULL; 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 * 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 **pdom)
{ {
struct nvkm_perfdom *dom = *pdom; struct nvkm_perfdom *dom = *pdom;
struct nvkm_perfsig *sig;
if (dom == NULL) { if (dom == NULL) {
list_for_each_entry(dom, &ppm->domains, head) { dom = nvkm_perfdom_find(ppm, di);
sig = nvkm_perfsig_find_(dom, name, size); if (dom == NULL)
if (sig) { return NULL;
*pdom = dom; *pdom = dom;
return sig;
}
}
return NULL;
} }
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 { } else {
strncpy(args->v0.name, name, sizeof(args->v0.name)); strncpy(args->v0.name, name, sizeof(args->v0.name));
} }
args->v0.signal = si;
} }
while (++si < dom->signal_nr) { while (++si < dom->signal_nr) {
@ -359,11 +333,9 @@ nvkm_perfctr_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
} else } else
return ret; return ret;
for (i = 0; i < ARRAY_SIZE(args->v0.name) && args->v0.name[i][0]; i++) { for (i = 0; i < ARRAY_SIZE(args->v0.signal) && args->v0.signal[i]; i++) {
sig[i] = nvkm_perfsig_find(ppm, args->v0.name[i], sig[i] = nvkm_perfsig_find(ppm, args->v0.domain,
strnlen(args->v0.name[i], args->v0.signal[i], &dom);
sizeof(args->v0.name[i])),
&dom);
if (!sig[i]) if (!sig[i])
return -EINVAL; return -EINVAL;
} }