diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index 209c278520da..ee48229f19df 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -3552,6 +3552,46 @@ static void dp_display_wakeup_phy_layer(struct dp_display *dp_display, hpd->wakeup_phy(hpd, wakeup); } +static int dp_display_get_display_type(struct dp_display *dp_display, + const char **display_type) +{ + struct dp_display_private *dp; + + if (!dp_display || !display_type) { + pr_err("invalid input\n"); + return -EINVAL; + } + + dp = container_of(dp_display, struct dp_display_private, dp_display); + + *display_type = dp->parser->display_type; + + return 0; +} + +static int dp_display_mst_get_fixed_topology_display_type( + struct dp_display *dp_display, u32 strm_id, + const char **display_type) +{ + struct dp_display_private *dp; + + if (!dp_display || !display_type) { + pr_err("invalid input\n"); + return -EINVAL; + } + + if (strm_id >= DP_STREAM_MAX) { + pr_err("invalid stream id:%d\n", strm_id); + return -EINVAL; + } + + dp = container_of(dp_display, struct dp_display_private, dp_display); + + *display_type = dp->parser->mst_fixed_display_type[strm_id]; + + return 0; +} + static int dp_display_probe(struct platform_device *pdev) { int rc = 0; @@ -3629,6 +3669,9 @@ static int dp_display_probe(struct platform_device *pdev) g_dp_display->set_colorspace = dp_display_setup_colospace; g_dp_display->get_available_dp_resources = dp_display_get_available_dp_resources; + g_dp_display->get_display_type = dp_display_get_display_type; + g_dp_display->mst_get_fixed_topology_display_type = + dp_display_mst_get_fixed_topology_display_type; rc = component_add(&pdev->dev, &dp_display_comp_ops); if (rc) { diff --git a/msm/dp/dp_display.h b/msm/dp/dp_display.h index eda860c74c11..de5daae9521b 100644 --- a/msm/dp/dp_display.h +++ b/msm/dp/dp_display.h @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ @@ -132,6 +133,10 @@ struct dp_display { int (*get_available_dp_resources)(struct dp_display *dp_display, const struct msm_resource_caps_info *avail_res, struct msm_resource_caps_info *max_dp_avail_res); + int (*get_display_type)(struct dp_display *dp_display, + const char **display_type); + int (*mst_get_fixed_topology_display_type)(struct dp_display *dp_display, + u32 strm_id, const char **display_type); }; #if IS_ENABLED(CONFIG_DRM_MSM_DP) diff --git a/msm/dp/dp_drm.c b/msm/dp/dp_drm.c index 3c29801249c3..60e9cc418ca2 100644 --- a/msm/dp/dp_drm.c +++ b/msm/dp/dp_drm.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. */ @@ -594,6 +595,18 @@ int dp_connector_get_modes(struct drm_connector *connector, return rc; } +int dp_connector_set_info_blob(struct drm_connector *connector, + void *info, void *display, struct msm_mode_info *mode_info) +{ + struct dp_display *dp_display = display; + const char *display_type = NULL; + + dp_display->get_display_type(dp_display, &display_type); + sde_kms_info_add_keystr(info, "display type", display_type); + + return 0; +} + int dp_drm_bridge_init(void *data, struct drm_encoder *encoder, u32 max_mixer_count, u32 max_dsc_count) { diff --git a/msm/dp/dp_drm.h b/msm/dp/dp_drm.h index 5d7462cd20f8..647705c2706d 100644 --- a/msm/dp/dp_drm.h +++ b/msm/dp/dp_drm.h @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ @@ -136,6 +137,18 @@ void dp_connector_post_open(struct drm_connector *connector, void *display); * @max_mixer_count: max available mixers for dp display * @max_dsc_count: max available dsc for dp display */ + +/** + * dp_conn_set_info_blob - callback to perform info blob initialization + * @connector: Pointer to drm connector structure + * @info: Pointer to sde connector info structure + * @display: Pointer to private display handle + * @mode_info: Pointer to mode info structure + * Returns: Zero on success + */ +int dp_connector_set_info_blob(struct drm_connector *connector, + void *info, void *display, struct msm_mode_info *mode_info); + int dp_drm_bridge_init(void *display, struct drm_encoder *encoder, u32 max_mixer_count, u32 max_dsc_count); @@ -233,6 +246,12 @@ static inline void dp_connector_post_open(struct drm_connector *connector, { } +static inline int dp_connector_set_info_blob(struct drm_connector *connector, + void *info, void *display, struct msm_mode_info *mode_info) +{ + return 0; +} + static inline int dp_drm_bridge_init(void *display, struct drm_encoder *encoder, u32 max_mixer_count, u32 max_dsc_count) { diff --git a/msm/dp/dp_mst_drm.c b/msm/dp/dp_mst_drm.c index e1ccf47b3881..1a295edeee3b 100644 --- a/msm/dp/dp_mst_drm.c +++ b/msm/dp/dp_mst_drm.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ @@ -2130,11 +2131,36 @@ static void dp_mst_destroy_fixed_connector(struct drm_dp_mst_topology_mgr *mgr, dp_mst_destroy_connector(mgr, connector); } +static int dp_mst_fixed_connector_set_info_blob( + struct drm_connector *connector, + void *info, void *display, struct msm_mode_info *mode_info) +{ + struct sde_connector *c_conn = to_sde_connector(connector); + struct dp_display *dp_display = display; + struct dp_mst_private *mst = dp_display->dp_mst_prv_info; + const char *display_type = NULL; + int i; + + for (i = 0; i < MAX_DP_MST_DRM_BRIDGES; i++) { + if (mst->mst_bridge[i].base.encoder != c_conn->encoder) + continue; + + dp_display->mst_get_fixed_topology_display_type(dp_display, + mst->mst_bridge[i].id, &display_type); + sde_kms_info_add_keystr(info, "display type", display_type); + + break; + } + + return 0; +} + static struct drm_connector * dp_mst_drm_fixed_connector_init(struct dp_display *dp_display, struct drm_encoder *encoder) { static const struct sde_connector_ops dp_mst_connector_ops = { + .set_info_blob = dp_mst_fixed_connector_set_info_blob, .post_init = dp_mst_connector_post_init, .detect = dp_mst_fixed_connector_detect, .get_modes = dp_mst_connector_get_modes, diff --git a/msm/dp/dp_parser.c b/msm/dp/dp_parser.c index 6938430283ed..87adcd2e1088 100644 --- a/msm/dp/dp_parser.c +++ b/msm/dp/dp_parser.c @@ -173,6 +173,10 @@ static int dp_parser_misc(struct dp_parser *parser) &parser->pixel_base_off[i]); } + parser->display_type = of_get_property(of_node, "qcom,display-type", NULL); + if (!parser->display_type) + parser->display_type = "unknown"; + return 0; } @@ -744,6 +748,12 @@ static int dp_parser_mst(struct dp_parser *parser) of_property_read_u32_index(dev->of_node, "qcom,mst-fixed-topology-ports", i, &parser->mst_fixed_port[i]); + of_property_read_string_index( + dev->of_node, + "qcom,mst-fixed-topology-display-types", i, + &parser->mst_fixed_display_type[i]); + if (!parser->mst_fixed_display_type[i]) + parser->mst_fixed_display_type[i] = "unknown"; } return 0; diff --git a/msm/dp/dp_parser.h b/msm/dp/dp_parser.h index 0ae02ec0a100..cdeb85f422c2 100644 --- a/msm/dp/dp_parser.h +++ b/msm/dp/dp_parser.h @@ -224,6 +224,8 @@ static inline char *dp_phy_aux_config_type_to_string(u32 cfg_type) * @get_io: function to be called by client to get io data. * @get_io_buf: function to be called by client to get io buffers. * @clear_io_buf: function to be called by client to clear io buffers. + * @mst_fixed_display_type: mst display_type reserved for fixed topology + * @display_type: display type as defined in device tree. */ struct dp_parser { struct platform_device *pdev; @@ -250,6 +252,8 @@ struct dp_parser { bool lphw_hpd; u32 mst_fixed_port[MAX_DP_MST_STREAMS]; u32 pixel_base_off[MAX_DP_MST_STREAMS]; + const char *mst_fixed_display_type[MAX_DP_MST_STREAMS]; + const char *display_type; int (*parse)(struct dp_parser *parser); struct dp_io_data *(*get_io)(struct dp_parser *parser, char *name); diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 9f7a815c9227..95ee152f691f 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1776,6 +1776,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev, .set_allowed_mode_switch = NULL, }; static const struct sde_connector_ops dp_ops = { + .set_info_blob = dp_connector_set_info_blob, .post_init = dp_connector_post_init, .detect = dp_connector_detect, .get_modes = dp_connector_get_modes,