These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / nouveau / nvkm / subdev / devinit / base.c
index b0d7c5f..5f25402 100644 (file)
  */
 #include "priv.h"
 
-#include <core/device.h>
 #include <core/option.h>
 #include <subdev/vga.h>
 
-int
-_nvkm_devinit_fini(struct nvkm_object *object, bool suspend)
+u32
+nvkm_devinit_mmio(struct nvkm_devinit *init, u32 addr)
 {
-       struct nvkm_devinit *devinit = (void *)object;
+       if (init->func->mmio)
+               addr = init->func->mmio(init, addr);
+       return addr;
+}
 
-       /* force full reinit on resume */
-       if (suspend)
-               devinit->post = true;
+int
+nvkm_devinit_pll_set(struct nvkm_devinit *init, u32 type, u32 khz)
+{
+       return init->func->pll_set(init, type, khz);
+}
 
-       /* unlock the extended vga crtc regs */
-       nv_lockvgac(devinit, false);
+void
+nvkm_devinit_meminit(struct nvkm_devinit *init)
+{
+       if (init->func->meminit)
+               init->func->meminit(init);
+}
 
-       return nvkm_subdev_fini(&devinit->base, suspend);
+u64
+nvkm_devinit_disable(struct nvkm_devinit *init)
+{
+       if (init && init->func->disable)
+               return init->func->disable(init);
+       return 0;
 }
 
 int
-_nvkm_devinit_init(struct nvkm_object *object)
+nvkm_devinit_post(struct nvkm_devinit *init, u64 *disable)
 {
-       struct nvkm_devinit_impl *impl = (void *)object->oclass;
-       struct nvkm_devinit *devinit = (void *)object;
-       int ret;
+       int ret = 0;
+       if (init && init->func->post)
+               ret = init->func->post(init, init->post);
+       *disable = nvkm_devinit_disable(init);
+       return ret;
+}
 
-       ret = nvkm_subdev_init(&devinit->base);
-       if (ret)
-               return ret;
+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;
+}
+
+static int
+nvkm_devinit_preinit(struct nvkm_subdev *subdev)
+{
+       struct nvkm_devinit *init = nvkm_devinit(subdev);
 
-       ret = impl->post(&devinit->base, devinit->post);
-       if (ret)
-               return ret;
+       if (init->func->preinit)
+               init->func->preinit(init);
 
-       if (impl->disable)
-               nv_device(devinit)->disable_mask |= impl->disable(devinit);
+       /* unlock the extended vga crtc regs */
+       nvkm_lockvgac(subdev->device, false);
        return 0;
 }
 
-void
-_nvkm_devinit_dtor(struct nvkm_object *object)
+static int
+nvkm_devinit_init(struct nvkm_subdev *subdev)
+{
+       struct nvkm_devinit *init = nvkm_devinit(subdev);
+       if (init->func->init)
+               init->func->init(init);
+       return 0;
+}
+
+static void *
+nvkm_devinit_dtor(struct nvkm_subdev *subdev)
 {
-       struct nvkm_devinit *devinit = (void *)object;
+       struct nvkm_devinit *init = nvkm_devinit(subdev);
+       void *data = init;
 
-       /* lock crtc regs */
-       nv_lockvgac(devinit, true);
+       if (init->func->dtor)
+               data = init->func->dtor(init);
 
-       nvkm_subdev_destroy(&devinit->base);
+       /* 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)
+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)
 {
-       struct nvkm_devinit_impl *impl = (void *)oclass;
-       struct nvkm_device *device = nv_device(parent);
-       struct nvkm_devinit *devinit;
-       int ret;
-
-       ret = nvkm_subdev_create_(parent, engine, oclass, 0, "DEVINIT",
-                                 "init", size, pobject);
-       devinit = *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;
-       return 0;
+       nvkm_subdev_ctor(&nvkm_devinit, device, index, 0, &init->subdev);
+       init->func = func;
+       init->post = nvkm_boolopt(device->cfgopt, "NvForcePost", false);
 }