diff --git a/msm/sde/sde_plane.c b/msm/sde/sde_plane.c index abad3c2151..44d70e6afc 100644 --- a/msm/sde/sde_plane.c +++ b/msm/sde/sde_plane.c @@ -3403,164 +3403,11 @@ static void _sde_plane_install_master_only_properties(struct sde_plane *psde) } -/* helper to install properties which are common to planes and crtcs */ -static void _sde_plane_install_properties(struct drm_plane *plane, - struct sde_mdss_cfg *catalog, u32 master_plane_id) +static void _sde_plane_install_colorproc_properties(struct sde_plane *psde, + struct sde_kms_info *info) { - static const struct drm_prop_enum_list e_blend_op[] = { - {SDE_DRM_BLEND_OP_NOT_DEFINED, "not_defined"}, - {SDE_DRM_BLEND_OP_OPAQUE, "opaque"}, - {SDE_DRM_BLEND_OP_PREMULTIPLIED, "premultiplied"}, - {SDE_DRM_BLEND_OP_COVERAGE, "coverage"}, - {SDE_DRM_BLEND_OP_SKIP, "skip_blending"}, - }; - static const struct drm_prop_enum_list e_src_config[] = { - {SDE_DRM_DEINTERLACE, "deinterlace"} - }; - static const struct drm_prop_enum_list e_fb_translation_mode[] = { - {SDE_DRM_FB_NON_SEC, "non_sec"}, - {SDE_DRM_FB_SEC, "sec"}, - {SDE_DRM_FB_NON_SEC_DIR_TRANS, "non_sec_direct_translation"}, - {SDE_DRM_FB_SEC_DIR_TRANS, "sec_direct_translation"}, - }; - static const struct drm_prop_enum_list e_multirect_mode[] = { - {SDE_SSPP_MULTIRECT_NONE, "none"}, - {SDE_SSPP_MULTIRECT_PARALLEL, "parallel"}, - {SDE_SSPP_MULTIRECT_TIME_MX, "serial"}, - }; - const struct sde_format_extended *format_list; - struct sde_kms_info *info; - struct sde_plane *psde = to_sde_plane(plane); - bool is_master; - int zpos_max = 255; - int zpos_def = 0; char feature_name[256]; - uint32_t index; - - if (!plane || !psde) { - SDE_ERROR("invalid plane\n"); - return; - } else if (!psde->pipe_hw || !psde->pipe_sblk) { - SDE_ERROR("invalid plane, pipe_hw %d pipe_sblk %d\n", - !psde->pipe_hw, !psde->pipe_sblk); - return; - } else if (!catalog) { - SDE_ERROR("invalid catalog\n"); - return; - } - - psde->catalog = catalog; - is_master = !psde->is_virtual; - - if (sde_is_custom_client()) { - if (catalog->mixer_count && - catalog->mixer[0].sblk->maxblendstages) { - zpos_max = catalog->mixer[0].sblk->maxblendstages - 1; - if (catalog->has_base_layer && - (zpos_max > SDE_STAGE_MAX - 1)) - zpos_max = SDE_STAGE_MAX - 1; - else if (zpos_max > SDE_STAGE_MAX - SDE_STAGE_0 - 1) - zpos_max = SDE_STAGE_MAX - SDE_STAGE_0 - 1; - } - } else if (plane->type != DRM_PLANE_TYPE_PRIMARY) { - /* reserve zpos == 0 for primary planes */ - zpos_def = drm_plane_index(plane) + 1; - } - - msm_property_install_range(&psde->property_info, "zpos", - 0x0, 0, zpos_max, zpos_def, PLANE_PROP_ZPOS); - - msm_property_install_range(&psde->property_info, "alpha", - 0x0, 0, 255, 255, PLANE_PROP_ALPHA); - - /* linux default file descriptor range on each process */ - msm_property_install_range(&psde->property_info, "input_fence", - 0x0, 0, INR_OPEN_MAX, 0, PLANE_PROP_INPUT_FENCE); - - if (is_master) - _sde_plane_install_master_only_properties(psde); - - if (psde->features & BIT(SDE_SSPP_EXCL_RECT)) - msm_property_install_volatile_range(&psde->property_info, - "excl_rect_v1", 0x0, 0, ~0, 0, PLANE_PROP_EXCL_RECT_V1); - - sde_plane_rot_install_properties(plane, catalog); - - msm_property_install_enum(&psde->property_info, "blend_op", 0x0, 0, - e_blend_op, ARRAY_SIZE(e_blend_op), PLANE_PROP_BLEND_OP); - - msm_property_install_enum(&psde->property_info, "src_config", 0x0, 1, - e_src_config, ARRAY_SIZE(e_src_config), PLANE_PROP_SRC_CONFIG); - - if (psde->pipe_hw->ops.setup_solidfill) - msm_property_install_range(&psde->property_info, "color_fill", - 0, 0, 0xFFFFFFFF, 0, PLANE_PROP_COLOR_FILL); - - msm_property_install_range(&psde->property_info, - "prefill_size", 0x0, 0, ~0, 0, - PLANE_PROP_PREFILL_SIZE); - msm_property_install_range(&psde->property_info, - "prefill_time", 0x0, 0, ~0, 0, - PLANE_PROP_PREFILL_TIME); - - info = kzalloc(sizeof(struct sde_kms_info), GFP_KERNEL); - if (!info) { - SDE_ERROR("failed to allocate info memory\n"); - return; - } - - msm_property_install_blob(&psde->property_info, "capabilities", - DRM_MODE_PROP_IMMUTABLE, PLANE_PROP_INFO); - sde_kms_info_reset(info); - - if (is_master) { - format_list = psde->pipe_sblk->format_list; - } else { - format_list = psde->pipe_sblk->virt_format_list; - sde_kms_info_add_keyint(info, "primary_smart_plane_id", - master_plane_id); - msm_property_install_enum(&psde->property_info, - "multirect_mode", 0x0, 0, e_multirect_mode, - ARRAY_SIZE(e_multirect_mode), - PLANE_PROP_MULTIRECT_MODE); - } - - if (format_list) { - sde_kms_info_start(info, "pixel_formats"); - while (format_list->fourcc_format) { - sde_kms_info_append_format(info, - format_list->fourcc_format, - format_list->modifier); - ++format_list; - } - sde_kms_info_stop(info); - } - - if (psde->pipe_hw && psde->pipe_hw->ops.get_scaler_ver) - sde_kms_info_add_keyint(info, "scaler_step_ver", - psde->pipe_hw->ops.get_scaler_ver(psde->pipe_hw)); - - sde_kms_info_add_keyint(info, "max_linewidth", - psde->pipe_sblk->maxlinewidth); - sde_kms_info_add_keyint(info, "max_upscale", - psde->pipe_sblk->maxupscale); - sde_kms_info_add_keyint(info, "max_downscale", - psde->pipe_sblk->maxdwnscale); - sde_kms_info_add_keyint(info, "max_horizontal_deci", - psde->pipe_sblk->maxhdeciexp); - sde_kms_info_add_keyint(info, "max_vertical_deci", - psde->pipe_sblk->maxvdeciexp); - sde_kms_info_add_keyint(info, "max_per_pipe_bw", - psde->pipe_sblk->max_per_pipe_bw * 1000LL); - sde_kms_info_add_keyint(info, "max_per_pipe_bw_high", - psde->pipe_sblk->max_per_pipe_bw_high * 1000LL); - index = (master_plane_id == 0) ? 0 : 1; - if (catalog->has_demura && - catalog->demura_supported[psde->pipe][index] != ~0x0) { - sde_kms_info_add_keyint(info, "demura_block", index); - sde_kms_info_add_keyint(info, "demura_pipe_id", - psde->pipe - SSPP_DMA0); - } + bool is_master = !psde->is_virtual; if ((is_master && (psde->features & BIT(SDE_SSPP_INVERSE_PMA))) || @@ -3577,52 +3424,6 @@ static void _sde_plane_install_properties(struct drm_plane *plane, sde_kms_info_add_keyint(info, "csc_dma_v1", 1); } - if (psde->features & BIT(SDE_SSPP_SEC_UI_ALLOWED)) - sde_kms_info_add_keyint(info, "sec_ui_allowed", 1); - if (psde->features & BIT(SDE_SSPP_BLOCK_SEC_UI)) - sde_kms_info_add_keyint(info, "block_sec_ui", 1); - - if (psde->features & BIT(SDE_SSPP_TRUE_INLINE_ROT)) { - const struct sde_format_extended *inline_rot_fmt_list; - - sde_kms_info_add_keyint(info, "true_inline_rot_rev", - catalog->true_inline_rot_rev); - sde_kms_info_add_keyint(info, - "true_inline_dwnscale_rt", - (int) (psde->pipe_sblk->in_rot_maxdwnscale_rt_num / - psde->pipe_sblk->in_rot_maxdwnscale_rt_denom)); - sde_kms_info_add_keyint(info, - "true_inline_dwnscale_rt_numerator", - psde->pipe_sblk->in_rot_maxdwnscale_rt_num); - sde_kms_info_add_keyint(info, - "true_inline_dwnscale_rt_denominator", - psde->pipe_sblk->in_rot_maxdwnscale_rt_denom); - sde_kms_info_add_keyint(info, "true_inline_dwnscale_nrt", - psde->pipe_sblk->in_rot_maxdwnscale_nrt); - sde_kms_info_add_keyint(info, "true_inline_max_height", - psde->pipe_sblk->in_rot_maxheight); - - inline_rot_fmt_list = psde->pipe_sblk->in_rot_format_list; - - if (inline_rot_fmt_list) { - sde_kms_info_start(info, "inline_rot_pixel_formats"); - while (inline_rot_fmt_list->fourcc_format) { - sde_kms_info_append_format(info, - inline_rot_fmt_list->fourcc_format, - inline_rot_fmt_list->modifier); - ++inline_rot_fmt_list; - } - sde_kms_info_stop(info); - } - - } - - msm_property_set_blob(&psde->property_info, &psde->blob_info, - info->data, SDE_KMS_INFO_DATALEN(info), - PLANE_PROP_INFO); - - kfree(info); - if (psde->features & BIT(SDE_SSPP_MEMCOLOR)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKIN_COLOR_V", @@ -3672,12 +3473,226 @@ static void _sde_plane_install_properties(struct drm_plane *plane, msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_GC); } +} + +static void _sde_plane_setup_capabilities_blob(struct sde_plane *psde, + u32 master_plane_id, struct sde_kms_info *info, + struct sde_mdss_cfg *catalog) +{ + bool is_master = !psde->is_virtual; + const struct sde_format_extended *format_list; + u32 index; + + if (is_master) { + format_list = psde->pipe_sblk->format_list; + } else { + format_list = psde->pipe_sblk->virt_format_list; + sde_kms_info_add_keyint(info, "primary_smart_plane_id", + master_plane_id); + } + + if (format_list) { + sde_kms_info_start(info, "pixel_formats"); + while (format_list->fourcc_format) { + sde_kms_info_append_format(info, + format_list->fourcc_format, + format_list->modifier); + ++format_list; + } + sde_kms_info_stop(info); + } + + if (psde->pipe_hw && psde->pipe_hw->ops.get_scaler_ver) + sde_kms_info_add_keyint(info, "scaler_step_ver", + psde->pipe_hw->ops.get_scaler_ver(psde->pipe_hw)); + + sde_kms_info_add_keyint(info, "max_linewidth", + psde->pipe_sblk->maxlinewidth); + sde_kms_info_add_keyint(info, "max_upscale", + psde->pipe_sblk->maxupscale); + sde_kms_info_add_keyint(info, "max_downscale", + psde->pipe_sblk->maxdwnscale); + sde_kms_info_add_keyint(info, "max_horizontal_deci", + psde->pipe_sblk->maxhdeciexp); + sde_kms_info_add_keyint(info, "max_vertical_deci", + psde->pipe_sblk->maxvdeciexp); + sde_kms_info_add_keyint(info, "max_per_pipe_bw", + psde->pipe_sblk->max_per_pipe_bw * 1000LL); + sde_kms_info_add_keyint(info, "max_per_pipe_bw_high", + psde->pipe_sblk->max_per_pipe_bw_high * 1000LL); + index = (master_plane_id == 0) ? 0 : 1; + if (catalog->has_demura && + catalog->demura_supported[psde->pipe][index] != ~0x0) { + sde_kms_info_add_keyint(info, "demura_block", index); + sde_kms_info_add_keyint(info, "demura_pipe_id", + psde->pipe - SSPP_DMA0); + } + + if (psde->features & BIT(SDE_SSPP_SEC_UI_ALLOWED)) + sde_kms_info_add_keyint(info, "sec_ui_allowed", 1); + if (psde->features & BIT(SDE_SSPP_BLOCK_SEC_UI)) + sde_kms_info_add_keyint(info, "block_sec_ui", 1); + + if (psde->features & BIT(SDE_SSPP_TRUE_INLINE_ROT)) { + const struct sde_format_extended *inline_rot_fmt_list; + + sde_kms_info_add_keyint(info, "true_inline_rot_rev", + catalog->true_inline_rot_rev); + sde_kms_info_add_keyint(info, + "true_inline_dwnscale_rt", + (int) (psde->pipe_sblk->in_rot_maxdwnscale_rt_num / + psde->pipe_sblk->in_rot_maxdwnscale_rt_denom)); + sde_kms_info_add_keyint(info, + "true_inline_dwnscale_rt_numerator", + psde->pipe_sblk->in_rot_maxdwnscale_rt_num); + sde_kms_info_add_keyint(info, + "true_inline_dwnscale_rt_denominator", + psde->pipe_sblk->in_rot_maxdwnscale_rt_denom); + sde_kms_info_add_keyint(info, "true_inline_dwnscale_nrt", + psde->pipe_sblk->in_rot_maxdwnscale_nrt); + sde_kms_info_add_keyint(info, "true_inline_max_height", + psde->pipe_sblk->in_rot_maxheight); + + inline_rot_fmt_list = psde->pipe_sblk->in_rot_format_list; + + if (inline_rot_fmt_list) { + sde_kms_info_start(info, "inline_rot_pixel_formats"); + while (inline_rot_fmt_list->fourcc_format) { + sde_kms_info_append_format(info, + inline_rot_fmt_list->fourcc_format, + inline_rot_fmt_list->modifier); + ++inline_rot_fmt_list; + } + sde_kms_info_stop(info); + } + } +} + +/* helper to install properties which are common to planes and crtcs */ +static void _sde_plane_install_properties(struct drm_plane *plane, + struct sde_mdss_cfg *catalog, u32 master_plane_id) +{ + static const struct drm_prop_enum_list e_blend_op[] = { + {SDE_DRM_BLEND_OP_NOT_DEFINED, "not_defined"}, + {SDE_DRM_BLEND_OP_OPAQUE, "opaque"}, + {SDE_DRM_BLEND_OP_PREMULTIPLIED, "premultiplied"}, + {SDE_DRM_BLEND_OP_COVERAGE, "coverage"}, + {SDE_DRM_BLEND_OP_SKIP, "skip_blending"}, + }; + static const struct drm_prop_enum_list e_src_config[] = { + {SDE_DRM_DEINTERLACE, "deinterlace"} + }; + static const struct drm_prop_enum_list e_fb_translation_mode[] = { + {SDE_DRM_FB_NON_SEC, "non_sec"}, + {SDE_DRM_FB_SEC, "sec"}, + {SDE_DRM_FB_NON_SEC_DIR_TRANS, "non_sec_direct_translation"}, + {SDE_DRM_FB_SEC_DIR_TRANS, "sec_direct_translation"}, + }; + static const struct drm_prop_enum_list e_multirect_mode[] = { + {SDE_SSPP_MULTIRECT_NONE, "none"}, + {SDE_SSPP_MULTIRECT_PARALLEL, "parallel"}, + {SDE_SSPP_MULTIRECT_TIME_MX, "serial"}, + }; + struct sde_kms_info *info; + struct sde_plane *psde = to_sde_plane(plane); + bool is_master; + int zpos_max = 255; + int zpos_def = 0; + + if (!plane || !psde) { + SDE_ERROR("invalid plane\n"); + return; + } else if (!psde->pipe_hw || !psde->pipe_sblk) { + SDE_ERROR("invalid plane, pipe_hw %d pipe_sblk %d\n", + !psde->pipe_hw, !psde->pipe_sblk); + return; + } else if (!catalog) { + SDE_ERROR("invalid catalog\n"); + return; + } + + psde->catalog = catalog; + is_master = !psde->is_virtual; + + info = kzalloc(sizeof(struct sde_kms_info), GFP_KERNEL); + if (!info) { + SDE_ERROR("failed to allocate info memory\n"); + return; + } + + if (sde_is_custom_client()) { + if (catalog->mixer_count && + catalog->mixer[0].sblk->maxblendstages) { + zpos_max = catalog->mixer[0].sblk->maxblendstages - 1; + if (catalog->has_base_layer && + (zpos_max > SDE_STAGE_MAX - 1)) + zpos_max = SDE_STAGE_MAX - 1; + else if (zpos_max > SDE_STAGE_MAX - SDE_STAGE_0 - 1) + zpos_max = SDE_STAGE_MAX - SDE_STAGE_0 - 1; + } + } else if (plane->type != DRM_PLANE_TYPE_PRIMARY) { + /* reserve zpos == 0 for primary planes */ + zpos_def = drm_plane_index(plane) + 1; + } + + msm_property_install_range(&psde->property_info, "zpos", + 0x0, 0, zpos_max, zpos_def, PLANE_PROP_ZPOS); + + msm_property_install_range(&psde->property_info, "alpha", + 0x0, 0, 255, 255, PLANE_PROP_ALPHA); + + /* linux default file descriptor range on each process */ + msm_property_install_range(&psde->property_info, "input_fence", + 0x0, 0, INR_OPEN_MAX, 0, PLANE_PROP_INPUT_FENCE); + + if (is_master) + _sde_plane_install_master_only_properties(psde); + else + msm_property_install_enum(&psde->property_info, + "multirect_mode", 0x0, 0, e_multirect_mode, + ARRAY_SIZE(e_multirect_mode), + PLANE_PROP_MULTIRECT_MODE); + + if (psde->features & BIT(SDE_SSPP_EXCL_RECT)) + msm_property_install_volatile_range(&psde->property_info, + "excl_rect_v1", 0x0, 0, ~0, 0, PLANE_PROP_EXCL_RECT_V1); + + sde_plane_rot_install_properties(plane, catalog); + + msm_property_install_enum(&psde->property_info, "blend_op", 0x0, 0, + e_blend_op, ARRAY_SIZE(e_blend_op), PLANE_PROP_BLEND_OP); + + msm_property_install_enum(&psde->property_info, "src_config", 0x0, 1, + e_src_config, ARRAY_SIZE(e_src_config), PLANE_PROP_SRC_CONFIG); + + if (psde->pipe_hw->ops.setup_solidfill) + msm_property_install_range(&psde->property_info, "color_fill", + 0, 0, 0xFFFFFFFF, 0, PLANE_PROP_COLOR_FILL); + + msm_property_install_range(&psde->property_info, "prefill_size", 0x0, + 0, ~0, 0, PLANE_PROP_PREFILL_SIZE); + msm_property_install_range(&psde->property_info, "prefill_time", 0x0, + 0, ~0, 0, PLANE_PROP_PREFILL_TIME); + + msm_property_install_blob(&psde->property_info, "capabilities", + DRM_MODE_PROP_IMMUTABLE, PLANE_PROP_INFO); + + sde_kms_info_reset(info); + _sde_plane_setup_capabilities_blob(psde, master_plane_id, info, + catalog); + + _sde_plane_install_colorproc_properties(psde, info); + + msm_property_set_blob(&psde->property_info, &psde->blob_info, + info->data, SDE_KMS_INFO_DATALEN(info), + PLANE_PROP_INFO); msm_property_install_enum(&psde->property_info, "fb_translation_mode", - 0x0, - 0, e_fb_translation_mode, + 0x0, 0, e_fb_translation_mode, ARRAY_SIZE(e_fb_translation_mode), PLANE_PROP_FB_TRANSLATION_MODE); + + kfree(info); } static inline void _sde_plane_set_csc_v1(struct sde_plane *psde,