drm/komeda: Attach scaler to drm as private object
authorjames qian wang (Arm Technology China) <james.qian.wang@arm.com>
Thu, 23 May 2019 11:09:57 +0000 (12:09 +0100)
committerLiviu Dudau <Liviu.Dudau@arm.com>
Wed, 19 Jun 2019 10:42:16 +0000 (11:42 +0100)
According to the komeda pipeline configuration, attach scaler to drm as
private object.

v2: Rebase

Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c

index d53bd6c23c5d03cdd64f70493098a206c7449b8f..bac90ab8fdc9f069a45dd9d5a41dd3880a145212 100644 (file)
@@ -60,6 +60,49 @@ static int komeda_layer_obj_add(struct komeda_kms_dev *kms,
        return 0;
 }
 
+static struct drm_private_state *
+komeda_scaler_atomic_duplicate_state(struct drm_private_obj *obj)
+{
+       struct komeda_scaler_state *st;
+
+       st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
+       if (!st)
+               return NULL;
+
+       komeda_component_state_reset(&st->base);
+       __drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
+
+       return &st->base.obj;
+}
+
+static void
+komeda_scaler_atomic_destroy_state(struct drm_private_obj *obj,
+                                  struct drm_private_state *state)
+{
+       kfree(to_scaler_st(priv_to_comp_st(state)));
+}
+
+static const struct drm_private_state_funcs komeda_scaler_obj_funcs = {
+       .atomic_duplicate_state = komeda_scaler_atomic_duplicate_state,
+       .atomic_destroy_state   = komeda_scaler_atomic_destroy_state,
+};
+
+static int komeda_scaler_obj_add(struct komeda_kms_dev *kms,
+                                struct komeda_scaler *scaler)
+{
+       struct komeda_scaler_state *st;
+
+       st = kzalloc(sizeof(*st), GFP_KERNEL);
+       if (!st)
+               return -ENOMEM;
+
+       st->base.component = &scaler->base;
+       drm_atomic_private_obj_init(&kms->base,
+                                   &scaler->base.obj, &st->base.obj,
+                                   &komeda_scaler_obj_funcs);
+       return 0;
+}
+
 static struct drm_private_state *
 komeda_compiz_atomic_duplicate_state(struct drm_private_obj *obj)
 {
@@ -258,6 +301,12 @@ int komeda_kms_add_private_objs(struct komeda_kms_dev *kms,
                                return err;
                }
 
+               for (j = 0; j < pipe->n_scalers; j++) {
+                       err = komeda_scaler_obj_add(kms, pipe->scalers[j]);
+                       if (err)
+                               return err;
+               }
+
                err = komeda_compiz_obj_add(kms, pipe->compiz);
                if (err)
                        return err;