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) 
1061f1c4a8Sjames qian wang (Arm Technology China) static struct drm_private_state *
1161f1c4a8Sjames qian wang (Arm Technology China) komeda_pipeline_atomic_duplicate_state(struct drm_private_obj *obj)
1261f1c4a8Sjames qian wang (Arm Technology China) {
1361f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline_state *st;
1461f1c4a8Sjames qian wang (Arm Technology China) 
1561f1c4a8Sjames qian wang (Arm Technology China) 	st = kmemdup(obj->state, sizeof(*st), GFP_KERNEL);
1661f1c4a8Sjames qian wang (Arm Technology China) 	if (!st)
1761f1c4a8Sjames qian wang (Arm Technology China) 		return NULL;
1861f1c4a8Sjames qian wang (Arm Technology China) 
1961f1c4a8Sjames qian wang (Arm Technology China) 	st->active_comps = 0;
2061f1c4a8Sjames qian wang (Arm Technology China) 
2161f1c4a8Sjames qian wang (Arm Technology China) 	__drm_atomic_helper_private_obj_duplicate_state(obj, &st->obj);
2261f1c4a8Sjames qian wang (Arm Technology China) 
2361f1c4a8Sjames qian wang (Arm Technology China) 	return &st->obj;
2461f1c4a8Sjames qian wang (Arm Technology China) }
2561f1c4a8Sjames qian wang (Arm Technology China) 
2661f1c4a8Sjames qian wang (Arm Technology China) static void
2761f1c4a8Sjames qian wang (Arm Technology China) komeda_pipeline_atomic_destroy_state(struct drm_private_obj *obj,
2861f1c4a8Sjames qian wang (Arm Technology China) 				     struct drm_private_state *state)
2961f1c4a8Sjames qian wang (Arm Technology China) {
3061f1c4a8Sjames qian wang (Arm Technology China) 	kfree(priv_to_pipe_st(state));
3161f1c4a8Sjames qian wang (Arm Technology China) }
3261f1c4a8Sjames qian wang (Arm Technology China) 
3361f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_private_state_funcs komeda_pipeline_obj_funcs = {
3461f1c4a8Sjames qian wang (Arm Technology China) 	.atomic_duplicate_state	= komeda_pipeline_atomic_duplicate_state,
3561f1c4a8Sjames qian wang (Arm Technology China) 	.atomic_destroy_state	= komeda_pipeline_atomic_destroy_state,
3661f1c4a8Sjames qian wang (Arm Technology China) };
3761f1c4a8Sjames qian wang (Arm Technology China) 
3861f1c4a8Sjames qian wang (Arm Technology China) static int komeda_pipeline_obj_add(struct komeda_kms_dev *kms,
3961f1c4a8Sjames qian wang (Arm Technology China) 				   struct komeda_pipeline *pipe)
4061f1c4a8Sjames qian wang (Arm Technology China) {
4161f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline_state *st;
4261f1c4a8Sjames qian wang (Arm Technology China) 
4361f1c4a8Sjames qian wang (Arm Technology China) 	st = kzalloc(sizeof(*st), GFP_KERNEL);
4461f1c4a8Sjames qian wang (Arm Technology China) 	if (!st)
4561f1c4a8Sjames qian wang (Arm Technology China) 		return -ENOMEM;
4661f1c4a8Sjames qian wang (Arm Technology China) 
4761f1c4a8Sjames qian wang (Arm Technology China) 	st->pipe = pipe;
4874b7d6a9SDave Airlie 	drm_atomic_private_obj_init(&kms->base, &pipe->obj, &st->obj,
4961f1c4a8Sjames qian wang (Arm Technology China) 				    &komeda_pipeline_obj_funcs);
5061f1c4a8Sjames qian wang (Arm Technology China) 
5161f1c4a8Sjames qian wang (Arm Technology China) 	return 0;
5261f1c4a8Sjames qian wang (Arm Technology China) }
5361f1c4a8Sjames qian wang (Arm Technology China) 
5461f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_private_objs(struct komeda_kms_dev *kms,
5561f1c4a8Sjames qian wang (Arm Technology China) 				struct komeda_dev *mdev)
5661f1c4a8Sjames qian wang (Arm Technology China) {
5761f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline *pipe;
5861f1c4a8Sjames qian wang (Arm Technology China) 	int i, err;
5961f1c4a8Sjames qian wang (Arm Technology China) 
6061f1c4a8Sjames qian wang (Arm Technology China) 	for (i = 0; i < mdev->n_pipelines; i++) {
6161f1c4a8Sjames qian wang (Arm Technology China) 		pipe = mdev->pipelines[i];
6261f1c4a8Sjames qian wang (Arm Technology China) 
6361f1c4a8Sjames qian wang (Arm Technology China) 		err = komeda_pipeline_obj_add(kms, pipe);
6461f1c4a8Sjames qian wang (Arm Technology China) 		if (err)
6561f1c4a8Sjames qian wang (Arm Technology China) 			return err;
6661f1c4a8Sjames qian wang (Arm Technology China) 
6761f1c4a8Sjames qian wang (Arm Technology China) 		/* Add component */
6861f1c4a8Sjames qian wang (Arm Technology China) 	}
6961f1c4a8Sjames qian wang (Arm Technology China) 
7061f1c4a8Sjames qian wang (Arm Technology China) 	return 0;
7161f1c4a8Sjames qian wang (Arm Technology China) }
7261f1c4a8Sjames qian wang (Arm Technology China) 
7361f1c4a8Sjames qian wang (Arm Technology China) void komeda_kms_cleanup_private_objs(struct komeda_dev *mdev)
7461f1c4a8Sjames qian wang (Arm Technology China) {
7561f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline *pipe;
7661f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_component *c;
7761f1c4a8Sjames qian wang (Arm Technology China) 	int i, id;
7861f1c4a8Sjames qian wang (Arm Technology China) 
7961f1c4a8Sjames qian wang (Arm Technology China) 	for (i = 0; i < mdev->n_pipelines; i++) {
8061f1c4a8Sjames qian wang (Arm Technology China) 		pipe = mdev->pipelines[i];
8161f1c4a8Sjames qian wang (Arm Technology China) 		dp_for_each_set_bit(id, pipe->avail_comps) {
8261f1c4a8Sjames qian wang (Arm Technology China) 			c = komeda_pipeline_get_component(pipe, id);
8361f1c4a8Sjames qian wang (Arm Technology China) 
8461f1c4a8Sjames qian wang (Arm Technology China) 			drm_atomic_private_obj_fini(&c->obj);
8561f1c4a8Sjames qian wang (Arm Technology China) 		}
8661f1c4a8Sjames qian wang (Arm Technology China) 		drm_atomic_private_obj_fini(&pipe->obj);
8761f1c4a8Sjames qian wang (Arm Technology China) 	}
8861f1c4a8Sjames qian wang (Arm Technology China) }
89