forked from Minki/linux
drm/nouveau/fifo/gk110-: support writing channel group runlist entries
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
4f2fc25c0f
commit
8c4e9f9dff
11
drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.h
Normal file
11
drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#ifndef __NVKM_FIFO_CGRP_H__
|
||||||
|
#define __NVKM_FIFO_CGRP_H__
|
||||||
|
#include "priv.h"
|
||||||
|
|
||||||
|
struct nvkm_fifo_cgrp {
|
||||||
|
int id;
|
||||||
|
struct list_head head;
|
||||||
|
struct list_head chan;
|
||||||
|
int chan_nr;
|
||||||
|
};
|
||||||
|
#endif
|
@ -10,6 +10,7 @@ struct gk104_fifo_chan {
|
|||||||
struct gk104_fifo *fifo;
|
struct gk104_fifo *fifo;
|
||||||
int runl;
|
int runl;
|
||||||
|
|
||||||
|
struct nvkm_fifo_cgrp *cgrp;
|
||||||
struct list_head head;
|
struct list_head head;
|
||||||
bool killed;
|
bool killed;
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
* Authors: Ben Skeggs
|
* Authors: Ben Skeggs
|
||||||
*/
|
*/
|
||||||
#include "gk104.h"
|
#include "gk104.h"
|
||||||
|
#include "cgrp.h"
|
||||||
#include "changk104.h"
|
#include "changk104.h"
|
||||||
|
|
||||||
#include <core/client.h>
|
#include <core/client.h>
|
||||||
@ -145,6 +146,7 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl)
|
|||||||
struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
|
struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
|
||||||
struct nvkm_device *device = subdev->device;
|
struct nvkm_device *device = subdev->device;
|
||||||
struct nvkm_memory *mem;
|
struct nvkm_memory *mem;
|
||||||
|
struct nvkm_fifo_cgrp *cgrp;
|
||||||
int nr = 0;
|
int nr = 0;
|
||||||
int target;
|
int target;
|
||||||
|
|
||||||
@ -156,6 +158,13 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl)
|
|||||||
list_for_each_entry(chan, &fifo->runlist[runl].chan, head) {
|
list_for_each_entry(chan, &fifo->runlist[runl].chan, head) {
|
||||||
func->chan(chan, mem, nr++ * func->size);
|
func->chan(chan, mem, nr++ * func->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_for_each_entry(cgrp, &fifo->runlist[runl].cgrp, head) {
|
||||||
|
func->cgrp(cgrp, mem, nr++ * func->size);
|
||||||
|
list_for_each_entry(chan, &cgrp->chan, head) {
|
||||||
|
func->chan(chan, mem, nr++ * func->size);
|
||||||
|
}
|
||||||
|
}
|
||||||
nvkm_done(mem);
|
nvkm_done(mem);
|
||||||
|
|
||||||
switch (nvkm_memory_target(mem)) {
|
switch (nvkm_memory_target(mem)) {
|
||||||
@ -182,16 +191,28 @@ unlock:
|
|||||||
void
|
void
|
||||||
gk104_fifo_runlist_remove(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan)
|
gk104_fifo_runlist_remove(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan)
|
||||||
{
|
{
|
||||||
|
struct nvkm_fifo_cgrp *cgrp = chan->cgrp;
|
||||||
mutex_lock(&fifo->base.engine.subdev.mutex);
|
mutex_lock(&fifo->base.engine.subdev.mutex);
|
||||||
list_del_init(&chan->head);
|
if (!list_empty(&chan->head)) {
|
||||||
|
list_del_init(&chan->head);
|
||||||
|
if (cgrp && !--cgrp->chan_nr)
|
||||||
|
list_del_init(&cgrp->head);
|
||||||
|
}
|
||||||
mutex_unlock(&fifo->base.engine.subdev.mutex);
|
mutex_unlock(&fifo->base.engine.subdev.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gk104_fifo_runlist_insert(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan)
|
gk104_fifo_runlist_insert(struct gk104_fifo *fifo, struct gk104_fifo_chan *chan)
|
||||||
{
|
{
|
||||||
|
struct nvkm_fifo_cgrp *cgrp = chan->cgrp;
|
||||||
mutex_lock(&fifo->base.engine.subdev.mutex);
|
mutex_lock(&fifo->base.engine.subdev.mutex);
|
||||||
list_add_tail(&chan->head, &fifo->runlist[chan->runl].chan);
|
if (cgrp) {
|
||||||
|
if (!cgrp->chan_nr++)
|
||||||
|
list_add_tail(&cgrp->head, &fifo->runlist[chan->runl].cgrp);
|
||||||
|
list_add_tail(&chan->head, &cgrp->chan);
|
||||||
|
} else {
|
||||||
|
list_add_tail(&chan->head, &fifo->runlist[chan->runl].chan);
|
||||||
|
}
|
||||||
mutex_unlock(&fifo->base.engine.subdev.mutex);
|
mutex_unlock(&fifo->base.engine.subdev.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -898,6 +919,7 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
|
|||||||
}
|
}
|
||||||
|
|
||||||
init_waitqueue_head(&fifo->runlist[i].wait);
|
init_waitqueue_head(&fifo->runlist[i].wait);
|
||||||
|
INIT_LIST_HEAD(&fifo->runlist[i].cgrp);
|
||||||
INIT_LIST_HEAD(&fifo->runlist[i].chan);
|
INIT_LIST_HEAD(&fifo->runlist[i].chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#define __GK104_FIFO_H__
|
#define __GK104_FIFO_H__
|
||||||
#define gk104_fifo(p) container_of((p), struct gk104_fifo, base)
|
#define gk104_fifo(p) container_of((p), struct gk104_fifo, base)
|
||||||
#include "priv.h"
|
#include "priv.h"
|
||||||
|
struct nvkm_fifo_cgrp;
|
||||||
|
|
||||||
#include <core/enum.h>
|
#include <core/enum.h>
|
||||||
#include <subdev/mmu.h>
|
#include <subdev/mmu.h>
|
||||||
@ -31,6 +32,7 @@ struct gk104_fifo {
|
|||||||
struct nvkm_memory *mem[2];
|
struct nvkm_memory *mem[2];
|
||||||
int next;
|
int next;
|
||||||
wait_queue_head_t wait;
|
wait_queue_head_t wait;
|
||||||
|
struct list_head cgrp;
|
||||||
struct list_head chan;
|
struct list_head chan;
|
||||||
u32 engm;
|
u32 engm;
|
||||||
} runlist[16];
|
} runlist[16];
|
||||||
@ -53,6 +55,8 @@ struct gk104_fifo_func {
|
|||||||
|
|
||||||
const struct gk104_fifo_runlist_func {
|
const struct gk104_fifo_runlist_func {
|
||||||
u8 size;
|
u8 size;
|
||||||
|
void (*cgrp)(struct nvkm_fifo_cgrp *,
|
||||||
|
struct nvkm_memory *, u32 offset);
|
||||||
void (*chan)(struct gk104_fifo_chan *,
|
void (*chan)(struct gk104_fifo_chan *,
|
||||||
struct nvkm_memory *, u32 offset);
|
struct nvkm_memory *, u32 offset);
|
||||||
} *runlist;
|
} *runlist;
|
||||||
@ -71,7 +75,6 @@ void gk104_fifo_runlist_remove(struct gk104_fifo *, struct gk104_fifo_chan *);
|
|||||||
void gk104_fifo_runlist_commit(struct gk104_fifo *, int runl);
|
void gk104_fifo_runlist_commit(struct gk104_fifo *, int runl);
|
||||||
|
|
||||||
extern const struct nvkm_enum gk104_fifo_fault_access[];
|
extern const struct nvkm_enum gk104_fifo_fault_access[];
|
||||||
|
|
||||||
extern const struct nvkm_enum gk104_fifo_fault_engine[];
|
extern const struct nvkm_enum gk104_fifo_fault_engine[];
|
||||||
extern const struct nvkm_enum gk104_fifo_fault_reason[];
|
extern const struct nvkm_enum gk104_fifo_fault_reason[];
|
||||||
extern const struct nvkm_enum gk104_fifo_fault_hubclient[];
|
extern const struct nvkm_enum gk104_fifo_fault_hubclient[];
|
||||||
@ -80,6 +83,10 @@ extern const struct gk104_fifo_runlist_func gk104_fifo_runlist;
|
|||||||
void gk104_fifo_runlist_chan(struct gk104_fifo_chan *,
|
void gk104_fifo_runlist_chan(struct gk104_fifo_chan *,
|
||||||
struct nvkm_memory *, u32);
|
struct nvkm_memory *, u32);
|
||||||
|
|
||||||
|
extern const struct gk104_fifo_runlist_func gk110_fifo_runlist;
|
||||||
|
void gk110_fifo_runlist_cgrp(struct nvkm_fifo_cgrp *,
|
||||||
|
struct nvkm_memory *, u32);
|
||||||
|
|
||||||
extern const struct nvkm_enum gm107_fifo_fault_engine[];
|
extern const struct nvkm_enum gm107_fifo_fault_engine[];
|
||||||
extern const struct nvkm_enum gp100_fifo_fault_engine[];
|
extern const struct nvkm_enum gp100_fifo_fault_engine[];
|
||||||
#endif
|
#endif
|
||||||
|
@ -22,10 +22,29 @@
|
|||||||
* Authors: Ben Skeggs
|
* Authors: Ben Skeggs
|
||||||
*/
|
*/
|
||||||
#include "gk104.h"
|
#include "gk104.h"
|
||||||
|
#include "cgrp.h"
|
||||||
#include "changk104.h"
|
#include "changk104.h"
|
||||||
|
|
||||||
|
#include <core/memory.h>
|
||||||
|
|
||||||
#include <nvif/class.h>
|
#include <nvif/class.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
gk110_fifo_runlist_cgrp(struct nvkm_fifo_cgrp *cgrp,
|
||||||
|
struct nvkm_memory *memory, u32 offset)
|
||||||
|
{
|
||||||
|
nvkm_wo32(memory, offset + 0, (cgrp->chan_nr << 26) | (128 << 18) |
|
||||||
|
(3 << 14) | 0x00002000 | cgrp->id);
|
||||||
|
nvkm_wo32(memory, offset + 4, 0x00000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct gk104_fifo_runlist_func
|
||||||
|
gk110_fifo_runlist = {
|
||||||
|
.size = 8,
|
||||||
|
.cgrp = gk110_fifo_runlist_cgrp,
|
||||||
|
.chan = gk104_fifo_runlist_chan,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct gk104_fifo_func
|
static const struct gk104_fifo_func
|
||||||
gk110_fifo = {
|
gk110_fifo = {
|
||||||
.fault.access = gk104_fifo_fault_access,
|
.fault.access = gk104_fifo_fault_access,
|
||||||
@ -33,7 +52,7 @@ gk110_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ gk208_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ gk20a_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ gm107_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_B}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ gm200_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,MAXWELL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,MAXWELL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ gm20b_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,MAXWELL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,MAXWELL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ gp100_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,PASCAL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,PASCAL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ gp10b_fifo = {
|
|||||||
.fault.reason = gk104_fifo_fault_reason,
|
.fault.reason = gk104_fifo_fault_reason,
|
||||||
.fault.hubclient = gk104_fifo_fault_hubclient,
|
.fault.hubclient = gk104_fifo_fault_hubclient,
|
||||||
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
.fault.gpcclient = gk104_fifo_fault_gpcclient,
|
||||||
.runlist = &gk104_fifo_runlist,
|
.runlist = &gk110_fifo_runlist,
|
||||||
.chan = {{0,0,PASCAL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
.chan = {{0,0,PASCAL_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user