161f1c4a8Sjames qian wang (Arm Technology China) // SPDX-License-Identifier: GPL-2.0
261f1c4a8Sjames qian wang (Arm Technology China) /*
361f1c4a8Sjames qian wang (Arm Technology China)  * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
461f1c4a8Sjames qian wang (Arm Technology China)  * Author: James.Qian.Wang <james.qian.wang@arm.com>
561f1c4a8Sjames qian wang (Arm Technology China)  *
661f1c4a8Sjames qian wang (Arm Technology China)  */
761f1c4a8Sjames qian wang (Arm Technology China) #include "komeda_dev.h"
861f1c4a8Sjames qian wang (Arm Technology China) #include "komeda_kms.h"
961f1c4a8Sjames qian wang (Arm Technology China) 
10ee6b73d6Sjames qian wang (Arm Technology China) static void
komeda_component_state_reset(struct komeda_component_state * st)11ee6b73d6Sjames qian wang (Arm Technology China) komeda_component_state_reset(struct komeda_component_state *st)
12ee6b73d6Sjames qian wang (Arm Technology China) {
13ee6b73d6Sjames qian wang (Arm Technology China) 	st->binding_user = NULL;
14ee6b73d6Sjames qian wang (Arm Technology China) 	st->affected_inputs = st->active_inputs;
15ee6b73d6Sjames qian wang (Arm Technology China) 	st->active_inputs = 0;
16ee6b73d6Sjames qian wang (Arm Technology China) 	st->changed_active_inputs = 0;
17ee6b73d6Sjames qian wang (Arm Technology China) }
18ee6b73d6Sjames qian wang (Arm Technology China) 
19ee6b73d6Sjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_layer_atomic_duplicate_state(struct drm_private_obj * obj)20ee6b73d6Sjames qian wang (Arm Technology China) komeda_layer_atomic_duplicate_state(struct drm_private_obj *obj)
21ee6b73d6Sjames qian wang (Arm Technology China) {
22ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_layer_state *st;
23ee6b73d6Sjames qian wang (Arm Technology China) 
24ee6b73d6Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
25ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
26ee6b73d6Sjames qian wang (Arm Technology China) 		return NULL;
27ee6b73d6Sjames qian wang (Arm Technology China) 
28ee6b73d6Sjames qian wang (Arm Technology China) 	komeda_component_state_reset(&st->base);
29ee6b73d6Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
30ee6b73d6Sjames qian wang (Arm Technology China) 
31ee6b73d6Sjames qian wang (Arm Technology China) 	return &st->base.obj;
32ee6b73d6Sjames qian wang (Arm Technology China) }
33ee6b73d6Sjames qian wang (Arm Technology China) 
34ee6b73d6Sjames qian wang (Arm Technology China) static void
komeda_layer_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)35ee6b73d6Sjames qian wang (Arm Technology China) komeda_layer_atomic_destroy_state(struct drm_private_obj *obj,
36ee6b73d6Sjames qian wang (Arm Technology China) 				  struct drm_private_state *state)
37ee6b73d6Sjames qian wang (Arm Technology China) {
38ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_layer_state *st = to_layer_st(priv_to_comp_st(state));
39ee6b73d6Sjames qian wang (Arm Technology China) 
40ee6b73d6Sjames qian wang (Arm Technology China) 	kfree(st);
41ee6b73d6Sjames qian wang (Arm Technology China) }
42ee6b73d6Sjames qian wang (Arm Technology China) 
43ee6b73d6Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_layer_obj_funcs = {
44ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_layer_atomic_duplicate_state,
45ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_layer_atomic_destroy_state,
46ee6b73d6Sjames qian wang (Arm Technology China) };
47ee6b73d6Sjames qian wang (Arm Technology China) 
komeda_layer_obj_add(struct komeda_kms_dev * kms,struct komeda_layer * layer)48ee6b73d6Sjames qian wang (Arm Technology China) static int komeda_layer_obj_add(struct komeda_kms_dev *kms,
49ee6b73d6Sjames qian wang (Arm Technology China) 				struct komeda_layer *layer)
50ee6b73d6Sjames qian wang (Arm Technology China) {
51ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_layer_state *st;
52ee6b73d6Sjames qian wang (Arm Technology China) 
53ee6b73d6Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
54ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
55ee6b73d6Sjames qian wang (Arm Technology China) 		return -ENOMEM;
56ee6b73d6Sjames qian wang (Arm Technology China) 
57ee6b73d6Sjames qian wang (Arm Technology China) 	st->base.component = &layer->base;
58ee6b73d6Sjames qian wang (Arm Technology China) 	drm_atomic_private_obj_init(&kms->base, &layer->base.obj, &st->base.obj,
59ee6b73d6Sjames qian wang (Arm Technology China) 				    &komeda_layer_obj_funcs);
60ee6b73d6Sjames qian wang (Arm Technology China) 	return 0;
61ee6b73d6Sjames qian wang (Arm Technology China) }
62ee6b73d6Sjames qian wang (Arm Technology China) 
63ee6b73d6Sjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_scaler_atomic_duplicate_state(struct drm_private_obj * obj)647fded557Sjames qian wang (Arm Technology China) komeda_scaler_atomic_duplicate_state(struct drm_private_obj *obj)
657fded557Sjames qian wang (Arm Technology China) {
667fded557Sjames qian wang (Arm Technology China) 	struct komeda_scaler_state *st;
677fded557Sjames qian wang (Arm Technology China) 
687fded557Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
697fded557Sjames qian wang (Arm Technology China) 	if (!st)
707fded557Sjames qian wang (Arm Technology China) 		return NULL;
717fded557Sjames qian wang (Arm Technology China) 
727fded557Sjames qian wang (Arm Technology China) 	komeda_component_state_reset(&st->base);
737fded557Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
747fded557Sjames qian wang (Arm Technology China) 
757fded557Sjames qian wang (Arm Technology China) 	return &st->base.obj;
767fded557Sjames qian wang (Arm Technology China) }
777fded557Sjames qian wang (Arm Technology China) 
787fded557Sjames qian wang (Arm Technology China) static void
komeda_scaler_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)797fded557Sjames qian wang (Arm Technology China) komeda_scaler_atomic_destroy_state(struct drm_private_obj *obj,
807fded557Sjames qian wang (Arm Technology China) 				   struct drm_private_state *state)
817fded557Sjames qian wang (Arm Technology China) {
827fded557Sjames qian wang (Arm Technology China) 	kfree(to_scaler_st(priv_to_comp_st(state)));
837fded557Sjames qian wang (Arm Technology China) }
847fded557Sjames qian wang (Arm Technology China) 
857fded557Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_scaler_obj_funcs = {
867fded557Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_scaler_atomic_duplicate_state,
877fded557Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_scaler_atomic_destroy_state,
887fded557Sjames qian wang (Arm Technology China) };
897fded557Sjames qian wang (Arm Technology China) 
komeda_scaler_obj_add(struct komeda_kms_dev * kms,struct komeda_scaler * scaler)907fded557Sjames qian wang (Arm Technology China) static int komeda_scaler_obj_add(struct komeda_kms_dev *kms,
917fded557Sjames qian wang (Arm Technology China) 				 struct komeda_scaler *scaler)
927fded557Sjames qian wang (Arm Technology China) {
937fded557Sjames qian wang (Arm Technology China) 	struct komeda_scaler_state *st;
947fded557Sjames qian wang (Arm Technology China) 
957fded557Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
967fded557Sjames qian wang (Arm Technology China) 	if (!st)
977fded557Sjames qian wang (Arm Technology China) 		return -ENOMEM;
987fded557Sjames qian wang (Arm Technology China) 
997fded557Sjames qian wang (Arm Technology China) 	st->base.component = &scaler->base;
1007fded557Sjames qian wang (Arm Technology China) 	drm_atomic_private_obj_init(&kms->base,
1017fded557Sjames qian wang (Arm Technology China) 				    &scaler->base.obj, &st->base.obj,
1027fded557Sjames qian wang (Arm Technology China) 				    &komeda_scaler_obj_funcs);
1037fded557Sjames qian wang (Arm Technology China) 	return 0;
1047fded557Sjames qian wang (Arm Technology China) }
1057fded557Sjames qian wang (Arm Technology China) 
1067fded557Sjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_compiz_atomic_duplicate_state(struct drm_private_obj * obj)107ee6b73d6Sjames qian wang (Arm Technology China) komeda_compiz_atomic_duplicate_state(struct drm_private_obj *obj)
108ee6b73d6Sjames qian wang (Arm Technology China) {
109ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_compiz_state *st;
110ee6b73d6Sjames qian wang (Arm Technology China) 
111ee6b73d6Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
112ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
113ee6b73d6Sjames qian wang (Arm Technology China) 		return NULL;
114ee6b73d6Sjames qian wang (Arm Technology China) 
115ee6b73d6Sjames qian wang (Arm Technology China) 	komeda_component_state_reset(&st->base);
116ee6b73d6Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
117ee6b73d6Sjames qian wang (Arm Technology China) 
118ee6b73d6Sjames qian wang (Arm Technology China) 	return &st->base.obj;
119ee6b73d6Sjames qian wang (Arm Technology China) }
120ee6b73d6Sjames qian wang (Arm Technology China) 
121ee6b73d6Sjames qian wang (Arm Technology China) static void
komeda_compiz_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)122ee6b73d6Sjames qian wang (Arm Technology China) komeda_compiz_atomic_destroy_state(struct drm_private_obj *obj,
123ee6b73d6Sjames qian wang (Arm Technology China) 				   struct drm_private_state *state)
124ee6b73d6Sjames qian wang (Arm Technology China) {
125ee6b73d6Sjames qian wang (Arm Technology China) 	kfree(to_compiz_st(priv_to_comp_st(state)));
126ee6b73d6Sjames qian wang (Arm Technology China) }
127ee6b73d6Sjames qian wang (Arm Technology China) 
128ee6b73d6Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_compiz_obj_funcs = {
129ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_compiz_atomic_duplicate_state,
130ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_compiz_atomic_destroy_state,
131ee6b73d6Sjames qian wang (Arm Technology China) };
132ee6b73d6Sjames qian wang (Arm Technology China) 
komeda_compiz_obj_add(struct komeda_kms_dev * kms,struct komeda_compiz * compiz)133ee6b73d6Sjames qian wang (Arm Technology China) static int komeda_compiz_obj_add(struct komeda_kms_dev *kms,
134ee6b73d6Sjames qian wang (Arm Technology China) 				 struct komeda_compiz *compiz)
135ee6b73d6Sjames qian wang (Arm Technology China) {
136ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_compiz_state *st;
137ee6b73d6Sjames qian wang (Arm Technology China) 
138ee6b73d6Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
139ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
140ee6b73d6Sjames qian wang (Arm Technology China) 		return -ENOMEM;
141ee6b73d6Sjames qian wang (Arm Technology China) 
142ee6b73d6Sjames qian wang (Arm Technology China) 	st->base.component = &compiz->base;
143ee6b73d6Sjames qian wang (Arm Technology China) 	drm_atomic_private_obj_init(&kms->base, &compiz->base.obj, &st->base.obj,
144ee6b73d6Sjames qian wang (Arm Technology China) 				    &komeda_compiz_obj_funcs);
145ee6b73d6Sjames qian wang (Arm Technology China) 
146ee6b73d6Sjames qian wang (Arm Technology China) 	return 0;
147ee6b73d6Sjames qian wang (Arm Technology China) }
148ee6b73d6Sjames qian wang (Arm Technology China) 
149ee6b73d6Sjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_splitter_atomic_duplicate_state(struct drm_private_obj * obj)1504b9baf74Sjames qian wang (Arm Technology China) komeda_splitter_atomic_duplicate_state(struct drm_private_obj *obj)
1514b9baf74Sjames qian wang (Arm Technology China) {
1524b9baf74Sjames qian wang (Arm Technology China) 	struct komeda_splitter_state *st;
1534b9baf74Sjames qian wang (Arm Technology China) 
1544b9baf74Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
1554b9baf74Sjames qian wang (Arm Technology China) 	if (!st)
1564b9baf74Sjames qian wang (Arm Technology China) 		return NULL;
1574b9baf74Sjames qian wang (Arm Technology China) 
1584b9baf74Sjames qian wang (Arm Technology China) 	komeda_component_state_reset(&st->base);
1594b9baf74Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
1604b9baf74Sjames qian wang (Arm Technology China) 
1614b9baf74Sjames qian wang (Arm Technology China) 	return &st->base.obj;
1624b9baf74Sjames qian wang (Arm Technology China) }
1634b9baf74Sjames qian wang (Arm Technology China) 
1644b9baf74Sjames qian wang (Arm Technology China) static void
komeda_splitter_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)1654b9baf74Sjames qian wang (Arm Technology China) komeda_splitter_atomic_destroy_state(struct drm_private_obj *obj,
1664b9baf74Sjames qian wang (Arm Technology China) 				     struct drm_private_state *state)
1674b9baf74Sjames qian wang (Arm Technology China) {
1684b9baf74Sjames qian wang (Arm Technology China) 	kfree(to_splitter_st(priv_to_comp_st(state)));
1694b9baf74Sjames qian wang (Arm Technology China) }
1704b9baf74Sjames qian wang (Arm Technology China) 
1714b9baf74Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_splitter_obj_funcs = {
1724b9baf74Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_splitter_atomic_duplicate_state,
1734b9baf74Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_splitter_atomic_destroy_state,
1744b9baf74Sjames qian wang (Arm Technology China) };
1754b9baf74Sjames qian wang (Arm Technology China) 
komeda_splitter_obj_add(struct komeda_kms_dev * kms,struct komeda_splitter * splitter)1764b9baf74Sjames qian wang (Arm Technology China) static int komeda_splitter_obj_add(struct komeda_kms_dev *kms,
1774b9baf74Sjames qian wang (Arm Technology China) 				   struct komeda_splitter *splitter)
1784b9baf74Sjames qian wang (Arm Technology China) {
1794b9baf74Sjames qian wang (Arm Technology China) 	struct komeda_splitter_state *st;
1804b9baf74Sjames qian wang (Arm Technology China) 
1814b9baf74Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
1824b9baf74Sjames qian wang (Arm Technology China) 	if (!st)
1834b9baf74Sjames qian wang (Arm Technology China) 		return -ENOMEM;
1844b9baf74Sjames qian wang (Arm Technology China) 
1854b9baf74Sjames qian wang (Arm Technology China) 	st->base.component = &splitter->base;
1864b9baf74Sjames qian wang (Arm Technology China) 	drm_atomic_private_obj_init(&kms->base,
1874b9baf74Sjames qian wang (Arm Technology China) 				    &splitter->base.obj, &st->base.obj,
1884b9baf74Sjames qian wang (Arm Technology China) 				    &komeda_splitter_obj_funcs);
1894b9baf74Sjames qian wang (Arm Technology China) 
1904b9baf74Sjames qian wang (Arm Technology China) 	return 0;
1914b9baf74Sjames qian wang (Arm Technology China) }
1924b9baf74Sjames qian wang (Arm Technology China) 
1934b9baf74Sjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_merger_atomic_duplicate_state(struct drm_private_obj * obj)1949a28105fSjames qian wang (Arm Technology China) komeda_merger_atomic_duplicate_state(struct drm_private_obj *obj)
1959a28105fSjames qian wang (Arm Technology China) {
1969a28105fSjames qian wang (Arm Technology China) 	struct komeda_merger_state *st;
1979a28105fSjames qian wang (Arm Technology China) 
1989a28105fSjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
1999a28105fSjames qian wang (Arm Technology China) 	if (!st)
2009a28105fSjames qian wang (Arm Technology China) 		return NULL;
2019a28105fSjames qian wang (Arm Technology China) 
2029a28105fSjames qian wang (Arm Technology China) 	komeda_component_state_reset(&st->base);
2039a28105fSjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
2049a28105fSjames qian wang (Arm Technology China) 
2059a28105fSjames qian wang (Arm Technology China) 	return &st->base.obj;
2069a28105fSjames qian wang (Arm Technology China) }
2079a28105fSjames qian wang (Arm Technology China) 
komeda_merger_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)2089a28105fSjames qian wang (Arm Technology China) static void komeda_merger_atomic_destroy_state(struct drm_private_obj *obj,
2099a28105fSjames qian wang (Arm Technology China) 					       struct drm_private_state *state)
2109a28105fSjames qian wang (Arm Technology China) {
2119a28105fSjames qian wang (Arm Technology China) 	kfree(to_merger_st(priv_to_comp_st(state)));
2129a28105fSjames qian wang (Arm Technology China) }
2139a28105fSjames qian wang (Arm Technology China) 
2149a28105fSjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_merger_obj_funcs = {
2159a28105fSjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_merger_atomic_duplicate_state,
2169a28105fSjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_merger_atomic_destroy_state,
2179a28105fSjames qian wang (Arm Technology China) };
2189a28105fSjames qian wang (Arm Technology China) 
komeda_merger_obj_add(struct komeda_kms_dev * kms,struct komeda_merger * merger)2199a28105fSjames qian wang (Arm Technology China) static int komeda_merger_obj_add(struct komeda_kms_dev *kms,
2209a28105fSjames qian wang (Arm Technology China) 				 struct komeda_merger *merger)
2219a28105fSjames qian wang (Arm Technology China) {
2229a28105fSjames qian wang (Arm Technology China) 	struct komeda_merger_state *st;
2239a28105fSjames qian wang (Arm Technology China) 
2249a28105fSjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
2259a28105fSjames qian wang (Arm Technology China) 	if (!st)
2269a28105fSjames qian wang (Arm Technology China) 		return -ENOMEM;
2279a28105fSjames qian wang (Arm Technology China) 
2289a28105fSjames qian wang (Arm Technology China) 	st->base.component = &merger->base;
2299a28105fSjames qian wang (Arm Technology China) 	drm_atomic_private_obj_init(&kms->base,
2309a28105fSjames qian wang (Arm Technology China) 				    &merger->base.obj, &st->base.obj,
2319a28105fSjames qian wang (Arm Technology China) 				    &komeda_merger_obj_funcs);
2329a28105fSjames qian wang (Arm Technology China) 
2339a28105fSjames qian wang (Arm Technology China) 	return 0;
2349a28105fSjames qian wang (Arm Technology China) }
2359a28105fSjames qian wang (Arm Technology China) 
2369a28105fSjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_improc_atomic_duplicate_state(struct drm_private_obj * obj)237ee6b73d6Sjames qian wang (Arm Technology China) komeda_improc_atomic_duplicate_state(struct drm_private_obj *obj)
238ee6b73d6Sjames qian wang (Arm Technology China) {
239ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_improc_state *st;
240ee6b73d6Sjames qian wang (Arm Technology China) 
241ee6b73d6Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
242ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
243ee6b73d6Sjames qian wang (Arm Technology China) 		return NULL;
244ee6b73d6Sjames qian wang (Arm Technology China) 
245ee6b73d6Sjames qian wang (Arm Technology China) 	komeda_component_state_reset(&st->base);
246ee6b73d6Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
247ee6b73d6Sjames qian wang (Arm Technology China) 
248ee6b73d6Sjames qian wang (Arm Technology China) 	return &st->base.obj;
249ee6b73d6Sjames qian wang (Arm Technology China) }
250ee6b73d6Sjames qian wang (Arm Technology China) 
251ee6b73d6Sjames qian wang (Arm Technology China) static void
komeda_improc_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)252ee6b73d6Sjames qian wang (Arm Technology China) komeda_improc_atomic_destroy_state(struct drm_private_obj *obj,
253ee6b73d6Sjames qian wang (Arm Technology China) 				   struct drm_private_state *state)
254ee6b73d6Sjames qian wang (Arm Technology China) {
255ee6b73d6Sjames qian wang (Arm Technology China) 	kfree(to_improc_st(priv_to_comp_st(state)));
256ee6b73d6Sjames qian wang (Arm Technology China) }
257ee6b73d6Sjames qian wang (Arm Technology China) 
258ee6b73d6Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_improc_obj_funcs = {
259ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_improc_atomic_duplicate_state,
260ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_improc_atomic_destroy_state,
261ee6b73d6Sjames qian wang (Arm Technology China) };
262ee6b73d6Sjames qian wang (Arm Technology China) 
komeda_improc_obj_add(struct komeda_kms_dev * kms,struct komeda_improc * improc)263ee6b73d6Sjames qian wang (Arm Technology China) static int komeda_improc_obj_add(struct komeda_kms_dev *kms,
264ee6b73d6Sjames qian wang (Arm Technology China) 				 struct komeda_improc *improc)
265ee6b73d6Sjames qian wang (Arm Technology China) {
266ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_improc_state *st;
267ee6b73d6Sjames qian wang (Arm Technology China) 
268ee6b73d6Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
269ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
270ee6b73d6Sjames qian wang (Arm Technology China) 		return -ENOMEM;
271ee6b73d6Sjames qian wang (Arm Technology China) 
272ee6b73d6Sjames qian wang (Arm Technology China) 	st->base.component = &improc->base;
273ee6b73d6Sjames qian wang (Arm Technology China) 	drm_atomic_private_obj_init(&kms->base, &improc->base.obj, &st->base.obj,
274ee6b73d6Sjames qian wang (Arm Technology China) 				    &komeda_improc_obj_funcs);
275ee6b73d6Sjames qian wang (Arm Technology China) 
276ee6b73d6Sjames qian wang (Arm Technology China) 	return 0;
277ee6b73d6Sjames qian wang (Arm Technology China) }
278ee6b73d6Sjames qian wang (Arm Technology China) 
279ee6b73d6Sjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_timing_ctrlr_atomic_duplicate_state(struct drm_private_obj * obj)280ee6b73d6Sjames qian wang (Arm Technology China) komeda_timing_ctrlr_atomic_duplicate_state(struct drm_private_obj *obj)
281ee6b73d6Sjames qian wang (Arm Technology China) {
282ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_timing_ctrlr_state *st;
283ee6b73d6Sjames qian wang (Arm Technology China) 
284ee6b73d6Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
285ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
286ee6b73d6Sjames qian wang (Arm Technology China) 		return NULL;
287ee6b73d6Sjames qian wang (Arm Technology China) 
288ee6b73d6Sjames qian wang (Arm Technology China) 	komeda_component_state_reset(&st->base);
289ee6b73d6Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->base.obj);
290ee6b73d6Sjames qian wang (Arm Technology China) 
291ee6b73d6Sjames qian wang (Arm Technology China) 	return &st->base.obj;
292ee6b73d6Sjames qian wang (Arm Technology China) }
293ee6b73d6Sjames qian wang (Arm Technology China) 
294ee6b73d6Sjames qian wang (Arm Technology China) static void
komeda_timing_ctrlr_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)295ee6b73d6Sjames qian wang (Arm Technology China) komeda_timing_ctrlr_atomic_destroy_state(struct drm_private_obj *obj,
296ee6b73d6Sjames qian wang (Arm Technology China) 					 struct drm_private_state *state)
297ee6b73d6Sjames qian wang (Arm Technology China) {
298ee6b73d6Sjames qian wang (Arm Technology China) 	kfree(to_ctrlr_st(priv_to_comp_st(state)));
299ee6b73d6Sjames qian wang (Arm Technology China) }
300ee6b73d6Sjames qian wang (Arm Technology China) 
301ee6b73d6Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_timing_ctrlr_obj_funcs = {
302ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_timing_ctrlr_atomic_duplicate_state,
303ee6b73d6Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_timing_ctrlr_atomic_destroy_state,
304ee6b73d6Sjames qian wang (Arm Technology China) };
305ee6b73d6Sjames qian wang (Arm Technology China) 
komeda_timing_ctrlr_obj_add(struct komeda_kms_dev * kms,struct komeda_timing_ctrlr * ctrlr)306ee6b73d6Sjames qian wang (Arm Technology China) static int komeda_timing_ctrlr_obj_add(struct komeda_kms_dev *kms,
307ee6b73d6Sjames qian wang (Arm Technology China) 				       struct komeda_timing_ctrlr *ctrlr)
308ee6b73d6Sjames qian wang (Arm Technology China) {
309ee6b73d6Sjames qian wang (Arm Technology China) 	struct komeda_compiz_state *st;
310ee6b73d6Sjames qian wang (Arm Technology China) 
311ee6b73d6Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
312ee6b73d6Sjames qian wang (Arm Technology China) 	if (!st)
313ee6b73d6Sjames qian wang (Arm Technology China) 		return -ENOMEM;
314ee6b73d6Sjames qian wang (Arm Technology China) 
315ee6b73d6Sjames qian wang (Arm Technology China) 	st->base.component = &ctrlr->base;
316ee6b73d6Sjames qian wang (Arm Technology China) 	drm_atomic_private_obj_init(&kms->base, &ctrlr->base.obj, &st->base.obj,
317ee6b73d6Sjames qian wang (Arm Technology China) 				    &komeda_timing_ctrlr_obj_funcs);
318ee6b73d6Sjames qian wang (Arm Technology China) 
319ee6b73d6Sjames qian wang (Arm Technology China) 	return 0;
320ee6b73d6Sjames qian wang (Arm Technology China) }
321ee6b73d6Sjames qian wang (Arm Technology China) 
32261f1c4a8Sjames qian wang (Arm Technology China) static struct drm_private_state *
komeda_pipeline_atomic_duplicate_state(struct drm_private_obj * obj)32361f1c4a8Sjames qian wang (Arm Technology China) komeda_pipeline_atomic_duplicate_state(struct drm_private_obj *obj)
32461f1c4a8Sjames qian wang (Arm Technology China) {
32561f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline_state *st;
32661f1c4a8Sjames qian wang (Arm Technology China) 
32761f1c4a8Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
32861f1c4a8Sjames qian wang (Arm Technology China) 	if (!st)
32961f1c4a8Sjames qian wang (Arm Technology China) 		return NULL;
33061f1c4a8Sjames qian wang (Arm Technology China) 
33161f1c4a8Sjames qian wang (Arm Technology China) 	st->active_comps = 0;
33261f1c4a8Sjames qian wang (Arm Technology China) 
33361f1c4a8Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->obj);
33461f1c4a8Sjames qian wang (Arm Technology China) 
33561f1c4a8Sjames qian wang (Arm Technology China) 	return &st->obj;
33661f1c4a8Sjames qian wang (Arm Technology China) }
33761f1c4a8Sjames qian wang (Arm Technology China) 
33861f1c4a8Sjames qian wang (Arm Technology China) static void
komeda_pipeline_atomic_destroy_state(struct drm_private_obj * obj,struct drm_private_state * state)33961f1c4a8Sjames qian wang (Arm Technology China) komeda_pipeline_atomic_destroy_state(struct drm_private_obj *obj,
34061f1c4a8Sjames qian wang (Arm Technology China) 				     struct drm_private_state *state)
34161f1c4a8Sjames qian wang (Arm Technology China) {
34261f1c4a8Sjames qian wang (Arm Technology China) 	kfree(priv_to_pipe_st(state));
34361f1c4a8Sjames qian wang (Arm Technology China) }
34461f1c4a8Sjames qian wang (Arm Technology China) 
34561f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_pipeline_obj_funcs = {
34661f1c4a8Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_pipeline_atomic_duplicate_state,
34761f1c4a8Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_pipeline_atomic_destroy_state,
34861f1c4a8Sjames qian wang (Arm Technology China) };
34961f1c4a8Sjames qian wang (Arm Technology China) 
komeda_pipeline_obj_add(struct komeda_kms_dev * kms,struct komeda_pipeline * pipe)35061f1c4a8Sjames qian wang (Arm Technology China) static int komeda_pipeline_obj_add(struct komeda_kms_dev *kms,
35161f1c4a8Sjames qian wang (Arm Technology China) 				   struct komeda_pipeline *pipe)
35261f1c4a8Sjames qian wang (Arm Technology China) {
35361f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline_state *st;
35461f1c4a8Sjames qian wang (Arm Technology China) 
35561f1c4a8Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
35661f1c4a8Sjames qian wang (Arm Technology China) 	if (!st)
35761f1c4a8Sjames qian wang (Arm Technology China) 		return -ENOMEM;
35861f1c4a8Sjames qian wang (Arm Technology China) 
35961f1c4a8Sjames qian wang (Arm Technology China) 	st->pipe = pipe;
36074b7d6a9SDave Airlie 	drm_atomic_private_obj_init(&kms->base, &pipe->obj, &st->obj,
36161f1c4a8Sjames qian wang (Arm Technology China) 				    &komeda_pipeline_obj_funcs);
36261f1c4a8Sjames qian wang (Arm Technology China) 
36361f1c4a8Sjames qian wang (Arm Technology China) 	return 0;
36461f1c4a8Sjames qian wang (Arm Technology China) }
36561f1c4a8Sjames qian wang (Arm Technology China) 
komeda_kms_add_private_objs(struct komeda_kms_dev * kms,struct komeda_dev * mdev)36661f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_private_objs(struct komeda_kms_dev *kms,
36761f1c4a8Sjames qian wang (Arm Technology China) 				struct komeda_dev *mdev)
36861f1c4a8Sjames qian wang (Arm Technology China) {
36961f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline *pipe;
370ee6b73d6Sjames qian wang (Arm Technology China) 	int i, j, err;
37161f1c4a8Sjames qian wang (Arm Technology China) 
37261f1c4a8Sjames qian wang (Arm Technology China) 	for (i = 0; i < mdev->n_pipelines; i++) {
37361f1c4a8Sjames qian wang (Arm Technology China) 		pipe = mdev->pipelines[i];
37461f1c4a8Sjames qian wang (Arm Technology China) 
37561f1c4a8Sjames qian wang (Arm Technology China) 		err = komeda_pipeline_obj_add(kms, pipe);
37661f1c4a8Sjames qian wang (Arm Technology China) 		if (err)
37761f1c4a8Sjames qian wang (Arm Technology China) 			return err;
37861f1c4a8Sjames qian wang (Arm Technology China) 
379ee6b73d6Sjames qian wang (Arm Technology China) 		for (j = 0; j < pipe->n_layers; j++) {
380ee6b73d6Sjames qian wang (Arm Technology China) 			err = komeda_layer_obj_add(kms, pipe->layers[j]);
381ee6b73d6Sjames qian wang (Arm Technology China) 			if (err)
382ee6b73d6Sjames qian wang (Arm Technology China) 				return err;
383ee6b73d6Sjames qian wang (Arm Technology China) 		}
384ee6b73d6Sjames qian wang (Arm Technology China) 
3855d51f6c0Sjames qian wang (Arm Technology China) 		if (pipe->wb_layer) {
3865d51f6c0Sjames qian wang (Arm Technology China) 			err = komeda_layer_obj_add(kms, pipe->wb_layer);
3875d51f6c0Sjames qian wang (Arm Technology China) 			if (err)
3885d51f6c0Sjames qian wang (Arm Technology China) 				return err;
3895d51f6c0Sjames qian wang (Arm Technology China) 		}
3905d51f6c0Sjames qian wang (Arm Technology China) 
3917fded557Sjames qian wang (Arm Technology China) 		for (j = 0; j < pipe->n_scalers; j++) {
3927fded557Sjames qian wang (Arm Technology China) 			err = komeda_scaler_obj_add(kms, pipe->scalers[j]);
3937fded557Sjames qian wang (Arm Technology China) 			if (err)
3947fded557Sjames qian wang (Arm Technology China) 				return err;
3957fded557Sjames qian wang (Arm Technology China) 		}
3967fded557Sjames qian wang (Arm Technology China) 
397ee6b73d6Sjames qian wang (Arm Technology China) 		err = komeda_compiz_obj_add(kms, pipe->compiz);
398ee6b73d6Sjames qian wang (Arm Technology China) 		if (err)
399ee6b73d6Sjames qian wang (Arm Technology China) 			return err;
400ee6b73d6Sjames qian wang (Arm Technology China) 
4014b9baf74Sjames qian wang (Arm Technology China) 		if (pipe->splitter) {
4024b9baf74Sjames qian wang (Arm Technology China) 			err = komeda_splitter_obj_add(kms, pipe->splitter);
4034b9baf74Sjames qian wang (Arm Technology China) 			if (err)
4044b9baf74Sjames qian wang (Arm Technology China) 				return err;
4054b9baf74Sjames qian wang (Arm Technology China) 		}
4064b9baf74Sjames qian wang (Arm Technology China) 
4079a28105fSjames qian wang (Arm Technology China) 		if (pipe->merger) {
4089a28105fSjames qian wang (Arm Technology China) 			err = komeda_merger_obj_add(kms, pipe->merger);
4099a28105fSjames qian wang (Arm Technology China) 			if (err)
4109a28105fSjames qian wang (Arm Technology China) 				return err;
4119a28105fSjames qian wang (Arm Technology China) 		}
4129a28105fSjames qian wang (Arm Technology China) 
413ee6b73d6Sjames qian wang (Arm Technology China) 		err = komeda_improc_obj_add(kms, pipe->improc);
414ee6b73d6Sjames qian wang (Arm Technology China) 		if (err)
415ee6b73d6Sjames qian wang (Arm Technology China) 			return err;
416ee6b73d6Sjames qian wang (Arm Technology China) 
417ee6b73d6Sjames qian wang (Arm Technology China) 		err = komeda_timing_ctrlr_obj_add(kms, pipe->ctrlr);
418ee6b73d6Sjames qian wang (Arm Technology China) 		if (err)
419ee6b73d6Sjames qian wang (Arm Technology China) 			return err;
42061f1c4a8Sjames qian wang (Arm Technology China) 	}
42161f1c4a8Sjames qian wang (Arm Technology China) 
42261f1c4a8Sjames qian wang (Arm Technology China) 	return 0;
42361f1c4a8Sjames qian wang (Arm Technology China) }
42461f1c4a8Sjames qian wang (Arm Technology China) 
komeda_kms_cleanup_private_objs(struct komeda_kms_dev * kms)425ee6b73d6Sjames qian wang (Arm Technology China) void komeda_kms_cleanup_private_objs(struct komeda_kms_dev *kms)
42661f1c4a8Sjames qian wang (Arm Technology China) {
427ee6b73d6Sjames qian wang (Arm Technology China) 	struct drm_mode_config *config = &kms->base.mode_config;
428ee6b73d6Sjames qian wang (Arm Technology China) 	struct drm_private_obj *obj, *next;
42961f1c4a8Sjames qian wang (Arm Technology China) 
430ee6b73d6Sjames qian wang (Arm Technology China) 	list_for_each_entry_safe(obj, next, &config->privobj_list, head)
431ee6b73d6Sjames qian wang (Arm Technology China) 		drm_atomic_private_obj_fini(obj);
43261f1c4a8Sjames qian wang (Arm Technology China) }
433