Loading msm/sde/sde_plane.c +181 −166 Original line number Diff line number Diff line Loading @@ -3489,115 +3489,85 @@ 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; bool is_master = !psde->is_virtual; 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; if ((is_master && (psde->features & BIT(SDE_SSPP_INVERSE_PMA))) || (psde->features & BIT(SDE_SSPP_DGM_INVERSE_PMA))) { msm_property_install_range(&psde->property_info, "inverse_pma", 0x0, 0, 1, 0, PLANE_PROP_INVERSE_PMA); sde_kms_info_add_keyint(info, "inverse_pma", 1); } 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; if (psde->features & BIT(SDE_SSPP_DGM_CSC)) { msm_property_install_volatile_range( &psde->property_info, "csc_dma_v1", 0x0, 0, ~0, 0, PLANE_PROP_CSC_DMA_V1); sde_kms_info_add_keyint(info, "csc_dma_v1", 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); if (psde->features & BIT(SDE_SSPP_MEMCOLOR)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKIN_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKIN_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKY_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKY_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_FOLIAGE_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_FOLIAGE_COLOR); } 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->features & BIT(SDE_SSPP_VIG_GAMUT)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_3D_LUT_GAMUT_V", psde->pipe_sblk->gamut_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_GAMUT); } if (psde->pipe_hw->ops.setup_solidfill) msm_property_install_range(&psde->property_info, "color_fill", 0, 0, 0xFFFFFFFF, 0, PLANE_PROP_COLOR_FILL); if (psde->features & BIT(SDE_SSPP_VIG_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_IGC); } 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); if (psde->features & BIT(SDE_SSPP_DMA_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_IGC); } info = kzalloc(sizeof(struct sde_kms_info), GFP_KERNEL); if (!info) { SDE_ERROR("failed to allocate info memory\n"); return; if (psde->features & BIT(SDE_SSPP_DMA_GC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_GC_V", psde->pipe_sblk->gc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_GC); } } msm_property_install_blob(&psde->property_info, "capabilities", DRM_MODE_PROP_IMMUTABLE, PLANE_PROP_INFO); sde_kms_info_reset(info); 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; Loading @@ -3605,10 +3575,6 @@ static void _sde_plane_install_properties(struct drm_plane *plane, 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) { Loading Loading @@ -3648,21 +3614,6 @@ static void _sde_plane_install_properties(struct drm_plane *plane, psde->pipe - SSPP_DMA0); } if ((is_master && (psde->features & BIT(SDE_SSPP_INVERSE_PMA))) || (psde->features & BIT(SDE_SSPP_DGM_INVERSE_PMA))) { msm_property_install_range(&psde->property_info, "inverse_pma", 0x0, 0, 1, 0, PLANE_PROP_INVERSE_PMA); sde_kms_info_add_keyint(info, "inverse_pma", 1); } if (psde->features & BIT(SDE_SSPP_DGM_CSC)) { msm_property_install_volatile_range( &psde->property_info, "csc_dma_v1", 0x0, 0, ~0, 0, PLANE_PROP_CSC_DMA_V1); 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)) Loading Loading @@ -3700,70 +3651,134 @@ static void _sde_plane_install_properties(struct drm_plane *plane, } 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); /* 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 (psde->features & BIT(SDE_SSPP_MEMCOLOR)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKIN_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKIN_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKY_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKY_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_FOLIAGE_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_FOLIAGE_COLOR); 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; } if (psde->features & BIT(SDE_SSPP_VIG_GAMUT)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_3D_LUT_GAMUT_V", psde->pipe_sblk->gamut_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_GAMUT); } psde->catalog = catalog; is_master = !psde->is_virtual; if (psde->features & BIT(SDE_SSPP_VIG_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_IGC); info = kzalloc(sizeof(struct sde_kms_info), GFP_KERNEL); if (!info) { SDE_ERROR("failed to allocate info memory\n"); return; } if (psde->features & BIT(SDE_SSPP_DMA_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_IGC); 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; } if (psde->features & BIT(SDE_SSPP_DMA_GC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_GC_V", psde->pipe_sblk->gc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_GC); } 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, Loading Loading
msm/sde/sde_plane.c +181 −166 Original line number Diff line number Diff line Loading @@ -3489,115 +3489,85 @@ 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; bool is_master = !psde->is_virtual; 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; if ((is_master && (psde->features & BIT(SDE_SSPP_INVERSE_PMA))) || (psde->features & BIT(SDE_SSPP_DGM_INVERSE_PMA))) { msm_property_install_range(&psde->property_info, "inverse_pma", 0x0, 0, 1, 0, PLANE_PROP_INVERSE_PMA); sde_kms_info_add_keyint(info, "inverse_pma", 1); } 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; if (psde->features & BIT(SDE_SSPP_DGM_CSC)) { msm_property_install_volatile_range( &psde->property_info, "csc_dma_v1", 0x0, 0, ~0, 0, PLANE_PROP_CSC_DMA_V1); sde_kms_info_add_keyint(info, "csc_dma_v1", 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); if (psde->features & BIT(SDE_SSPP_MEMCOLOR)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKIN_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKIN_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKY_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKY_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_FOLIAGE_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_FOLIAGE_COLOR); } 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->features & BIT(SDE_SSPP_VIG_GAMUT)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_3D_LUT_GAMUT_V", psde->pipe_sblk->gamut_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_GAMUT); } if (psde->pipe_hw->ops.setup_solidfill) msm_property_install_range(&psde->property_info, "color_fill", 0, 0, 0xFFFFFFFF, 0, PLANE_PROP_COLOR_FILL); if (psde->features & BIT(SDE_SSPP_VIG_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_IGC); } 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); if (psde->features & BIT(SDE_SSPP_DMA_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_IGC); } info = kzalloc(sizeof(struct sde_kms_info), GFP_KERNEL); if (!info) { SDE_ERROR("failed to allocate info memory\n"); return; if (psde->features & BIT(SDE_SSPP_DMA_GC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_GC_V", psde->pipe_sblk->gc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_GC); } } msm_property_install_blob(&psde->property_info, "capabilities", DRM_MODE_PROP_IMMUTABLE, PLANE_PROP_INFO); sde_kms_info_reset(info); 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; Loading @@ -3605,10 +3575,6 @@ static void _sde_plane_install_properties(struct drm_plane *plane, 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) { Loading Loading @@ -3648,21 +3614,6 @@ static void _sde_plane_install_properties(struct drm_plane *plane, psde->pipe - SSPP_DMA0); } if ((is_master && (psde->features & BIT(SDE_SSPP_INVERSE_PMA))) || (psde->features & BIT(SDE_SSPP_DGM_INVERSE_PMA))) { msm_property_install_range(&psde->property_info, "inverse_pma", 0x0, 0, 1, 0, PLANE_PROP_INVERSE_PMA); sde_kms_info_add_keyint(info, "inverse_pma", 1); } if (psde->features & BIT(SDE_SSPP_DGM_CSC)) { msm_property_install_volatile_range( &psde->property_info, "csc_dma_v1", 0x0, 0, ~0, 0, PLANE_PROP_CSC_DMA_V1); 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)) Loading Loading @@ -3700,70 +3651,134 @@ static void _sde_plane_install_properties(struct drm_plane *plane, } 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); /* 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 (psde->features & BIT(SDE_SSPP_MEMCOLOR)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKIN_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKIN_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_SKY_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_SKY_COLOR); snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_SSPP_FOLIAGE_COLOR_V", psde->pipe_sblk->memcolor_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_FOLIAGE_COLOR); 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; } if (psde->features & BIT(SDE_SSPP_VIG_GAMUT)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_3D_LUT_GAMUT_V", psde->pipe_sblk->gamut_blk.version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_GAMUT); } psde->catalog = catalog; is_master = !psde->is_virtual; if (psde->features & BIT(SDE_SSPP_VIG_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_VIG_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_VIG_IGC); info = kzalloc(sizeof(struct sde_kms_info), GFP_KERNEL); if (!info) { SDE_ERROR("failed to allocate info memory\n"); return; } if (psde->features & BIT(SDE_SSPP_DMA_IGC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_IGC_V", psde->pipe_sblk->igc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_IGC); 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; } if (psde->features & BIT(SDE_SSPP_DMA_GC)) { snprintf(feature_name, sizeof(feature_name), "%s%d", "SDE_DGM_1D_LUT_GC_V", psde->pipe_sblk->gc_blk[0].version >> 16); msm_property_install_blob(&psde->property_info, feature_name, 0, PLANE_PROP_DMA_GC); } 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, Loading