drm/nouveau/pm: reorganize the nvif interface

This commit introduces the NVIF_IOCTL_NEW_V0_PERFMON class which will be
used in order to query domains, signals and sources. This separates the
querying and the counting interface.

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:15 +02:00 committed by Ben Skeggs
parent a78ce96f96
commit 5a0bc4b5ae
3 changed files with 51 additions and 18 deletions

View File

@ -251,6 +251,20 @@ struct gf110_dma_v0 {
* perfmon * perfmon
******************************************************************************/ ******************************************************************************/
#define NVIF_PERFMON_V0_QUERY_SIGNAL 0x00
struct nvif_perfmon_query_signal_v0 {
__u8 version;
__u8 pad01[3];
__u32 iter;
char name[64];
};
/*******************************************************************************
* perfctr
******************************************************************************/
struct nvif_perfctr_v0 { struct nvif_perfctr_v0 {
__u8 version; __u8 version;
__u8 pad01[1]; __u8 pad01[1];
@ -259,16 +273,8 @@ struct nvif_perfctr_v0 {
char name[4][64]; char name[4][64];
}; };
#define NVIF_PERFCTR_V0_QUERY 0x00 #define NVIF_PERFCTR_V0_SAMPLE 0x00
#define NVIF_PERFCTR_V0_SAMPLE 0x01 #define NVIF_PERFCTR_V0_READ 0x01
#define NVIF_PERFCTR_V0_READ 0x02
struct nvif_perfctr_query_v0 {
__u8 version;
__u8 pad01[3];
__u32 iter;
char name[64];
};
struct nvif_perfctr_sample { struct nvif_perfctr_sample {
}; };

View File

@ -49,8 +49,9 @@ struct nvif_ioctl_new_v0 {
__u64 token; __u64 token;
__u32 handle; __u32 handle;
/* these class numbers are made up by us, and not nvidia-assigned */ /* these class numbers are made up by us, and not nvidia-assigned */
#define NVIF_IOCTL_NEW_V0_PERFCTR 0x0000ffff #define NVIF_IOCTL_NEW_V0_PERFMON 0x0000ffff
#define NVIF_IOCTL_NEW_V0_CONTROL 0x0000fffe #define NVIF_IOCTL_NEW_V0_PERFCTR 0x0000fffe
#define NVIF_IOCTL_NEW_V0_CONTROL 0x0000fffd
__u32 oclass; __u32 oclass;
__u8 data[]; /* class data (class.h) */ __u8 data[]; /* class data (class.h) */
}; };

View File

@ -83,10 +83,10 @@ nvkm_perfsig_find(struct nvkm_pm *ppm, const char *name, u32 size,
* Perfmon object classes * Perfmon object classes
******************************************************************************/ ******************************************************************************/
static int static int
nvkm_perfctr_query(struct nvkm_object *object, void *data, u32 size) nvkm_perfmon_mthd_query_signal(struct nvkm_object *object, void *data, u32 size)
{ {
union { union {
struct nvif_perfctr_query_v0 v0; struct nvif_perfmon_query_signal_v0 v0;
} *args = data; } *args = data;
struct nvkm_device *device = nv_device(object); struct nvkm_device *device = nv_device(object);
struct nvkm_pm *ppm = (void *)object->engine; struct nvkm_pm *ppm = (void *)object->engine;
@ -97,9 +97,9 @@ nvkm_perfctr_query(struct nvkm_object *object, void *data, u32 size)
int tmp = 0, di, si; int tmp = 0, di, si;
int ret; int ret;
nv_ioctl(object, "perfctr query size %d\n", size); nv_ioctl(object, "perfmon query signal size %d\n", size);
if (nvif_unpack(args->v0, 0, 0, false)) { if (nvif_unpack(args->v0, 0, 0, false)) {
nv_ioctl(object, "perfctr query vers %d iter %08x\n", nv_ioctl(object, "perfmon query signal vers %d iter %08x\n",
args->v0.version, args->v0.iter); args->v0.version, args->v0.iter);
di = (args->v0.iter & 0xff000000) >> 24; di = (args->v0.iter & 0xff000000) >> 24;
si = (args->v0.iter & 0x00ffffff) - 1; si = (args->v0.iter & 0x00ffffff) - 1;
@ -141,6 +141,30 @@ nvkm_perfctr_query(struct nvkm_object *object, void *data, u32 size)
return 0; return 0;
} }
static int
nvkm_perfmon_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
{
switch (mthd) {
case NVIF_PERFMON_V0_QUERY_SIGNAL:
return nvkm_perfmon_mthd_query_signal(object, data, size);
default:
break;
}
return -EINVAL;
}
static struct nvkm_ofuncs
nvkm_perfmon_ofuncs = {
.ctor = _nvkm_object_ctor,
.dtor = nvkm_object_destroy,
.init = nvkm_object_init,
.fini = nvkm_object_fini,
.mthd = nvkm_perfmon_mthd,
};
/*******************************************************************************
* Perfctr object classes
******************************************************************************/
static int static int
nvkm_perfctr_sample(struct nvkm_object *object, void *data, u32 size) nvkm_perfctr_sample(struct nvkm_object *object, void *data, u32 size)
{ {
@ -221,8 +245,6 @@ static int
nvkm_perfctr_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size) nvkm_perfctr_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size)
{ {
switch (mthd) { switch (mthd) {
case NVIF_PERFCTR_V0_QUERY:
return nvkm_perfctr_query(object, data, size);
case NVIF_PERFCTR_V0_SAMPLE: case NVIF_PERFCTR_V0_SAMPLE:
return nvkm_perfctr_sample(object, data, size); return nvkm_perfctr_sample(object, data, size);
case NVIF_PERFCTR_V0_READ: case NVIF_PERFCTR_V0_READ:
@ -299,6 +321,10 @@ nvkm_perfctr_ofuncs = {
struct nvkm_oclass struct nvkm_oclass
nvkm_pm_sclass[] = { nvkm_pm_sclass[] = {
{
.handle = NVIF_IOCTL_NEW_V0_PERFMON,
.ofuncs = &nvkm_perfmon_ofuncs,
},
{ .handle = NVIF_IOCTL_NEW_V0_PERFCTR, { .handle = NVIF_IOCTL_NEW_V0_PERFCTR,
.ofuncs = &nvkm_perfctr_ofuncs, .ofuncs = &nvkm_perfctr_ofuncs,
}, },