From nobody Sun Feb 8 19:39:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 896591C3BF7 for ; Sat, 3 Jan 2026 13:45:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767447913; cv=none; b=H6dAKQsiJ91mYjTFrvxLl2lx/0VjqhrDwdn0+Tthe+c6iMm1SU5H1dWqoNKY1tL8N0eu4qDK1e77qZaRHhcliAcTNwYoyjIzVG55amMBkK+uHNo/KZWeXHMaGhy4lcSpoVNWebk/ajp5GIWtTf6S2IM/hXdoLyn7rZnZerB7aC0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767447913; c=relaxed/simple; bh=eJwaS8AIVbfSqoaa1FQTEObV3QnxwMSaPtV54XbsuiE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aeE1OmZpLBv/g1Vk0sP5mVQc5l0t0LmnRHF8Ug7+Vy2TMSJQiGDYearseV6780aPmVx327vejSt0ZK5odkNpab5QlU81B89D/E+WOWlqS5MfwLAO7nIgnYXviLnrcJs5NhwptSaLLi518euIXrW+/qMnoRRVE88OclcmfqWSm9M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=dUVuyuyy; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=O8Ww0AtV; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="dUVuyuyy"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="O8Ww0AtV" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 603CuNdF4051695 for ; Sat, 3 Jan 2026 13:45:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= /wcs7WndFuV4NrmzF+q/q7Lo8YaqkaYiZJXqCxYd/1U=; b=dUVuyuyyw1u4T2UX ckUMw3m4GVGrwqWPWMig040pg2Lp3z3ij3z9dtNTBRFy0vMzym9HISCbweN24A35 fTVW5J80HOGuY2Q1z9eHQoSs76Odpq+WbpcPoqqcHomRg+6tBJBkNR40rN4pTUqs rX+YNSUq+ko/kfHl9ZtN3UufWiCHtEb3SVvU3Vnd1HDVlZmaMzPVV1gbwGqalra7 M6V12gkEiUjiPKaqmpfj1nwtLDaoHGrdkUVlS0lWN6D5SIzBqjAxGO12XnAl9G+K cljr3nr1GfKZipZlFSV9VcjOQlp8KzV2rvrKBk0QfvHC46C9tin5PMG1TA49jE3z dUDtng== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4betpxgntw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Sat, 03 Jan 2026 13:45:10 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-8b24a25cff5so3678465285a.2 for ; Sat, 03 Jan 2026 05:45:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767447909; x=1768052709; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=/wcs7WndFuV4NrmzF+q/q7Lo8YaqkaYiZJXqCxYd/1U=; b=O8Ww0AtVYVgAUu8vlaObWJKXkzXcIFDJ4Rw9+PumNaPsmUoadTzNnsvur1leMv2Cm6 CmuECH/LCbC0d0IwWYIbzkBAhlU6wzB9cirSYBbFbJE2hD3G4HWuHPbfU9xqDC+J9VF/ tBpnSYtCyjciR8ucEuHE4nrCpxhOeU3UrQ+UYw5gZ7b9AQ3hT3fLrbYr4QbJEG+WXg/U ENdOGJYqGRTEls5pUyFPAg+Z8hIfMbzXcGzblcPl5iZK93cmPKmKLfymFPWhOthxP+ro VaK+0rhRdJSJj1AFynCIinEE1B1gOwUbmFMZ2vBHcKfi0HjKPcS930Xh/Gq0tjlXw+Ud uWeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767447909; x=1768052709; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=/wcs7WndFuV4NrmzF+q/q7Lo8YaqkaYiZJXqCxYd/1U=; b=kRaQLfihyNaLbcx32M6ueHwUTkzuLbsYMLHh21wg6OraZu3O5ADZmIm1ODpTNlLxBx VQV8EAGPkxYAMhyoOfAm5oa+KIZunvRqj7icW99BGLUXbEGhUp0nsm4nRa0c4NV40foO 0hhbEyUBLTJ2S6Zab0ZS8wVoqS7ovHwHLcYHAoi6ifWGY+NsIu890cT272pLiGhDfhWT mT6OOeEpqcGX/A/Ht3gEQbW8WOv9ow0qkm87XX8w4fuFp4ALpjMU92l5dNWK5qA1V+BM 7EGwGc3B6J+gDreTCTkaM904OofSYfzo1L1SZdKRy4fu0eweUjjRWW7W0gvnYlaW0DIW lE0Q== X-Forwarded-Encrypted: i=1; AJvYcCWMi6hjdmOWWSgpdG/RpNHIkdlAvp+AvdjPlPvEmuZESMnQ8ov0N/130GKDenby7kzDY4PRHUxrKSAPva4=@vger.kernel.org X-Gm-Message-State: AOJu0YzN5qRpkRE5nMhGTpGe0tydUNdErKmZHvixcJdPY4gk3xcARzzL FxkcnwdZ2UufqYc5SvS7U6XbykCF56GzERDmmf2rLLxUdmzgUKdk6vV3tjVPCikIoDnQbuRZJFX QKHbdgNS40JArT9AGK9cY5morEDM/HvhQxVO/Fbo+rG7lf6rF+5n/UiXHo5XLz6ri9GU= X-Gm-Gg: AY/fxX7CVJPDFj+DZSD/dScNqGDgVM/NNVF8U/eGp62s/PRcszB1AHaKeRv0wbg349g Be62SFo2Yjt1M2zrI7/aDJaBXn0dF3yfK/5mXjnojMLqXSjP8JS6hygimguKWKRXALkM8h7ODTZ 72I91enMg9Blg6SL6oTBJEkVUS2HkaQuHcvxqcGZfdNiy6cdvvKGNSULLhsa9Xecg1ABA8kf5GU h3dg0eOnF//HZG3p/lOam0KL+K9YwCW0/FCfUcCHLqqIDBv/e7yUI8WRAazWbKaQzMXb7zLVbSY 3m5tVOZcs3MSbdJl//NFxxVU6MqZMOXBo/h0YOYNPsoJL6fkwakhVNWFXFzTf2ogF6BD7KPw4oJ ZaTYGyeFOZ9DnbXWZO3lcA+JznzmtEjyUM89txVkxcCLFYgBYQPEWvwtJnmW1FmvNvmRI6uW7yM 4nw8AMqncunnoiJ3t51YiDMPw= X-Received: by 2002:a05:622a:52:b0:4ee:2154:8032 with SMTP id d75a77b69052e-4f4abccfbf9mr669959741cf.6.1767447909486; Sat, 03 Jan 2026 05:45:09 -0800 (PST) X-Google-Smtp-Source: AGHT+IHtRGaEFNGZAjXZRw0vILk7ro1kk7a/w0mzqVaoPclwICa5mz2eIm3sp++pOArbv3jxj57h/g== X-Received: by 2002:a05:622a:52:b0:4ee:2154:8032 with SMTP id d75a77b69052e-4f4abccfbf9mr669959401cf.6.1767447908959; Sat, 03 Jan 2026 05:45:08 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628422sm12920873e87.101.2026.01.03.05.45.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Jan 2026 05:45:08 -0800 (PST) From: Dmitry Baryshkov Date: Sat, 03 Jan 2026 15:45:04 +0200 Subject: [PATCH v2 1/3] drm/msm/dpu: Check mode against PINGPONG or DSC max width Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260103-max-mixer-width-v2-1-ef5d3d246709@oss.qualcomm.com> References: <20260103-max-mixer-width-v2-0-ef5d3d246709@oss.qualcomm.com> In-Reply-To: <20260103-max-mixer-width-v2-0-ef5d3d246709@oss.qualcomm.com> To: Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jessica Zhang , Xilin Wu X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6701; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=XxW40C1bPDwTGr6XGqsFvtEWPDf2zqGDYU7eSYwzR3E=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpWR1ibTf0NkyTLcLTmJEx64Xhmyic5FeUe3FdR e/pGjZVMDqJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaVkdYgAKCRCLPIo+Aiko 1VB0CACun8gKPGcBnTWOozE0spTi/qU4fsdw9cAroeBYsr2XFpkYX09lZ3yEzGMxeFgjJNjBMxm ULt3yMPsi82ie+FmJQvAPpb4TK8bb55fP60+hNvODbK4O5CcZlv0xCPSFjPB+LN4lRw2DtrK/aM cbppOSF1efZEIIcnooYwIu1U74r2etTMNDsLAwdjqnFQsQxpvjdnOwMCOlOuHRY0yUujplGFM6l K0O1MTT8SWvsmVhGBEu04etpcPTRiQ8X5c/Z6WW8NBOZPq8VQy8dNvu+sDD0H/K7P7B6eHSbpw3 /un9ym6S70njE1azlOwlFNCI1/ETNUN+P07E3mCG4iuiSPHU X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTAzMDEyNCBTYWx0ZWRfXwCvsrZpLx6cG a6l/TbxPWl21nLC/DsyxBfo6KY1j9SrHHAVM6sYyWvXPys7QBnqcWwKSmT8uJk5Moumm4l5Wyh4 Om2OpG2qMV0Jz9nq/KSFw64n02E23rYbyeMCY1x//yiHK7yr4iWicGudoViyDHzDIz7VCy7b9ey Ah1demWPv4ntSMAQH3qEDxQ3+vg3xOj7Aj+YTuikcjjiFXGsJ/ryQqEwkZaF/fbNk8xs6K0ndKk HOhgCIcL/ycASeoOXj7HIYq+SRuTR1O0n2yAq6MRmv/9ND5vKjUQsfsGvfFUYfnoFVoqpcACMc9 XNVbM5HkslFLUAiOAmYCfPqfMR2L1mB90QfKpUkeGBRnKGv3sGelDBunkRYpXALuEIkJn1Qmrzl R8ZeYfJi9pn0WUgFg8mKbNeceNJYXEXVD5GNNXIriJYv6psQNDmT4K14yHvVzYIAbBTNnxvgJFR kf+Ra8SgFPavOAgdP3A== X-Proofpoint-GUID: hGxdYa0wgANptrdsxSGMZ5GGrrcLFiLN X-Authority-Analysis: v=2.4 cv=YuQChoYX c=1 sm=1 tr=0 ts=69591d66 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=ksxQWNrZAAAA:8 a=LLqVbBr0KbdSWhQ7gwEA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 a=l7WU34MJF0Z5EO9KEJC3:22 X-Proofpoint-ORIG-GUID: hGxdYa0wgANptrdsxSGMZ5GGrrcLFiLN X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2026-01-03_02,2025-12-31_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 phishscore=0 bulkscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601030124 From: Jessica Zhang Validate requested mode and topology based on the PINGPONG or DSC encoder max width. In addition, drop MAX_HDISPLAY_SPLIT and base LM reservation off of PINGPONG or DSC encoder max width As noted in the patch, while DPU 8.x+ supports a max linewidth of 8960 for PINGPONG_0, there is some additional logic that needs to be added to the resource manager to specifically try and reserve PINGPONG_0 for modes that are greater than 5k. Since this is out of the scope of this series, add a helper that will get the overall minimum PINGPONG max linewidth for a given chipset. Signed-off-by: Jessica Zhang Tested-by: Xilin Wu # qcs6490-radxa-dragon-q6a Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 44 ++++++++++++++++++++++= ---- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 7 ++++ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm= /disp/dpu1/dpu_crtc.c index c39f1908ea65..0b74d85a6142 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -762,6 +762,22 @@ void dpu_crtc_complete_commit(struct drm_crtc *crtc) _dpu_crtc_complete_flip(crtc); } =20 +static int msm_display_get_max_pingpong_width(struct dpu_kms *dpu_kms) +{ + /* + * Note: While, for DPU 8.x+, PINGPONG_0 can technically support up to + * 8k resolutions, this requires reworking the RM to try to reserve + * PINGPONG_0 for modes greater than 5k. + * + * Once this additional logic is implemented, we can probably drop this + * helper and use the reserved PINGPONG's max_linewidth + */ + if (dpu_kms->catalog->mdss_ver->core_major_ver < 6) + return DPU_1_x_MAX_PINGPONG_WIDTH; + else + return DPU_6_x_MAX_PINGPONG_WIDTH; +} + static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc, struct drm_crtc_state *state) { @@ -769,13 +785,14 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct= drm_crtc *crtc, struct drm_display_mode *adj_mode =3D &state->adjusted_mode; u32 crtc_split_width =3D adj_mode->hdisplay / cstate->num_mixers; struct dpu_kms *dpu_kms =3D _dpu_crtc_get_kms(crtc); + int max_pingpong_width =3D msm_display_get_max_pingpong_width(dpu_kms); int i; =20 /* if we cannot merge 2 LMs (no 3d mux) better to fail earlier * before even checking the width after the split */ if (!dpu_kms->catalog->caps->has_3d_merge && - adj_mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width) + adj_mode->hdisplay > max_pingpong_width) return -E2BIG; =20 for (i =3D 0; i < cstate->num_mixers; i++) { @@ -787,7 +804,7 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct d= rm_crtc *crtc, =20 trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r); =20 - if (drm_rect_width(r) > dpu_kms->catalog->caps->max_mixer_width) + if (drm_rect_width(r) > max_pingpong_width) return -E2BIG; } =20 @@ -1318,7 +1335,6 @@ static int dpu_crtc_reassign_planes(struct drm_crtc *= crtc, struct drm_crtc_state } =20 #define MAX_CHANNELS_PER_CRTC PIPES_PER_PLANE -#define MAX_HDISPLAY_SPLIT 1080 =20 static struct msm_display_topology dpu_crtc_get_topology( struct drm_crtc *crtc, @@ -1328,6 +1344,7 @@ static struct msm_display_topology dpu_crtc_get_topol= ogy( struct drm_display_mode *mode =3D &crtc_state->adjusted_mode; struct msm_display_topology topology =3D {0}; struct drm_encoder *drm_enc; + u32 max_hdisplay_split; u32 num_rt_intf; =20 drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask) @@ -1335,6 +1352,18 @@ static struct msm_display_topology dpu_crtc_get_topo= logy( &crtc_state->adjusted_mode); =20 topology.cwb_enabled =3D drm_crtc_in_clone_mode(crtc_state); + max_hdisplay_split =3D msm_display_get_max_pingpong_width(dpu_kms); + + if (topology.num_dsc > 0) { + u32 max_dsc_encoder_width; + + if (dpu_kms->catalog->mdss_ver->core_major_ver < 6) + max_dsc_encoder_width =3D DPU_1_x_MAX_DSC_ENCODER_WIDTH; + else + max_dsc_encoder_width =3D DPU_8_x_MAX_DSC_ENCODER_WIDTH; + + max_hdisplay_split =3D min(max_hdisplay_split, max_dsc_encoder_width); + } =20 /* * Datapath topology selection @@ -1358,7 +1387,7 @@ static struct msm_display_topology dpu_crtc_get_topol= ogy( * count both the WB and real-time phys encoders. * * For non-DSC CWB usecases, have the num_lm be decided by the - * (mode->hdisplay > MAX_HDISPLAY_SPLIT) check. + * (mode->hdisplay > max_hdisplay_split) check. */ =20 num_rt_intf =3D topology.num_intf; @@ -1374,7 +1403,7 @@ static struct msm_display_topology dpu_crtc_get_topol= ogy( } else if (num_rt_intf =3D=3D 2) { topology.num_lm =3D 2; } else if (dpu_kms->catalog->caps->has_3d_merge) { - topology.num_lm =3D (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1; + topology.num_lm =3D (mode->hdisplay > max_hdisplay_split) ? 2 : 1; } else { topology.num_lm =3D 1; } @@ -1553,13 +1582,14 @@ static enum drm_mode_status dpu_crtc_mode_valid(str= uct drm_crtc *crtc, const struct drm_display_mode *mode) { struct dpu_kms *dpu_kms =3D _dpu_crtc_get_kms(crtc); + int max_pingpong_width =3D msm_display_get_max_pingpong_width(dpu_kms); u64 adjusted_mode_clk; =20 /* if there is no 3d_mux block we cannot merge LMs so we cannot * split the large layer into 2 LMs, filter out such modes */ if (!dpu_kms->catalog->caps->has_3d_merge && - mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width) + mode->hdisplay > max_pingpong_width) return MODE_BAD_HVALUE; =20 adjusted_mode_clk =3D dpu_core_perf_adjusted_mode_clk(mode->clock, @@ -1579,7 +1609,7 @@ static enum drm_mode_status dpu_crtc_mode_valid(struc= t drm_crtc *crtc, * max crtc width is equal to the max mixer width * 2 and max height is 4K */ return drm_mode_validate_size(mode, - 2 * dpu_kms->catalog->caps->max_mixer_width, + 2 * max_pingpong_width, 4096); } =20 diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/d= rm/msm/disp/dpu1/dpu_hw_catalog.h index 336757103b5a..ee94d0ccb8a3 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h @@ -24,6 +24,13 @@ #define DPU_MAX_IMG_WIDTH 0x3fff #define DPU_MAX_IMG_HEIGHT 0x3fff =20 +#define DPU_1_x_MAX_PINGPONG_WIDTH 4096 +#define DPU_6_x_MAX_PINGPONG_WIDTH 5120 +#define DPU_8_x_MAX_PINGPONG_0_WIDTH 8960 + +#define DPU_1_x_MAX_DSC_ENCODER_WIDTH 2048 +#define DPU_8_x_MAX_DSC_ENCODER_WIDTH 2560 + #define CRTC_QUAD_MIXERS 4 =20 #define MAX_XIN_COUNT 16 --=20 2.47.3