Commit fdad5183 authored by Ben Skeggs's avatar Ben Skeggs

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
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
struct nvkm_sec2 { struct nvkm_sec2 {
struct nvkm_engine engine; struct nvkm_engine engine;
u32 addr;
struct nvkm_falcon *falcon; struct nvkm_falcon *falcon;
struct nvkm_msgqueue *queue; struct nvkm_msgqueue *queue;
struct work_struct work; struct work_struct work;
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "priv.h" #include "priv.h"
#include <core/msgqueue.h> #include <core/msgqueue.h>
#include <subdev/top.h>
#include <engine/falcon.h> #include <engine/falcon.h>
static void * static void *
...@@ -39,18 +40,18 @@ nvkm_sec2_intr(struct nvkm_engine *engine) ...@@ -39,18 +40,18 @@ nvkm_sec2_intr(struct nvkm_engine *engine)
struct nvkm_sec2 *sec2 = nvkm_sec2(engine); struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
struct nvkm_subdev *subdev = &engine->subdev; struct nvkm_subdev *subdev = &engine->subdev;
struct nvkm_device *device = subdev->device; struct nvkm_device *device = subdev->device;
u32 disp = nvkm_rd32(device, 0x8701c); u32 disp = nvkm_rd32(device, sec2->addr + 0x01c);
u32 intr = nvkm_rd32(device, 0x87008) & disp & ~(disp >> 16); u32 intr = nvkm_rd32(device, sec2->addr + 0x008) & disp & ~(disp >> 16);
if (intr & 0x00000040) { if (intr & 0x00000040) {
schedule_work(&sec2->work); schedule_work(&sec2->work);
nvkm_wr32(device, 0x87004, 0x00000040); nvkm_wr32(device, sec2->addr + 0x004, 0x00000040);
intr &= ~0x00000040; intr &= ~0x00000040;
} }
if (intr) { if (intr) {
nvkm_error(subdev, "unhandled intr %08x\n", 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 ...@@ -74,8 +75,15 @@ static int
nvkm_sec2_oneinit(struct nvkm_engine *engine) nvkm_sec2_oneinit(struct nvkm_engine *engine)
{ {
struct nvkm_sec2 *sec2 = nvkm_sec2(engine); struct nvkm_sec2 *sec2 = nvkm_sec2(engine);
return nvkm_falcon_v1_new(&sec2->engine.subdev, "SEC2", 0x87000, struct nvkm_subdev *subdev = &sec2->engine.subdev;
&sec2->falcon);
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 static int
...@@ -95,13 +103,14 @@ nvkm_sec2 = { ...@@ -95,13 +103,14 @@ nvkm_sec2 = {
}; };
int 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 **psec2)
{ {
struct nvkm_sec2 *sec2; struct nvkm_sec2 *sec2;
if (!(sec2 = *psec2 = kzalloc(sizeof(*sec2), GFP_KERNEL))) if (!(sec2 = *psec2 = kzalloc(sizeof(*sec2), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
sec2->addr = addr;
INIT_WORK(&sec2->work, nvkm_sec2_recv); INIT_WORK(&sec2->work, nvkm_sec2_recv);
return nvkm_engine_ctor(&nvkm_sec2, device, index, true, &sec2->engine); return nvkm_engine_ctor(&nvkm_sec2, device, index, true, &sec2->engine);
......
...@@ -26,5 +26,5 @@ int ...@@ -26,5 +26,5 @@ int
gp102_sec2_new(struct nvkm_device *device, int index, gp102_sec2_new(struct nvkm_device *device, int index,
struct nvkm_sec2 **psec2) struct nvkm_sec2 **psec2)
{ {
return nvkm_sec2_new_(device, index, psec2); return nvkm_sec2_new_(device, index, 0, psec2);
} }
...@@ -5,6 +5,5 @@ ...@@ -5,6 +5,5 @@
#define nvkm_sec2(p) container_of((p), struct nvkm_sec2, engine) #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 #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment