Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a0bc4b5 authored by Samuel Pitoiset's avatar Samuel Pitoiset Committed by Ben Skeggs
Browse files

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: default avatarSamuel Pitoiset <samuel.pitoiset@gmail.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a78ce96f
Loading
Loading
Loading
Loading
+16 −10
Original line number Original line Diff line number Diff line
@@ -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 {
};
};
+3 −2
Original line number Original line Diff line number Diff line
@@ -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) */
};
};
+32 −6
Original line number Original line Diff line number Diff line
@@ -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,
	},
	},