Loading arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi +1 −0 Original line number Original line Diff line number Diff line Loading @@ -412,6 +412,7 @@ qcom,dp-usbpd-detection = <&pmi8998_pdphy>; qcom,dp-usbpd-detection = <&pmi8998_pdphy>; qcom,aux-cfg-settings = [00 13 04 00 0a 26 0a 03 bb 03]; qcom,aux-cfg-settings = [00 13 04 00 0a 26 0a 03 bb 03]; qcom,max-pclk-frequency-khz = <576000>; qcom,core-supply-entries { qcom,core-supply-entries { #address-cells = <1>; #address-cells = <1>; Loading drivers/gpu/drm/msm/dp/dp_display.c +6 −0 Original line number Original line Diff line number Diff line Loading @@ -261,6 +261,7 @@ static const struct component_ops dp_display_comp_ops = { static int dp_display_process_hpd_high(struct dp_display_private *dp) static int dp_display_process_hpd_high(struct dp_display_private *dp) { { int rc = 0; int rc = 0; u32 max_pclk_from_edid = 0; rc = dp->panel->read_dpcd(dp->panel); rc = dp->panel->read_dpcd(dp->panel); if (rc) if (rc) Loading @@ -269,6 +270,11 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) sde_get_edid(dp->dp_display.connector, &dp->aux->drm_aux->ddc, sde_get_edid(dp->dp_display.connector, &dp->aux->drm_aux->ddc, (void **)&dp->panel->edid_ctrl); (void **)&dp->panel->edid_ctrl); max_pclk_from_edid = dp->panel->get_max_pclk(dp->panel); dp->dp_display.max_pclk_khz = min(max_pclk_from_edid, dp->parser->max_pclk_khz); dp->dp_display.is_connected = true; dp->dp_display.is_connected = true; drm_helper_hpd_irq_event(dp->dp_display.connector->dev); drm_helper_hpd_irq_event(dp->dp_display.connector->dev); Loading drivers/gpu/drm/msm/dp/dp_display.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ struct dp_display { struct dp_bridge *bridge; struct dp_bridge *bridge; struct drm_connector *connector; struct drm_connector *connector; bool is_connected; bool is_connected; u32 max_pclk_khz; int (*enable)(struct dp_display *dp_display); int (*enable)(struct dp_display *dp_display); int (*post_enable)(struct dp_display *dp_display); int (*post_enable)(struct dp_display *dp_display); Loading drivers/gpu/drm/msm/dp/dp_drm.c +13 −1 Original line number Original line Diff line number Diff line Loading @@ -450,5 +450,17 @@ enum drm_mode_status dp_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode, struct drm_display_mode *mode, void *display) void *display) { { struct dp_display *dp_disp; if (!mode || !display) { pr_err("invalid params\n"); return MODE_ERROR; } dp_disp = display; if (mode->clock > dp_disp->max_pclk_khz) return MODE_BAD; else return MODE_OK; return MODE_OK; } } drivers/gpu/drm/msm/dp/dp_panel.c +29 −0 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,34 @@ static int dp_panel_read_dpcd(struct dp_panel *dp_panel) return rc; return rc; } } static u32 dp_panel_get_max_pclk(struct dp_panel *dp_panel) { struct dp_panel_private *panel; struct drm_dp_link *dp_link; u32 bpc, bpp, max_data_rate_khz, max_pclk_rate_khz; const u8 num_components = 3; if (!dp_panel) { pr_err("invalid input\n"); return 0; } panel = container_of(dp_panel, struct dp_panel_private, dp_panel); dp_link = &dp_panel->dp_link; bpc = sde_get_sink_bpc(dp_panel->edid_ctrl); bpp = bpc * num_components; max_data_rate_khz = (dp_link->num_lanes * dp_link->rate * 8); max_pclk_rate_khz = max_data_rate_khz / bpp; pr_debug("bpp=%d, max_lane_cnt=%d\n", bpp, dp_link->num_lanes); pr_debug("max_data_rate=%dKHz, max_pclk_rate=%dKHz\n", max_data_rate_khz, max_pclk_rate_khz); return max_pclk_rate_khz; } static int dp_panel_timing_cfg(struct dp_panel *dp_panel) static int dp_panel_timing_cfg(struct dp_panel *dp_panel) { { int rc = 0; int rc = 0; Loading Loading @@ -276,6 +304,7 @@ struct dp_panel *dp_panel_get(struct device *dev, struct dp_aux *aux, dp_panel->timing_cfg = dp_panel_timing_cfg; dp_panel->timing_cfg = dp_panel_timing_cfg; dp_panel->read_dpcd = dp_panel_read_dpcd; dp_panel->read_dpcd = dp_panel_read_dpcd; dp_panel->get_link_rate = dp_panel_get_link_rate; dp_panel->get_link_rate = dp_panel_get_link_rate; dp_panel->get_max_pclk = dp_panel_get_max_pclk; return dp_panel; return dp_panel; error: error: Loading Loading
arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi +1 −0 Original line number Original line Diff line number Diff line Loading @@ -412,6 +412,7 @@ qcom,dp-usbpd-detection = <&pmi8998_pdphy>; qcom,dp-usbpd-detection = <&pmi8998_pdphy>; qcom,aux-cfg-settings = [00 13 04 00 0a 26 0a 03 bb 03]; qcom,aux-cfg-settings = [00 13 04 00 0a 26 0a 03 bb 03]; qcom,max-pclk-frequency-khz = <576000>; qcom,core-supply-entries { qcom,core-supply-entries { #address-cells = <1>; #address-cells = <1>; Loading
drivers/gpu/drm/msm/dp/dp_display.c +6 −0 Original line number Original line Diff line number Diff line Loading @@ -261,6 +261,7 @@ static const struct component_ops dp_display_comp_ops = { static int dp_display_process_hpd_high(struct dp_display_private *dp) static int dp_display_process_hpd_high(struct dp_display_private *dp) { { int rc = 0; int rc = 0; u32 max_pclk_from_edid = 0; rc = dp->panel->read_dpcd(dp->panel); rc = dp->panel->read_dpcd(dp->panel); if (rc) if (rc) Loading @@ -269,6 +270,11 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) sde_get_edid(dp->dp_display.connector, &dp->aux->drm_aux->ddc, sde_get_edid(dp->dp_display.connector, &dp->aux->drm_aux->ddc, (void **)&dp->panel->edid_ctrl); (void **)&dp->panel->edid_ctrl); max_pclk_from_edid = dp->panel->get_max_pclk(dp->panel); dp->dp_display.max_pclk_khz = min(max_pclk_from_edid, dp->parser->max_pclk_khz); dp->dp_display.is_connected = true; dp->dp_display.is_connected = true; drm_helper_hpd_irq_event(dp->dp_display.connector->dev); drm_helper_hpd_irq_event(dp->dp_display.connector->dev); Loading
drivers/gpu/drm/msm/dp/dp_display.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ struct dp_display { struct dp_bridge *bridge; struct dp_bridge *bridge; struct drm_connector *connector; struct drm_connector *connector; bool is_connected; bool is_connected; u32 max_pclk_khz; int (*enable)(struct dp_display *dp_display); int (*enable)(struct dp_display *dp_display); int (*post_enable)(struct dp_display *dp_display); int (*post_enable)(struct dp_display *dp_display); Loading
drivers/gpu/drm/msm/dp/dp_drm.c +13 −1 Original line number Original line Diff line number Diff line Loading @@ -450,5 +450,17 @@ enum drm_mode_status dp_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode, struct drm_display_mode *mode, void *display) void *display) { { struct dp_display *dp_disp; if (!mode || !display) { pr_err("invalid params\n"); return MODE_ERROR; } dp_disp = display; if (mode->clock > dp_disp->max_pclk_khz) return MODE_BAD; else return MODE_OK; return MODE_OK; } }
drivers/gpu/drm/msm/dp/dp_panel.c +29 −0 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,34 @@ static int dp_panel_read_dpcd(struct dp_panel *dp_panel) return rc; return rc; } } static u32 dp_panel_get_max_pclk(struct dp_panel *dp_panel) { struct dp_panel_private *panel; struct drm_dp_link *dp_link; u32 bpc, bpp, max_data_rate_khz, max_pclk_rate_khz; const u8 num_components = 3; if (!dp_panel) { pr_err("invalid input\n"); return 0; } panel = container_of(dp_panel, struct dp_panel_private, dp_panel); dp_link = &dp_panel->dp_link; bpc = sde_get_sink_bpc(dp_panel->edid_ctrl); bpp = bpc * num_components; max_data_rate_khz = (dp_link->num_lanes * dp_link->rate * 8); max_pclk_rate_khz = max_data_rate_khz / bpp; pr_debug("bpp=%d, max_lane_cnt=%d\n", bpp, dp_link->num_lanes); pr_debug("max_data_rate=%dKHz, max_pclk_rate=%dKHz\n", max_data_rate_khz, max_pclk_rate_khz); return max_pclk_rate_khz; } static int dp_panel_timing_cfg(struct dp_panel *dp_panel) static int dp_panel_timing_cfg(struct dp_panel *dp_panel) { { int rc = 0; int rc = 0; Loading Loading @@ -276,6 +304,7 @@ struct dp_panel *dp_panel_get(struct device *dev, struct dp_aux *aux, dp_panel->timing_cfg = dp_panel_timing_cfg; dp_panel->timing_cfg = dp_panel_timing_cfg; dp_panel->read_dpcd = dp_panel_read_dpcd; dp_panel->read_dpcd = dp_panel_read_dpcd; dp_panel->get_link_rate = dp_panel_get_link_rate; dp_panel->get_link_rate = dp_panel_get_link_rate; dp_panel->get_max_pclk = dp_panel_get_max_pclk; return dp_panel; return dp_panel; error: error: Loading