diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c index deeecdfd6c4e..74c6c118bfab 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c @@ -167,6 +167,7 @@ struct msm_dsi_host { unsigned int lanes; enum mipi_dsi_pixel_format format; unsigned long mode_flags; + unsigned int slice_per_pkt; /* lane data parsed via DT */ int dlane_swap; @@ -863,7 +864,7 @@ static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mod * Since the current driver only supports slice_per_pkt = 1, * pkt_per_line will be equal to slice per intf for now. */ - pkt_per_line = slice_per_intf; + pkt_per_line = slice_per_intf * msm_host->slice_per_pkt; if (is_cmd_mode) /* packet data type */ reg = DSI_COMMAND_COMPRESSION_MODE_CTRL_STREAM0_DATATYPE(MIPI_DSI_DCS_LONG_WRITE); @@ -1002,7 +1003,8 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi) * TODO: Expand mipi_dsi_device struct to hold slice_per_pkt info * and adjust DSC math to account for slice_per_pkt. */ - wc = msm_host->dsc->slice_chunk_size + 1; + wc = msm_host->dsc->slice_chunk_size * + msm_host->slice_per_pkt + 1; dsi_write(msm_host, REG_DSI_CMD_MDP_STREAM0_CTRL, DSI_CMD_MDP_STREAM0_CTRL_WORD_COUNT(wc) | @@ -1629,6 +1631,7 @@ static int dsi_host_attach(struct mipi_dsi_host *host, msm_host->lanes = dsi->lanes; msm_host->format = dsi->format; msm_host->mode_flags = dsi->mode_flags; + msm_host->slice_per_pkt = dsi->slice_per_pkt; if (dsi->dsc) msm_host->dsc = dsi->dsc; @@ -1762,6 +1765,18 @@ static int dsi_host_parse_lane_data(struct msm_dsi_host *msm_host, return -EINVAL; } +static void dsi_host_set_num_slices(struct msm_dsi_host *msm_host) +{ + struct mipi_dsi_device *dsi = to_mipi_dsi_device(&msm_host->pdev->dev); + + if (dsi->slice_per_pkt) + msm_host->slice_per_pkt = dsi->slice_per_pkt; + else { + msm_host->slice_per_pkt = 1; + dsi->slice_per_pkt = 1; + } +} + static int dsi_populate_dsc_params(struct msm_dsi_host *msm_host, struct drm_dsc_config *dsc) { int ret; @@ -1833,6 +1848,8 @@ static int dsi_host_parse_dt(struct msm_dsi_host *msm_host) } } + dsi_host_set_num_slices(msm_host); + err: of_node_put(endpoint); diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h index c9df0407980c..62d4c8d91101 100644 --- a/include/drm/drm_mipi_dsi.h +++ b/include/drm/drm_mipi_dsi.h @@ -172,6 +172,7 @@ struct mipi_dsi_device_info { * @channel: virtual channel assigned to the peripheral * @format: pixel format for video mode * @lanes: number of active data lanes + * @slice_per_pkt: number of slices in a data packet * @mode_flags: DSI operation mode related flags * @hs_rate: maximum lane frequency for high speed mode in hertz, this should * be set to the real limits of the hardware, zero is only accepted for @@ -188,6 +189,7 @@ struct mipi_dsi_device { char name[DSI_DEV_NAME_SIZE]; unsigned int channel; unsigned int lanes; + unsigned int slice_per_pkt; enum mipi_dsi_pixel_format format; unsigned long mode_flags; unsigned long hs_rate;