diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-08-20 04:54:21 (GMT) |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-08-28 02:40:45 (GMT) |
commit | 98b20c9ab88ff4dbe5f3e239efa5a6b7818c1da7 (patch) | |
tree | 0f4435d3a405b2134ab04d898f8145437945c73a /drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c | |
parent | 53e60da43aee440d3f75000cdd269bd1324a8ad4 (diff) | |
download | linux-98b20c9ab88ff4dbe5f3e239efa5a6b7818c1da7.tar.xz |
drm/nouveau/xtensa: convert to new-style nvkm_engine
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c b/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c index fa87000..fa36233 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c @@ -51,11 +51,12 @@ nvkm_xtensa_cclass = { .bind = nvkm_xtensa_cclass_bind, }; -void -_nvkm_xtensa_intr(struct nvkm_subdev *subdev) +static void +nvkm_xtensa_intr(struct nvkm_engine *engine) { - struct nvkm_xtensa *xtensa = (void *)subdev; - struct nvkm_device *device = xtensa->engine.subdev.device; + struct nvkm_xtensa *xtensa = nvkm_xtensa(engine); + struct nvkm_subdev *subdev = &xtensa->engine.subdev; + struct nvkm_device *device = subdev->device; const u32 base = xtensa->addr; u32 unk104 = nvkm_rd32(device, base + 0xd04); u32 intr = nvkm_rd32(device, base + 0xc20); @@ -68,41 +69,29 @@ _nvkm_xtensa_intr(struct nvkm_subdev *subdev) intr = nvkm_rd32(device, base + 0xc20); if (unk104 == 0x10001 && unk10c == 0x200 && chan && !intr) { nvkm_debug(subdev, "Enabling FIFO_CTRL\n"); - nvkm_mask(device, xtensa->addr + 0xd94, 0, xtensa->fifo_val); + nvkm_mask(device, xtensa->addr + 0xd94, 0, xtensa->func->fifo_val); } } -static const struct nvkm_engine_func -nvkm_xtensa = { - .fifo.sclass = nvkm_xtensa_oclass_get, - .cclass = &nvkm_xtensa_cclass, -}; - -int -nvkm_xtensa_create_(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, u32 addr, bool enable, - const char *iname, const char *fname, - int length, void **pobject) +static int +nvkm_xtensa_fini(struct nvkm_engine *engine, bool suspend) { - struct nvkm_xtensa *xtensa; - int ret; + struct nvkm_xtensa *xtensa = nvkm_xtensa(engine); + struct nvkm_device *device = xtensa->engine.subdev.device; + const u32 base = xtensa->addr; - ret = nvkm_engine_create_(parent, engine, oclass, enable, iname, - fname, length, pobject); - xtensa = *pobject; - if (ret) - return ret; + nvkm_wr32(device, base + 0xd84, 0); /* INTR_EN */ + nvkm_wr32(device, base + 0xd94, 0); /* FIFO_CTRL */ - xtensa->engine.subdev.intr = _nvkm_xtensa_intr; - xtensa->engine.func = &nvkm_xtensa; - xtensa->addr = addr; + if (!suspend) + nvkm_memory_del(&xtensa->gpu_fw); return 0; } -int -_nvkm_xtensa_init(struct nvkm_object *object) +static int +nvkm_xtensa_init(struct nvkm_engine *engine) { - struct nvkm_xtensa *xtensa = (void *)object; + struct nvkm_xtensa *xtensa = nvkm_xtensa(engine); struct nvkm_subdev *subdev = &xtensa->engine.subdev; struct nvkm_device *device = subdev->device; const u32 base = xtensa->addr; @@ -112,10 +101,6 @@ _nvkm_xtensa_init(struct nvkm_object *object) u64 addr, size; u32 tmp; - ret = nvkm_engine_init_old(&xtensa->engine); - if (ret) - return ret; - if (!xtensa->gpu_fw) { snprintf(name, sizeof(name), "nouveau/nv84_xuc%03x", xtensa->addr >> 12); @@ -153,7 +138,7 @@ _nvkm_xtensa_init(struct nvkm_object *object) nvkm_wr32(device, base + 0xd10, 0x1fffffff); /* ?? */ nvkm_wr32(device, base + 0xd08, 0x0fffffff); /* ?? */ - nvkm_wr32(device, base + 0xd28, xtensa->unkd28); /* ?? */ + nvkm_wr32(device, base + 0xd28, xtensa->func->unkd28); /* ?? */ nvkm_wr32(device, base + 0xc20, 0x3f); /* INTR */ nvkm_wr32(device, base + 0xd84, 0x3f); /* INTR_EN */ @@ -171,18 +156,35 @@ _nvkm_xtensa_init(struct nvkm_object *object) return 0; } -int -_nvkm_xtensa_fini(struct nvkm_object *object, bool suspend) +static void * +nvkm_xtensa_dtor(struct nvkm_engine *engine) { - struct nvkm_xtensa *xtensa = (void *)object; - struct nvkm_device *device = xtensa->engine.subdev.device; - const u32 base = xtensa->addr; + return nvkm_xtensa(engine); +} - nvkm_wr32(device, base + 0xd84, 0); /* INTR_EN */ - nvkm_wr32(device, base + 0xd94, 0); /* FIFO_CTRL */ +static const struct nvkm_engine_func +nvkm_xtensa = { + .dtor = nvkm_xtensa_dtor, + .init = nvkm_xtensa_init, + .fini = nvkm_xtensa_fini, + .intr = nvkm_xtensa_intr, + .fifo.sclass = nvkm_xtensa_oclass_get, + .cclass = &nvkm_xtensa_cclass, +}; - if (!suspend) - nvkm_memory_del(&xtensa->gpu_fw); +int +nvkm_xtensa_new_(const struct nvkm_xtensa_func *func, + struct nvkm_device *device, int index, bool enable, + u32 addr, struct nvkm_engine **pengine) +{ + struct nvkm_xtensa *xtensa; + + if (!(xtensa = kzalloc(sizeof(*xtensa), GFP_KERNEL))) + return -ENOMEM; + xtensa->func = func; + xtensa->addr = addr; + *pengine = &xtensa->engine; - return nvkm_engine_fini_old(&xtensa->engine, suspend); + return nvkm_engine_ctor(&nvkm_xtensa, device, index, func->pmc_enable, + enable, &xtensa->engine); } |