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" 13429bfabeSLowry Li (Arm Technology China) #include "komeda_framebuffer.h" 1461f1c4a8Sjames qian wang (Arm Technology China) 159e560309Sjames qian wang (Arm Technology China) static int 169e560309Sjames qian wang (Arm Technology China) komeda_plane_init_data_flow(struct drm_plane_state *st, 173b9dfa4eSLowry Li (Arm Technology China) struct komeda_crtc_state *kcrtc_st, 189e560309Sjames qian wang (Arm Technology China) struct komeda_data_flow_cfg *dflow) 199e560309Sjames qian wang (Arm Technology China) { 203b9dfa4eSLowry Li (Arm Technology China) struct komeda_plane *kplane = to_kplane(st->plane); 219e560309Sjames qian wang (Arm Technology China) struct drm_framebuffer *fb = st->fb; 22429bfabeSLowry Li (Arm Technology China) const struct komeda_format_caps *caps = to_kfb(fb)->format_caps; 233b9dfa4eSLowry Li (Arm Technology China) struct komeda_pipeline *pipe = kplane->layer->base.pipeline; 249e560309Sjames qian wang (Arm Technology China) 259e560309Sjames qian wang (Arm Technology China) memset(dflow, 0, sizeof(*dflow)); 269e560309Sjames qian wang (Arm Technology China) 27109bd7d5SLowry Li (Arm Technology China) dflow->blending_zorder = st->normalized_zpos; 283b9dfa4eSLowry Li (Arm Technology China) if (pipe == to_kcrtc(st->crtc)->master) 293b9dfa4eSLowry Li (Arm Technology China) dflow->blending_zorder -= kcrtc_st->max_slave_zorder; 303b9dfa4eSLowry Li (Arm Technology China) if (dflow->blending_zorder < 0) { 313b9dfa4eSLowry Li (Arm Technology China) DRM_DEBUG_ATOMIC("%s zorder:%d < max_slave_zorder: %d.\n", 323b9dfa4eSLowry Li (Arm Technology China) st->plane->name, st->normalized_zpos, 333b9dfa4eSLowry Li (Arm Technology China) kcrtc_st->max_slave_zorder); 343b9dfa4eSLowry Li (Arm Technology China) return -EINVAL; 353b9dfa4eSLowry Li (Arm Technology China) } 363b9dfa4eSLowry Li (Arm Technology China) 37b35d0927Sjames qian wang (Arm Technology China) dflow->pixel_blend_mode = st->pixel_blend_mode; 389e560309Sjames qian wang (Arm Technology China) dflow->layer_alpha = st->alpha >> 8; 399e560309Sjames qian wang (Arm Technology China) 409e560309Sjames qian wang (Arm Technology China) dflow->out_x = st->crtc_x; 419e560309Sjames qian wang (Arm Technology China) dflow->out_y = st->crtc_y; 429e560309Sjames qian wang (Arm Technology China) dflow->out_w = st->crtc_w; 439e560309Sjames qian wang (Arm Technology China) dflow->out_h = st->crtc_h; 449e560309Sjames qian wang (Arm Technology China) 459e560309Sjames qian wang (Arm Technology China) dflow->in_x = st->src_x >> 16; 469e560309Sjames qian wang (Arm Technology China) dflow->in_y = st->src_y >> 16; 479e560309Sjames qian wang (Arm Technology China) dflow->in_w = st->src_w >> 16; 489e560309Sjames qian wang (Arm Technology China) dflow->in_h = st->src_h >> 16; 499e560309Sjames qian wang (Arm Technology China) 50429bfabeSLowry Li (Arm Technology China) dflow->rot = drm_rotation_simplify(st->rotation, caps->supported_rots); 51429bfabeSLowry Li (Arm Technology China) if (!has_bits(dflow->rot, caps->supported_rots)) { 5292f1d09cSSakari Ailus DRM_DEBUG_ATOMIC("rotation(0x%x) isn't supported by %p4cc with modifier: 0x%llx.\n", 5392f1d09cSSakari Ailus dflow->rot, &caps->fourcc, fb->modifier); 54429bfabeSLowry Li (Arm Technology China) return -EINVAL; 55429bfabeSLowry Li (Arm Technology China) } 56429bfabeSLowry Li (Arm Technology China) 571930c112Sjames qian wang (Arm Technology China) komeda_complete_data_flow_cfg(kplane->layer, dflow, fb); 58502932a0Sjames qian wang (Arm Technology China) 599e560309Sjames qian wang (Arm Technology China) return 0; 609e560309Sjames qian wang (Arm Technology China) } 619e560309Sjames qian wang (Arm Technology China) 628c919745Sjames qian wang (Arm Technology China) /** 638c919745Sjames qian wang (Arm Technology China) * komeda_plane_atomic_check - build input data flow 648c919745Sjames qian wang (Arm Technology China) * @plane: DRM plane 658c919745Sjames qian wang (Arm Technology China) * @state: the plane state object 668c919745Sjames qian wang (Arm Technology China) * 678c919745Sjames qian wang (Arm Technology China) * RETURNS: 688c919745Sjames qian wang (Arm Technology China) * Zero for success or -errno 698c919745Sjames qian wang (Arm Technology China) */ 7015e9122dSjames qian wang (Arm Technology China) static int 7115e9122dSjames qian wang (Arm Technology China) komeda_plane_atomic_check(struct drm_plane *plane, 727c11b99aSMaxime Ripard struct drm_atomic_state *state) 739e560309Sjames qian wang (Arm Technology China) { 747c11b99aSMaxime Ripard struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, 757c11b99aSMaxime Ripard plane); 769e560309Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 77ba5c1649SMaxime Ripard struct komeda_plane_state *kplane_st = to_kplane_st(new_plane_state); 789e560309Sjames qian wang (Arm Technology China) struct komeda_layer *layer = kplane->layer; 799e560309Sjames qian wang (Arm Technology China) struct drm_crtc_state *crtc_st; 809e560309Sjames qian wang (Arm Technology China) struct komeda_crtc_state *kcrtc_st; 819e560309Sjames qian wang (Arm Technology China) struct komeda_data_flow_cfg dflow; 829e560309Sjames qian wang (Arm Technology China) int err; 839e560309Sjames qian wang (Arm Technology China) 84ba5c1649SMaxime Ripard if (!new_plane_state->crtc || !new_plane_state->fb) 859e560309Sjames qian wang (Arm Technology China) return 0; 869e560309Sjames qian wang (Arm Technology China) 87dec92020SMaxime Ripard crtc_st = drm_atomic_get_crtc_state(state, 88ba5c1649SMaxime Ripard new_plane_state->crtc); 896d10dc61SDan Carpenter if (IS_ERR(crtc_st) || !crtc_st->enable) { 909e560309Sjames qian wang (Arm Technology China) DRM_DEBUG_ATOMIC("Cannot update plane on a disabled CRTC.\n"); 919e560309Sjames qian wang (Arm Technology China) return -EINVAL; 929e560309Sjames qian wang (Arm Technology China) } 939e560309Sjames qian wang (Arm Technology China) 949e560309Sjames qian wang (Arm Technology China) /* crtc is inactive, skip the resource assignment */ 959e560309Sjames qian wang (Arm Technology China) if (!crtc_st->active) 969e560309Sjames qian wang (Arm Technology China) return 0; 979e560309Sjames qian wang (Arm Technology China) 989e560309Sjames qian wang (Arm Technology China) kcrtc_st = to_kcrtc_st(crtc_st); 999e560309Sjames qian wang (Arm Technology China) 100ba5c1649SMaxime Ripard err = komeda_plane_init_data_flow(new_plane_state, kcrtc_st, &dflow); 1019e560309Sjames qian wang (Arm Technology China) if (err) 1029e560309Sjames qian wang (Arm Technology China) return err; 1039e560309Sjames qian wang (Arm Technology China) 104a407a650Sjames qian wang (Arm Technology China) if (dflow.en_split) 105a407a650Sjames qian wang (Arm Technology China) err = komeda_build_layer_split_data_flow(layer, 106a407a650Sjames qian wang (Arm Technology China) kplane_st, kcrtc_st, &dflow); 107a407a650Sjames qian wang (Arm Technology China) else 108a407a650Sjames qian wang (Arm Technology China) err = komeda_build_layer_data_flow(layer, 109a407a650Sjames qian wang (Arm Technology China) kplane_st, kcrtc_st, &dflow); 1109e560309Sjames qian wang (Arm Technology China) 1119e560309Sjames qian wang (Arm Technology China) return err; 1129e560309Sjames qian wang (Arm Technology China) } 1139e560309Sjames qian wang (Arm Technology China) 1149e560309Sjames qian wang (Arm Technology China) /* plane doesn't represent a real HW, so there is no HW update for plane. 1159e560309Sjames qian wang (Arm Technology China) * komeda handles all the HW update in crtc->atomic_flush 1169e560309Sjames qian wang (Arm Technology China) */ 11715e9122dSjames qian wang (Arm Technology China) static void 11815e9122dSjames qian wang (Arm Technology China) komeda_plane_atomic_update(struct drm_plane *plane, 119977697e2SMaxime Ripard struct drm_atomic_state *state) 1209e560309Sjames qian wang (Arm Technology China) { 1219e560309Sjames qian wang (Arm Technology China) } 1229e560309Sjames qian wang (Arm Technology China) 12361f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_plane_helper_funcs komeda_plane_helper_funcs = { 1249e560309Sjames qian wang (Arm Technology China) .atomic_check = komeda_plane_atomic_check, 1259e560309Sjames qian wang (Arm Technology China) .atomic_update = komeda_plane_atomic_update, 12661f1c4a8Sjames qian wang (Arm Technology China) }; 12761f1c4a8Sjames qian wang (Arm Technology China) 12861f1c4a8Sjames qian wang (Arm Technology China) static void komeda_plane_destroy(struct drm_plane *plane) 12961f1c4a8Sjames qian wang (Arm Technology China) { 13061f1c4a8Sjames qian wang (Arm Technology China) drm_plane_cleanup(plane); 13161f1c4a8Sjames qian wang (Arm Technology China) 13261f1c4a8Sjames qian wang (Arm Technology China) kfree(to_kplane(plane)); 13361f1c4a8Sjames qian wang (Arm Technology China) } 13461f1c4a8Sjames qian wang (Arm Technology China) 1359e560309Sjames qian wang (Arm Technology China) static void komeda_plane_reset(struct drm_plane *plane) 1369e560309Sjames qian wang (Arm Technology China) { 1379e560309Sjames qian wang (Arm Technology China) struct komeda_plane_state *state; 1389e560309Sjames qian wang (Arm Technology China) 1399e560309Sjames qian wang (Arm Technology China) if (plane->state) 1409e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_destroy_state(plane->state); 1419e560309Sjames qian wang (Arm Technology China) 1429e560309Sjames qian wang (Arm Technology China) kfree(plane->state); 1439e560309Sjames qian wang (Arm Technology China) plane->state = NULL; 1449e560309Sjames qian wang (Arm Technology China) 1459e560309Sjames qian wang (Arm Technology China) state = kzalloc(sizeof(*state), GFP_KERNEL); 146e026f288SMaxime Ripard if (state) 1478a0982b6SMaxime Ripard __drm_atomic_helper_plane_reset(plane, &state->base); 1489e560309Sjames qian wang (Arm Technology China) } 1499e560309Sjames qian wang (Arm Technology China) 1509e560309Sjames qian wang (Arm Technology China) static struct drm_plane_state * 1519e560309Sjames qian wang (Arm Technology China) komeda_plane_atomic_duplicate_state(struct drm_plane *plane) 1529e560309Sjames qian wang (Arm Technology China) { 153513be333SYueHaibing struct komeda_plane_state *new; 1549e560309Sjames qian wang (Arm Technology China) 1559e560309Sjames qian wang (Arm Technology China) if (WARN_ON(!plane->state)) 1569e560309Sjames qian wang (Arm Technology China) return NULL; 1579e560309Sjames qian wang (Arm Technology China) 1589e560309Sjames qian wang (Arm Technology China) new = kzalloc(sizeof(*new), GFP_KERNEL); 1599e560309Sjames qian wang (Arm Technology China) if (!new) 1609e560309Sjames qian wang (Arm Technology China) return NULL; 1619e560309Sjames qian wang (Arm Technology China) 1629e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_duplicate_state(plane, &new->base); 1639e560309Sjames qian wang (Arm Technology China) 1649e560309Sjames qian wang (Arm Technology China) return &new->base; 1659e560309Sjames qian wang (Arm Technology China) } 1669e560309Sjames qian wang (Arm Technology China) 1679e560309Sjames qian wang (Arm Technology China) static void 1689e560309Sjames qian wang (Arm Technology China) komeda_plane_atomic_destroy_state(struct drm_plane *plane, 1699e560309Sjames qian wang (Arm Technology China) struct drm_plane_state *state) 1709e560309Sjames qian wang (Arm Technology China) { 1719e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_destroy_state(state); 1729e560309Sjames qian wang (Arm Technology China) kfree(to_kplane_st(state)); 1739e560309Sjames qian wang (Arm Technology China) } 1749e560309Sjames qian wang (Arm Technology China) 17565ad2392Sjames qian wang (Arm Technology China) static bool 17665ad2392Sjames qian wang (Arm Technology China) komeda_plane_format_mod_supported(struct drm_plane *plane, 17765ad2392Sjames qian wang (Arm Technology China) u32 format, u64 modifier) 17865ad2392Sjames qian wang (Arm Technology China) { 17965ad2392Sjames qian wang (Arm Technology China) struct komeda_dev *mdev = plane->dev->dev_private; 18065ad2392Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 18165ad2392Sjames qian wang (Arm Technology China) u32 layer_type = kplane->layer->layer_type; 18265ad2392Sjames qian wang (Arm Technology China) 18365ad2392Sjames qian wang (Arm Technology China) return komeda_format_mod_supported(&mdev->fmt_tbl, layer_type, 18419358630SLowry Li (Arm Technology China) format, modifier, 0); 18565ad2392Sjames qian wang (Arm Technology China) } 18665ad2392Sjames qian wang (Arm Technology China) 18761f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_plane_funcs komeda_plane_funcs = { 1889e560309Sjames qian wang (Arm Technology China) .update_plane = drm_atomic_helper_update_plane, 1899e560309Sjames qian wang (Arm Technology China) .disable_plane = drm_atomic_helper_disable_plane, 1909e560309Sjames qian wang (Arm Technology China) .destroy = komeda_plane_destroy, 1919e560309Sjames qian wang (Arm Technology China) .reset = komeda_plane_reset, 1929e560309Sjames qian wang (Arm Technology China) .atomic_duplicate_state = komeda_plane_atomic_duplicate_state, 1939e560309Sjames qian wang (Arm Technology China) .atomic_destroy_state = komeda_plane_atomic_destroy_state, 19465ad2392Sjames qian wang (Arm Technology China) .format_mod_supported = komeda_plane_format_mod_supported, 19561f1c4a8Sjames qian wang (Arm Technology China) }; 19661f1c4a8Sjames qian wang (Arm Technology China) 19761f1c4a8Sjames qian wang (Arm Technology China) /* for komeda, which is pipeline can be share between crtcs */ 19861f1c4a8Sjames qian wang (Arm Technology China) static u32 get_possible_crtcs(struct komeda_kms_dev *kms, 19961f1c4a8Sjames qian wang (Arm Technology China) struct komeda_pipeline *pipe) 20061f1c4a8Sjames qian wang (Arm Technology China) { 20161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_crtc *crtc; 20261f1c4a8Sjames qian wang (Arm Technology China) u32 possible_crtcs = 0; 20361f1c4a8Sjames qian wang (Arm Technology China) int i; 20461f1c4a8Sjames qian wang (Arm Technology China) 20561f1c4a8Sjames qian wang (Arm Technology China) for (i = 0; i < kms->n_crtcs; i++) { 20661f1c4a8Sjames qian wang (Arm Technology China) crtc = &kms->crtcs[i]; 20761f1c4a8Sjames qian wang (Arm Technology China) 20861f1c4a8Sjames qian wang (Arm Technology China) if ((pipe == crtc->master) || (pipe == crtc->slave)) 20961f1c4a8Sjames qian wang (Arm Technology China) possible_crtcs |= BIT(i); 21061f1c4a8Sjames qian wang (Arm Technology China) } 21161f1c4a8Sjames qian wang (Arm Technology China) 21261f1c4a8Sjames qian wang (Arm Technology China) return possible_crtcs; 21361f1c4a8Sjames qian wang (Arm Technology China) } 21461f1c4a8Sjames qian wang (Arm Technology China) 2153b9dfa4eSLowry Li (Arm Technology China) static void 2163b9dfa4eSLowry Li (Arm Technology China) komeda_set_crtc_plane_mask(struct komeda_kms_dev *kms, 2173b9dfa4eSLowry Li (Arm Technology China) struct komeda_pipeline *pipe, 2183b9dfa4eSLowry Li (Arm Technology China) struct drm_plane *plane) 2193b9dfa4eSLowry Li (Arm Technology China) { 2203b9dfa4eSLowry Li (Arm Technology China) struct komeda_crtc *kcrtc; 2213b9dfa4eSLowry Li (Arm Technology China) int i; 2223b9dfa4eSLowry Li (Arm Technology China) 2233b9dfa4eSLowry Li (Arm Technology China) for (i = 0; i < kms->n_crtcs; i++) { 2243b9dfa4eSLowry Li (Arm Technology China) kcrtc = &kms->crtcs[i]; 2253b9dfa4eSLowry Li (Arm Technology China) 2263b9dfa4eSLowry Li (Arm Technology China) if (pipe == kcrtc->slave) 2273b9dfa4eSLowry Li (Arm Technology China) kcrtc->slave_planes |= BIT(drm_plane_index(plane)); 2283b9dfa4eSLowry Li (Arm Technology China) } 2293b9dfa4eSLowry Li (Arm Technology China) } 2303b9dfa4eSLowry Li (Arm Technology China) 23161f1c4a8Sjames qian wang (Arm Technology China) /* use Layer0 as primary */ 23261f1c4a8Sjames qian wang (Arm Technology China) static u32 get_plane_type(struct komeda_kms_dev *kms, 23361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_component *c) 23461f1c4a8Sjames qian wang (Arm Technology China) { 23561f1c4a8Sjames qian wang (Arm Technology China) bool is_primary = (c->id == KOMEDA_COMPONENT_LAYER0); 23661f1c4a8Sjames qian wang (Arm Technology China) 23761f1c4a8Sjames qian wang (Arm Technology China) return is_primary ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY; 23861f1c4a8Sjames qian wang (Arm Technology China) } 23961f1c4a8Sjames qian wang (Arm Technology China) 24061f1c4a8Sjames qian wang (Arm Technology China) static int komeda_plane_add(struct komeda_kms_dev *kms, 24161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_layer *layer) 24261f1c4a8Sjames qian wang (Arm Technology China) { 24361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_dev *mdev = kms->base.dev_private; 24461f1c4a8Sjames qian wang (Arm Technology China) struct komeda_component *c = &layer->base; 24561f1c4a8Sjames qian wang (Arm Technology China) struct komeda_plane *kplane; 24661f1c4a8Sjames qian wang (Arm Technology China) struct drm_plane *plane; 24761f1c4a8Sjames qian wang (Arm Technology China) u32 *formats, n_formats = 0; 24861f1c4a8Sjames qian wang (Arm Technology China) int err; 24961f1c4a8Sjames qian wang (Arm Technology China) 25061f1c4a8Sjames qian wang (Arm Technology China) kplane = kzalloc(sizeof(*kplane), GFP_KERNEL); 25161f1c4a8Sjames qian wang (Arm Technology China) if (!kplane) 25261f1c4a8Sjames qian wang (Arm Technology China) return -ENOMEM; 25361f1c4a8Sjames qian wang (Arm Technology China) 25461f1c4a8Sjames qian wang (Arm Technology China) plane = &kplane->base; 25561f1c4a8Sjames qian wang (Arm Technology China) kplane->layer = layer; 25661f1c4a8Sjames qian wang (Arm Technology China) 25761f1c4a8Sjames qian wang (Arm Technology China) formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl, 25861f1c4a8Sjames qian wang (Arm Technology China) layer->layer_type, &n_formats); 259*f5e284bbSZhou Qingyang if (!formats) { 260*f5e284bbSZhou Qingyang kfree(kplane); 261*f5e284bbSZhou Qingyang return -ENOMEM; 262*f5e284bbSZhou Qingyang } 26361f1c4a8Sjames qian wang (Arm Technology China) 26461f1c4a8Sjames qian wang (Arm Technology China) err = drm_universal_plane_init(&kms->base, plane, 26561f1c4a8Sjames qian wang (Arm Technology China) get_possible_crtcs(kms, c->pipeline), 26661f1c4a8Sjames qian wang (Arm Technology China) &komeda_plane_funcs, 26765ad2392Sjames qian wang (Arm Technology China) formats, n_formats, komeda_supported_modifiers, 26861f1c4a8Sjames qian wang (Arm Technology China) get_plane_type(kms, c), 26961f1c4a8Sjames qian wang (Arm Technology China) "%s", c->name); 27061f1c4a8Sjames qian wang (Arm Technology China) 27161f1c4a8Sjames qian wang (Arm Technology China) komeda_put_fourcc_list(formats); 27261f1c4a8Sjames qian wang (Arm Technology China) 27361f1c4a8Sjames qian wang (Arm Technology China) if (err) 27461f1c4a8Sjames qian wang (Arm Technology China) goto cleanup; 27561f1c4a8Sjames qian wang (Arm Technology China) 27661f1c4a8Sjames qian wang (Arm Technology China) drm_plane_helper_add(plane, &komeda_plane_helper_funcs); 27761f1c4a8Sjames qian wang (Arm Technology China) 278429bfabeSLowry Li (Arm Technology China) err = drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0, 279429bfabeSLowry Li (Arm Technology China) layer->supported_rots); 280429bfabeSLowry Li (Arm Technology China) if (err) 281429bfabeSLowry Li (Arm Technology China) goto cleanup; 282429bfabeSLowry Li (Arm Technology China) 28362ffc393SLowry Li (Arm Technology China) err = drm_plane_create_alpha_property(plane); 28462ffc393SLowry Li (Arm Technology China) if (err) 28562ffc393SLowry Li (Arm Technology China) goto cleanup; 28662ffc393SLowry Li (Arm Technology China) 28762ffc393SLowry Li (Arm Technology China) err = drm_plane_create_blend_mode_property(plane, 28862ffc393SLowry Li (Arm Technology China) BIT(DRM_MODE_BLEND_PIXEL_NONE) | 28962ffc393SLowry Li (Arm Technology China) BIT(DRM_MODE_BLEND_PREMULTI) | 29062ffc393SLowry Li (Arm Technology China) BIT(DRM_MODE_BLEND_COVERAGE)); 29162ffc393SLowry Li (Arm Technology China) if (err) 29262ffc393SLowry Li (Arm Technology China) goto cleanup; 29362ffc393SLowry Li (Arm Technology China) 2949682dee9SLowry Li (Arm Technology China) err = drm_plane_create_color_properties(plane, 2959682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_BT601) | 2969682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_BT709) | 2979682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_BT2020), 2989682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | 2999682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_FULL_RANGE), 3009682dee9SLowry Li (Arm Technology China) DRM_COLOR_YCBCR_BT601, 3019682dee9SLowry Li (Arm Technology China) DRM_COLOR_YCBCR_LIMITED_RANGE); 3029682dee9SLowry Li (Arm Technology China) if (err) 3039682dee9SLowry Li (Arm Technology China) goto cleanup; 3049682dee9SLowry Li (Arm Technology China) 305109bd7d5SLowry Li (Arm Technology China) err = drm_plane_create_zpos_property(plane, layer->base.id, 0, 8); 306109bd7d5SLowry Li (Arm Technology China) if (err) 307109bd7d5SLowry Li (Arm Technology China) goto cleanup; 308109bd7d5SLowry Li (Arm Technology China) 3093b9dfa4eSLowry Li (Arm Technology China) komeda_set_crtc_plane_mask(kms, c->pipeline, plane); 3103b9dfa4eSLowry Li (Arm Technology China) 31161f1c4a8Sjames qian wang (Arm Technology China) return 0; 31261f1c4a8Sjames qian wang (Arm Technology China) cleanup: 31361f1c4a8Sjames qian wang (Arm Technology China) komeda_plane_destroy(plane); 31461f1c4a8Sjames qian wang (Arm Technology China) return err; 31561f1c4a8Sjames qian wang (Arm Technology China) } 31661f1c4a8Sjames qian wang (Arm Technology China) 31761f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_planes(struct komeda_kms_dev *kms, struct komeda_dev *mdev) 31861f1c4a8Sjames qian wang (Arm Technology China) { 31961f1c4a8Sjames qian wang (Arm Technology China) struct komeda_pipeline *pipe; 32061f1c4a8Sjames qian wang (Arm Technology China) int i, j, err; 32161f1c4a8Sjames qian wang (Arm Technology China) 32261f1c4a8Sjames qian wang (Arm Technology China) for (i = 0; i < mdev->n_pipelines; i++) { 32361f1c4a8Sjames qian wang (Arm Technology China) pipe = mdev->pipelines[i]; 32461f1c4a8Sjames qian wang (Arm Technology China) 32561f1c4a8Sjames qian wang (Arm Technology China) for (j = 0; j < pipe->n_layers; j++) { 32661f1c4a8Sjames qian wang (Arm Technology China) err = komeda_plane_add(kms, pipe->layers[j]); 32761f1c4a8Sjames qian wang (Arm Technology China) if (err) 32861f1c4a8Sjames qian wang (Arm Technology China) return err; 32961f1c4a8Sjames qian wang (Arm Technology China) } 33061f1c4a8Sjames qian wang (Arm Technology China) } 33161f1c4a8Sjames qian wang (Arm Technology China) 33261f1c4a8Sjames qian wang (Arm Technology China) return 0; 33361f1c4a8Sjames qian wang (Arm Technology China) } 334