- transition from "ioctl" interfaces Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx> --- drivers/gpu/drm/nouveau/include/nvif/fifo.h | 2 + drivers/gpu/drm/nouveau/include/nvif/object.h | 8 -- drivers/gpu/drm/nouveau/nouveau_abi16.c | 91 +++++-------------- drivers/gpu/drm/nouveau/nvif/fifo.c | 13 +++ drivers/gpu/drm/nouveau/nvif/object.c | 51 ----------- drivers/gpu/drm/nouveau/nvkm/core/ioctl.c | 27 +----- 6 files changed, 40 insertions(+), 152 deletions(-) diff --git a/drivers/gpu/drm/nouveau/include/nvif/fifo.h b/drivers/gpu/drm/nouveau/include/nvif/fifo.h index 4e9663848291..1a47cf96509f 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/fifo.h +++ b/drivers/gpu/drm/nouveau/include/nvif/fifo.h @@ -16,4 +16,6 @@ nvif_fifo_runlist_ce(struct nvif_device *device) runmce = runmgr; return runmce; } + +s32 nvif_fifo_engine_oclass(struct nvif_device *, enum nvif_engine_type); #endif diff --git a/drivers/gpu/drm/nouveau/include/nvif/object.h b/drivers/gpu/drm/nouveau/include/nvif/object.h index d52d59d9805d..56308333ef86 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/object.h +++ b/drivers/gpu/drm/nouveau/include/nvif/object.h @@ -3,12 +3,6 @@ #define __NVIF_OBJECT_H__ #include <nvif/os.h> -struct nvif_sclass { - s32 oclass; - int minver; - int maxver; -}; - struct nvif_object { struct nvif_parent *parent; struct nvif_client *client; @@ -46,8 +40,6 @@ void nvif_object_ctor_1(struct nvif_object *parent, const char *name, u32 handle void nvif_object_dtor(struct nvif_object *); int nvif_object_ioctl(struct nvif_object *, void *, u32, void **); -int nvif_object_sclass_get(struct nvif_object *, struct nvif_sclass **); -void nvif_object_sclass_put(struct nvif_sclass **); int nvif_object_mthd(struct nvif_object *, u32, void *, u32); int nvif_object_map_cpu(struct nvif_object *, const struct nvif_mapinfo *, struct nvif_map *); int nvif_object_unmap_cpu(struct nvif_map *); diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c index d7db5c0eeaea..36cf7b035973 100644 --- a/drivers/gpu/drm/nouveau/nouveau_abi16.c +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c @@ -131,25 +131,7 @@ nouveau_abi16_obj_new(struct nouveau_abi16 *abi16, enum nouveau_abi16_obj_type t s32 nouveau_abi16_swclass(struct nouveau_drm *drm) { - switch (drm->client.device.info.family) { - case NV_DEVICE_INFO_V0_TNT: - return NVIF_CLASS_SW_NV04; - case NV_DEVICE_INFO_V0_CELSIUS: - case NV_DEVICE_INFO_V0_KELVIN: - case NV_DEVICE_INFO_V0_RANKINE: - case NV_DEVICE_INFO_V0_CURIE: - return NVIF_CLASS_SW_NV10; - case NV_DEVICE_INFO_V0_TESLA: - return NVIF_CLASS_SW_NV50; - case NV_DEVICE_INFO_V0_FERMI: - case NV_DEVICE_INFO_V0_KEPLER: - case NV_DEVICE_INFO_V0_MAXWELL: - case NV_DEVICE_INFO_V0_PASCAL: - case NV_DEVICE_INFO_V0_VOLTA: - return NVIF_CLASS_SW_GF100; - } - - return 0x0000; + return nvif_fifo_engine_oclass(&drm->device, NVIF_ENGINE_SW); } static void @@ -510,9 +492,8 @@ nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS) struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv); struct nouveau_abi16_chan *chan; struct nouveau_abi16_ntfy *ntfy; - struct nvif_sclass *sclass; s32 oclass = 0; - int ret, i; + int ret; if (unlikely(!abi16)) return -ENOMEM; @@ -524,56 +505,25 @@ nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS) if (!chan) return nouveau_abi16_put(abi16, -ENOENT); - ret = nvif_object_sclass_get(&chan->chan->chan.object, &sclass); - if (ret < 0) - return nouveau_abi16_put(abi16, ret); - if ((init->class & 0x00ff) == 0x006e) { /* nvsw: compatibility with older 0x*6e class identifier */ - for (i = 0; !oclass && i < ret; i++) { - switch (sclass[i].oclass) { - case NVIF_CLASS_SW_NV04: - case NVIF_CLASS_SW_NV10: - case NVIF_CLASS_SW_NV50: - case NVIF_CLASS_SW_GF100: - oclass = sclass[i].oclass; - break; - default: - break; - } - } + oclass = nvif_fifo_engine_oclass(&abi16->cli->drm->device, NVIF_ENGINE_SW); } else if ((init->class & 0x00ff) == 0x00b1) { /* msvld: compatibility with incorrect version exposure */ - for (i = 0; i < ret; i++) { - if ((sclass[i].oclass & 0x00ff) == 0x00b1) { - oclass = sclass[i].oclass; - break; - } - } + oclass = nvif_fifo_engine_oclass(&abi16->cli->drm->device, NVIF_ENGINE_MSVLD); } else if ((init->class & 0x00ff) == 0x00b2) { /* mspdec */ /* mspdec: compatibility with incorrect version exposure */ - for (i = 0; i < ret; i++) { - if ((sclass[i].oclass & 0x00ff) == 0x00b2) { - oclass = sclass[i].oclass; - break; - } - } + oclass = nvif_fifo_engine_oclass(&abi16->cli->drm->device, NVIF_ENGINE_MSPDEC); } else if ((init->class & 0x00ff) == 0x00b3) { /* msppp */ /* msppp: compatibility with incorrect version exposure */ - for (i = 0; i < ret; i++) { - if ((sclass[i].oclass & 0x00ff) == 0x00b3) { - oclass = sclass[i].oclass; - break; - } - } + oclass = nvif_fifo_engine_oclass(&abi16->cli->drm->device, NVIF_ENGINE_MSPPP); } else { oclass = init->class; } - nvif_object_sclass_put(&sclass); if (!oclass) return nouveau_abi16_put(abi16, -EINVAL); @@ -779,10 +729,11 @@ nouveau_abi16_ioctl_new(struct nouveau_abi16 *abi16, struct nvif_ioctl_v0 *ioctl static int nouveau_abi16_ioctl_sclass(struct nouveau_abi16 *abi16, struct nvif_ioctl_v0 *ioctl, u32 argc) { + const struct nvif_device_impl_fifo *fifo; + const struct nvif_device_impl_runl *runl; struct nvif_ioctl_sclass_v0 *args; struct nouveau_abi16_chan *chan; - struct nvif_sclass *sclass; - int ret; + int cnt = 0; if (!ioctl->route || argc < sizeof(*args)) return -EINVAL; @@ -796,18 +747,24 @@ nouveau_abi16_ioctl_sclass(struct nouveau_abi16 *abi16, struct nvif_ioctl_v0 *io if (!chan) return -EINVAL; - ret = nvif_object_sclass_get(&chan->chan->chan.object, &sclass); - if (ret < 0) - return ret; + fifo = &chan->chan->cli->drm->device.impl->fifo; + runl = &fifo->runl[chan->chan->chan.runl]; + + for (int engi = 0; engi < runl->engn_nr; engi++) { + const struct nvif_device_impl_engine *engine = + &fifo->engine[runl->engn[engi].engine]; - for (int i = 0; i < min_t(u8, args->count, ret); i++) { - args->oclass[i].oclass = sclass[i].oclass; - args->oclass[i].minver = sclass[i].minver; - args->oclass[i].maxver = sclass[i].maxver; + for (int clsi = 0; clsi < engine->oclass_nr; clsi++) { + if (cnt < args->count) { + args->oclass[cnt].oclass = engine->oclass[clsi]; + args->oclass[cnt].minver = -1; + args->oclass[cnt].maxver = -1; + } + cnt++; + } } - args->count = ret; - nvif_object_sclass_put(&sclass); + args->count = cnt; return 0; } diff --git a/drivers/gpu/drm/nouveau/nvif/fifo.c b/drivers/gpu/drm/nouveau/nvif/fifo.c index 34e6fec0f0a3..6bf2c663583f 100644 --- a/drivers/gpu/drm/nouveau/nvif/fifo.c +++ b/drivers/gpu/drm/nouveau/nvif/fifo.c @@ -21,6 +21,19 @@ */ #include <nvif/fifo.h> +s32 +nvif_fifo_engine_oclass(struct nvif_device *device, enum nvif_engine_type type) +{ + const struct nvif_device_impl_fifo *impl = &device->impl->fifo; + + for (int i = 0; i < impl->engine_nr; i++) { + if (impl->engine[i].type == type) + return impl->engine[i].oclass[0]; + } + + return 0; +} + u64 nvif_fifo_runlist(struct nvif_device *device, enum nvif_engine_type type) { diff --git a/drivers/gpu/drm/nouveau/nvif/object.c b/drivers/gpu/drm/nouveau/nvif/object.c index 371a3605f537..9887241c5200 100644 --- a/drivers/gpu/drm/nouveau/nvif/object.c +++ b/drivers/gpu/drm/nouveau/nvif/object.c @@ -46,57 +46,6 @@ nvif_object_ioctl(struct nvif_object *object, void *data, u32 size, void **hack) return client->driver->ioctl(client->object.priv, data, size, hack); } -void -nvif_object_sclass_put(struct nvif_sclass **psclass) -{ - kfree(*psclass); - *psclass = NULL; -} - -int -nvif_object_sclass_get(struct nvif_object *object, struct nvif_sclass **psclass) -{ - struct { - struct nvif_ioctl_v0 ioctl; - struct nvif_ioctl_sclass_v0 sclass; - } *args = NULL; - int ret, cnt = 0, i; - u32 size; - - while (1) { - size = sizeof(*args) + cnt * sizeof(args->sclass.oclass[0]); - if (!(args = kmalloc(size, GFP_KERNEL))) - return -ENOMEM; - args->ioctl.version = 0; - args->ioctl.type = NVIF_IOCTL_V0_SCLASS; - args->sclass.version = 0; - args->sclass.count = cnt; - - ret = nvif_object_ioctl(object, args, size, NULL); - if (ret == 0 && args->sclass.count <= cnt) - break; - cnt = args->sclass.count; - kfree(args); - if (ret != 0) - return ret; - } - - *psclass = kcalloc(args->sclass.count, sizeof(**psclass), GFP_KERNEL); - if (*psclass) { - for (i = 0; i < args->sclass.count; i++) { - (*psclass)[i].oclass = args->sclass.oclass[i].oclass; - (*psclass)[i].minver = args->sclass.oclass[i].minver; - (*psclass)[i].maxver = args->sclass.oclass[i].maxver; - } - ret = args->sclass.count; - } else { - ret = -ENOMEM; - } - - kfree(args); - return ret; -} - int nvif_object_mthd(struct nvif_object *object, u32 mthd, void *data, u32 size) { diff --git a/drivers/gpu/drm/nouveau/nvkm/core/ioctl.c b/drivers/gpu/drm/nouveau/nvkm/core/ioctl.c index 66f843cac37d..b34ed158aa63 100644 --- a/drivers/gpu/drm/nouveau/nvkm/core/ioctl.c +++ b/drivers/gpu/drm/nouveau/nvkm/core/ioctl.c @@ -60,32 +60,7 @@ static int nvkm_ioctl_sclass(struct nvkm_client *client, struct nvkm_object *object, void *data, u32 size) { - union { - struct nvif_ioctl_sclass_v0 v0; - } *args = data; - struct nvkm_oclass oclass = { .client = client }; - int ret = -ENOSYS, i = 0; - - nvif_ioctl(object, "sclass size %d\n", size); - if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, true))) { - nvif_ioctl(object, "sclass vers %d count %d\n", - args->v0.version, args->v0.count); - if (size != args->v0.count * sizeof(args->v0.oclass[0])) - return -EINVAL; - - while (nvkm_ioctl_sclass_(object, i, &oclass) >= 0) { - if (i < args->v0.count) { - args->v0.oclass[i].oclass = oclass.base.oclass; - args->v0.oclass[i].minver = oclass.base.minver; - args->v0.oclass[i].maxver = oclass.base.maxver; - } - i++; - } - - args->v0.count = i; - } - - return ret; + return -ENODEV; } static int -- 2.41.0