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