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, 179e560309Sjames qian wang (Arm Technology China) struct komeda_data_flow_cfg *dflow) 189e560309Sjames qian wang (Arm Technology China) { 1942b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *kplane_st = to_kplane_st(st); 209e560309Sjames qian wang (Arm Technology China) struct drm_framebuffer *fb = st->fb; 21429bfabeSLowry Li (Arm Technology China) const struct komeda_format_caps *caps = to_kfb(fb)->format_caps; 229e560309Sjames qian wang (Arm Technology China) 239e560309Sjames qian wang (Arm Technology China) memset(dflow, 0, sizeof(*dflow)); 249e560309Sjames qian wang (Arm Technology China) 25109bd7d5SLowry Li (Arm Technology China) dflow->blending_zorder = st->normalized_zpos; 26b35d0927Sjames qian wang (Arm Technology China) dflow->pixel_blend_mode = st->pixel_blend_mode; 279e560309Sjames qian wang (Arm Technology China) dflow->layer_alpha = st->alpha >> 8; 289e560309Sjames qian wang (Arm Technology China) 299e560309Sjames qian wang (Arm Technology China) dflow->out_x = st->crtc_x; 309e560309Sjames qian wang (Arm Technology China) dflow->out_y = st->crtc_y; 319e560309Sjames qian wang (Arm Technology China) dflow->out_w = st->crtc_w; 329e560309Sjames qian wang (Arm Technology China) dflow->out_h = st->crtc_h; 339e560309Sjames qian wang (Arm Technology China) 349e560309Sjames qian wang (Arm Technology China) dflow->in_x = st->src_x >> 16; 359e560309Sjames qian wang (Arm Technology China) dflow->in_y = st->src_y >> 16; 369e560309Sjames qian wang (Arm Technology China) dflow->in_w = st->src_w >> 16; 379e560309Sjames qian wang (Arm Technology China) dflow->in_h = st->src_h >> 16; 389e560309Sjames qian wang (Arm Technology China) 39429bfabeSLowry Li (Arm Technology China) dflow->rot = drm_rotation_simplify(st->rotation, caps->supported_rots); 40429bfabeSLowry Li (Arm Technology China) if (!has_bits(dflow->rot, caps->supported_rots)) { 41429bfabeSLowry Li (Arm Technology China) DRM_DEBUG_ATOMIC("rotation(0x%x) isn't supported by %s.\n", 42429bfabeSLowry Li (Arm Technology China) dflow->rot, 43429bfabeSLowry Li (Arm Technology China) komeda_get_format_name(caps->fourcc, 44429bfabeSLowry Li (Arm Technology China) fb->modifier)); 45429bfabeSLowry Li (Arm Technology China) return -EINVAL; 46429bfabeSLowry Li (Arm Technology China) } 47429bfabeSLowry Li (Arm Technology China) 48b35d0927Sjames qian wang (Arm Technology China) dflow->en_img_enhancement = kplane_st->img_enhancement; 49b35d0927Sjames qian wang (Arm Technology China) 50b35d0927Sjames qian wang (Arm Technology China) komeda_complete_data_flow_cfg(dflow, fb); 51502932a0Sjames qian wang (Arm Technology China) 529e560309Sjames qian wang (Arm Technology China) return 0; 539e560309Sjames qian wang (Arm Technology China) } 549e560309Sjames qian wang (Arm Technology China) 558c919745Sjames qian wang (Arm Technology China) /** 568c919745Sjames qian wang (Arm Technology China) * komeda_plane_atomic_check - build input data flow 578c919745Sjames qian wang (Arm Technology China) * @plane: DRM plane 588c919745Sjames qian wang (Arm Technology China) * @state: the plane state object 598c919745Sjames qian wang (Arm Technology China) * 608c919745Sjames qian wang (Arm Technology China) * RETURNS: 618c919745Sjames qian wang (Arm Technology China) * Zero for success or -errno 628c919745Sjames qian wang (Arm Technology China) */ 6315e9122dSjames qian wang (Arm Technology China) static int 6415e9122dSjames qian wang (Arm Technology China) komeda_plane_atomic_check(struct drm_plane *plane, 659e560309Sjames qian wang (Arm Technology China) struct drm_plane_state *state) 669e560309Sjames qian wang (Arm Technology China) { 679e560309Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 689e560309Sjames qian wang (Arm Technology China) struct komeda_plane_state *kplane_st = to_kplane_st(state); 699e560309Sjames qian wang (Arm Technology China) struct komeda_layer *layer = kplane->layer; 709e560309Sjames qian wang (Arm Technology China) struct drm_crtc_state *crtc_st; 719e560309Sjames qian wang (Arm Technology China) struct komeda_crtc_state *kcrtc_st; 729e560309Sjames qian wang (Arm Technology China) struct komeda_data_flow_cfg dflow; 739e560309Sjames qian wang (Arm Technology China) int err; 749e560309Sjames qian wang (Arm Technology China) 759e560309Sjames qian wang (Arm Technology China) if (!state->crtc || !state->fb) 769e560309Sjames qian wang (Arm Technology China) return 0; 779e560309Sjames qian wang (Arm Technology China) 789e560309Sjames qian wang (Arm Technology China) crtc_st = drm_atomic_get_crtc_state(state->state, state->crtc); 796d10dc61SDan Carpenter if (IS_ERR(crtc_st) || !crtc_st->enable) { 809e560309Sjames qian wang (Arm Technology China) DRM_DEBUG_ATOMIC("Cannot update plane on a disabled CRTC.\n"); 819e560309Sjames qian wang (Arm Technology China) return -EINVAL; 829e560309Sjames qian wang (Arm Technology China) } 839e560309Sjames qian wang (Arm Technology China) 849e560309Sjames qian wang (Arm Technology China) /* crtc is inactive, skip the resource assignment */ 859e560309Sjames qian wang (Arm Technology China) if (!crtc_st->active) 869e560309Sjames qian wang (Arm Technology China) return 0; 879e560309Sjames qian wang (Arm Technology China) 889e560309Sjames qian wang (Arm Technology China) kcrtc_st = to_kcrtc_st(crtc_st); 899e560309Sjames qian wang (Arm Technology China) 909e560309Sjames qian wang (Arm Technology China) err = komeda_plane_init_data_flow(state, &dflow); 919e560309Sjames qian wang (Arm Technology China) if (err) 929e560309Sjames qian wang (Arm Technology China) return err; 939e560309Sjames qian wang (Arm Technology China) 949e560309Sjames qian wang (Arm Technology China) err = komeda_build_layer_data_flow(layer, kplane_st, kcrtc_st, &dflow); 959e560309Sjames qian wang (Arm Technology China) 969e560309Sjames qian wang (Arm Technology China) return err; 979e560309Sjames qian wang (Arm Technology China) } 989e560309Sjames qian wang (Arm Technology China) 999e560309Sjames qian wang (Arm Technology China) /* plane doesn't represent a real HW, so there is no HW update for plane. 1009e560309Sjames qian wang (Arm Technology China) * komeda handles all the HW update in crtc->atomic_flush 1019e560309Sjames qian wang (Arm Technology China) */ 10215e9122dSjames qian wang (Arm Technology China) static void 10315e9122dSjames qian wang (Arm Technology China) komeda_plane_atomic_update(struct drm_plane *plane, 1049e560309Sjames qian wang (Arm Technology China) struct drm_plane_state *old_state) 1059e560309Sjames qian wang (Arm Technology China) { 1069e560309Sjames qian wang (Arm Technology China) } 1079e560309Sjames qian wang (Arm Technology China) 10861f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_plane_helper_funcs komeda_plane_helper_funcs = { 1099e560309Sjames qian wang (Arm Technology China) .atomic_check = komeda_plane_atomic_check, 1109e560309Sjames qian wang (Arm Technology China) .atomic_update = komeda_plane_atomic_update, 11161f1c4a8Sjames qian wang (Arm Technology China) }; 11261f1c4a8Sjames qian wang (Arm Technology China) 11361f1c4a8Sjames qian wang (Arm Technology China) static void komeda_plane_destroy(struct drm_plane *plane) 11461f1c4a8Sjames qian wang (Arm Technology China) { 11561f1c4a8Sjames qian wang (Arm Technology China) drm_plane_cleanup(plane); 11661f1c4a8Sjames qian wang (Arm Technology China) 11761f1c4a8Sjames qian wang (Arm Technology China) kfree(to_kplane(plane)); 11861f1c4a8Sjames qian wang (Arm Technology China) } 11961f1c4a8Sjames qian wang (Arm Technology China) 1209e560309Sjames qian wang (Arm Technology China) static void komeda_plane_reset(struct drm_plane *plane) 1219e560309Sjames qian wang (Arm Technology China) { 1229e560309Sjames qian wang (Arm Technology China) struct komeda_plane_state *state; 1239e560309Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 1249e560309Sjames qian wang (Arm Technology China) 1259e560309Sjames qian wang (Arm Technology China) if (plane->state) 1269e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_destroy_state(plane->state); 1279e560309Sjames qian wang (Arm Technology China) 1289e560309Sjames qian wang (Arm Technology China) kfree(plane->state); 1299e560309Sjames qian wang (Arm Technology China) plane->state = NULL; 1309e560309Sjames qian wang (Arm Technology China) 1319e560309Sjames qian wang (Arm Technology China) state = kzalloc(sizeof(*state), GFP_KERNEL); 1329e560309Sjames qian wang (Arm Technology China) if (state) { 1339e560309Sjames qian wang (Arm Technology China) state->base.rotation = DRM_MODE_ROTATE_0; 1349e560309Sjames qian wang (Arm Technology China) state->base.pixel_blend_mode = DRM_MODE_BLEND_PREMULTI; 1359e560309Sjames qian wang (Arm Technology China) state->base.alpha = DRM_BLEND_ALPHA_OPAQUE; 1369e560309Sjames qian wang (Arm Technology China) state->base.zpos = kplane->layer->base.id; 1379682dee9SLowry Li (Arm Technology China) state->base.color_encoding = DRM_COLOR_YCBCR_BT601; 1389682dee9SLowry Li (Arm Technology China) state->base.color_range = DRM_COLOR_YCBCR_LIMITED_RANGE; 1399e560309Sjames qian wang (Arm Technology China) plane->state = &state->base; 1409e560309Sjames qian wang (Arm Technology China) plane->state->plane = plane; 1419e560309Sjames qian wang (Arm Technology China) } 1429e560309Sjames qian wang (Arm Technology China) } 1439e560309Sjames qian wang (Arm Technology China) 1449e560309Sjames qian wang (Arm Technology China) static struct drm_plane_state * 1459e560309Sjames qian wang (Arm Technology China) komeda_plane_atomic_duplicate_state(struct drm_plane *plane) 1469e560309Sjames qian wang (Arm Technology China) { 14742b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *new, *old; 1489e560309Sjames qian wang (Arm Technology China) 1499e560309Sjames qian wang (Arm Technology China) if (WARN_ON(!plane->state)) 1509e560309Sjames qian wang (Arm Technology China) return NULL; 1519e560309Sjames qian wang (Arm Technology China) 1529e560309Sjames qian wang (Arm Technology China) new = kzalloc(sizeof(*new), GFP_KERNEL); 1539e560309Sjames qian wang (Arm Technology China) if (!new) 1549e560309Sjames qian wang (Arm Technology China) return NULL; 1559e560309Sjames qian wang (Arm Technology China) 1569e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_duplicate_state(plane, &new->base); 1579e560309Sjames qian wang (Arm Technology China) 15842b6f118Sjames qian wang (Arm Technology China) old = to_kplane_st(plane->state); 15942b6f118Sjames qian wang (Arm Technology China) 16042b6f118Sjames qian wang (Arm Technology China) new->img_enhancement = old->img_enhancement; 16142b6f118Sjames qian wang (Arm Technology China) 1629e560309Sjames qian wang (Arm Technology China) return &new->base; 1639e560309Sjames qian wang (Arm Technology China) } 1649e560309Sjames qian wang (Arm Technology China) 1659e560309Sjames qian wang (Arm Technology China) static void 1669e560309Sjames qian wang (Arm Technology China) komeda_plane_atomic_destroy_state(struct drm_plane *plane, 1679e560309Sjames qian wang (Arm Technology China) struct drm_plane_state *state) 1689e560309Sjames qian wang (Arm Technology China) { 1699e560309Sjames qian wang (Arm Technology China) __drm_atomic_helper_plane_destroy_state(state); 1709e560309Sjames qian wang (Arm Technology China) kfree(to_kplane_st(state)); 1719e560309Sjames qian wang (Arm Technology China) } 1729e560309Sjames qian wang (Arm Technology China) 17342b6f118Sjames qian wang (Arm Technology China) static int 17442b6f118Sjames qian wang (Arm Technology China) komeda_plane_atomic_get_property(struct drm_plane *plane, 17542b6f118Sjames qian wang (Arm Technology China) const struct drm_plane_state *state, 17642b6f118Sjames qian wang (Arm Technology China) struct drm_property *property, 17742b6f118Sjames qian wang (Arm Technology China) uint64_t *val) 17842b6f118Sjames qian wang (Arm Technology China) { 17942b6f118Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 18042b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *st = to_kplane_st(state); 18142b6f118Sjames qian wang (Arm Technology China) 18242b6f118Sjames qian wang (Arm Technology China) if (property == kplane->prop_img_enhancement) 18342b6f118Sjames qian wang (Arm Technology China) *val = st->img_enhancement; 18442b6f118Sjames qian wang (Arm Technology China) else 18542b6f118Sjames qian wang (Arm Technology China) return -EINVAL; 18642b6f118Sjames qian wang (Arm Technology China) 18742b6f118Sjames qian wang (Arm Technology China) return 0; 18842b6f118Sjames qian wang (Arm Technology China) } 18942b6f118Sjames qian wang (Arm Technology China) 19042b6f118Sjames qian wang (Arm Technology China) static int 19142b6f118Sjames qian wang (Arm Technology China) komeda_plane_atomic_set_property(struct drm_plane *plane, 19242b6f118Sjames qian wang (Arm Technology China) struct drm_plane_state *state, 19342b6f118Sjames qian wang (Arm Technology China) struct drm_property *property, 19442b6f118Sjames qian wang (Arm Technology China) uint64_t val) 19542b6f118Sjames qian wang (Arm Technology China) { 19642b6f118Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 19742b6f118Sjames qian wang (Arm Technology China) struct komeda_plane_state *st = to_kplane_st(state); 19842b6f118Sjames qian wang (Arm Technology China) 19942b6f118Sjames qian wang (Arm Technology China) if (property == kplane->prop_img_enhancement) 20042b6f118Sjames qian wang (Arm Technology China) st->img_enhancement = !!val; 20142b6f118Sjames qian wang (Arm Technology China) else 20242b6f118Sjames qian wang (Arm Technology China) return -EINVAL; 20342b6f118Sjames qian wang (Arm Technology China) 20442b6f118Sjames qian wang (Arm Technology China) return 0; 20542b6f118Sjames qian wang (Arm Technology China) } 20642b6f118Sjames qian wang (Arm Technology China) 20765ad2392Sjames qian wang (Arm Technology China) static bool 20865ad2392Sjames qian wang (Arm Technology China) komeda_plane_format_mod_supported(struct drm_plane *plane, 20965ad2392Sjames qian wang (Arm Technology China) u32 format, u64 modifier) 21065ad2392Sjames qian wang (Arm Technology China) { 21165ad2392Sjames qian wang (Arm Technology China) struct komeda_dev *mdev = plane->dev->dev_private; 21265ad2392Sjames qian wang (Arm Technology China) struct komeda_plane *kplane = to_kplane(plane); 21365ad2392Sjames qian wang (Arm Technology China) u32 layer_type = kplane->layer->layer_type; 21465ad2392Sjames qian wang (Arm Technology China) 21565ad2392Sjames qian wang (Arm Technology China) return komeda_format_mod_supported(&mdev->fmt_tbl, layer_type, 21619358630SLowry Li (Arm Technology China) format, modifier, 0); 21765ad2392Sjames qian wang (Arm Technology China) } 21865ad2392Sjames qian wang (Arm Technology China) 21961f1c4a8Sjames qian wang (Arm Technology China) static const struct drm_plane_funcs komeda_plane_funcs = { 2209e560309Sjames qian wang (Arm Technology China) .update_plane = drm_atomic_helper_update_plane, 2219e560309Sjames qian wang (Arm Technology China) .disable_plane = drm_atomic_helper_disable_plane, 2229e560309Sjames qian wang (Arm Technology China) .destroy = komeda_plane_destroy, 2239e560309Sjames qian wang (Arm Technology China) .reset = komeda_plane_reset, 2249e560309Sjames qian wang (Arm Technology China) .atomic_duplicate_state = komeda_plane_atomic_duplicate_state, 2259e560309Sjames qian wang (Arm Technology China) .atomic_destroy_state = komeda_plane_atomic_destroy_state, 22642b6f118Sjames qian wang (Arm Technology China) .atomic_get_property = komeda_plane_atomic_get_property, 22742b6f118Sjames qian wang (Arm Technology China) .atomic_set_property = komeda_plane_atomic_set_property, 22865ad2392Sjames qian wang (Arm Technology China) .format_mod_supported = komeda_plane_format_mod_supported, 22961f1c4a8Sjames qian wang (Arm Technology China) }; 23061f1c4a8Sjames qian wang (Arm Technology China) 23142b6f118Sjames qian wang (Arm Technology China) static int 23242b6f118Sjames qian wang (Arm Technology China) komeda_plane_create_layer_properties(struct komeda_plane *kplane, 23342b6f118Sjames qian wang (Arm Technology China) struct komeda_layer *layer) 23442b6f118Sjames qian wang (Arm Technology China) { 23542b6f118Sjames qian wang (Arm Technology China) struct drm_device *drm = kplane->base.dev; 23642b6f118Sjames qian wang (Arm Technology China) struct drm_plane *plane = &kplane->base; 23742b6f118Sjames qian wang (Arm Technology China) struct drm_property *prop = NULL; 23842b6f118Sjames qian wang (Arm Technology China) 23942b6f118Sjames qian wang (Arm Technology China) /* property: layer image_enhancement */ 24042b6f118Sjames qian wang (Arm Technology China) if (layer->base.supported_outputs & KOMEDA_PIPELINE_SCALERS) { 24142b6f118Sjames qian wang (Arm Technology China) prop = drm_property_create_bool(drm, DRM_MODE_PROP_ATOMIC, 24242b6f118Sjames qian wang (Arm Technology China) "img_enhancement"); 24342b6f118Sjames qian wang (Arm Technology China) if (!prop) 24442b6f118Sjames qian wang (Arm Technology China) return -ENOMEM; 24542b6f118Sjames qian wang (Arm Technology China) 24642b6f118Sjames qian wang (Arm Technology China) drm_object_attach_property(&plane->base, prop, 0); 24742b6f118Sjames qian wang (Arm Technology China) kplane->prop_img_enhancement = prop; 24842b6f118Sjames qian wang (Arm Technology China) } 24942b6f118Sjames qian wang (Arm Technology China) 25042b6f118Sjames qian wang (Arm Technology China) return 0; 25142b6f118Sjames qian wang (Arm Technology China) } 25242b6f118Sjames qian wang (Arm Technology China) 25361f1c4a8Sjames qian wang (Arm Technology China) /* for komeda, which is pipeline can be share between crtcs */ 25461f1c4a8Sjames qian wang (Arm Technology China) static u32 get_possible_crtcs(struct komeda_kms_dev *kms, 25561f1c4a8Sjames qian wang (Arm Technology China) struct komeda_pipeline *pipe) 25661f1c4a8Sjames qian wang (Arm Technology China) { 25761f1c4a8Sjames qian wang (Arm Technology China) struct komeda_crtc *crtc; 25861f1c4a8Sjames qian wang (Arm Technology China) u32 possible_crtcs = 0; 25961f1c4a8Sjames qian wang (Arm Technology China) int i; 26061f1c4a8Sjames qian wang (Arm Technology China) 26161f1c4a8Sjames qian wang (Arm Technology China) for (i = 0; i < kms->n_crtcs; i++) { 26261f1c4a8Sjames qian wang (Arm Technology China) crtc = &kms->crtcs[i]; 26361f1c4a8Sjames qian wang (Arm Technology China) 26461f1c4a8Sjames qian wang (Arm Technology China) if ((pipe == crtc->master) || (pipe == crtc->slave)) 26561f1c4a8Sjames qian wang (Arm Technology China) possible_crtcs |= BIT(i); 26661f1c4a8Sjames qian wang (Arm Technology China) } 26761f1c4a8Sjames qian wang (Arm Technology China) 26861f1c4a8Sjames qian wang (Arm Technology China) return possible_crtcs; 26961f1c4a8Sjames qian wang (Arm Technology China) } 27061f1c4a8Sjames qian wang (Arm Technology China) 27161f1c4a8Sjames qian wang (Arm Technology China) /* use Layer0 as primary */ 27261f1c4a8Sjames qian wang (Arm Technology China) static u32 get_plane_type(struct komeda_kms_dev *kms, 27361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_component *c) 27461f1c4a8Sjames qian wang (Arm Technology China) { 27561f1c4a8Sjames qian wang (Arm Technology China) bool is_primary = (c->id == KOMEDA_COMPONENT_LAYER0); 27661f1c4a8Sjames qian wang (Arm Technology China) 27761f1c4a8Sjames qian wang (Arm Technology China) return is_primary ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY; 27861f1c4a8Sjames qian wang (Arm Technology China) } 27961f1c4a8Sjames qian wang (Arm Technology China) 28061f1c4a8Sjames qian wang (Arm Technology China) static int komeda_plane_add(struct komeda_kms_dev *kms, 28161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_layer *layer) 28261f1c4a8Sjames qian wang (Arm Technology China) { 28361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_dev *mdev = kms->base.dev_private; 28461f1c4a8Sjames qian wang (Arm Technology China) struct komeda_component *c = &layer->base; 28561f1c4a8Sjames qian wang (Arm Technology China) struct komeda_plane *kplane; 28661f1c4a8Sjames qian wang (Arm Technology China) struct drm_plane *plane; 28761f1c4a8Sjames qian wang (Arm Technology China) u32 *formats, n_formats = 0; 28861f1c4a8Sjames qian wang (Arm Technology China) int err; 28961f1c4a8Sjames qian wang (Arm Technology China) 29061f1c4a8Sjames qian wang (Arm Technology China) kplane = kzalloc(sizeof(*kplane), GFP_KERNEL); 29161f1c4a8Sjames qian wang (Arm Technology China) if (!kplane) 29261f1c4a8Sjames qian wang (Arm Technology China) return -ENOMEM; 29361f1c4a8Sjames qian wang (Arm Technology China) 29461f1c4a8Sjames qian wang (Arm Technology China) plane = &kplane->base; 29561f1c4a8Sjames qian wang (Arm Technology China) kplane->layer = layer; 29661f1c4a8Sjames qian wang (Arm Technology China) 29761f1c4a8Sjames qian wang (Arm Technology China) formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl, 29861f1c4a8Sjames qian wang (Arm Technology China) layer->layer_type, &n_formats); 29961f1c4a8Sjames qian wang (Arm Technology China) 30061f1c4a8Sjames qian wang (Arm Technology China) err = drm_universal_plane_init(&kms->base, plane, 30161f1c4a8Sjames qian wang (Arm Technology China) get_possible_crtcs(kms, c->pipeline), 30261f1c4a8Sjames qian wang (Arm Technology China) &komeda_plane_funcs, 30365ad2392Sjames qian wang (Arm Technology China) formats, n_formats, komeda_supported_modifiers, 30461f1c4a8Sjames qian wang (Arm Technology China) get_plane_type(kms, c), 30561f1c4a8Sjames qian wang (Arm Technology China) "%s", c->name); 30661f1c4a8Sjames qian wang (Arm Technology China) 30761f1c4a8Sjames qian wang (Arm Technology China) komeda_put_fourcc_list(formats); 30861f1c4a8Sjames qian wang (Arm Technology China) 30961f1c4a8Sjames qian wang (Arm Technology China) if (err) 31061f1c4a8Sjames qian wang (Arm Technology China) goto cleanup; 31161f1c4a8Sjames qian wang (Arm Technology China) 31261f1c4a8Sjames qian wang (Arm Technology China) drm_plane_helper_add(plane, &komeda_plane_helper_funcs); 31361f1c4a8Sjames qian wang (Arm Technology China) 314429bfabeSLowry Li (Arm Technology China) err = drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0, 315429bfabeSLowry Li (Arm Technology China) layer->supported_rots); 316429bfabeSLowry Li (Arm Technology China) if (err) 317429bfabeSLowry Li (Arm Technology China) goto cleanup; 318429bfabeSLowry Li (Arm Technology China) 31962ffc393SLowry Li (Arm Technology China) err = drm_plane_create_alpha_property(plane); 32062ffc393SLowry Li (Arm Technology China) if (err) 32162ffc393SLowry Li (Arm Technology China) goto cleanup; 32262ffc393SLowry Li (Arm Technology China) 32362ffc393SLowry Li (Arm Technology China) err = drm_plane_create_blend_mode_property(plane, 32462ffc393SLowry Li (Arm Technology China) BIT(DRM_MODE_BLEND_PIXEL_NONE) | 32562ffc393SLowry Li (Arm Technology China) BIT(DRM_MODE_BLEND_PREMULTI) | 32662ffc393SLowry Li (Arm Technology China) BIT(DRM_MODE_BLEND_COVERAGE)); 32762ffc393SLowry Li (Arm Technology China) if (err) 32862ffc393SLowry Li (Arm Technology China) goto cleanup; 32962ffc393SLowry Li (Arm Technology China) 33042b6f118Sjames qian wang (Arm Technology China) err = komeda_plane_create_layer_properties(kplane, layer); 33142b6f118Sjames qian wang (Arm Technology China) if (err) 33242b6f118Sjames qian wang (Arm Technology China) goto cleanup; 33342b6f118Sjames qian wang (Arm Technology China) 3349682dee9SLowry Li (Arm Technology China) err = drm_plane_create_color_properties(plane, 3359682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_BT601) | 3369682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_BT709) | 3379682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_BT2020), 3389682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | 3399682dee9SLowry Li (Arm Technology China) BIT(DRM_COLOR_YCBCR_FULL_RANGE), 3409682dee9SLowry Li (Arm Technology China) DRM_COLOR_YCBCR_BT601, 3419682dee9SLowry Li (Arm Technology China) DRM_COLOR_YCBCR_LIMITED_RANGE); 3429682dee9SLowry Li (Arm Technology China) if (err) 3439682dee9SLowry Li (Arm Technology China) goto cleanup; 3449682dee9SLowry Li (Arm Technology China) 345109bd7d5SLowry Li (Arm Technology China) err = drm_plane_create_zpos_property(plane, layer->base.id, 0, 8); 346109bd7d5SLowry Li (Arm Technology China) if (err) 347109bd7d5SLowry Li (Arm Technology China) goto cleanup; 348109bd7d5SLowry Li (Arm Technology China) 34961f1c4a8Sjames qian wang (Arm Technology China) return 0; 35061f1c4a8Sjames qian wang (Arm Technology China) cleanup: 35161f1c4a8Sjames qian wang (Arm Technology China) komeda_plane_destroy(plane); 35261f1c4a8Sjames qian wang (Arm Technology China) return err; 35361f1c4a8Sjames qian wang (Arm Technology China) } 35461f1c4a8Sjames qian wang (Arm Technology China) 35561f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_planes(struct komeda_kms_dev *kms, struct komeda_dev *mdev) 35661f1c4a8Sjames qian wang (Arm Technology China) { 35761f1c4a8Sjames qian wang (Arm Technology China) struct komeda_pipeline *pipe; 35861f1c4a8Sjames qian wang (Arm Technology China) int i, j, err; 35961f1c4a8Sjames qian wang (Arm Technology China) 36061f1c4a8Sjames qian wang (Arm Technology China) for (i = 0; i < mdev->n_pipelines; i++) { 36161f1c4a8Sjames qian wang (Arm Technology China) pipe = mdev->pipelines[i]; 36261f1c4a8Sjames qian wang (Arm Technology China) 36361f1c4a8Sjames qian wang (Arm Technology China) for (j = 0; j < pipe->n_layers; j++) { 36461f1c4a8Sjames qian wang (Arm Technology China) err = komeda_plane_add(kms, pipe->layers[j]); 36561f1c4a8Sjames qian wang (Arm Technology China) if (err) 36661f1c4a8Sjames qian wang (Arm Technology China) return err; 36761f1c4a8Sjames qian wang (Arm Technology China) } 36861f1c4a8Sjames qian wang (Arm Technology China) } 36961f1c4a8Sjames qian wang (Arm Technology China) 37061f1c4a8Sjames qian wang (Arm Technology China) return 0; 37161f1c4a8Sjames qian wang (Arm Technology China) } 372