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

drm/nouveau/pmu: move init() falcon reset to non-nvfw code



Cleanup before falcon changes.

- fixes (attempt at?) reset of pmu while rtos is running, on gm20b

v2:
- remove extra whitespace

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent b7f44ef7
Loading
Loading
Loading
Loading
+3 −28
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ nvkm_pmu_fini(struct nvkm_subdev *subdev, bool suspend)
{
	struct nvkm_pmu *pmu = nvkm_pmu(subdev);

	if (!subdev->use.enabled)
		return 0;

	if (pmu->func->fini)
		pmu->func->fini(pmu);

@@ -94,42 +97,14 @@ nvkm_pmu_fini(struct nvkm_subdev *subdev, bool suspend)
	return 0;
}

static void
nvkm_pmu_reset(struct nvkm_pmu *pmu)
{
	struct nvkm_device *device = pmu->subdev.device;

	/* Reset. */
	if (pmu->func->reset)
		pmu->func->reset(pmu);

	/* Wait for IMEM/DMEM scrubbing to be complete. */
	nvkm_msec(device, 2000,
		if (!(nvkm_rd32(device, 0x10a10c) & 0x00000006))
			break;
	);
}

static int
nvkm_pmu_init(struct nvkm_subdev *subdev)
{
	struct nvkm_pmu *pmu = nvkm_pmu(subdev);
	struct nvkm_device *device = pmu->subdev.device;

	if (!pmu->func->init)
		return 0;

	if (pmu->func->enabled(pmu)) {
		/* Inhibit interrupts, and wait for idle. */
		nvkm_wr32(device, 0x10a014, 0x0000ffff);
		nvkm_msec(device, 2000,
			if (!nvkm_rd32(device, 0x10a04c))
				break;
		);

		nvkm_pmu_reset(pmu);
	}

	return pmu->func->init(pmu);
}

+0 −1
Original line number Diff line number Diff line
@@ -197,7 +197,6 @@ gk20a_dvfs_data= {
static const struct nvkm_pmu_func
gk20a_pmu = {
	.flcn = &gt215_pmu_flcn,
	.enabled = gf100_pmu_enabled,
	.init = gk20a_pmu_init,
	.fini = gk20a_pmu_fini,
	.reset = gf100_pmu_reset,
+0 −2
Original line number Diff line number Diff line
@@ -55,11 +55,9 @@ gm200_pmu_flcn = {
static const struct nvkm_pmu_func
gm200_pmu = {
	.flcn = &gm200_pmu_flcn,
	.enabled = gf100_pmu_enabled,
	.reset = gf100_pmu_reset,
};


int
gm200_pmu_nofw(struct nvkm_pmu *pmu, int ver, const struct nvkm_pmu_fwif *fwif)
{
+3 −4
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ gm20b_pmu_acr_init_wpr(struct nvkm_pmu *pmu)
				     gm20b_pmu_acr_init_wpr_callback, pmu, 0);
}

int
static int
gm20b_pmu_initmsg(struct nvkm_pmu *pmu)
{
	struct nv_pmu_init_msg msg;
@@ -192,7 +192,7 @@ gm20b_pmu_initmsg(struct nvkm_pmu *pmu)
	return gm20b_pmu_acr_init_wpr(pmu);
}

void
static void
gm20b_pmu_recv(struct nvkm_pmu *pmu)
{
	if (!pmu->initmsg_received) {
@@ -209,10 +209,9 @@ gm20b_pmu_recv(struct nvkm_pmu *pmu)
	nvkm_falcon_msgq_recv(pmu->msgq);
}

static const struct nvkm_pmu_func
const struct nvkm_pmu_func
gm20b_pmu = {
	.flcn = &gm200_pmu_flcn,
	.enabled = gf100_pmu_enabled,
	.intr = gt215_pmu_intr,
	.recv = gm20b_pmu_recv,
	.initmsg = gm20b_pmu_initmsg,
+0 −7
Original line number Diff line number Diff line
@@ -31,16 +31,9 @@ gp102_pmu_reset(struct nvkm_pmu *pmu)
	nvkm_mask(device, 0x10a3c0, 0x00000001, 0x00000000);
}

static bool
gp102_pmu_enabled(struct nvkm_pmu *pmu)
{
	return !(nvkm_rd32(pmu->subdev.device, 0x10a3c0) & 0x00000001);
}

static const struct nvkm_pmu_func
gp102_pmu = {
	.flcn = &gm200_pmu_flcn,
	.enabled = gp102_pmu_enabled,
	.reset = gp102_pmu_reset,
};

Loading