From nobody Mon Apr 6 19:59:51 2026 Received: from mail-106121.protonmail.ch (mail-106121.protonmail.ch [79.135.106.121]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B63B638F238 for ; Wed, 18 Mar 2026 09:54:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=79.135.106.121 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773827668; cv=none; b=I9fjPf2Xoo4xsnHDLXkixAfeRL9lWPfX4RKgqKcsGivvHFKDmPlUOK/gsHAYuzP62v8yiN/14XnoT/VEKDKSFE8/+AENSDvamMSqELOE0vhYsXze+eHKxTZuZ26X6sNUehC0q/KwEXtNeGfm0Ojoi6BFKQIteBUSV6OGfTNuLcY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773827668; c=relaxed/simple; bh=5qSjDne/iFsggNeLug5cvZNfuY3uHkfAcnxR73bBwss=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=S9gS+taeLvtD1QbdfAACT8sAjXUCho+9O93qfTKmB0pOKLP5dXvdtDdurx/VaTG1I5beQ1c3xcm2DQjh5Ey1jW1O//RbruV7LAfx4TSZ4olTCh/PR3FfBl8+0f9BZpvIBd7vXBsKeKDNZImF9YHitSxhMZkkUGWAkdKJ/571Wlc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me; spf=pass smtp.mailfrom=pm.me; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b=To9GZ6FP; arc=none smtp.client-ip=79.135.106.121 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pm.me Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b="To9GZ6FP" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pm.me; s=protonmail3; t=1773827652; x=1774086852; bh=ZvJ/7shirC546tu3Qvvv+nTQ0LiLQyarVEjf06bBYsw=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=To9GZ6FP8Qe55WfhBL0mP+v8hSJMObOShVbNLb4pJsM9D+zpUerZBR7Mg9O3rZPcY 2EBNNllFJD6Klk++xdfkN27RT79PdCtCO1FBqFJ0YhCiaxmG9S0n8Lu5H2aCLn5wGL di5RCnXB0Doz303Z+6+LwZnUDxeYrPxAtOSa4aeN0yhxJoNiKCfT5sDfIhD4dVNNhf ANw/Aa0b6iHXuFvOVcoK0Pt+h6fWlcc8xtNbTBiPggXlsxubOi9SJhE4IeJp3ns8+H PnnhjxgyjREV83Gk7mslNr4w1cjt7YbdZWJHy/wqDbQAIo5vXH9U2DRQbxNGY40kGz LCvFEuH7JIP9g== Date: Wed, 18 Mar 2026 09:54:08 +0000 To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten From: Alexander Koskovich Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Alexander Koskovich , Jonathan Marek Subject: [PATCH v2 2/2] drm/msm/dsi: support DSC configurations with slice_per_pkt > 1 Message-ID: <20260318-dsi-dsc-slice-per-pkt-v2-2-0a1b316f8250@pm.me> In-Reply-To: <20260318-dsi-dsc-slice-per-pkt-v2-0-0a1b316f8250@pm.me> References: <20260318-dsi-dsc-slice-per-pkt-v2-0-0a1b316f8250@pm.me> Feedback-ID: 37836894:user:proton X-Pm-Message-ID: 946c12605bb56f903f60b9e6ca9f8a98b3a6cec4 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jonathan Marek Some panels support multiple slice to be sent in a single DSC packet and this feature is a must for specific panels, such as the JDI LPM026M648C. Use the MIPI_DSI_MODE_DSC_ALL_SLICES_IN_PKT flag to derive slice_per_pkt from slice_count, note that most panels are expected to just work with just one slice per packet. Signed-off-by: Jonathan Marek Signed-off-by: Alexander Koskovich Reviewed-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio --- drivers/gpu/drm/msm/dsi/dsi_host.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/d= si_host.c index db6da99375a1..758b076ee4bf 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c @@ -166,6 +166,7 @@ struct msm_dsi_host { =20 struct drm_display_mode *mode; struct drm_dsc_config *dsc; + unsigned int dsc_slice_per_pkt; =20 /* connected device info */ unsigned int channel; @@ -927,17 +928,10 @@ static void dsi_update_dsc_timing(struct msm_dsi_host= *msm_host, bool is_cmd_mod slice_per_intf =3D dsc->slice_count; =20 total_bytes_per_intf =3D dsc->slice_chunk_size * slice_per_intf; - bytes_per_pkt =3D dsc->slice_chunk_size; /* * slice_per_pkt; */ + bytes_per_pkt =3D dsc->slice_chunk_size * msm_host->dsc_slice_per_pkt; =20 eol_byte_num =3D total_bytes_per_intf % 3; - - /* - * Typically, pkt_per_line =3D slice_per_intf * slice_per_pkt. - * - * Since the current driver only supports slice_per_pkt =3D 1, - * pkt_per_line will be equal to slice per intf for now. - */ - pkt_per_line =3D slice_per_intf; + pkt_per_line =3D slice_per_intf / msm_host->dsc_slice_per_pkt; =20 if (is_cmd_mode) /* packet data type */ reg =3D DSI_COMMAND_COMPRESSION_MODE_CTRL_STREAM0_DATATYPE(MIPI_DSI_DCS_= LONG_WRITE); @@ -1088,12 +1082,8 @@ static void dsi_timing_setup(struct msm_dsi_host *ms= m_host, bool is_bonded_dsi) else /* * When DSC is enabled, WC =3D slice_chunk_size * slice_per_pkt + 1. - * Currently, the driver only supports default value of slice_per_pkt = =3D 1 - * - * TODO: Expand mipi_dsi_device struct to hold slice_per_pkt info - * and adjust DSC math to account for slice_per_pkt. */ - wc =3D msm_host->dsc->slice_chunk_size + 1; + wc =3D msm_host->dsc->slice_chunk_size * msm_host->dsc_slice_per_pkt + = 1; =20 dsi_write(msm_host, REG_DSI_CMD_MDP_STREAM0_CTRL, DSI_CMD_MDP_STREAM0_CTRL_WORD_COUNT(wc) | @@ -1702,8 +1692,13 @@ static int dsi_host_attach(struct mipi_dsi_host *hos= t, msm_host->lanes =3D dsi->lanes; msm_host->format =3D dsi->format; msm_host->mode_flags =3D dsi->mode_flags; - if (dsi->dsc) + if (dsi->dsc) { msm_host->dsc =3D dsi->dsc; + if (dsi->mode_flags & MIPI_DSI_MODE_DSC_ALL_SLICES_IN_PKT) + msm_host->dsc_slice_per_pkt =3D dsi->dsc->slice_count; + else + msm_host->dsc_slice_per_pkt =3D 1; + } =20 ret =3D dsi_dev_attach(msm_host->pdev); if (ret) --=20 2.53.0