Commit 989863d7 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/pmu: select implementation based on available firmware



This will allow for further customisation of the subdev depending on what
firmware is available.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e905736c
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
 */
#include "priv.h"

#include <core/firmware.h>
#include <core/msgqueue.h>
#include <subdev/timer.h>

@@ -160,22 +161,28 @@ nvkm_pmu = {
};

int
nvkm_pmu_ctor(const struct nvkm_pmu_func *func, struct nvkm_device *device,
nvkm_pmu_ctor(const struct nvkm_pmu_fwif *fwif, struct nvkm_device *device,
	      int index, struct nvkm_pmu *pmu)
{
	nvkm_subdev_ctor(&nvkm_pmu, device, index, &pmu->subdev);
	pmu->func = func;

	INIT_WORK(&pmu->recv.work, nvkm_pmu_recv);
	init_waitqueue_head(&pmu->recv.wait);

	fwif = nvkm_firmware_load(&pmu->subdev, fwif, "Pmu", pmu);
	if (IS_ERR(fwif))
		return PTR_ERR(fwif);

	pmu->func = fwif->func;
	return 0;
}

int
nvkm_pmu_new_(const struct nvkm_pmu_func *func, struct nvkm_device *device,
nvkm_pmu_new_(const struct nvkm_pmu_fwif *fwif, struct nvkm_device *device,
	      int index, struct nvkm_pmu **ppmu)
{
	struct nvkm_pmu *pmu;
	if (!(pmu = *ppmu = kzalloc(sizeof(*pmu), GFP_KERNEL)))
		return -ENOMEM;
	return nvkm_pmu_ctor(func, device, index, *ppmu);
	return nvkm_pmu_ctor(fwif, device, index, *ppmu);
}
+13 −1
Original line number Diff line number Diff line
@@ -55,8 +55,20 @@ gf100_pmu = {
	.recv = gt215_pmu_recv,
};

int
gf100_pmu_nofw(struct nvkm_pmu *pmu, int ver, const struct nvkm_pmu_fwif *fwif)
{
	return 0;
}

static const struct nvkm_pmu_fwif
gf100_pmu_fwif[] = {
	{ -1, gf100_pmu_nofw, &gf100_pmu },
	{}
};

int
gf100_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
{
	return nvkm_pmu_new_(&gf100_pmu, device, index, ppmu);
	return nvkm_pmu_new_(gf100_pmu_fwif, device, index, ppmu);
}
+7 −1
Original line number Diff line number Diff line
@@ -39,8 +39,14 @@ gf119_pmu = {
	.recv = gt215_pmu_recv,
};

static const struct nvkm_pmu_fwif
gf119_pmu_fwif[] = {
	{ -1, gf100_pmu_nofw, &gf119_pmu },
	{}
};

int
gf119_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
{
	return nvkm_pmu_new_(&gf119_pmu, device, index, ppmu);
	return nvkm_pmu_new_(gf119_pmu_fwif, device, index, ppmu);
}
+7 −1
Original line number Diff line number Diff line
@@ -119,8 +119,14 @@ gk104_pmu = {
	.pgob = gk104_pmu_pgob,
};

static const struct nvkm_pmu_fwif
gk104_pmu_fwif[] = {
	{ -1, gf100_pmu_nofw, &gk104_pmu },
	{}
};

int
gk104_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
{
	return nvkm_pmu_new_(&gk104_pmu, device, index, ppmu);
	return nvkm_pmu_new_(gk104_pmu_fwif, device, index, ppmu);
}
+7 −1
Original line number Diff line number Diff line
@@ -98,8 +98,14 @@ gk110_pmu = {
	.pgob = gk110_pmu_pgob,
};

static const struct nvkm_pmu_fwif
gk110_pmu_fwif[] = {
	{ -1, gf100_pmu_nofw, &gk110_pmu },
	{}
};

int
gk110_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
{
	return nvkm_pmu_new_(&gk110_pmu, device, index, ppmu);
	return nvkm_pmu_new_(gk110_pmu_fwif, device, index, ppmu);
}
Loading