drm/nouveau: port all engines to new engine module format
[deliverable/linux.git] / drivers / gpu / drm / nouveau / core / engine / bsp / nv84.c
index 4b809319e83193a2e6b349fd1590cb5928242f6a..66f7dfd907ee506035143513135f91345183e4d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 Red Hat Inc.
+ * Copyright 2012 Red Hat Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * Authors: Ben Skeggs
  */
 
-#include "drmP.h"
-#include "nouveau_drv.h"
-#include "nouveau_util.h"
-#include <core/ramht.h>
+#include <core/os.h>
+#include <core/class.h>
+#include <core/engctx.h>
 
-/*XXX: This stub is currently used on NV98+ also, as soon as this becomes
- *     more than just an enable/disable stub this needs to be split out to
- *     nv98_bsp.c...
- */
+#include <engine/bsp.h>
+
+struct nv84_bsp_priv {
+       struct nouveau_bsp base;
+};
 
-struct nv84_bsp_engine {
-       struct nouveau_exec_engine base;
+struct nv84_bsp_chan {
+       struct nouveau_bsp_chan base;
 };
 
+/*******************************************************************************
+ * BSP object classes
+ ******************************************************************************/
+
+static struct nouveau_oclass
+nv84_bsp_sclass[] = {
+       {},
+};
+
+/*******************************************************************************
+ * BSP context
+ ******************************************************************************/
+
 static int
-nv84_bsp_fini(struct drm_device *dev, int engine, bool suspend)
+nv84_bsp_context_ctor(struct nouveau_object *parent,
+                     struct nouveau_object *engine,
+                     struct nouveau_oclass *oclass, void *data, u32 size,
+                     struct nouveau_object **pobject)
 {
-       if (!(nv_rd32(dev, 0x000200) & 0x00008000))
-               return 0;
+       struct nv84_bsp_chan *priv;
+       int ret;
+
+       ret = nouveau_bsp_context_create(parent, engine, oclass, NULL,
+                                        0, 0, 0, &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
 
-       nv_mask(dev, 0x000200, 0x00008000, 0x00000000);
        return 0;
 }
 
+static void
+nv84_bsp_context_dtor(struct nouveau_object *object)
+{
+       struct nv84_bsp_chan *priv = (void *)object;
+       nouveau_bsp_context_destroy(&priv->base);
+}
+
 static int
-nv84_bsp_init(struct drm_device *dev, int engine)
+nv84_bsp_context_init(struct nouveau_object *object)
 {
-       nv_mask(dev, 0x000200, 0x00008000, 0x00000000);
-       nv_mask(dev, 0x000200, 0x00008000, 0x00008000);
+       struct nv84_bsp_chan *priv = (void *)object;
+       int ret;
+
+       ret = nouveau_bsp_context_init(&priv->base);
+       if (ret)
+               return ret;
+
        return 0;
 }
 
+static int
+nv84_bsp_context_fini(struct nouveau_object *object, bool suspend)
+{
+       struct nv84_bsp_chan *priv = (void *)object;
+       return nouveau_bsp_context_fini(&priv->base, suspend);
+}
+
+static struct nouveau_oclass
+nv84_bsp_cclass = {
+       .handle = NV_ENGCTX(BSP, 0x84),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv84_bsp_context_ctor,
+               .dtor = nv84_bsp_context_dtor,
+               .init = nv84_bsp_context_init,
+               .fini = nv84_bsp_context_fini,
+               .rd32 = _nouveau_bsp_context_rd32,
+               .wr32 = _nouveau_bsp_context_wr32,
+       },
+};
+
+/*******************************************************************************
+ * BSP engine/subdev functions
+ ******************************************************************************/
+
 static void
-nv84_bsp_destroy(struct drm_device *dev, int engine)
+nv84_bsp_intr(struct nouveau_subdev *subdev)
 {
-       struct nv84_bsp_engine *pbsp = nv_engine(dev, engine);
+}
 
-       NVOBJ_ENGINE_DEL(dev, BSP);
+static int
+nv84_bsp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+             struct nouveau_oclass *oclass, void *data, u32 size,
+             struct nouveau_object **pobject)
+{
+       struct nv84_bsp_priv *priv;
+       int ret;
+
+       ret = nouveau_bsp_create(parent, engine, oclass, &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
 
-       kfree(pbsp);
+       nv_subdev(priv)->unit = 0x04008000;
+       nv_subdev(priv)->intr = nv84_bsp_intr;
+       nv_engine(priv)->cclass = &nv84_bsp_cclass;
+       nv_engine(priv)->sclass = nv84_bsp_sclass;
+       return 0;
 }
 
-int
-nv84_bsp_create(struct drm_device *dev)
+static void
+nv84_bsp_dtor(struct nouveau_object *object)
 {
-       struct nv84_bsp_engine *pbsp;
+       struct nv84_bsp_priv *priv = (void *)object;
+       nouveau_bsp_destroy(&priv->base);
+}
 
-       pbsp = kzalloc(sizeof(*pbsp), GFP_KERNEL);
-       if (!pbsp)
-               return -ENOMEM;
+static int
+nv84_bsp_init(struct nouveau_object *object)
+{
+       struct nv84_bsp_priv *priv = (void *)object;
+       int ret;
 
-       pbsp->base.destroy = nv84_bsp_destroy;
-       pbsp->base.init = nv84_bsp_init;
-       pbsp->base.fini = nv84_bsp_fini;
+       ret = nouveau_bsp_init(&priv->base);
+       if (ret)
+               return ret;
 
-       NVOBJ_ENGINE_ADD(dev, BSP, &pbsp->base);
        return 0;
 }
+
+static int
+nv84_bsp_fini(struct nouveau_object *object, bool suspend)
+{
+       struct nv84_bsp_priv *priv = (void *)object;
+       return nouveau_bsp_fini(&priv->base, suspend);
+}
+
+struct nouveau_oclass
+nv84_bsp_oclass = {
+       .handle = NV_ENGINE(BSP, 0x84),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv84_bsp_ctor,
+               .dtor = nv84_bsp_dtor,
+               .init = nv84_bsp_init,
+               .fini = nv84_bsp_fini,
+       },
+};
This page took 0.025472 seconds and 5 git commands to generate.