Commit b826f48a authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/flcn: specify queue register offsets from subdev

Also fixes the values for Turing, even though we don't use it yet.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e938c4e7
...@@ -93,6 +93,12 @@ struct nvkm_falcon_func { ...@@ -93,6 +93,12 @@ struct nvkm_falcon_func {
int (*enable)(struct nvkm_falcon *falcon); int (*enable)(struct nvkm_falcon *falcon);
void (*disable)(struct nvkm_falcon *falcon); void (*disable)(struct nvkm_falcon *falcon);
struct {
u32 head;
u32 tail;
u32 stride;
} cmdq, msgq;
struct nvkm_sclass sclass[]; struct nvkm_sclass sclass[];
}; };
......
...@@ -101,6 +101,8 @@ gp102_sec2_flcn = { ...@@ -101,6 +101,8 @@ gp102_sec2_flcn = {
.start = nvkm_falcon_v1_start, .start = nvkm_falcon_v1_start,
.enable = nvkm_falcon_v1_enable, .enable = nvkm_falcon_v1_enable,
.disable = nvkm_falcon_v1_disable, .disable = nvkm_falcon_v1_disable,
.cmdq = { 0xa00, 0xa04, 8 },
.msgq = { 0xa30, 0xa34, 8 },
}; };
const struct nvkm_sec2_func const struct nvkm_sec2_func
......
...@@ -36,6 +36,8 @@ tu102_sec2_flcn = { ...@@ -36,6 +36,8 @@ tu102_sec2_flcn = {
.start = nvkm_falcon_v1_start, .start = nvkm_falcon_v1_start,
.enable = nvkm_falcon_v1_enable, .enable = nvkm_falcon_v1_enable,
.disable = nvkm_falcon_v1_disable, .disable = nvkm_falcon_v1_disable,
.cmdq = { 0xc00, 0xc04, 8 },
.msgq = { 0xc80, 0xc84, 8 },
}; };
static const struct nvkm_sec2_func static const struct nvkm_sec2_func
......
...@@ -384,27 +384,10 @@ msgqueue_handle_init_msg(struct nvkm_msgqueue *priv, ...@@ -384,27 +384,10 @@ msgqueue_handle_init_msg(struct nvkm_msgqueue *priv,
{ {
struct nvkm_falcon *falcon = priv->falcon; struct nvkm_falcon *falcon = priv->falcon;
const struct nvkm_subdev *subdev = falcon->owner; const struct nvkm_subdev *subdev = falcon->owner;
const u32 tail_reg = falcon->func->msgq.tail;
u32 tail; u32 tail;
u32 tail_reg;
int ret; int ret;
/*
* Of course the message queue registers vary depending on the falcon
* used...
*/
switch (falcon->owner->index) {
case NVKM_SUBDEV_PMU:
tail_reg = 0x4cc;
break;
case NVKM_ENGINE_SEC2:
tail_reg = 0xa34;
break;
default:
nvkm_error(subdev, "falcon %s unsupported for msgqueue!\n",
nvkm_subdev_name[falcon->owner->index]);
return -EINVAL;
}
/* /*
* Read the message - queues are not initialized yet so we cannot rely * Read the message - queues are not initialized yet so we cannot rely
* on msg_queue_read() * on msg_queue_read()
......
...@@ -136,6 +136,7 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr) ...@@ -136,6 +136,7 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr)
u16 sw_managed_area_offset; u16 sw_managed_area_offset;
u16 sw_managed_area_size; u16 sw_managed_area_size;
} *init = (void *)hdr; } *init = (void *)hdr;
const struct nvkm_falcon_func *func = _queue->falcon->func;
const struct nvkm_subdev *subdev = _queue->falcon->owner; const struct nvkm_subdev *subdev = _queue->falcon->owner;
int i; int i;
...@@ -159,11 +160,13 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr) ...@@ -159,11 +160,13 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr)
queue->size = init->queue_info[i].size; queue->size = init->queue_info[i].size;
if (i != MSGQUEUE_0137C63D_MESSAGE_QUEUE) { if (i != MSGQUEUE_0137C63D_MESSAGE_QUEUE) {
queue->head_reg = 0x4a0 + (queue->index * 4); queue->head_reg = func->cmdq.head + queue->index *
queue->tail_reg = 0x4b0 + (queue->index * 4); func->cmdq.stride;
queue->tail_reg = func->cmdq.tail + queue->index *
func->cmdq.stride;
} else { } else {
queue->head_reg = 0x4c8; queue->head_reg = func->msgq.head;
queue->tail_reg = 0x4cc; queue->tail_reg = func->msgq.tail;
} }
nvkm_debug(subdev, nvkm_debug(subdev,
......
...@@ -105,6 +105,7 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr) ...@@ -105,6 +105,7 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr)
u16 sw_managed_area_offset; u16 sw_managed_area_offset;
u16 sw_managed_area_size; u16 sw_managed_area_size;
} *init = (void *)hdr; } *init = (void *)hdr;
const struct nvkm_falcon_func *func = _queue->falcon->func;
const struct nvkm_subdev *subdev = _queue->falcon->owner; const struct nvkm_subdev *subdev = _queue->falcon->owner;
int i; int i;
...@@ -129,11 +130,15 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr) ...@@ -129,11 +130,15 @@ init_callback(struct nvkm_msgqueue *_queue, struct nvkm_msgqueue_hdr *hdr)
queue->size = init->queue_info[i].size; queue->size = init->queue_info[i].size;
if (id == MSGQUEUE_0148CDEC_MESSAGE_QUEUE) { if (id == MSGQUEUE_0148CDEC_MESSAGE_QUEUE) {
queue->head_reg = 0xa30 + (queue->index * 8); queue->head_reg = func->msgq.head + queue->index *
queue->tail_reg = 0xa34 + (queue->index * 8); func->msgq.stride;
queue->tail_reg = func->msgq.tail + queue->index *
func->msgq.stride;
} else { } else {
queue->head_reg = 0xa00 + (queue->index * 8); queue->head_reg = func->cmdq.head + queue->index *
queue->tail_reg = 0xa04 + (queue->index * 8); func->cmdq.stride;
queue->tail_reg = func->cmdq.tail + queue->index *
func->cmdq.stride;
} }
nvkm_debug(subdev, nvkm_debug(subdev,
......
...@@ -255,6 +255,8 @@ gt215_pmu_flcn = { ...@@ -255,6 +255,8 @@ gt215_pmu_flcn = {
.start = nvkm_falcon_v1_start, .start = nvkm_falcon_v1_start,
.enable = nvkm_falcon_v1_enable, .enable = nvkm_falcon_v1_enable,
.disable = nvkm_falcon_v1_disable, .disable = nvkm_falcon_v1_disable,
.cmdq = { 0x4a0, 0x4b0, 4 },
.msgq = { 0x4c8, 0x4cc, 0 },
}; };
static const struct nvkm_pmu_func static const struct nvkm_pmu_func
......
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