Loading drivers/gpu/drm/nouveau/include/nvif/class.h +20 −1 Original line number Diff line number Diff line Loading @@ -354,9 +354,18 @@ struct nvif_control_pstate_user_v0 { ******************************************************************************/ struct nv03_channel_dma_v0 { __u8 version; __u8 chid; __u8 pad02[2]; __u32 offset; __u64 pushbuf; }; struct nv50_channel_dma_v0 { __u8 version; __u8 chid; __u8 pad02[6]; __u64 vm; __u64 pushbuf; __u64 offset; }; Loading @@ -374,6 +383,16 @@ struct nv50_channel_gpfifo_v0 { __u32 ilength; __u64 ioffset; __u64 pushbuf; __u64 vm; }; struct fermi_channel_gpfifo_v0 { __u8 version; __u8 chid; __u8 pad02[2]; __u32 ilength; __u64 ioffset; __u64 vm; }; struct kepler_channel_gpfifo_a_v0 { Loading @@ -389,7 +408,7 @@ struct kepler_channel_gpfifo_a_v0 { __u16 chid; __u32 ilength; __u64 ioffset; __u64 pushbuf; __u64 vm; }; /******************************************************************************* Loading drivers/gpu/drm/nouveau/nouveau_chan.c +14 −2 Original line number Diff line number Diff line Loading @@ -193,6 +193,7 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nvif_device *device, const u16 *oclass = oclasses; union { struct nv50_channel_gpfifo_v0 nv50; struct fermi_channel_gpfifo_v0 fermi; struct kepler_channel_gpfifo_a_v0 kepler; } args; struct nouveau_channel *chan; Loading @@ -210,15 +211,23 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nvif_device *device, if (oclass[0] >= KEPLER_CHANNEL_GPFIFO_A) { args.kepler.version = 0; args.kepler.engine = engine; args.kepler.pushbuf = nvif_handle(&chan->push.ctxdma); args.kepler.ilength = 0x02000; args.kepler.ioffset = 0x10000 + chan->push.vma.offset; args.kepler.vm = 0; size = sizeof(args.kepler); } else if (oclass[0] >= FERMI_CHANNEL_GPFIFO) { args.fermi.version = 0; args.fermi.ilength = 0x02000; args.fermi.ioffset = 0x10000 + chan->push.vma.offset; args.fermi.vm = 0; size = sizeof(args.fermi); } else { args.nv50.version = 0; args.nv50.pushbuf = nvif_handle(&chan->push.ctxdma); args.nv50.ilength = 0x02000; args.nv50.ioffset = 0x10000 + chan->push.vma.offset; args.nv50.pushbuf = nvif_handle(&chan->push.ctxdma); args.nv50.vm = 0; size = sizeof(args.nv50); } Loading @@ -227,6 +236,9 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nvif_device *device, if (ret == 0) { if (chan->user.oclass >= KEPLER_CHANNEL_GPFIFO_A) chan->chid = args.kepler.chid; else if (chan->user.oclass >= FERMI_CHANNEL_GPFIFO) chan->chid = args.fermi.chid; else chan->chid = args.nv50.chid; return ret; Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c +18 −16 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ nvkm_fifo_channel_create_(struct nvkm_object *parent, return ret; /* validate dma object representing push buffer */ if (pushbuf) { handle = nvkm_client_search(client, pushbuf); if (!handle) return -ENOENT; Loading @@ -93,6 +94,7 @@ nvkm_fifo_channel_create_(struct nvkm_object *parent, ret = dmaeng->bind(dmaobj, parent, &chan->pushgpu); if (ret) return ret; } /* find a free fifo channel */ spin_lock_irqsave(&fifo->lock, flags); Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c +5 −1 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ g84_fifo_chan_ctor_dma(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_object **pobject) { union { struct nv03_channel_dma_v0 v0; struct nv50_channel_dma_v0 v0; } *args = data; struct nvkm_bar *bar = nvkm_bar(parent); struct nv50_fifo_base *base = (void *)parent; Loading @@ -185,6 +185,8 @@ g84_fifo_chan_ctor_dma(struct nvkm_object *parent, struct nvkm_object *engine, nvif_ioctl(parent, "create channel dma vers %d pushbuf %llx " "offset %016llx\n", args->v0.version, args->v0.pushbuf, args->v0.offset); if (args->v0.vm) return -ENOENT; } else return ret; Loading Loading @@ -262,6 +264,8 @@ g84_fifo_chan_ctor_ind(struct nvkm_object *parent, struct nvkm_object *engine, "ioffset %016llx ilength %08x\n", args->v0.version, args->v0.pushbuf, args->v0.ioffset, args->v0.ilength); if (args->v0.vm) return -ENOENT; } else return ret; Loading drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c +6 −5 Original line number Diff line number Diff line Loading @@ -199,7 +199,7 @@ gf100_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_object **pobject) { union { struct nv50_channel_gpfifo_v0 v0; struct fermi_channel_gpfifo_v0 v0; } *args = data; struct nvkm_bar *bar = nvkm_bar(parent); struct gf100_fifo *fifo = (void *)engine; Loading @@ -211,16 +211,17 @@ gf100_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine, nvif_ioctl(parent, "create channel gpfifo size %d\n", size); if (nvif_unpack(args->v0, 0, 0, false)) { nvif_ioctl(parent, "create channel gpfifo vers %d pushbuf %llx " nvif_ioctl(parent, "create channel gpfifo vers %d " "ioffset %016llx ilength %08x\n", args->v0.version, args->v0.pushbuf, args->v0.ioffset, args->v0.version, args->v0.ioffset, args->v0.ilength); if (args->v0.vm) return -ENOENT; } else return ret; ret = nvkm_fifo_channel_create(parent, engine, oclass, 1, fifo->user.bar.offset, 0x1000, args->v0.pushbuf, fifo->user.bar.offset, 0x1000, 0, (1ULL << NVDEV_ENGINE_SW) | (1ULL << NVDEV_ENGINE_GR) | (1ULL << NVDEV_ENGINE_CE0) | Loading Loading
drivers/gpu/drm/nouveau/include/nvif/class.h +20 −1 Original line number Diff line number Diff line Loading @@ -354,9 +354,18 @@ struct nvif_control_pstate_user_v0 { ******************************************************************************/ struct nv03_channel_dma_v0 { __u8 version; __u8 chid; __u8 pad02[2]; __u32 offset; __u64 pushbuf; }; struct nv50_channel_dma_v0 { __u8 version; __u8 chid; __u8 pad02[6]; __u64 vm; __u64 pushbuf; __u64 offset; }; Loading @@ -374,6 +383,16 @@ struct nv50_channel_gpfifo_v0 { __u32 ilength; __u64 ioffset; __u64 pushbuf; __u64 vm; }; struct fermi_channel_gpfifo_v0 { __u8 version; __u8 chid; __u8 pad02[2]; __u32 ilength; __u64 ioffset; __u64 vm; }; struct kepler_channel_gpfifo_a_v0 { Loading @@ -389,7 +408,7 @@ struct kepler_channel_gpfifo_a_v0 { __u16 chid; __u32 ilength; __u64 ioffset; __u64 pushbuf; __u64 vm; }; /******************************************************************************* Loading
drivers/gpu/drm/nouveau/nouveau_chan.c +14 −2 Original line number Diff line number Diff line Loading @@ -193,6 +193,7 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nvif_device *device, const u16 *oclass = oclasses; union { struct nv50_channel_gpfifo_v0 nv50; struct fermi_channel_gpfifo_v0 fermi; struct kepler_channel_gpfifo_a_v0 kepler; } args; struct nouveau_channel *chan; Loading @@ -210,15 +211,23 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nvif_device *device, if (oclass[0] >= KEPLER_CHANNEL_GPFIFO_A) { args.kepler.version = 0; args.kepler.engine = engine; args.kepler.pushbuf = nvif_handle(&chan->push.ctxdma); args.kepler.ilength = 0x02000; args.kepler.ioffset = 0x10000 + chan->push.vma.offset; args.kepler.vm = 0; size = sizeof(args.kepler); } else if (oclass[0] >= FERMI_CHANNEL_GPFIFO) { args.fermi.version = 0; args.fermi.ilength = 0x02000; args.fermi.ioffset = 0x10000 + chan->push.vma.offset; args.fermi.vm = 0; size = sizeof(args.fermi); } else { args.nv50.version = 0; args.nv50.pushbuf = nvif_handle(&chan->push.ctxdma); args.nv50.ilength = 0x02000; args.nv50.ioffset = 0x10000 + chan->push.vma.offset; args.nv50.pushbuf = nvif_handle(&chan->push.ctxdma); args.nv50.vm = 0; size = sizeof(args.nv50); } Loading @@ -227,6 +236,9 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nvif_device *device, if (ret == 0) { if (chan->user.oclass >= KEPLER_CHANNEL_GPFIFO_A) chan->chid = args.kepler.chid; else if (chan->user.oclass >= FERMI_CHANNEL_GPFIFO) chan->chid = args.fermi.chid; else chan->chid = args.nv50.chid; return ret; Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c +18 −16 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ nvkm_fifo_channel_create_(struct nvkm_object *parent, return ret; /* validate dma object representing push buffer */ if (pushbuf) { handle = nvkm_client_search(client, pushbuf); if (!handle) return -ENOENT; Loading @@ -93,6 +94,7 @@ nvkm_fifo_channel_create_(struct nvkm_object *parent, ret = dmaeng->bind(dmaobj, parent, &chan->pushgpu); if (ret) return ret; } /* find a free fifo channel */ spin_lock_irqsave(&fifo->lock, flags); Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c +5 −1 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ g84_fifo_chan_ctor_dma(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_object **pobject) { union { struct nv03_channel_dma_v0 v0; struct nv50_channel_dma_v0 v0; } *args = data; struct nvkm_bar *bar = nvkm_bar(parent); struct nv50_fifo_base *base = (void *)parent; Loading @@ -185,6 +185,8 @@ g84_fifo_chan_ctor_dma(struct nvkm_object *parent, struct nvkm_object *engine, nvif_ioctl(parent, "create channel dma vers %d pushbuf %llx " "offset %016llx\n", args->v0.version, args->v0.pushbuf, args->v0.offset); if (args->v0.vm) return -ENOENT; } else return ret; Loading Loading @@ -262,6 +264,8 @@ g84_fifo_chan_ctor_ind(struct nvkm_object *parent, struct nvkm_object *engine, "ioffset %016llx ilength %08x\n", args->v0.version, args->v0.pushbuf, args->v0.ioffset, args->v0.ilength); if (args->v0.vm) return -ENOENT; } else return ret; Loading
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c +6 −5 Original line number Diff line number Diff line Loading @@ -199,7 +199,7 @@ gf100_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine, struct nvkm_object **pobject) { union { struct nv50_channel_gpfifo_v0 v0; struct fermi_channel_gpfifo_v0 v0; } *args = data; struct nvkm_bar *bar = nvkm_bar(parent); struct gf100_fifo *fifo = (void *)engine; Loading @@ -211,16 +211,17 @@ gf100_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine, nvif_ioctl(parent, "create channel gpfifo size %d\n", size); if (nvif_unpack(args->v0, 0, 0, false)) { nvif_ioctl(parent, "create channel gpfifo vers %d pushbuf %llx " nvif_ioctl(parent, "create channel gpfifo vers %d " "ioffset %016llx ilength %08x\n", args->v0.version, args->v0.pushbuf, args->v0.ioffset, args->v0.version, args->v0.ioffset, args->v0.ilength); if (args->v0.vm) return -ENOENT; } else return ret; ret = nvkm_fifo_channel_create(parent, engine, oclass, 1, fifo->user.bar.offset, 0x1000, args->v0.pushbuf, fifo->user.bar.offset, 0x1000, 0, (1ULL << NVDEV_ENGINE_SW) | (1ULL << NVDEV_ENGINE_GR) | (1ULL << NVDEV_ENGINE_CE0) | Loading