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

Commit 6defde5a authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/mc: add helper function to handle device reset



This will be later extended to handle PTOP-specified reset masks as well
as the hardcoded ones.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 87f313e6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ struct nvkm_mc {
void nvkm_mc_intr(struct nvkm_mc *, bool *handled);
void nvkm_mc_intr_unarm(struct nvkm_mc *);
void nvkm_mc_intr_rearm(struct nvkm_mc *);
void nvkm_mc_reset(struct nvkm_mc *, enum nvkm_devidx);
void nvkm_mc_unk260(struct nvkm_mc *, u32 data);

int nv04_mc_new(struct nvkm_device *, int, struct nvkm_mc **);
+2 −6
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <core/subdev.h>
#include <core/device.h>
#include <core/option.h>
#include <subdev/mc.h>

static struct lock_class_key nvkm_subdev_lock_class[NVKM_SUBDEV_NR];

@@ -90,7 +91,6 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
{
	struct nvkm_device *device = subdev->device;
	const char *action = suspend ? "suspend" : "fini";
	u32 pmc_enable = subdev->pmc_enable;
	s64 time;

	nvkm_trace(subdev, "%s running...\n", action);
@@ -105,11 +105,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
		}
	}

	if (pmc_enable) {
		nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
		nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
		nvkm_rd32(device, 0x000200);
	}
	nvkm_mc_reset(device->mc, subdev->index);

	time = ktime_to_us(ktime_get()) - time;
	nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
+20 −0
Original line number Diff line number Diff line
@@ -77,6 +77,26 @@ nvkm_mc_intr(struct nvkm_mc *mc, bool *handled)
	*handled = intr != 0;
}

static void
nvkm_mc_reset_(struct nvkm_mc *mc, enum nvkm_devidx devidx)
{
	struct nvkm_device *device = mc->subdev.device;
	struct nvkm_subdev *subdev = nvkm_device_subdev(device, devidx);
	u64 pmc_enable = subdev->pmc_enable;
	if (pmc_enable) {
		nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
		nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
		nvkm_rd32(device, 0x000200);
	}
}

void
nvkm_mc_reset(struct nvkm_mc *mc, enum nvkm_devidx devidx)
{
	if (likely(mc))
		nvkm_mc_reset_(mc, devidx);
}

static int
nvkm_mc_fini(struct nvkm_subdev *subdev, bool suspend)
{