drm/nouveau: port all engines to new engine module format
[linux-3.10.git] / drivers / gpu / drm / nouveau / core / engine / ppp / nv98.c
index 384de6d..50e7e0d 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>
 
-struct nv98_ppp_engine {
-       struct nouveau_exec_engine base;
+#include <engine/ppp.h>
+
+struct nv98_ppp_priv {
+       struct nouveau_ppp base;
+};
+
+struct nv98_ppp_chan {
+       struct nouveau_ppp_chan base;
 };
 
+/*******************************************************************************
+ * PPP object classes
+ ******************************************************************************/
+
+static struct nouveau_oclass
+nv98_ppp_sclass[] = {
+       {},
+};
+
+/*******************************************************************************
+ * PPPP context
+ ******************************************************************************/
+
 static int
-nv98_ppp_fini(struct drm_device *dev, int engine, bool suspend)
+nv98_ppp_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) & 0x00000002))
-               return 0;
+       struct nv98_ppp_chan *priv;
+       int ret;
+
+       ret = nouveau_ppp_context_create(parent, engine, oclass, NULL,
+                                        0, 0, 0, &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
 
-       nv_mask(dev, 0x000200, 0x00000002, 0x00000000);
        return 0;
 }
 
+static void
+nv98_ppp_context_dtor(struct nouveau_object *object)
+{
+       struct nv98_ppp_chan *priv = (void *)object;
+       nouveau_ppp_context_destroy(&priv->base);
+}
+
 static int
-nv98_ppp_init(struct drm_device *dev, int engine)
+nv98_ppp_context_init(struct nouveau_object *object)
 {
-       nv_mask(dev, 0x000200, 0x00000002, 0x00000000);
-       nv_mask(dev, 0x000200, 0x00000002, 0x00000002);
+       struct nv98_ppp_chan *priv = (void *)object;
+       int ret;
+
+       ret = nouveau_ppp_context_init(&priv->base);
+       if (ret)
+               return ret;
+
        return 0;
 }
 
+static int
+nv98_ppp_context_fini(struct nouveau_object *object, bool suspend)
+{
+       struct nv98_ppp_chan *priv = (void *)object;
+       return nouveau_ppp_context_fini(&priv->base, suspend);
+}
+
+static struct nouveau_oclass
+nv98_ppp_cclass = {
+       .handle = NV_ENGCTX(PPP, 0x98),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv98_ppp_context_ctor,
+               .dtor = nv98_ppp_context_dtor,
+               .init = nv98_ppp_context_init,
+               .fini = nv98_ppp_context_fini,
+               .rd32 = _nouveau_ppp_context_rd32,
+               .wr32 = _nouveau_ppp_context_wr32,
+       },
+};
+
+/*******************************************************************************
+ * PPPP engine/subdev functions
+ ******************************************************************************/
+
 static void
-nv98_ppp_destroy(struct drm_device *dev, int engine)
+nv98_ppp_intr(struct nouveau_subdev *subdev)
 {
-       struct nv98_ppp_engine *pppp = nv_engine(dev, engine);
+}
 
-       NVOBJ_ENGINE_DEL(dev, PPP);
+static int
+nv98_ppp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
+             struct nouveau_oclass *oclass, void *data, u32 size,
+             struct nouveau_object **pobject)
+{
+       struct nv98_ppp_priv *priv;
+       int ret;
+
+       ret = nouveau_ppp_create(parent, engine, oclass, &priv);
+       *pobject = nv_object(priv);
+       if (ret)
+               return ret;
 
-       kfree(pppp);
+       nv_subdev(priv)->unit = 0x00400002;
+       nv_subdev(priv)->intr = nv98_ppp_intr;
+       nv_engine(priv)->cclass = &nv98_ppp_cclass;
+       nv_engine(priv)->sclass = nv98_ppp_sclass;
+       return 0;
 }
 
-int
-nv98_ppp_create(struct drm_device *dev)
+static void
+nv98_ppp_dtor(struct nouveau_object *object)
 {
-       struct nv98_ppp_engine *pppp;
+       struct nv98_ppp_priv *priv = (void *)object;
+       nouveau_ppp_destroy(&priv->base);
+}
 
-       pppp = kzalloc(sizeof(*pppp), GFP_KERNEL);
-       if (!pppp)
-               return -ENOMEM;
+static int
+nv98_ppp_init(struct nouveau_object *object)
+{
+       struct nv98_ppp_priv *priv = (void *)object;
+       int ret;
 
-       pppp->base.destroy = nv98_ppp_destroy;
-       pppp->base.init = nv98_ppp_init;
-       pppp->base.fini = nv98_ppp_fini;
+       ret = nouveau_ppp_init(&priv->base);
+       if (ret)
+               return ret;
 
-       NVOBJ_ENGINE_ADD(dev, PPP, &pppp->base);
        return 0;
 }
+
+static int
+nv98_ppp_fini(struct nouveau_object *object, bool suspend)
+{
+       struct nv98_ppp_priv *priv = (void *)object;
+       return nouveau_ppp_fini(&priv->base, suspend);
+}
+
+struct nouveau_oclass
+nv98_ppp_oclass = {
+       .handle = NV_ENGINE(PPP, 0x98),
+       .ofuncs = &(struct nouveau_ofuncs) {
+               .ctor = nv98_ppp_ctor,
+               .dtor = nv98_ppp_dtor,
+               .init = nv98_ppp_init,
+               .fini = nv98_ppp_fini,
+       },
+};