diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/engine/ce')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.c | 122 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/ce/gm204.c | 123 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/ce/priv.h | 7 |
5 files changed, 53 insertions, 207 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c index e45c6d703c00..6b36b86f858f 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.c @@ -21,7 +21,7 @@ * * Authors: Ben Skeggs */ -#include <engine/ce.h> +#include "priv.h" #include "fuc/gf100.fuc3.h" #include <nvif/class.h> diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.c index f35677b87d29..5de21a2ebb9a 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.c @@ -21,121 +21,47 @@ * * Authors: Ben Skeggs */ -#include <engine/ce.h> -#include <engine/fifo.h> +#include "priv.h" #include <nvif/class.h> -static void -gk104_ce_intr(struct nvkm_subdev *subdev) +void +gk104_ce_intr(struct nvkm_engine *ce) { + const u32 base = (ce->subdev.index - NVDEV_ENGINE_CE0) * 0x1000; + struct nvkm_subdev *subdev = &ce->subdev; struct nvkm_device *device = subdev->device; - const int idx = nv_subidx(subdev) - NVDEV_ENGINE_CE0; - u32 stat = nvkm_rd32(device, 0x104908 + (idx * 0x1000)); - + u32 stat = nvkm_rd32(device, 0x104908 + base); if (stat) { nvkm_warn(subdev, "intr %08x\n", stat); - nvkm_wr32(device, 0x104908 + (idx * 0x1000), stat); + nvkm_wr32(device, 0x104908 + base, stat); } } static const struct nvkm_engine_func gk104_ce = { + .intr = gk104_ce_intr, .sclass = { { -1, -1, KEPLER_DMA_COPY_A }, {} } }; -static int -gk104_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) -{ - struct nvkm_engine *ce; - int ret; - - ret = nvkm_engine_create(parent, engine, oclass, true, - "PCE0", "ce0", &ce); - *pobject = nv_object(ce); - if (ret) - return ret; - - ce->func = &gk104_ce; - nv_subdev(ce)->unit = 0x00000040; - nv_subdev(ce)->intr = gk104_ce_intr; - return 0; -} - -static int -gk104_ce1_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) -{ - struct nvkm_engine *ce; - int ret; - - ret = nvkm_engine_create(parent, engine, oclass, true, - "PCE1", "ce1", &ce); - *pobject = nv_object(ce); - if (ret) - return ret; - - ce->func = &gk104_ce; - nv_subdev(ce)->unit = 0x00000080; - nv_subdev(ce)->intr = gk104_ce_intr; - return 0; -} - -static int -gk104_ce2_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) +int +gk104_ce_new(struct nvkm_device *device, int index, + struct nvkm_engine **pengine) { - struct nvkm_engine *ce; - int ret; - - ret = nvkm_engine_create(parent, engine, oclass, true, - "PCE2", "ce2", &ce); - *pobject = nv_object(ce); - if (ret) - return ret; - - ce->func = &gk104_ce; - nv_subdev(ce)->unit = 0x00200000; - nv_subdev(ce)->intr = gk104_ce_intr; - return 0; + if (index == NVDEV_ENGINE_CE0) { + return nvkm_engine_new_(&gk104_ce, device, index, + 0x00000040, true, pengine); + } else + if (index == NVDEV_ENGINE_CE1) { + return nvkm_engine_new_(&gk104_ce, device, index, + 0x00000080, true, pengine); + } else + if (index == NVDEV_ENGINE_CE2) { + return nvkm_engine_new_(&gk104_ce, device, index, + 0x00200000, true, pengine); + } + return -ENODEV; } - -struct nvkm_oclass -gk104_ce0_oclass = { - .handle = NV_ENGINE(CE0, 0xe0), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = gk104_ce0_ctor, - .dtor = _nvkm_engine_dtor, - .init = _nvkm_engine_init, - .fini = _nvkm_engine_fini, - }, -}; - -struct nvkm_oclass -gk104_ce1_oclass = { - .handle = NV_ENGINE(CE1, 0xe0), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = gk104_ce1_ctor, - .dtor = _nvkm_engine_dtor, - .init = _nvkm_engine_init, - .fini = _nvkm_engine_fini, - }, -}; - -struct nvkm_oclass -gk104_ce2_oclass = { - .handle = NV_ENGINE(CE2, 0xe0), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = gk104_ce2_ctor, - .dtor = _nvkm_engine_dtor, - .init = _nvkm_engine_init, - .fini = _nvkm_engine_fini, - }, -}; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gm204.c b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gm204.c index cb8faea1db74..e89c44cb23e1 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gm204.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gm204.c @@ -21,121 +21,34 @@ * * Authors: Ben Skeggs */ -#include <engine/ce.h> -#include <engine/fifo.h> +#include "priv.h" #include <nvif/class.h> -static void -gm204_ce_intr(struct nvkm_subdev *subdev) -{ - struct nvkm_device *device = subdev->device; - const int idx = nv_subidx(subdev) - NVDEV_ENGINE_CE0; - u32 stat = nvkm_rd32(device, 0x104908 + (idx * 0x1000)); - - if (stat) { - nvkm_warn(subdev, "intr %08x\n", stat); - nvkm_wr32(device, 0x104908 + (idx * 0x1000), stat); - } -} - static const struct nvkm_engine_func gm204_ce = { + .intr = gk104_ce_intr, .sclass = { { -1, -1, MAXWELL_DMA_COPY_A }, {} } }; -static int -gm204_ce0_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) -{ - struct nvkm_engine *ce; - int ret; - - ret = nvkm_engine_create(parent, engine, oclass, true, - "PCE0", "ce0", &ce); - *pobject = nv_object(ce); - if (ret) - return ret; - - ce->func = &gm204_ce; - nv_subdev(ce)->unit = 0x00000040; - nv_subdev(ce)->intr = gm204_ce_intr; - return 0; -} - -static int -gm204_ce1_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) -{ - struct nvkm_engine *ce; - int ret; - - ret = nvkm_engine_create(parent, engine, oclass, true, - "PCE1", "ce1", &ce); - *pobject = nv_object(ce); - if (ret) - return ret; - - ce->func = &gm204_ce; - nv_subdev(ce)->unit = 0x00000080; - nv_subdev(ce)->intr = gm204_ce_intr; - return 0; -} - -static int -gm204_ce2_ctor(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, void *data, u32 size, - struct nvkm_object **pobject) +int +gm204_ce_new(struct nvkm_device *device, int index, + struct nvkm_engine **pengine) { - struct nvkm_engine *ce; - int ret; - - ret = nvkm_engine_create(parent, engine, oclass, true, - "PCE2", "ce2", &ce); - *pobject = nv_object(ce); - if (ret) - return ret; - - ce->func = &gm204_ce; - nv_subdev(ce)->unit = 0x00200000; - nv_subdev(ce)->intr = gm204_ce_intr; - return 0; + if (index == NVDEV_ENGINE_CE0) { + return nvkm_engine_new_(&gm204_ce, device, index, + 0x00000040, true, pengine); + } else + if (index == NVDEV_ENGINE_CE1) { + return nvkm_engine_new_(&gm204_ce, device, index, + 0x00000080, true, pengine); + } else + if (index == NVDEV_ENGINE_CE2) { + return nvkm_engine_new_(&gm204_ce, device, index, + 0x00200000, true, pengine); + } + return -ENODEV; } - -struct nvkm_oclass -gm204_ce0_oclass = { - .handle = NV_ENGINE(CE0, 0x24), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = gm204_ce0_ctor, - .dtor = _nvkm_engine_dtor, - .init = _nvkm_engine_init, - .fini = _nvkm_engine_fini, - }, -}; - -struct nvkm_oclass -gm204_ce1_oclass = { - .handle = NV_ENGINE(CE1, 0x24), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = gm204_ce1_ctor, - .dtor = _nvkm_engine_dtor, - .init = _nvkm_engine_init, - .fini = _nvkm_engine_fini, - }, -}; - -struct nvkm_oclass -gm204_ce2_oclass = { - .handle = NV_ENGINE(CE2, 0x24), - .ofuncs = &(struct nvkm_ofuncs) { - .ctor = gm204_ce2_ctor, - .dtor = _nvkm_engine_dtor, - .init = _nvkm_engine_init, - .fini = _nvkm_engine_fini, - }, -}; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c index f8223d696598..764b46751eb9 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c @@ -21,12 +21,12 @@ * * Authors: Ben Skeggs */ -#include <engine/ce.h> -#include <engine/fifo.h> +#include "priv.h" #include "fuc/gt215.fuc3.h" #include <core/client.h> #include <core/enum.h> +#include <engine/fifo.h> #include <nvif/class.h> @@ -43,7 +43,7 @@ gt215_ce_intr(struct nvkm_falcon *ce, struct nvkm_fifo_chan *chan) { struct nvkm_subdev *subdev = &ce->engine.subdev; struct nvkm_device *device = subdev->device; - const u32 base = (nv_subidx(subdev) - NVDEV_ENGINE_CE0) * 0x1000; + const u32 base = (subdev->index - NVDEV_ENGINE_CE0) * 0x1000; u32 ssta = nvkm_rd32(device, 0x104040 + base) & 0x0000ffff; u32 addr = nvkm_rd32(device, 0x104040 + base) >> 16; u32 mthd = (addr & 0x07ff) << 2; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/ce/priv.h b/drivers/gpu/drm/nouveau/nvkm/engine/ce/priv.h new file mode 100644 index 000000000000..e2fa8b161943 --- /dev/null +++ b/drivers/gpu/drm/nouveau/nvkm/engine/ce/priv.h @@ -0,0 +1,7 @@ +#ifndef __NVKM_CE_PRIV_H__ +#define __NVKM_CE_PRIV_H__ +#include <engine/ce.h> + +void gt215_ce_intr(struct nvkm_falcon *, struct nvkm_fifo_chan *); +void gk104_ce_intr(struct nvkm_engine *); +#endif |