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

drm/nouveau/sec2: utilise engine PRI address from TOP



Turing has its SEC2 instance in an alternate location, and this avoids
needing to duplicate the code here for it.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 1a346934
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@

struct nvkm_sec2 {
	struct nvkm_engine engine;
	u32 addr;

	struct nvkm_falcon *falcon;
	struct nvkm_msgqueue *queue;
	struct work_struct work;
+16 −7
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include "priv.h"

#include <core/msgqueue.h>
#include <subdev/top.h>
#include <engine/falcon.h>

static void *
@@ -39,18 +40,18 @@ nvkm_sec2_intr(struct nvkm_engine *engine)
	struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
	struct nvkm_subdev *subdev = &engine->subdev;
	struct nvkm_device *device = subdev->device;
	u32 disp = nvkm_rd32(device, 0x8701c);
	u32 intr = nvkm_rd32(device, 0x87008) & disp & ~(disp >> 16);
	u32 disp = nvkm_rd32(device, sec2->addr + 0x01c);
	u32 intr = nvkm_rd32(device, sec2->addr + 0x008) & disp & ~(disp >> 16);

	if (intr & 0x00000040) {
		schedule_work(&sec2->work);
		nvkm_wr32(device, 0x87004, 0x00000040);
		nvkm_wr32(device, sec2->addr + 0x004, 0x00000040);
		intr &= ~0x00000040;
	}

	if (intr) {
		nvkm_error(subdev, "unhandled intr %08x\n", intr);
		nvkm_wr32(device, 0x87004, intr);
		nvkm_wr32(device, sec2->addr + 0x004, intr);

	}
}
@@ -74,8 +75,15 @@ static int
nvkm_sec2_oneinit(struct nvkm_engine *engine)
{
	struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
	return nvkm_falcon_v1_new(&sec2->engine.subdev, "SEC2", 0x87000,
				  &sec2->falcon);
	struct nvkm_subdev *subdev = &sec2->engine.subdev;

	if (!sec2->addr) {
		sec2->addr = nvkm_top_addr(subdev->device, subdev->index);
		if (WARN_ON(!sec2->addr))
			return -EINVAL;
	}

	return nvkm_falcon_v1_new(subdev, "SEC2", sec2->addr, &sec2->falcon);
}

static int
@@ -95,13 +103,14 @@ nvkm_sec2 = {
};

int
nvkm_sec2_new_(struct nvkm_device *device, int index,
nvkm_sec2_new_(struct nvkm_device *device, int index, u32 addr,
	       struct nvkm_sec2 **psec2)
{
	struct nvkm_sec2 *sec2;

	if (!(sec2 = *psec2 = kzalloc(sizeof(*sec2), GFP_KERNEL)))
		return -ENOMEM;
	sec2->addr = addr;
	INIT_WORK(&sec2->work, nvkm_sec2_recv);

	return nvkm_engine_ctor(&nvkm_sec2, device, index, true, &sec2->engine);
+1 −1
Original line number Diff line number Diff line
@@ -26,5 +26,5 @@ int
gp102_sec2_new(struct nvkm_device *device, int index,
	       struct nvkm_sec2 **psec2)
{
	return nvkm_sec2_new_(device, index, psec2);
	return nvkm_sec2_new_(device, index, 0, psec2);
}
+1 −2
Original line number Diff line number Diff line
@@ -5,6 +5,5 @@

#define nvkm_sec2(p) container_of((p), struct nvkm_sec2, engine)

int nvkm_sec2_new_(struct nvkm_device *, int, struct nvkm_sec2 **);

int nvkm_sec2_new_(struct nvkm_device *, int, u32 addr, struct nvkm_sec2 **);
#endif