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 <drm/drm_atomic.h> 861f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_atomic_helper.h> 961f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_plane_helper.h> 109e560309Sjames qian wang (Arm Technology China) #include <drm/drm_print.h> 1161f1c4a8Sjames qian wang (Arm Technology China) #include "komeda_dev.h" 1261f1c4a8Sjames qian wang (Arm Technology China) #include "komeda_kms.h" 1361f1c4a8Sjames qian wang (Arm Technology China) 149e560309Sjames qian wang (Arm Technology China) static int 159e560309Sjames qian wang (Arm Technology China) komeda_plane_init_data_flow(struct drm_plane_state *st, 169e560309Sjames qian wang (Arm Technology China) struct komeda_data_flow_cfg *dflow) 179e560309Sjames qian wang (Arm Technology China) { 1842b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *kplane_st = to_kplane_st(st); 199e560309Sjames qian wang (Arm Technology China) struct drm_framebuffer *fb = st->fb; 209e560309Sjames qian wang (Arm Technology China) 219e560309Sjames qian wang (Arm Technology China) memset(dflow, 0, sizeof(*dflow)); 229e560309Sjames qian wang (Arm Technology China) 239e560309Sjames qian wang (Arm Technology China) dflow->blending_zorder = st->zpos; 249e560309Sjames qian wang (Arm Technology China) 259e560309Sjames qian wang (Arm Technology China) /* if format doesn't have alpha, fix blend mode to PIXEL_NONE */ 269e560309Sjames qian wang (Arm Technology China) dflow->pixel_blend_mode = fb->format->has_alpha ? 279e560309Sjames qian wang (Arm Technology China) st->pixel_blend_mode : DRM_MODE_BLEND_PIXEL_NONE; 289e560309Sjames qian wang (Arm Technology China) dflow->layer_alpha = st->alpha >> 8; 299e560309Sjames qian wang (Arm Technology China) 309e560309Sjames qian wang (Arm Technology China) dflow->out_x = st->crtc_x; 319e560309Sjames qian wang (Arm Technology China) dflow->out_y = st->crtc_y; 329e560309Sjames qian wang (Arm Technology China) dflow->out_w = st->crtc_w; 339e560309Sjames qian wang (Arm Technology China) dflow->out_h = st->crtc_h; 349e560309Sjames qian wang (Arm Technology China) 359e560309Sjames qian wang (Arm Technology China) dflow->in_x = st->src_x >> 16; 369e560309Sjames qian wang (Arm Technology China) dflow->in_y = st->src_y >> 16; 379e560309Sjames qian wang (Arm Technology China) dflow->in_w = st->src_w >> 16; 389e560309Sjames qian wang (Arm Technology China) dflow->in_h = st->src_h >> 16; 399e560309Sjames qian wang (Arm Technology China) 4042b6f118Sjames qian wang (Arm Technology China) dflow->en_img_enhancement = kplane_st->img_enhancement; 4142b6f118Sjames qian wang (Arm Technology China) 42d92b66b8Sjames qian wang (Arm Technology China) komeda_complete_data_flow_cfg(dflow); 43502932a0Sjames qian wang (Arm Technology China) 449e560309Sjames qian wang (Arm Technology China) return 0; 459e560309Sjames qian wang (Arm Technology China) } 469e560309Sjames qian wang (Arm Technology China) 478c919745Sjames qian wang (Arm Technology China) /** 488c919745Sjames qian wang (Arm Technology China) * komeda_plane_atomic_check - build input data flow 498c919745Sjames qian wang (Arm Technology China) * @plane: DRM plane 508c919745Sjames qian wang (Arm Technology China) * @state: the plane state object 518c919745Sjames qian wang (Arm Technology China) * 528c919745Sjames qian wang (Arm Technology China) * RETURNS: 538c919745Sjames qian wang (Arm Technology China) * Zero for success or -errno 548c919745Sjames qian wang (Arm Technology China) */ 5515e9122dSjames qian wang (Arm Technology China) static int 5615e9122dSjames qian wang (Arm Technology China) komeda_plane_atomic_check(struct drm_plane *plane, 579e560309Sjames qian wang (Arm Technology China) struct drm_plane_state *state) 589e560309Sjames qian wang (Arm Technology China) { 599e560309Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 609e560309Sjames qian wang (Arm Technology China) struct komeda_plane_state *kplane_st = to_kplane_st(state); 619e560309Sjames qian wang (Arm Technology China) struct komeda_layer *layer = kplane->layer; 629e560309Sjames qian wang (Arm Technology China) struct drm_crtc_state *crtc_st; 639e560309Sjames qian wang (Arm Technology China) struct komeda_crtc_state *kcrtc_st; 649e560309Sjames qian wang (Arm Technology China) struct komeda_data_flow_cfg dflow; 659e560309Sjames qian wang (Arm Technology China) int err; 669e560309Sjames qian wang (Arm Technology China) 679e560309Sjames qian wang (Arm Technology China) if (!state->crtc || !state->fb) 689e560309Sjames qian wang (Arm Technology China) return 0; 699e560309Sjames qian wang (Arm Technology China) 709e560309Sjames qian wang (Arm Technology China) crtc_st = drm_atomic_get_crtc_state(state->state, state->crtc); 716d10dc61SDan Carpenter if (IS_ERR(crtc_st) || !crtc_st->enable) { 729e560309Sjames qian wang (Arm Technology China) DRM_DEBUG_ATOMIC("Cannot update plane on a disabled CRTC.\n"); 739e560309Sjames qian wang (Arm Technology China) return -EINVAL; 749e560309Sjames qian wang (Arm Technology China) } 759e560309Sjames qian wang (Arm Technology China) 769e560309Sjames qian wang (Arm Technology China) /* crtc is inactive, skip the resource assignment */ 779e560309Sjames qian wang (Arm Technology China) if (!crtc_st->active) 789e560309Sjames qian wang (Arm Technology China) return 0; 799e560309Sjames qian wang (Arm Technology China) 809e560309Sjames qian wang (Arm Technology China) kcrtc_st = to_kcrtc_st(crtc_st); 819e560309Sjames qian wang (Arm Technology China) 829e560309Sjames qian wang (Arm Technology China) err = komeda_plane_init_data_flow(state, &dflow); 839e560309Sjames qian wang (Arm Technology China) if (err) 849e560309Sjames qian wang (Arm Technology China) return err; 859e560309Sjames qian wang (Arm Technology China) 869e560309Sjames qian wang (Arm Technology China) err = komeda_build_layer_data_flow(layer, kplane_st, kcrtc_st, &dflow); 879e560309Sjames qian wang (Arm Technology China) 889e560309Sjames qian wang (Arm Technology China) return err; 899e560309Sjames qian wang (Arm Technology China) } 909e560309Sjames qian wang (Arm Technology China) 919e560309Sjames qian wang (Arm Technology China) /* plane doesn't represent a real HW, so there is no HW update for plane. 929e560309Sjames qian wang (Arm Technology China) * komeda handles all the HW update in crtc->atomic_flush 939e560309Sjames qian wang (Arm Technology China) */ 9415e9122dSjames qian wang (Arm Technology China) static void 9515e9122dSjames qian wang (Arm Technology China) komeda_plane_atomic_update(struct drm_plane *plane, 969e560309Sjames qian wang (Arm Technology China) struct drm_plane_state *old_state) 979e560309Sjames qian wang (Arm Technology China) { 989e560309Sjames qian wang (Arm Technology China) } 999e560309Sjames qian wang (Arm Technology China) 10061f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_plane_helper_funcs komeda_plane_helper_funcs = { 1019e560309Sjames qian wang (Arm Technology China) .atomic_check = komeda_plane_atomic_check, 1029e560309Sjames qian wang (Arm Technology China) .atomic_update = komeda_plane_atomic_update, 10361f1c4a8Sjames qian wang (Arm Technology China) }; 10461f1c4a8Sjames qian wang (Arm Technology China) 10561f1c4a8Sjames qian wang (Arm Technology China) static void komeda_plane_destroy(struct drm_plane *plane) 10661f1c4a8Sjames qian wang (Arm Technology China) { 10761f1c4a8Sjames qian wang (Arm Technology China) drm_plane_cleanup(plane); 10861f1c4a8Sjames qian wang (Arm Technology China) 10961f1c4a8Sjames qian wang (Arm Technology China) kfree(to_kplane(plane)); 11061f1c4a8Sjames qian wang (Arm Technology China) } 11161f1c4a8Sjames qian wang (Arm Technology China) 1129e560309Sjames qian wang (Arm Technology China) static void komeda_plane_reset(struct drm_plane *plane) 1139e560309Sjames qian wang (Arm Technology China) { 1149e560309Sjames qian wang (Arm Technology China) struct komeda_plane_state *state; 1159e560309Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 1169e560309Sjames qian wang (Arm Technology China) 1179e560309Sjames qian wang (Arm Technology China) if (plane->state) 1189e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_destroy_state(plane->state); 1199e560309Sjames qian wang (Arm Technology China) 1209e560309Sjames qian wang (Arm Technology China) kfree(plane->state); 1219e560309Sjames qian wang (Arm Technology China) plane->state = NULL; 1229e560309Sjames qian wang (Arm Technology China) 1239e560309Sjames qian wang (Arm Technology China) state = kzalloc(sizeof(*state), GFP_KERNEL); 1249e560309Sjames qian wang (Arm Technology China) if (state) { 1259e560309Sjames qian wang (Arm Technology China) state->base.rotation = DRM_MODE_ROTATE_0; 1269e560309Sjames qian wang (Arm Technology China) state->base.pixel_blend_mode = DRM_MODE_BLEND_PREMULTI; 1279e560309Sjames qian wang (Arm Technology China) state->base.alpha = DRM_BLEND_ALPHA_OPAQUE; 1289e560309Sjames qian wang (Arm Technology China) state->base.zpos = kplane->layer->base.id; 1299e560309Sjames qian wang (Arm Technology China) plane->state = &state->base; 1309e560309Sjames qian wang (Arm Technology China) plane->state->plane = plane; 1319e560309Sjames qian wang (Arm Technology China) } 1329e560309Sjames qian wang (Arm Technology China) } 1339e560309Sjames qian wang (Arm Technology China) 1349e560309Sjames qian wang (Arm Technology China) static struct drm_plane_state * 1359e560309Sjames qian wang (Arm Technology China) komeda_plane_atomic_duplicate_state(struct drm_plane *plane) 1369e560309Sjames qian wang (Arm Technology China) { 13742b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *new, *old; 1389e560309Sjames qian wang (Arm Technology China) 1399e560309Sjames qian wang (Arm Technology China) if (WARN_ON(!plane->state)) 1409e560309Sjames qian wang (Arm Technology China) return NULL; 1419e560309Sjames qian wang (Arm Technology China) 1429e560309Sjames qian wang (Arm Technology China) new = kzalloc(sizeof(*new), GFP_KERNEL); 1439e560309Sjames qian wang (Arm Technology China) if (!new) 1449e560309Sjames qian wang (Arm Technology China) return NULL; 1459e560309Sjames qian wang (Arm Technology China) 1469e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_duplicate_state(plane, &new->base); 1479e560309Sjames qian wang (Arm Technology China) 14842b6f118Sjames qian wang (Arm Technology China) old = to_kplane_st(plane->state); 14942b6f118Sjames qian wang (Arm Technology China) 15042b6f118Sjames qian wang (Arm Technology China) new->img_enhancement = old->img_enhancement; 15142b6f118Sjames qian wang (Arm Technology China) 1529e560309Sjames qian wang (Arm Technology China) return &new->base; 1539e560309Sjames qian wang (Arm Technology China) } 1549e560309Sjames qian wang (Arm Technology China) 1559e560309Sjames qian wang (Arm Technology China) static void 1569e560309Sjames qian wang (Arm Technology China) komeda_plane_atomic_destroy_state(struct drm_plane *plane, 1579e560309Sjames qian wang (Arm Technology China) struct drm_plane_state *state) 1589e560309Sjames qian wang (Arm Technology China) { 1599e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_destroy_state(state); 1609e560309Sjames qian wang (Arm Technology China) kfree(to_kplane_st(state)); 1619e560309Sjames qian wang (Arm Technology China) } 1629e560309Sjames qian wang (Arm Technology China) 16342b6f118Sjames qian wang (Arm Technology China) static int 16442b6f118Sjames qian wang (Arm Technology China) komeda_plane_atomic_get_property(struct drm_plane *plane, 16542b6f118Sjames qian wang (Arm Technology China) const struct drm_plane_state *state, 16642b6f118Sjames qian wang (Arm Technology China) struct drm_property *property, 16742b6f118Sjames qian wang (Arm Technology China) uint64_t *val) 16842b6f118Sjames qian wang (Arm Technology China) { 16942b6f118Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 17042b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *st = to_kplane_st(state); 17142b6f118Sjames qian wang (Arm Technology China) 17242b6f118Sjames qian wang (Arm Technology China) if (property == kplane->prop_img_enhancement) 17342b6f118Sjames qian wang (Arm Technology China) *val = st->img_enhancement; 17442b6f118Sjames qian wang (Arm Technology China) else 17542b6f118Sjames qian wang (Arm Technology China) return -EINVAL; 17642b6f118Sjames qian wang (Arm Technology China) 17742b6f118Sjames qian wang (Arm Technology China) return 0; 17842b6f118Sjames qian wang (Arm Technology China) } 17942b6f118Sjames qian wang (Arm Technology China) 18042b6f118Sjames qian wang (Arm Technology China) static int 18142b6f118Sjames qian wang (Arm Technology China) komeda_plane_atomic_set_property(struct drm_plane *plane, 18242b6f118Sjames qian wang (Arm Technology China) struct drm_plane_state *state, 18342b6f118Sjames qian wang (Arm Technology China) struct drm_property *property, 18442b6f118Sjames qian wang (Arm Technology China) uint64_t val) 18542b6f118Sjames qian wang (Arm Technology China) { 18642b6f118Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 18742b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *st = to_kplane_st(state); 18842b6f118Sjames qian wang (Arm Technology China) 18942b6f118Sjames qian wang (Arm Technology China) if (property == kplane->prop_img_enhancement) 19042b6f118Sjames qian wang (Arm Technology China) st->img_enhancement = !!val; 19142b6f118Sjames qian wang (Arm Technology China) else 19242b6f118Sjames qian wang (Arm Technology China) return -EINVAL; 19342b6f118Sjames qian wang (Arm Technology China) 19442b6f118Sjames qian wang (Arm Technology China) return 0; 19542b6f118Sjames qian wang (Arm Technology China) } 19642b6f118Sjames qian wang (Arm Technology China) 19765ad2392Sjames qian wang (Arm Technology China) static bool 19865ad2392Sjames qian wang (Arm Technology China) komeda_plane_format_mod_supported(struct drm_plane *plane, 19965ad2392Sjames qian wang (Arm Technology China) u32 format, u64 modifier) 20065ad2392Sjames qian wang (Arm Technology China) { 20165ad2392Sjames qian wang (Arm Technology China) struct komeda_dev *mdev = plane->dev->dev_private; 20265ad2392Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 20365ad2392Sjames qian wang (Arm Technology China) u32 layer_type = kplane->layer->layer_type; 20465ad2392Sjames qian wang (Arm Technology China) 20565ad2392Sjames qian wang (Arm Technology China) return komeda_format_mod_supported(&mdev->fmt_tbl, layer_type, 20665ad2392Sjames qian wang (Arm Technology China) format, modifier); 20765ad2392Sjames qian wang (Arm Technology China) } 20865ad2392Sjames qian wang (Arm Technology China) 20961f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_plane_funcs komeda_plane_funcs = { 2109e560309Sjames qian wang (Arm Technology China) .update_plane = drm_atomic_helper_update_plane, 2119e560309Sjames qian wang (Arm Technology China) .disable_plane = drm_atomic_helper_disable_plane, 2129e560309Sjames qian wang (Arm Technology China) .destroy = komeda_plane_destroy, 2139e560309Sjames qian wang (Arm Technology China) .reset = komeda_plane_reset, 2149e560309Sjames qian wang (Arm Technology China) .atomic_duplicate_state = komeda_plane_atomic_duplicate_state, 2159e560309Sjames qian wang (Arm Technology China) .atomic_destroy_state = komeda_plane_atomic_destroy_state, 21642b6f118Sjames qian wang (Arm Technology China) .atomic_get_property = komeda_plane_atomic_get_property, 21742b6f118Sjames qian wang (Arm Technology China) .atomic_set_property = komeda_plane_atomic_set_property, 21865ad2392Sjames qian wang (Arm Technology China) .format_mod_supported = komeda_plane_format_mod_supported, 21961f1c4a8Sjames qian wang (Arm Technology China) }; 22061f1c4a8Sjames qian wang (Arm Technology China) 22142b6f118Sjames qian wang (Arm Technology China) static int 22242b6f118Sjames qian wang (Arm Technology China) komeda_plane_create_layer_properties(struct komeda_plane *kplane, 22342b6f118Sjames qian wang (Arm Technology China) struct komeda_layer *layer) 22442b6f118Sjames qian wang (Arm Technology China) { 22542b6f118Sjames qian wang (Arm Technology China) struct drm_device *drm = kplane->base.dev; 22642b6f118Sjames qian wang (Arm Technology China) struct drm_plane *plane = &kplane->base; 22742b6f118Sjames qian wang (Arm Technology China) struct drm_property *prop = NULL; 22842b6f118Sjames qian wang (Arm Technology China) 22942b6f118Sjames qian wang (Arm Technology China) /* property: layer image_enhancement */ 23042b6f118Sjames qian wang (Arm Technology China) if (layer->base.supported_outputs & KOMEDA_PIPELINE_SCALERS) { 23142b6f118Sjames qian wang (Arm Technology China) prop = drm_property_create_bool(drm, DRM_MODE_PROP_ATOMIC, 23242b6f118Sjames qian wang (Arm Technology China) "img_enhancement"); 23342b6f118Sjames qian wang (Arm Technology China) if (!prop) 23442b6f118Sjames qian wang (Arm Technology China) return -ENOMEM; 23542b6f118Sjames qian wang (Arm Technology China) 23642b6f118Sjames qian wang (Arm Technology China) drm_object_attach_property(&plane->base, prop, 0); 23742b6f118Sjames qian wang (Arm Technology China) kplane->prop_img_enhancement = prop; 23842b6f118Sjames qian wang (Arm Technology China) } 23942b6f118Sjames qian wang (Arm Technology China) 24042b6f118Sjames qian wang (Arm Technology China) return 0; 24142b6f118Sjames qian wang (Arm Technology China) } 24242b6f118Sjames qian wang (Arm Technology China) 24361f1c4a8Sjames qian wang (Arm Technology China) /* for komeda, which is pipeline can be share between crtcs */ 24461f1c4a8Sjames qian wang (Arm Technology China) static u32 get_possible_crtcs(struct komeda_kms_dev *kms, 24561f1c4a8Sjames qian wang (Arm Technology China) struct komeda_pipeline *pipe) 24661f1c4a8Sjames qian wang (Arm Technology China) { 24761f1c4a8Sjames qian wang (Arm Technology China) struct komeda_crtc *crtc; 24861f1c4a8Sjames qian wang (Arm Technology China) u32 possible_crtcs = 0; 24961f1c4a8Sjames qian wang (Arm Technology China) int i; 25061f1c4a8Sjames qian wang (Arm Technology China) 25161f1c4a8Sjames qian wang (Arm Technology China) for (i = 0; i < kms->n_crtcs; i++) { 25261f1c4a8Sjames qian wang (Arm Technology China) crtc = &kms->crtcs[i]; 25361f1c4a8Sjames qian wang (Arm Technology China) 25461f1c4a8Sjames qian wang (Arm Technology China) if ((pipe == crtc->master) || (pipe == crtc->slave)) 25561f1c4a8Sjames qian wang (Arm Technology China) possible_crtcs |= BIT(i); 25661f1c4a8Sjames qian wang (Arm Technology China) } 25761f1c4a8Sjames qian wang (Arm Technology China) 25861f1c4a8Sjames qian wang (Arm Technology China) return possible_crtcs; 25961f1c4a8Sjames qian wang (Arm Technology China) } 26061f1c4a8Sjames qian wang (Arm Technology China) 26161f1c4a8Sjames qian wang (Arm Technology China) /* use Layer0 as primary */ 26261f1c4a8Sjames qian wang (Arm Technology China) static u32 get_plane_type(struct komeda_kms_dev *kms, 26361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_component *c) 26461f1c4a8Sjames qian wang (Arm Technology China) { 26561f1c4a8Sjames qian wang (Arm Technology China) bool is_primary = (c->id == KOMEDA_COMPONENT_LAYER0); 26661f1c4a8Sjames qian wang (Arm Technology China) 26761f1c4a8Sjames qian wang (Arm Technology China) return is_primary ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY; 26861f1c4a8Sjames qian wang (Arm Technology China) } 26961f1c4a8Sjames qian wang (Arm Technology China) 27061f1c4a8Sjames qian wang (Arm Technology China) static int komeda_plane_add(struct komeda_kms_dev *kms, 27161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_layer *layer) 27261f1c4a8Sjames qian wang (Arm Technology China) { 27361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_dev *mdev = kms->base.dev_private; 27461f1c4a8Sjames qian wang (Arm Technology China) struct komeda_component *c = &layer->base; 27561f1c4a8Sjames qian wang (Arm Technology China) struct komeda_plane *kplane; 27661f1c4a8Sjames qian wang (Arm Technology China) struct drm_plane *plane; 27761f1c4a8Sjames qian wang (Arm Technology China) u32 *formats, n_formats = 0; 27861f1c4a8Sjames qian wang (Arm Technology China) int err; 27961f1c4a8Sjames qian wang (Arm Technology China) 28061f1c4a8Sjames qian wang (Arm Technology China) kplane = kzalloc(sizeof(*kplane), GFP_KERNEL); 28161f1c4a8Sjames qian wang (Arm Technology China) if (!kplane) 28261f1c4a8Sjames qian wang (Arm Technology China) return -ENOMEM; 28361f1c4a8Sjames qian wang (Arm Technology China) 28461f1c4a8Sjames qian wang (Arm Technology China) plane = &kplane->base; 28561f1c4a8Sjames qian wang (Arm Technology China) kplane->layer = layer; 28661f1c4a8Sjames qian wang (Arm Technology China) 28761f1c4a8Sjames qian wang (Arm Technology China) formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl, 28861f1c4a8Sjames qian wang (Arm Technology China) layer->layer_type, &n_formats); 28961f1c4a8Sjames qian wang (Arm Technology China) 29061f1c4a8Sjames qian wang (Arm Technology China) err = drm_universal_plane_init(&kms->base, plane, 29161f1c4a8Sjames qian wang (Arm Technology China) get_possible_crtcs(kms, c->pipeline), 29261f1c4a8Sjames qian wang (Arm Technology China) &komeda_plane_funcs, 29365ad2392Sjames qian wang (Arm Technology China) formats, n_formats, komeda_supported_modifiers, 29461f1c4a8Sjames qian wang (Arm Technology China) get_plane_type(kms, c), 29561f1c4a8Sjames qian wang (Arm Technology China) "%s", c->name); 29661f1c4a8Sjames qian wang (Arm Technology China) 29761f1c4a8Sjames qian wang (Arm Technology China) komeda_put_fourcc_list(formats); 29861f1c4a8Sjames qian wang (Arm Technology China) 29961f1c4a8Sjames qian wang (Arm Technology China) if (err) 30061f1c4a8Sjames qian wang (Arm Technology China) goto cleanup; 30161f1c4a8Sjames qian wang (Arm Technology China) 30261f1c4a8Sjames qian wang (Arm Technology China) drm_plane_helper_add(plane, &komeda_plane_helper_funcs); 30361f1c4a8Sjames qian wang (Arm Technology China) 30442b6f118Sjames qian wang (Arm Technology China) err = komeda_plane_create_layer_properties(kplane, layer); 30542b6f118Sjames qian wang (Arm Technology China) if (err) 30642b6f118Sjames qian wang (Arm Technology China) goto cleanup; 30742b6f118Sjames qian wang (Arm Technology China) 30861f1c4a8Sjames qian wang (Arm Technology China) return 0; 30961f1c4a8Sjames qian wang (Arm Technology China) cleanup: 31061f1c4a8Sjames qian wang (Arm Technology China) komeda_plane_destroy(plane); 31161f1c4a8Sjames qian wang (Arm Technology China) return err; 31261f1c4a8Sjames qian wang (Arm Technology China) } 31361f1c4a8Sjames qian wang (Arm Technology China) 31461f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_planes(struct komeda_kms_dev *kms, struct komeda_dev *mdev) 31561f1c4a8Sjames qian wang (Arm Technology China) { 31661f1c4a8Sjames qian wang (Arm Technology China) struct komeda_pipeline *pipe; 31761f1c4a8Sjames qian wang (Arm Technology China) int i, j, err; 31861f1c4a8Sjames qian wang (Arm Technology China) 31961f1c4a8Sjames qian wang (Arm Technology China) for (i = 0; i < mdev->n_pipelines; i++) { 32061f1c4a8Sjames qian wang (Arm Technology China) pipe = mdev->pipelines[i]; 32161f1c4a8Sjames qian wang (Arm Technology China) 32261f1c4a8Sjames qian wang (Arm Technology China) for (j = 0; j < pipe->n_layers; j++) { 32361f1c4a8Sjames qian wang (Arm Technology China) err = komeda_plane_add(kms, pipe->layers[j]); 32461f1c4a8Sjames qian wang (Arm Technology China) if (err) 32561f1c4a8Sjames qian wang (Arm Technology China) return err; 32661f1c4a8Sjames qian wang (Arm Technology China) } 32761f1c4a8Sjames qian wang (Arm Technology China) } 32861f1c4a8Sjames qian wang (Arm Technology China) 32961f1c4a8Sjames qian wang (Arm Technology China) return 0; 33061f1c4a8Sjames qian wang (Arm Technology China) } 331