From 9ace404b1098221021b01c2ba0eeea0c257fa4a5 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:06 +1000 Subject: drm/nouveau/device: include core/device.h automatically for subdevs/engines Pretty much every subdev/engine is going to need access to nvkm_device shortly to touch registers and/or output messages. The odd placement of the includes is necessary to work around some inter-dependencies that currently exist. This will be fixed later. Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c | 1 - 1 file changed, 1 deletion(-) (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c') diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c index b0d7c5f40db1..5cc7dd24a213 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c @@ -23,7 +23,6 @@ */ #include "priv.h" -#include #include #include -- cgit v1.2.3 From 266f8b5ee6e98979f3251efc81451a2a2cbf2a28 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:06 +1000 Subject: drm/nouveau/devinit: cosmetic changes This is purely preparation for upcoming commits, there should be no code changes here. Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c') diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c index 5cc7dd24a213..4338e437bcc3 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c @@ -29,47 +29,47 @@ int _nvkm_devinit_fini(struct nvkm_object *object, bool suspend) { - struct nvkm_devinit *devinit = (void *)object; + struct nvkm_devinit *init = (void *)object; /* force full reinit on resume */ if (suspend) - devinit->post = true; + init->post = true; /* unlock the extended vga crtc regs */ - nv_lockvgac(devinit, false); + nv_lockvgac(init, false); - return nvkm_subdev_fini(&devinit->base, suspend); + return nvkm_subdev_fini(&init->subdev, suspend); } int _nvkm_devinit_init(struct nvkm_object *object) { struct nvkm_devinit_impl *impl = (void *)object->oclass; - struct nvkm_devinit *devinit = (void *)object; + struct nvkm_devinit *init = (void *)object; int ret; - ret = nvkm_subdev_init(&devinit->base); + ret = nvkm_subdev_init(&init->subdev); if (ret) return ret; - ret = impl->post(&devinit->base, devinit->post); + ret = impl->post(&init->subdev, init->post); if (ret) return ret; if (impl->disable) - nv_device(devinit)->disable_mask |= impl->disable(devinit); + nv_device(init)->disable_mask |= impl->disable(init); return 0; } void _nvkm_devinit_dtor(struct nvkm_object *object) { - struct nvkm_devinit *devinit = (void *)object; + struct nvkm_devinit *init = (void *)object; /* lock crtc regs */ - nv_lockvgac(devinit, true); + nv_lockvgac(init, true); - nvkm_subdev_destroy(&devinit->base); + nvkm_subdev_destroy(&init->subdev); } int @@ -78,18 +78,18 @@ nvkm_devinit_create_(struct nvkm_object *parent, struct nvkm_object *engine, { struct nvkm_devinit_impl *impl = (void *)oclass; struct nvkm_device *device = nv_device(parent); - struct nvkm_devinit *devinit; + struct nvkm_devinit *init; int ret; ret = nvkm_subdev_create_(parent, engine, oclass, 0, "DEVINIT", "init", size, pobject); - devinit = *pobject; + init = *pobject; if (ret) return ret; - devinit->post = nvkm_boolopt(device->cfgopt, "NvForcePost", false); - devinit->meminit = impl->meminit; - devinit->pll_set = impl->pll_set; - devinit->mmio = impl->mmio; + init->post = nvkm_boolopt(device->cfgopt, "NvForcePost", false); + init->meminit = impl->meminit; + init->pll_set = impl->pll_set; + init->mmio = impl->mmio; return 0; } -- cgit v1.2.3 From a8dae9fe0e8ad94de1bb2bfda90d288c1b9eb6e6 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:14 +1000 Subject: drm/nouveau/vga: require nvkm_device pointer in accessor functions Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c') diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c index 4338e437bcc3..989513fae7d5 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c @@ -36,7 +36,7 @@ _nvkm_devinit_fini(struct nvkm_object *object, bool suspend) init->post = true; /* unlock the extended vga crtc regs */ - nv_lockvgac(init, false); + nvkm_lockvgac(init->subdev.device, false); return nvkm_subdev_fini(&init->subdev, suspend); } @@ -67,7 +67,7 @@ _nvkm_devinit_dtor(struct nvkm_object *object) struct nvkm_devinit *init = (void *)object; /* lock crtc regs */ - nv_lockvgac(init, true); + nvkm_lockvgac(init->subdev.device, true); nvkm_subdev_destroy(&init->subdev); } -- cgit v1.2.3 From 3a8c3400f3e74638bedd0d2410416aa8b794c0fd Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:16 +1000 Subject: drm/nouveau/subdev: rename some functions to avoid upcoming conflicts Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c') diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c index 989513fae7d5..e5ef999adbb9 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c @@ -38,7 +38,7 @@ _nvkm_devinit_fini(struct nvkm_object *object, bool suspend) /* unlock the extended vga crtc regs */ nvkm_lockvgac(init->subdev.device, false); - return nvkm_subdev_fini(&init->subdev, suspend); + return nvkm_subdev_fini_old(&init->subdev, suspend); } int @@ -48,7 +48,7 @@ _nvkm_devinit_init(struct nvkm_object *object) struct nvkm_devinit *init = (void *)object; int ret; - ret = nvkm_subdev_init(&init->subdev); + ret = nvkm_subdev_init_old(&init->subdev); if (ret) return ret; -- cgit v1.2.3 From 151abd44c27c1562f348a99c176b078a876ebe93 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:20 +1000 Subject: drm/nouveau/devinit: convert to new-style nvkm_subdev Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c | 112 ++++++++++++++------- 1 file changed, 73 insertions(+), 39 deletions(-) (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c') diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c index e5ef999adbb9..47823f5a2cdf 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c @@ -26,70 +26,104 @@ #include #include +u32 +nvkm_devinit_mmio(struct nvkm_devinit *init, u32 addr) +{ + if (init->func->mmio) + addr = init->func->mmio(init, addr); + return addr; +} + int -_nvkm_devinit_fini(struct nvkm_object *object, bool suspend) +nvkm_devinit_pll_set(struct nvkm_devinit *init, u32 type, u32 khz) +{ + return init->func->pll_set(init, type, khz); +} + +void +nvkm_devinit_meminit(struct nvkm_devinit *init) +{ + if (init->func->meminit) + init->func->meminit(init); +} + +u64 +nvkm_devinit_disable(struct nvkm_devinit *init) { - struct nvkm_devinit *init = (void *)object; + if (init->func->disable) + return init->func->disable(init); + return 0; +} +static int +nvkm_devinit_fini(struct nvkm_subdev *subdev, bool suspend) +{ + struct nvkm_devinit *init = nvkm_devinit(subdev); /* force full reinit on resume */ if (suspend) init->post = true; + return 0; +} - /* unlock the extended vga crtc regs */ - nvkm_lockvgac(init->subdev.device, false); +static int +nvkm_devinit_preinit(struct nvkm_subdev *subdev) +{ + struct nvkm_devinit *init = nvkm_devinit(subdev); + + if (init->func->preinit) + init->func->preinit(init); - return nvkm_subdev_fini_old(&init->subdev, suspend); + /* unlock the extended vga crtc regs */ + nvkm_lockvgac(subdev->device, false); + return 0; } -int -_nvkm_devinit_init(struct nvkm_object *object) +static int +nvkm_devinit_init(struct nvkm_subdev *subdev) { - struct nvkm_devinit_impl *impl = (void *)object->oclass; - struct nvkm_devinit *init = (void *)object; + struct nvkm_devinit *init = nvkm_devinit(subdev); int ret; - ret = nvkm_subdev_init_old(&init->subdev); + ret = init->func->post(init, init->post); if (ret) return ret; - ret = impl->post(&init->subdev, init->post); - if (ret) - return ret; + if (init->func->init) + init->func->init(init); - if (impl->disable) - nv_device(init)->disable_mask |= impl->disable(init); + if (init->func->disable) + subdev->device->disable_mask |= init->func->disable(init); return 0; } -void -_nvkm_devinit_dtor(struct nvkm_object *object) +static void * +nvkm_devinit_dtor(struct nvkm_subdev *subdev) { - struct nvkm_devinit *init = (void *)object; + struct nvkm_devinit *init = nvkm_devinit(subdev); + void *data = init; - /* lock crtc regs */ - nvkm_lockvgac(init->subdev.device, true); + if (init->func->dtor) + data = init->func->dtor(init); - nvkm_subdev_destroy(&init->subdev); + /* lock crtc regs */ + nvkm_lockvgac(subdev->device, true); + return data; } -int -nvkm_devinit_create_(struct nvkm_object *parent, struct nvkm_object *engine, - struct nvkm_oclass *oclass, int size, void **pobject) -{ - struct nvkm_devinit_impl *impl = (void *)oclass; - struct nvkm_device *device = nv_device(parent); - struct nvkm_devinit *init; - int ret; - - ret = nvkm_subdev_create_(parent, engine, oclass, 0, "DEVINIT", - "init", size, pobject); - init = *pobject; - if (ret) - return ret; +static const struct nvkm_subdev_func +nvkm_devinit = { + .dtor = nvkm_devinit_dtor, + .preinit = nvkm_devinit_preinit, + .init = nvkm_devinit_init, + .fini = nvkm_devinit_fini, +}; +void +nvkm_devinit_ctor(const struct nvkm_devinit_func *func, + struct nvkm_device *device, int index, + struct nvkm_devinit *init) +{ + nvkm_subdev_ctor(&nvkm_devinit, device, index, 0, &init->subdev); + init->func = func; init->post = nvkm_boolopt(device->cfgopt, "NvForcePost", false); - init->meminit = impl->meminit; - init->pll_set = impl->pll_set; - init->mmio = impl->mmio; - return 0; } -- cgit v1.2.3 From 8de65bd0901e2ee7a485a158bfe9e4631cc00644 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 20 Aug 2015 14:54:20 +1000 Subject: drm/nouveau/devinit: run devinit scripts right after preinit This ensures we have a valid mask of disabled engines before we start trying to execute fini()/init() on the subdevs, potentially touching devices that don't exist. Signed-off-by: Ben Skeggs --- drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c') diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c index 47823f5a2cdf..5f25402f6b09 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c @@ -50,11 +50,21 @@ nvkm_devinit_meminit(struct nvkm_devinit *init) u64 nvkm_devinit_disable(struct nvkm_devinit *init) { - if (init->func->disable) + if (init && init->func->disable) return init->func->disable(init); return 0; } +int +nvkm_devinit_post(struct nvkm_devinit *init, u64 *disable) +{ + int ret = 0; + if (init && init->func->post) + ret = init->func->post(init, init->post); + *disable = nvkm_devinit_disable(init); + return ret; +} + static int nvkm_devinit_fini(struct nvkm_subdev *subdev, bool suspend) { @@ -82,17 +92,8 @@ static int nvkm_devinit_init(struct nvkm_subdev *subdev) { struct nvkm_devinit *init = nvkm_devinit(subdev); - int ret; - - ret = init->func->post(init, init->post); - if (ret) - return ret; - if (init->func->init) init->func->init(init); - - if (init->func->disable) - subdev->device->disable_mask |= init->func->disable(init); return 0; } -- cgit v1.2.3