drm/nouveau/gr/gf100-: subclass nvkm_object to store channel pointer
authorBen Skeggs <bskeggs@redhat.com>
Tue, 15 Dec 2015 09:22:49 +0000 (19:22 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 11 Jan 2016 01:17:40 +0000 (11:17 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c

index 3c6effbf19d630f4bf38508fb6a617899db93a84..414521b438f7ac73a6c3df646f0478c3162936ae 100644 (file)
@@ -140,6 +140,12 @@ gf100_gr_zbc_depth_get(struct gf100_gr *gr, int format,
 /*******************************************************************************
  * Graphics object classes
  ******************************************************************************/
+#define gf100_gr_object(p) container_of((p), struct gf100_gr_object, object)
+
+struct gf100_gr_object {
+       struct nvkm_object object;
+       struct gf100_gr_chan *chan;
+};
 
 static int
 gf100_fermi_mthd_zbc_color(struct nvkm_object *object, void *data, u32 size)
@@ -258,6 +264,27 @@ gf100_gr_mthd_sw(struct nvkm_device *device, u16 class, u32 mthd, u32 data)
        return false;
 }
 
+static const struct nvkm_object_func
+gf100_gr_object_func = {
+};
+
+static int
+gf100_gr_object_new(const struct nvkm_oclass *oclass, void *data, u32 size,
+                   struct nvkm_object **pobject)
+{
+       struct gf100_gr_chan *chan = gf100_gr_chan(oclass->parent);
+       struct gf100_gr_object *object;
+
+       if (!(object = kzalloc(sizeof(*object), GFP_KERNEL)))
+               return -ENOMEM;
+       *pobject = &object->object;
+
+       nvkm_object_ctor(oclass->base.func ? oclass->base.func :
+                        &gf100_gr_object_func, oclass, &object->object);
+       object->chan = chan;
+       return 0;
+}
+
 static int
 gf100_gr_object_get(struct nvkm_gr *base, int index, struct nvkm_sclass *sclass)
 {
@@ -267,6 +294,7 @@ gf100_gr_object_get(struct nvkm_gr *base, int index, struct nvkm_sclass *sclass)
        while (gr->func->sclass[c].oclass) {
                if (c++ == index) {
                        *sclass = gr->func->sclass[index];
+                       sclass->ctor = gf100_gr_object_new;
                        return index;
                }
        }