Commit c5c9127b authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/device: implement a generic method to query device-specific properties



We have a need to fetch data from GPU-specific sub-devices that is not
tied to any particular engine object.

This commit provides the framework to support such queries.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f5650478
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -39,9 +39,25 @@ struct nv_device_info_v0 {
	char  name[64];
};

struct nv_device_info_v1 {
	__u8  version;
	__u8  count;
	__u8  pad02[6];
	struct nv_device_info_v1_data {
		__u64 mthd; /* NV_DEVICE_INFO_* (see below). */
		__u64 data;
	} data[];
};

struct nv_device_time_v0 {
	__u8  version;
	__u8  pad01[7];
	__u64 time;
};

#define NV_DEVICE_INFO_UNIT                               (0xffffffffULL << 32)
#define NV_DEVICE_INFO(n)                          ((n) | (0x00000000ULL << 32))

/* This will be returned for unsupported queries. */
#define NV_DEVICE_INFO_INVALID                                           ~0ULL
#endif
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ struct nvkm_engine_func {
	void *(*dtor)(struct nvkm_engine *);
	void (*preinit)(struct nvkm_engine *);
	int (*oneinit)(struct nvkm_engine *);
	int (*info)(struct nvkm_engine *, u64 mthd, u64 *data);
	int (*init)(struct nvkm_engine *);
	int (*fini)(struct nvkm_engine *, bool suspend);
	void (*intr)(struct nvkm_engine *);
+2 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ struct nvkm_subdev_func {
	void *(*dtor)(struct nvkm_subdev *);
	int (*preinit)(struct nvkm_subdev *);
	int (*oneinit)(struct nvkm_subdev *);
	int (*info)(struct nvkm_subdev *, u64 mthd, u64 *data);
	int (*init)(struct nvkm_subdev *);
	int (*fini)(struct nvkm_subdev *, bool suspend);
	void (*intr)(struct nvkm_subdev *);
@@ -29,6 +30,7 @@ void nvkm_subdev_del(struct nvkm_subdev **);
int  nvkm_subdev_preinit(struct nvkm_subdev *);
int  nvkm_subdev_init(struct nvkm_subdev *);
int  nvkm_subdev_fini(struct nvkm_subdev *, bool suspend);
int  nvkm_subdev_info(struct nvkm_subdev *, u64, u64 *);
void nvkm_subdev_intr(struct nvkm_subdev *);

/* subdev logging */
+15 −0
Original line number Diff line number Diff line
@@ -82,6 +82,20 @@ nvkm_engine_intr(struct nvkm_subdev *subdev)
		engine->func->intr(engine);
}

static int
nvkm_engine_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
{
	struct nvkm_engine *engine = nvkm_engine(subdev);
	if (engine->func->info) {
		if ((engine = nvkm_engine_ref(engine))) {
			int ret = engine->func->info(engine, mthd, data);
			nvkm_engine_unref(&engine);
			return ret;
		}
	}
	return -ENOSYS;
}

static int
nvkm_engine_fini(struct nvkm_subdev *subdev, bool suspend)
{
@@ -150,6 +164,7 @@ nvkm_engine_func = {
	.preinit = nvkm_engine_preinit,
	.init = nvkm_engine_init,
	.fini = nvkm_engine_fini,
	.info = nvkm_engine_info,
	.intr = nvkm_engine_intr,
};

+8 −0
Original line number Diff line number Diff line
@@ -92,6 +92,14 @@ nvkm_subdev_intr(struct nvkm_subdev *subdev)
		subdev->func->intr(subdev);
}

int
nvkm_subdev_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data)
{
	if (subdev->func->info)
		return subdev->func->info(subdev, mthd, data);
	return -ENOSYS;
}

int
nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
{
Loading