- transition from "ioctl" interfaces Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx> --- drivers/gpu/drm/nouveau/include/nvif/cl0080.h | 46 --------- drivers/gpu/drm/nouveau/include/nvif/device.h | 5 - .../gpu/drm/nouveau/include/nvif/driverif.h | 43 ++++++++ drivers/gpu/drm/nouveau/include/nvif/fifo.h | 9 +- .../drm/nouveau/include/nvkm/core/subdev.h | 2 - drivers/gpu/drm/nouveau/nouveau_abi16.c | 14 +-- drivers/gpu/drm/nouveau/nouveau_chan.c | 43 ++------ drivers/gpu/drm/nouveau/nouveau_drm.c | 7 +- drivers/gpu/drm/nouveau/nvif/device.c | 4 - drivers/gpu/drm/nouveau/nvif/fifo.c | 65 ++---------- drivers/gpu/drm/nouveau/nvkm/core/engine.c | 12 --- drivers/gpu/drm/nouveau/nvkm/core/subdev.c | 8 -- drivers/gpu/drm/nouveau/nvkm/device/user.c | 58 ----------- .../gpu/drm/nouveau/nvkm/engine/fifo/base.c | 73 -------------- .../gpu/drm/nouveau/nvkm/engine/fifo/ufifo.c | 99 +++++++++++++++++++ 15 files changed, 174 insertions(+), 314 deletions(-) diff --git a/drivers/gpu/drm/nouveau/include/nvif/cl0080.h b/drivers/gpu/drm/nouveau/include/nvif/cl0080.h index ea937fa7bc55..f1684dbd8e3b 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/cl0080.h +++ b/drivers/gpu/drm/nouveau/include/nvif/cl0080.h @@ -37,55 +37,9 @@ struct nv_device_info_v0 { char name[64]; }; -struct nv_device_info_v1 { - __u8 version; - __u8 count; - __u8 pad02[6]; - struct nv_device_info_v1_data { - __u64 mthd; /* NV_DEVICE_INFO_* (see below). */ - __u64 data; - } data[]; -}; - struct nv_device_time_v0 { __u8 version; __u8 pad01[7]; __u64 time; }; - -#define NV_DEVICE_INFO_UNIT (0xffffffffULL << 32) -#define NV_DEVICE_INFO(n) ((n) | (0x00000000ULL << 32)) -#define NV_DEVICE_HOST(n) ((n) | (0x00000001ULL << 32)) - -/* This will be returned in the mthd field for unsupported queries. */ -#define NV_DEVICE_INFO_INVALID ~0ULL - -/* Returns the number of available runlists. */ -#define NV_DEVICE_HOST_RUNLISTS NV_DEVICE_HOST(0x00000000) -/* Returns the number of available channels (0 if per-runlist). */ -#define NV_DEVICE_HOST_CHANNELS NV_DEVICE_HOST(0x00000001) - -/* Returns a mask of available engine types on runlist(data). */ -#define NV_DEVICE_HOST_RUNLIST_ENGINES NV_DEVICE_HOST(0x00000100) -#define NV_DEVICE_HOST_RUNLIST_ENGINES_SW 0x00000001 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_GR 0x00000002 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_MPEG 0x00000004 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_ME 0x00000008 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_CIPHER 0x00000010 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_BSP 0x00000020 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_VP 0x00000040 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_CE 0x00000080 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_SEC 0x00000100 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSVLD 0x00000200 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSPDEC 0x00000400 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSPPP 0x00000800 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_MSENC 0x00001000 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_VIC 0x00002000 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_SEC2 0x00004000 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_NVDEC 0x00008000 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_NVENC 0x00010000 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_NVJPG 0x00020000 -#define NV_DEVICE_HOST_RUNLIST_ENGINES_OFA 0x00040000 -/* Returns the number of available channels on runlist(data). */ -#define NV_DEVICE_HOST_RUNLIST_CHANNELS NV_DEVICE_HOST(0x00000101) #endif diff --git a/drivers/gpu/drm/nouveau/include/nvif/device.h b/drivers/gpu/drm/nouveau/include/nvif/device.h index 27526d5811cf..fa8402e575da 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/device.h +++ b/drivers/gpu/drm/nouveau/include/nvif/device.h @@ -14,11 +14,6 @@ struct nvif_device { struct nv_device_info_v0 info; - struct nvif_fifo_runlist { - u64 engines; - } *runlist; - int runlists; - struct nvif_user user; }; diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h b/drivers/gpu/drm/nouveau/include/nvif/driverif.h index 6152eabd4352..54446d38cb91 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h +++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h @@ -78,6 +78,49 @@ struct nvif_device_impl { } disp; struct nvif_device_impl_fifo { + u8 engine_nr; + u8 runl_nr; + u16 chan_nr; /* 0 == per-runlist */ + + struct nvif_device_impl_engine { + enum nvif_engine_type { + NVIF_ENGINE_SW, + NVIF_ENGINE_GR, + NVIF_ENGINE_MPEG, + NVIF_ENGINE_ME, + NVIF_ENGINE_CIPHER, + NVIF_ENGINE_BSP, + NVIF_ENGINE_VP, + NVIF_ENGINE_CE, + NVIF_ENGINE_SEC, + NVIF_ENGINE_MSVLD, + NVIF_ENGINE_MSPDEC, + NVIF_ENGINE_MSPPP, + NVIF_ENGINE_MSENC, + NVIF_ENGINE_VIC, + NVIF_ENGINE_SEC2, + NVIF_ENGINE_NVDEC, + NVIF_ENGINE_NVENC, + NVIF_ENGINE_NVJPG, + NVIF_ENGINE_OFA, + } type; + + u8 oclass_nr; + s32 oclass[64]; + } engine[8]; + + struct nvif_device_impl_runl { + u8 id; + u16 chan_nr; + u8 runq_nr; + u8 engn_nr; + + struct { + u8 engine; + u8 inst; + } engn[8]; + } runl[64]; + struct { s32 oclass; } cgrp; diff --git a/drivers/gpu/drm/nouveau/include/nvif/fifo.h b/drivers/gpu/drm/nouveau/include/nvif/fifo.h index d351ac890ca1..4e9663848291 100644 --- a/drivers/gpu/drm/nouveau/include/nvif/fifo.h +++ b/drivers/gpu/drm/nouveau/include/nvif/fifo.h @@ -1,16 +1,17 @@ #ifndef __NVIF_FIFO_H__ #define __NVIF_FIFO_H__ #include <nvif/device.h> +#include <nvif/driverif.h> -/* Returns mask of runlists that support a NV_DEVICE_INFO_RUNLIST_ENGINES_* type. */ -u64 nvif_fifo_runlist(struct nvif_device *, u64 engine); +/* Returns mask of runlists that support a NVIF_ENGINE_* type. */ +u64 nvif_fifo_runlist(struct nvif_device *, enum nvif_engine_type); /* CE-supporting runlists (excluding GRCE, if others exist). */ static inline u64 nvif_fifo_runlist_ce(struct nvif_device *device) { - u64 runmgr = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_GR); - u64 runmce = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_CE); + u64 runmgr = nvif_fifo_runlist(device, NVIF_ENGINE_GR); + u64 runmce = nvif_fifo_runlist(device, NVIF_ENGINE_CE); if (runmce && !(runmce &= ~runmgr)) runmce = runmgr; return runmce; diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h b/drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h index bce6e1ba09ea..3bce2077072b 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/core/subdev.h @@ -38,7 +38,6 @@ struct nvkm_subdev_func { void *(*dtor)(struct nvkm_subdev *); int (*preinit)(struct nvkm_subdev *); int (*oneinit)(struct nvkm_subdev *); - int (*info)(struct nvkm_subdev *, u64 mthd, u64 *data); int (*init)(struct nvkm_subdev *); int (*fini)(struct nvkm_subdev *, bool suspend); void (*intr)(struct nvkm_subdev *); @@ -66,7 +65,6 @@ int nvkm_subdev_preinit(struct nvkm_subdev *); int nvkm_subdev_oneinit(struct nvkm_subdev *); int nvkm_subdev_init(struct nvkm_subdev *); int nvkm_subdev_fini(struct nvkm_subdev *, bool suspend); -int nvkm_subdev_info(struct nvkm_subdev *, u64, u64 *); void nvkm_subdev_intr(struct nvkm_subdev *); /* subdev logging */ diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c index 23f8b448a30a..fdbc982ea566 100644 --- a/drivers/gpu/drm/nouveau/nouveau_abi16.c +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c @@ -338,26 +338,26 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS) */ __nouveau_cli_disable_uvmm_noinit(cli); - engine = NV_DEVICE_HOST_RUNLIST_ENGINES_GR; + engine = NVIF_ENGINE_GR; /* hack to allow channel engine type specification on kepler */ if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) { if (init->fb_ctxdma_handle == ~0) { switch (init->tt_ctxdma_handle) { case NOUVEAU_FIFO_ENGINE_GR: - engine = NV_DEVICE_HOST_RUNLIST_ENGINES_GR; + engine = NVIF_ENGINE_GR; break; case NOUVEAU_FIFO_ENGINE_VP: - engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSPDEC; + engine = NVIF_ENGINE_MSPDEC; break; case NOUVEAU_FIFO_ENGINE_PPP: - engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSPPP; + engine = NVIF_ENGINE_MSPPP; break; case NOUVEAU_FIFO_ENGINE_BSP: - engine = NV_DEVICE_HOST_RUNLIST_ENGINES_MSVLD; + engine = NVIF_ENGINE_MSVLD; break; case NOUVEAU_FIFO_ENGINE_CE: - engine = NV_DEVICE_HOST_RUNLIST_ENGINES_CE; + engine = NVIF_ENGINE_CE; break; default: return nouveau_abi16_put(abi16, -ENOSYS); @@ -368,7 +368,7 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS) } } - if (engine != NV_DEVICE_HOST_RUNLIST_ENGINES_CE) + if (engine != NVIF_ENGINE_CE) runm = nvif_fifo_runlist(device, engine); else runm = nvif_fifo_runlist_ce(device); diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c index f9592eb0a47b..636ca1f284f8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_chan.c +++ b/drivers/gpu/drm/nouveau/nouveau_chan.c @@ -300,10 +300,12 @@ nouveau_channel_ctor(struct nouveau_cli *cli, bool priv, u64 runm, if (ret) return ret; + chan->runlist = __ffs64(runm); + /* create channel object */ args.chan.version = 0; args.chan.namelen = sizeof(args.name); - args.chan.runlist = __ffs64(runm); + args.chan.runlist = cli->drm->device.impl->fifo.runl[chan->runlist].id; args.chan.runq = 0; args.chan.priv = priv; args.chan.devm = BIT(0); @@ -350,7 +352,6 @@ nouveau_channel_ctor(struct nouveau_cli *cli, bool priv, u64 runm, return ret; } - chan->runlist = args.chan.runlist; chan->chid = args.chan.chid; chan->inst = args.chan.inst; chan->token = args.chan.token; @@ -523,46 +524,18 @@ nouveau_channels_fini(struct nouveau_drm *drm) int nouveau_channels_init(struct nouveau_drm *drm) { - struct { - struct nv_device_info_v1 m; - struct { - struct nv_device_info_v1_data channels; - struct nv_device_info_v1_data runlists; - } v; - } args = { - .m.version = 1, - .m.count = sizeof(args.v) / sizeof(args.v.channels), - .v.channels.mthd = NV_DEVICE_HOST_CHANNELS, - .v.runlists.mthd = NV_DEVICE_HOST_RUNLISTS, - }; - struct nvif_object *device = &drm->client.device.object; - int ret, i; - - ret = nvif_object_mthd(device, NV_DEVICE_V0_INFO, &args, sizeof(args)); - if (ret || - args.v.runlists.mthd == NV_DEVICE_INFO_INVALID || !args.v.runlists.data || - args.v.channels.mthd == NV_DEVICE_INFO_INVALID) - return -ENODEV; + struct nvif_device *device = &drm->device; + int i; - drm->chan_nr = drm->chan_total = args.v.channels.data; - drm->runl_nr = fls64(args.v.runlists.data); + drm->chan_nr = drm->chan_total = device->impl->fifo.chan_nr; + drm->runl_nr = device->impl->fifo.runl_nr; drm->runl = kcalloc(drm->runl_nr, sizeof(*drm->runl), GFP_KERNEL); if (!drm->runl) return -ENOMEM; if (drm->chan_nr == 0) { for (i = 0; i < drm->runl_nr; i++) { - if (!(args.v.runlists.data & BIT(i))) - continue; - - args.v.channels.mthd = NV_DEVICE_HOST_RUNLIST_CHANNELS; - args.v.channels.data = i; - - ret = nvif_object_mthd(device, NV_DEVICE_V0_INFO, &args, sizeof(args)); - if (ret || args.v.channels.mthd == NV_DEVICE_INFO_INVALID) - return -ENODEV; - - drm->runl[i].chan_nr = args.v.channels.data; + drm->runl[i].chan_nr = device->impl->fifo.runl[i].chan_nr; drm->runl[i].chan_id_base = drm->chan_total; drm->runl[i].context_base = dma_fence_context_alloc(drm->runl[i].chan_nr); diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index a37e08f0fd77..76990dde1b6a 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c @@ -295,14 +295,13 @@ nouveau_accel_ce_fini(struct nouveau_drm *drm) static void nouveau_accel_ce_init(struct nouveau_drm *drm) { - struct nvif_device *device = &drm->client.device; u64 runm; int ret = 0; /* Allocate channel that has access to a (preferably async) copy * engine, to use for TTM buffer moves. */ - runm = nvif_fifo_runlist_ce(device); + runm = nvif_fifo_runlist_ce(&drm->device); if (!runm) { NV_DEBUG(drm, "no ce runlist\n"); return; @@ -325,12 +324,12 @@ nouveau_accel_gr_fini(struct nouveau_drm *drm) static void nouveau_accel_gr_init(struct nouveau_drm *drm) { - struct nvif_device *device = &drm->client.device; + struct nvif_device *device = &drm->device; u64 runm; int ret; /* Allocate channel that has access to the graphics engine. */ - runm = nvif_fifo_runlist(device, NV_DEVICE_HOST_RUNLIST_ENGINES_GR); + runm = nvif_fifo_runlist(device, NVIF_ENGINE_GR); if (!runm) { NV_DEBUG(drm, "no gr runlist\n"); return; diff --git a/drivers/gpu/drm/nouveau/nvif/device.c b/drivers/gpu/drm/nouveau/nvif/device.c index 7c28f9764936..d4d00a757cd0 100644 --- a/drivers/gpu/drm/nouveau/nvif/device.c +++ b/drivers/gpu/drm/nouveau/nvif/device.c @@ -53,9 +53,6 @@ nvif_device_dtor(struct nvif_device *device) nvif_user_dtor(device); - kfree(device->runlist); - device->runlist = NULL; - nvif_object_unmap_cpu(&device->map); device->impl->del(device->priv); @@ -67,7 +64,6 @@ nvif_device_ctor(struct nvif_client *client, const char *name, struct nvif_devic { int ret; - device->runlist = NULL; device->user.func = NULL; ret = client->impl->device.new(client->priv, &device->impl, &device->priv, diff --git a/drivers/gpu/drm/nouveau/nvif/fifo.c b/drivers/gpu/drm/nouveau/nvif/fifo.c index a463289962b2..34e6fec0f0a3 100644 --- a/drivers/gpu/drm/nouveau/nvif/fifo.c +++ b/drivers/gpu/drm/nouveau/nvif/fifo.c @@ -21,66 +21,19 @@ */ #include <nvif/fifo.h> -static int -nvif_fifo_runlists(struct nvif_device *device) -{ - struct nvif_object *object = &device->object; - struct { - struct nv_device_info_v1 m; - struct { - struct nv_device_info_v1_data runlists; - struct nv_device_info_v1_data runlist[64]; - } v; - } *a; - int ret, i; - - if (device->runlist) - return 0; - - if (!(a = kmalloc(sizeof(*a), GFP_KERNEL))) - return -ENOMEM; - a->m.version = 1; - a->m.count = sizeof(a->v) / sizeof(a->v.runlists); - a->v.runlists.mthd = NV_DEVICE_HOST_RUNLISTS; - for (i = 0; i < ARRAY_SIZE(a->v.runlist); i++) { - a->v.runlist[i].mthd = NV_DEVICE_HOST_RUNLIST_ENGINES; - a->v.runlist[i].data = i; - } - - ret = nvif_object_mthd(object, NV_DEVICE_V0_INFO, a, sizeof(*a)); - if (ret) - goto done; - - device->runlists = fls64(a->v.runlists.data); - device->runlist = kcalloc(device->runlists, sizeof(*device->runlist), - GFP_KERNEL); - if (!device->runlist) { - ret = -ENOMEM; - goto done; - } - - for (i = 0; i < device->runlists; i++) { - if (a->v.runlist[i].mthd != NV_DEVICE_INFO_INVALID) - device->runlist[i].engines = a->v.runlist[i].data; - } - -done: - kfree(a); - return ret; -} - u64 -nvif_fifo_runlist(struct nvif_device *device, u64 engine) +nvif_fifo_runlist(struct nvif_device *device, enum nvif_engine_type type) { + const struct nvif_device_impl_fifo *impl = &device->impl->fifo; u64 runm = 0; - int ret, i; - - if ((ret = nvif_fifo_runlists(device))) - return runm; - for (i = 0; i < device->runlists; i++) { - if (device->runlist[i].engines & engine) - runm |= BIT_ULL(i); + for (int i = 0; i < impl->runl_nr; i++) { + for (int j = 0; j < impl->runl[i].engn_nr; j++) { + if (impl->engine[impl->runl[i].engn[j].engine].type == type) { + runm |= BIT_ULL(i); + continue; + } + } } return runm; diff --git a/drivers/gpu/drm/nouveau/nvkm/core/engine.c b/drivers/gpu/drm/nouveau/nvkm/core/engine.c index 36a31e9eea22..7d59a1d43a5b 100644 --- a/drivers/gpu/drm/nouveau/nvkm/core/engine.c +++ b/drivers/gpu/drm/nouveau/nvkm/core/engine.c @@ -86,17 +86,6 @@ nvkm_engine_intr(struct nvkm_subdev *subdev) engine->func->intr(engine); } -static int -nvkm_engine_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data) -{ - struct nvkm_engine *engine = nvkm_engine(subdev); - - if (engine->func->info) - return engine->func->info(engine, mthd, data); - - return -ENOSYS; -} - static int nvkm_engine_fini(struct nvkm_subdev *subdev, bool suspend) { @@ -157,7 +146,6 @@ nvkm_engine = { .oneinit = nvkm_engine_oneinit, .init = nvkm_engine_init, .fini = nvkm_engine_fini, - .info = nvkm_engine_info, .intr = nvkm_engine_intr, }; diff --git a/drivers/gpu/drm/nouveau/nvkm/core/subdev.c b/drivers/gpu/drm/nouveau/nvkm/core/subdev.c index 6c20e827a069..d8b6d0f31883 100644 --- a/drivers/gpu/drm/nouveau/nvkm/core/subdev.c +++ b/drivers/gpu/drm/nouveau/nvkm/core/subdev.c @@ -42,14 +42,6 @@ nvkm_subdev_intr(struct nvkm_subdev *subdev) subdev->func->intr(subdev); } -int -nvkm_subdev_info(struct nvkm_subdev *subdev, u64 mthd, u64 *data) -{ - if (subdev->func->info) - return subdev->func->info(subdev, mthd, data); - return -ENOSYS; -} - int nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend) { diff --git a/drivers/gpu/drm/nouveau/nvkm/device/user.c b/drivers/gpu/drm/nouveau/nvkm/device/user.c index 589cb31853e6..26ce50fc2aac 100644 --- a/drivers/gpu/drm/nouveau/nvkm/device/user.c +++ b/drivers/gpu/drm/nouveau/nvkm/device/user.c @@ -45,62 +45,6 @@ struct nvif_device_priv { struct nvif_device_impl impl; }; -static int -nvkm_udevice_info_subdev(struct nvkm_device *device, u64 mthd, u64 *data) -{ - struct nvkm_subdev *subdev; - enum nvkm_subdev_type type; - - switch (mthd & NV_DEVICE_INFO_UNIT) { - case NV_DEVICE_HOST(0): type = NVKM_ENGINE_FIFO; break; - default: - return -EINVAL; - } - - subdev = nvkm_device_subdev(device, type, 0); - if (subdev) - return nvkm_subdev_info(subdev, mthd, data); - return -ENODEV; -} - -static void -nvkm_udevice_info_v1(struct nvkm_device *device, - struct nv_device_info_v1_data *args) -{ - if (args->mthd & NV_DEVICE_INFO_UNIT) { - if (nvkm_udevice_info_subdev(device, args->mthd, &args->data)) - args->mthd = NV_DEVICE_INFO_INVALID; - return; - } - args->mthd = NV_DEVICE_INFO_INVALID; -} - -static int -nvkm_udevice_info(struct nvkm_udevice *udev, void *data, u32 size) -{ - struct nvkm_object *object = &udev->object; - struct nvkm_device *device = udev->device; - union { - struct nv_device_info_v1 v1; - } *args = data; - int ret = -ENOSYS, i; - - nvif_ioctl(object, "device info size %d\n", size); - if (!(ret = nvif_unpack(ret, &data, &size, args->v1, 1, 1, true))) { - nvif_ioctl(object, "device info vers %d count %d\n", - args->v1.version, args->v1.count); - if (args->v1.count * sizeof(args->v1.data[0]) == size) { - for (i = 0; i < args->v1.count; i++) - nvkm_udevice_info_v1(device, &args->v1.data[i]); - return 0; - } - return -EINVAL; - } else - return ret; - - return 0; -} - static int nvkm_udevice_time(struct nvkm_udevice *udev, void *data, u32 size) { @@ -140,8 +84,6 @@ nvkm_udevice_mthd(struct nvkm_object *object, u32 mthd, void *data, u32 size) struct nvif_device_priv *udev = container_of(object, typeof(*udev), object); nvif_ioctl(object, "device mthd %08x\n", mthd); switch (mthd) { - case NV_DEVICE_V0_INFO: - return nvkm_udevice_info(udev, data, size); case NV_DEVICE_V0_TIME: return nvkm_udevice_time(udev, data, size); default: diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c index 22443fe4a39f..6bd464da1c96 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c @@ -165,78 +165,6 @@ nvkm_fifo_init(struct nvkm_engine *engine) return 0; } -static int -nvkm_fifo_info(struct nvkm_engine *engine, u64 mthd, u64 *data) -{ - struct nvkm_fifo *fifo = nvkm_fifo(engine); - struct nvkm_runl *runl; - struct nvkm_engn *engn; - int ret; - - ret = nvkm_subdev_oneinit(&fifo->engine.subdev); - if (ret) - return ret; - - switch (mthd) { - case NV_DEVICE_HOST_CHANNELS: *data = fifo->chid ? fifo->chid->nr : 0; return 0; - case NV_DEVICE_HOST_RUNLISTS: - *data = 0; - nvkm_runl_foreach(runl, fifo) - *data |= BIT(runl->id); - return 0; - case NV_DEVICE_HOST_RUNLIST_ENGINES: - runl = nvkm_runl_get(fifo, *data, 0); - if (runl) { - *data = 0; - nvkm_runl_foreach_engn(engn, runl) { -#define CASE(n) case NVKM_ENGINE_##n: *data |= NV_DEVICE_HOST_RUNLIST_ENGINES_##n; break - switch (engn->engine->subdev.type) { - case NVKM_ENGINE_DMAOBJ: - break; - CASE(SW ); - CASE(GR ); - CASE(MPEG ); - CASE(ME ); - CASE(CIPHER); - CASE(BSP ); - CASE(VP ); - CASE(CE ); - CASE(SEC ); - CASE(MSVLD ); - CASE(MSPDEC); - CASE(MSPPP ); - CASE(MSENC ); - CASE(VIC ); - CASE(SEC2 ); - CASE(NVDEC ); - CASE(NVENC ); - CASE(NVJPG ); - CASE(OFA ); - default: - WARN_ON(1); - break; - } -#undef CASE - } - return 0; - } - return -EINVAL; - case NV_DEVICE_HOST_RUNLIST_CHANNELS: - if (!fifo->chid) { - runl = nvkm_runl_get(fifo, *data, 0); - if (runl) { - *data = runl->chid->nr; - return 0; - } - } - return -EINVAL; - default: - break; - } - - return -ENOSYS; -} - static int nvkm_fifo_oneinit(struct nvkm_engine *engine) { @@ -365,7 +293,6 @@ nvkm_fifo = { .dtor = nvkm_fifo_dtor, .preinit = nvkm_fifo_preinit, .oneinit = nvkm_fifo_oneinit, - .info = nvkm_fifo_info, .init = nvkm_fifo_init, .fini = nvkm_fifo_fini, .base.sclass = nvkm_fifo_class_get, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/ufifo.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/ufifo.c index 3f0bd70f614e..46f60eb0f122 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/ufifo.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/ufifo.c @@ -20,11 +20,110 @@ * DEALINGS IN THE SOFTWARE. */ #include "ufifo.h" +#include "chid.h" #include "priv.h" +#include "runl.h" void nvkm_ufifo_ctor(struct nvkm_fifo *fifo, struct nvif_device_impl_fifo *impl) { + struct nvkm_runl *runl; + struct nvkm_engn *engn; + int runi = 0; + + nvkm_runl_foreach(runl, fifo) { + bool failed_engines = false; + int engi = 0; + + nvkm_runl_foreach_engn(engn, runl) { + struct nvkm_engine *engine = engn->engine; + enum nvif_engine_type type; + int i; + + switch (engine->subdev.type) { + case NVKM_ENGINE_SW : type = NVIF_ENGINE_SW; break; + case NVKM_ENGINE_GR : type = NVIF_ENGINE_GR; break; + case NVKM_ENGINE_MPEG : type = NVIF_ENGINE_MPEG; break; + case NVKM_ENGINE_ME : type = NVIF_ENGINE_ME; break; + case NVKM_ENGINE_CIPHER: type = NVIF_ENGINE_CIPHER; break; + case NVKM_ENGINE_BSP : type = NVIF_ENGINE_BSP; break; + case NVKM_ENGINE_VP : type = NVIF_ENGINE_VP; break; + case NVKM_ENGINE_CE : type = NVIF_ENGINE_CE; break; + case NVKM_ENGINE_SEC : type = NVIF_ENGINE_SEC; break; + case NVKM_ENGINE_MSVLD : type = NVIF_ENGINE_MSVLD; break; + case NVKM_ENGINE_MSPDEC: type = NVIF_ENGINE_MSPDEC; break; + case NVKM_ENGINE_MSPPP : type = NVIF_ENGINE_MSPPP; break; + case NVKM_ENGINE_MSENC : type = NVIF_ENGINE_MSENC; break; + case NVKM_ENGINE_VIC : type = NVIF_ENGINE_VIC; break; + case NVKM_ENGINE_SEC2 : type = NVIF_ENGINE_SEC2; break; + case NVKM_ENGINE_NVDEC : type = NVIF_ENGINE_NVDEC; break; + case NVKM_ENGINE_NVENC : type = NVIF_ENGINE_NVENC; break; + case NVKM_ENGINE_NVJPG : type = NVIF_ENGINE_NVJPG; break; + case NVKM_ENGINE_OFA : type = NVIF_ENGINE_OFA; break; + default: + failed_engines = true; + WARN_ON(1); + continue; + } + + for (i = 0; i < impl->engine_nr; i++) { + if (impl->engine[i].type == type) + break; + } + + if (i == impl->engine_nr) { + int clsi = 0; + + if (WARN_ON(i >= ARRAY_SIZE(impl->engine))) { + failed_engines = true; + break; + } + + impl->engine[i].type = type; + impl->engine_nr++; + + for (;;) { + struct nvkm_oclass oclass = { .engine = engine }; + + if (engine->func->fifo.sclass) + engine->func->fifo.sclass(&oclass, clsi); + else + oclass.base = engine->func->sclass[clsi]; + if (!oclass.base.oclass) + break; + + if (WARN_ON(clsi >= ARRAY_SIZE(impl->engine[i].oclass))) + break; + + impl->engine[i].oclass[clsi++] = oclass.base.oclass; + } + + impl->engine[i].oclass_nr = clsi; + } + + engi = impl->runl[runi].engn_nr; + + if (WARN_ON(engi >= ARRAY_SIZE(impl->runl[runi].engn))) { + failed_engines = true; + break; + } + + impl->runl[runi].engn[engi].engine = i; + impl->runl[runi].engn[engi].inst = engine->subdev.inst; + impl->runl[runi].engn_nr = ++engi; + } + + if (failed_engines || + WARN_ON(runi >= ARRAY_SIZE(impl->runl))) + continue; + + impl->runl[runi].id = runl->id; + impl->runl[runi].chan_nr = runl->chid->nr; + impl->runl[runi].runq_nr = runl->runq_nr; + impl->runl[runi].engn_nr = engi; + impl->runl_nr = ++runi; + } + impl->cgrp.oclass = fifo->func->cgrp.user.oclass; impl->chan.oclass = fifo->func->chan.user.oclass; } -- 2.41.0