From nobody Sat Feb 7 09:46:35 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 327ED328B58 for ; Wed, 21 Jan 2026 08:02:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982529; cv=none; b=ZC8aJ5Fh01BxnCPL6i0iiZGQVb3JthGhp/QGavFy3ig17kOKPayxfdrj+c4T4ddlY40u1CPGsY+zhJHHfA/IoIb4OZXEn/GZnjYBhMDBsl01eXvtdisZQaY44gN6Z/K+t0/TdKcB8zzt6pj98DnhN8mxdwjFf/Kaj8PgEIzARcI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982529; c=relaxed/simple; bh=0lT7RY7u/q/OvDkV4Xni5NMBZEHeI41cYul1o1LxOgY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=suSqJN2d27OpW/x6a5d0Cg3ANT1+X7ZzJOWxFAXMHjPFWnn6zdsSBSAtlfIzhVWqpixO8F6CSmnlJxyTnL/Q99ZqH95JptBP+P+Ed/X1jcX9p8nU2vPDq7CaUbS8FJbtt+Hqg0Oe/D22cNl88qkzjlK5bZYENCD0fzqjw9ahstk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=rl+ZaBN6; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="rl+ZaBN6" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2a7b23dd036so910365ad.3 for ; Wed, 21 Jan 2026 00:02:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1768982527; x=1769587327; 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=+ROwhGAC+uM/YVDPTZ7SWeJKccnx9vcVwkY+8qPNgeE=; b=rl+ZaBN62QPWRqf8Yy9XxupZDbliFZUQh0fgnhrQenLjJ2C/MrS/O08ND+YsrpKDoB kZ4i2eUteb/F/+p0FGtlYGwSk9KRab96VPITnThbCAgjmT2d7pbx4+uQO0zUW1gFblYg bzesWYSFzfyNM4/88BdJUX9bzn7qFCjrzoRZbbwztJodSEPrTI4tLrxikOPkC93Vh9u4 o/CjMtYlThIAQAHeM71dS+7VA9RV86E2dZrhLHknKDuTqYxT45lr6ePmRnXdsDGOH/6+ YzxT47F7mOq02PFl5HQJMU0t24eUvtAV5CjUGGYm5BrSKXdwbwtMFzu4BlH/IxGfNes5 xfcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768982527; x=1769587327; 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=+ROwhGAC+uM/YVDPTZ7SWeJKccnx9vcVwkY+8qPNgeE=; b=gfdi8lpZ3pNL2FNBN+KYr3ULMqYCS++8eU7OUk3KU71EFNE135t9OyHTD3ZgSbuOef 2mB2QULAx3ETKlKXGN2W9z5Icun2MIDR5ch2WhbEbmFL7i3ID1Y8odyAPxxmZiKHk58s SuMQAV2gcqkZiwnP02wEUEQ7MQ1qRa3TKYMpju3tjMdKE5oCjhd0+p00pBhsQOQOsdNX VoxNpCd4dQ/qW3EMqmXcdKna1asa1B0y635yumQOWMJrc3Ub9o1pS7QGKwoqwWJxaJOr FFvVKf4DY6RXTAGECYy+3zM/xeQiQC8i7LpT5oDTr7irlSpz8XnKSM+UiHOpNWac7dhG PgBA== X-Forwarded-Encrypted: i=1; AJvYcCXSiS3ZnLT/HmmfD284abt3rTqBySN5uLGsDwXGcYUQ1n3VrQL2FAWV5coedk9MaMaQlvNjH9uxCl7jhbk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywok5CzWmeqp7O/7XoD/5zlGzIRt0bJrqiroiFRv1/XSJqDY9/z EvIb1Ddyc/XFU0CRucMj+6ECim4Uq9NblXGzIO4YNGNOkhiUt5k6wQO9cXAjHD+H64s= X-Gm-Gg: AZuq6aIVS4DFQ1Qp/RXEVo9d6rRXXpATDrKmxS5nbaKU6BIKBerf2jt4G6vgmWDEMEG mqGQcqy3RNa+iFD9E4wZMzi9ceL2p4JjPx137wWNXBH0fd7CDWXo5o8NlERrD7YXuYBcRoxA931 mX2Jy3yqxq00o8jRtDdj9+hnJCcNKLtj/eCohHCAP+/sDVWwEb9GFni2CUoy3leuzMZVphwslKk 7vlkL+KzK3qeE/PQVIImuYUQ0W648eIbCX4rJNqRep7AG17BarBHAYg5eGAN9dVxC0bMtGq140u e1A3AzobK2WRNsn4Hov8TzpkcWwJGsaSEuM/PsmdpLemZ45fl5xoQspPAofgOMwdbvqpZZQ3ULh 0pEbSMBSC2YxqskD3xtwe2QOAoEOQJnABqq0aHuq3k6lir8gOllnolqqHRS6i X-Received: by 2002:a17:903:120e:b0:2a7:a653:5203 with SMTP id d9443c01a7336-2a7a65357e2mr14021225ad.27.1768982527409; Wed, 21 Jan 2026 00:02:07 -0800 (PST) Received: from [127.0.1.1] ([2a12:a305:4::4039]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a7190d14cfsm146851545ad.38.2026.01.21.00.02.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Jan 2026 00:02:07 -0800 (PST) From: Jun Nie Date: Wed, 21 Jan 2026 16:01:50 +0800 Subject: [PATCH v17 1/4] drm/msm/dpu: Extract plane splitting into a dedicated function 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: <20260121-msm-next-quad-pipe-split-v17-1-6eb6d8675ca2@linaro.org> References: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> In-Reply-To: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> To: Abhinav Kumar , Dmitry Baryshkov , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Rob Clark , Neil Armstrong Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jun Nie X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768982516; l=3875; i=jun.nie@linaro.org; s=20240403; h=from:subject:message-id; bh=0lT7RY7u/q/OvDkV4Xni5NMBZEHeI41cYul1o1LxOgY=; b=juT6dM7+wS6bJ686Sz7r81JjtuD2R3kEK1T/TWFYvoeqbWMGUk0aI9oIPqlOt55UihLWbNWX1 DtWFQDyewVcCrJu4auRZ6pmyKxxlrana1zeB0SWz3g0EqmIShha9sJk X-Developer-Key: i=jun.nie@linaro.org; a=ed25519; pk=MNiBt/faLPvo+iJoP1hodyY2x6ozVXL8QMptmsKg3cc= dpu_plane_atomic_check_nosspp() currently handles both plane validation and plane splitting. For better simplicity and to facilitate future refactoring, move the splitting logic into its own dedicated function. Signed-off-by: Jun Nie --- drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 51 ++++++++++++++++++++++-----= ---- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/ms= m/disp/dpu1/dpu_plane.c index 9b7a8b46bfa91..66f240ce29d07 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c @@ -821,13 +821,8 @@ static int dpu_plane_atomic_check_nosspp(struct drm_pl= ane *plane, { int i, ret =3D 0, min_scale, max_scale; struct dpu_plane *pdpu =3D to_dpu_plane(plane); - struct dpu_kms *kms =3D _dpu_plane_get_kms(&pdpu->base); - u64 max_mdp_clk_rate =3D kms->perf.max_core_clk_rate; struct dpu_plane_state *pstate =3D to_dpu_plane_state(new_plane_state); - struct dpu_sw_pipe_cfg *pipe_cfg; - struct dpu_sw_pipe_cfg *r_pipe_cfg; struct drm_rect fb_rect =3D { 0 }; - uint32_t max_linewidth; =20 min_scale =3D FRAC_16_16(1, MAX_UPSCALE_RATIO); max_scale =3D MAX_DOWNSCALE_RATIO << 16; @@ -850,14 +845,6 @@ static int dpu_plane_atomic_check_nosspp(struct drm_pl= ane *plane, return -EINVAL; } =20 - /* move the assignment here, to ease handling to another pairs later */ - pipe_cfg =3D &pstate->pipe_cfg[0]; - r_pipe_cfg =3D &pstate->pipe_cfg[1]; - /* state->src is 16.16, src_rect is not */ - drm_rect_fp_to_int(&pipe_cfg->src_rect, &new_plane_state->src); - - pipe_cfg->dst_rect =3D new_plane_state->dst; - fb_rect.x2 =3D new_plane_state->fb->width; fb_rect.y2 =3D new_plane_state->fb->height; =20 @@ -879,6 +866,34 @@ static int dpu_plane_atomic_check_nosspp(struct drm_pl= ane *plane, if (pstate->layout.plane_pitch[i] > DPU_SSPP_MAX_PITCH_SIZE) return -E2BIG; =20 + pstate->needs_qos_remap =3D drm_atomic_crtc_needs_modeset(crtc_state); + + return 0; +} + +static int dpu_plane_split(struct drm_plane *plane, + struct drm_plane_state *new_plane_state, + const struct drm_crtc_state *crtc_state) +{ + struct dpu_plane *pdpu =3D to_dpu_plane(plane); + struct dpu_kms *kms =3D _dpu_plane_get_kms(&pdpu->base); + u64 max_mdp_clk_rate =3D kms->perf.max_core_clk_rate; + struct dpu_plane_state *pstate =3D to_dpu_plane_state(new_plane_state); + struct dpu_sw_pipe_cfg *pipe_cfg; + struct dpu_sw_pipe_cfg *r_pipe_cfg; + uint32_t max_linewidth; + + if (!new_plane_state->visible) + return 0; + + /* move the assignment here, to ease handling to another pairs later */ + pipe_cfg =3D &pstate->pipe_cfg[0]; + r_pipe_cfg =3D &pstate->pipe_cfg[1]; + /* state->src is 16.16, src_rect is not */ + drm_rect_fp_to_int(&pipe_cfg->src_rect, &new_plane_state->src); + + pipe_cfg->dst_rect =3D new_plane_state->dst; + max_linewidth =3D pdpu->catalog->caps->max_linewidth; =20 drm_rect_rotate(&pipe_cfg->src_rect, @@ -910,8 +925,6 @@ static int dpu_plane_atomic_check_nosspp(struct drm_pla= ne *plane, new_plane_state->fb->width, new_plane_state->fb->height, new_plane_state->rotation); =20 - pstate->needs_qos_remap =3D drm_atomic_crtc_needs_modeset(crtc_state); - return 0; } =20 @@ -1129,6 +1142,10 @@ static int dpu_plane_atomic_check(struct drm_plane *= plane, if (ret) return ret; =20 + ret =3D dpu_plane_split(plane, new_plane_state, crtc_state); + if (ret) + return ret; + if (!new_plane_state->visible) return 0; =20 @@ -1169,6 +1186,10 @@ static int dpu_plane_virtual_atomic_check(struct drm= _plane *plane, if (ret) return ret; =20 + ret =3D dpu_plane_split(plane, plane_state, crtc_state); + if (ret) + return ret; + if (!plane_state->visible) { /* * resources are freed by dpu_crtc_assign_plane_resources(), --=20 2.43.0 From nobody Sat Feb 7 09:46:35 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E1B9B47279C for ; Wed, 21 Jan 2026 08:02:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982535; cv=none; b=A7oSbVlro8RLxh0OJ8ajDWKvcBrYNFAXaU3nGkJ4tCydxkOOdHpZoLbpcy9rwXG10nu3VRgUIuh0fNxCKdi5d/TfjqwJ6mnqRBWtxL9/DlN1d2JCLlGHXQAEYvMLxiN0xE7WDvp2nVdktIQHPyIRJ8Ws+TL9+GTEvZaBXPRHC/A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982535; c=relaxed/simple; bh=znEAFclRJeKN3r3dai1PBNwwtP0DNzX4Fuq5vltavGs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uOcmABoX9WJCUAabVNAya8HuZ55zwwW6MM+I2DYu8dLjv9nFwsgiVj3f7mhErQI3Q/1Ys5GTDhO82Q26xjtQsySgXk//0zvKTah6SnUMGkjki8BdkwXpdRvx9sR3k5+63kzhoxUt0s2NWp65PA1B3fn3vm2mPXJBRtINkwyr8EU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=T4W4Hvv0; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="T4W4Hvv0" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2a0c09bb78cso4701175ad.0 for ; Wed, 21 Jan 2026 00:02:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1768982533; x=1769587333; 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=kdmamm1Mw3J6iuJZD1u6/ZinuaX8sHh3/XSQfKccNq4=; b=T4W4Hvv06craGVnKAqTv7fwAUfkdLK/8R6k33hgt3+HLaCDN9U9RtPijAFF95LuUqJ 2+XK5fo19rgqfEwIwd1ICmmFnNLF3XPNRqxznryzpcmD0QM5Obo0CbSBrExREIpEwNlL cN5tP9hCiNe5H/AwNJk9yKZe3pLGlBbq8Fk/1MIVUyS5/GcD22SfNNWWS6BptX60Mms+ Q9MrfdUCF0VHAPgTVnl/8vJr1EQBTsH0rnCASCotUBosE8ANEAHh/72yRAHrVLilQRKl YxIUMjgVfYMAZiZl+9wJqEpJSygdMXeRVaTeEpLsXosWZzeTJ811GDmw/zjwwJeXF24Q KrgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768982533; x=1769587333; 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=kdmamm1Mw3J6iuJZD1u6/ZinuaX8sHh3/XSQfKccNq4=; b=bdeph1Dely3idwCX3tKQrnH4EeY4GoVGyariW5FdN3QDizs8ClgQMb/7j8W6styZtU bxmwlH4Lqd5yF9gl4S1FsD0YuJNBamo37ByYDQCm2cigIPh6MDi0DjHkRBkZ8yW54pFX AOYUEe7Pxspu5QLhRpuL3ADkLl7IEE6sTyVomouXzKX3cPR1bFEi9qhJUGcJzbf2z8YW V9gTW7G4C9uphb74jUuNhFyoGR2viRDNetZ8WMVt4E0w60f+Q6B3RmHqTWN4rLuuiLlr AC2EmyhyLCUrpwNp23LI3xQOZsU4fsjaSr7pLeF97QULUU8bMinfQAI0KqYPcgoJ6spd ufOQ== X-Forwarded-Encrypted: i=1; AJvYcCUg1RFVp+dTba43t6BOEVOpQP1J90sv8u9sHZEHTJJTbu30KLBKtxcsDjUgrD7q0ZGYHUon/v/RFuCi9/Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyF8MF0wsVFI6LBw8G9ZyjCWdXPdhIn+LDpLC2HM8sBtMU5MdcN c/VEDvSHScabyvTw1/2mQBfoxHR/3s/xxE568zu7UX9rACnaO6V9BDfbUgAkdrdFpFI= X-Gm-Gg: AZuq6aIkrcY3x8NoQZ39GZGPW43H+S0U60cZL2LDEKLr0cP+6lZMBZS9BjjDIgFKXPf vEwdFSG1BrKA0OAUjMJIVu0NkmT4m6v1AZ+yDfWw/pAk7KK3wrOtKhtsNSFq0qXlOqT9xB/Eibr /Kz9BwViNdofCUkHH+QGJA5Ay5kIR2LIfNYNCPE0LuHL6zRpRH4TWXnYzwEJyQzP+JwhlE95YaE 9vaVbD005Z4TBZGYFWyMWejXyk08/xEhOutt7oLp2BdWjA1ztU+HhhfLUJ0sSFWBKtMs1pyiOXY Col+JDvI3hWs8nHRNq41QMx855dKzrbc/aoBtgLsrur4ifjjVwgBBWWc+f6KReGE72IKsRVfiDi EaXZUvecAV3YbhF2yrJOXJ9R0Vl8Q7FUFG/O+G5jVZmubP9Ya9/BvrAf9B5iv X-Received: by 2002:a17:902:ea09:b0:29f:2734:837d with SMTP id d9443c01a7336-2a700a51209mr183205965ad.28.1768982532816; Wed, 21 Jan 2026 00:02:12 -0800 (PST) Received: from [127.0.1.1] ([2a12:a305:4::4039]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a7190d14cfsm146851545ad.38.2026.01.21.00.02.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Jan 2026 00:02:12 -0800 (PST) From: Jun Nie Date: Wed, 21 Jan 2026 16:01:51 +0800 Subject: [PATCH v17 2/4] drm/msm/dpu: Defer SSPP allocation until CRTC check 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: <20260121-msm-next-quad-pipe-split-v17-2-6eb6d8675ca2@linaro.org> References: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> In-Reply-To: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> To: Abhinav Kumar , Dmitry Baryshkov , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Rob Clark , Neil Armstrong Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jun Nie X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768982516; l=7971; i=jun.nie@linaro.org; s=20240403; h=from:subject:message-id; bh=znEAFclRJeKN3r3dai1PBNwwtP0DNzX4Fuq5vltavGs=; b=tcPd/napQSxPPJ5WWGUlFaphNEXjLvFq5w7lE25kc5GxovGdQajJx/rJh594UFM2VsYG/pf/j 1w1Bw0ZbFYvAYR9Z5dAzEnW3xFRW5HfcnKTM1WVBOlEme/bcghTR+Fq X-Developer-Key: i=jun.nie@linaro.org; a=ed25519; pk=MNiBt/faLPvo+iJoP1hodyY2x6ozVXL8QMptmsKg3cc= Currently, plane splitting and SSPP allocation occur during the plane check phase. Defer these operations until dpu_assign_plane_resources() is called from the CRTC side to ensure the topology information from the CRTC check is available. Signed-off-by: Jun Nie --- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 3 +- drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 112 +++++++++++++++++++-------= ---- 2 files changed, 71 insertions(+), 44 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm= /disp/dpu1/dpu_crtc.c index 2d06c950e8143..debdbbe6160dd 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -1484,8 +1484,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crt= c, return rc; } =20 - if (dpu_use_virtual_planes && - (crtc_state->planes_changed || crtc_state->zpos_changed)) { + if (crtc_state->planes_changed || crtc_state->zpos_changed) { rc =3D dpu_crtc_reassign_planes(crtc, crtc_state); if (rc < 0) return rc; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/ms= m/disp/dpu1/dpu_plane.c index 66f240ce29d07..3c629f4df461d 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c @@ -1119,49 +1119,25 @@ static int dpu_plane_atomic_check(struct drm_plane = *plane, struct drm_plane_state *new_plane_state =3D drm_atomic_get_new_plane_stat= e(state, plane); int ret =3D 0; - struct dpu_plane *pdpu =3D to_dpu_plane(plane); - struct dpu_plane_state *pstate =3D to_dpu_plane_state(new_plane_state); - struct dpu_kms *dpu_kms =3D _dpu_plane_get_kms(plane); - struct dpu_sw_pipe *pipe =3D &pstate->pipe[0]; - struct dpu_sw_pipe *r_pipe =3D &pstate->pipe[1]; - struct dpu_sw_pipe_cfg *pipe_cfg =3D &pstate->pipe_cfg[0]; - struct dpu_sw_pipe_cfg *r_pipe_cfg =3D &pstate->pipe_cfg[1]; - const struct drm_crtc_state *crtc_state =3D NULL; - uint32_t max_linewidth =3D dpu_kms->catalog->caps->max_linewidth; + struct drm_crtc_state *crtc_state =3D NULL; =20 if (new_plane_state->crtc) crtc_state =3D drm_atomic_get_new_crtc_state(state, new_plane_state->crtc); =20 - pipe->sspp =3D dpu_rm_get_sspp(&dpu_kms->rm, pdpu->pipe); - - if (!pipe->sspp) - return -EINVAL; - ret =3D dpu_plane_atomic_check_nosspp(plane, new_plane_state, crtc_state); if (ret) return ret; =20 - ret =3D dpu_plane_split(plane, new_plane_state, crtc_state); - if (ret) - return ret; - if (!new_plane_state->visible) return 0; =20 - if (!dpu_plane_try_multirect_parallel(pipe, pipe_cfg, r_pipe, r_pipe_cfg, - pipe->sspp, - msm_framebuffer_format(new_plane_state->fb), - max_linewidth)) { - DPU_DEBUG_PLANE(pdpu, "invalid " DRM_RECT_FMT " /" DRM_RECT_FMT - " max_line:%u, can't use split source\n", - DRM_RECT_ARG(&pipe_cfg->src_rect), - DRM_RECT_ARG(&r_pipe_cfg->src_rect), - max_linewidth); - return -E2BIG; - } - - return dpu_plane_atomic_check_sspp(plane, state, crtc_state); + /* + * To trigger the callback of dpu_assign_plane_resources() to + * finish the deferred sspp check + */ + crtc_state->planes_changed =3D true; + return 0; } =20 static int dpu_plane_virtual_atomic_check(struct drm_plane *plane, @@ -1186,10 +1162,6 @@ static int dpu_plane_virtual_atomic_check(struct drm= _plane *plane, if (ret) return ret; =20 - ret =3D dpu_plane_split(plane, plane_state, crtc_state); - if (ret) - return ret; - if (!plane_state->visible) { /* * resources are freed by dpu_crtc_assign_plane_resources(), @@ -1261,9 +1233,9 @@ static int dpu_plane_virtual_assign_resources(struct = drm_crtc *crtc, struct dpu_global_state *global_state, struct drm_atomic_state *state, struct drm_plane_state *plane_state, + const struct drm_crtc_state *crtc_state, struct drm_plane_state **prev_adjacent_plane_state) { - const struct drm_crtc_state *crtc_state =3D NULL; struct drm_plane *plane =3D plane_state->plane; struct dpu_kms *dpu_kms =3D _dpu_plane_get_kms(plane); struct dpu_rm_sspp_requirements reqs; @@ -1273,10 +1245,6 @@ static int dpu_plane_virtual_assign_resources(struct= drm_crtc *crtc, const struct msm_format *fmt; int i, ret; =20 - if (plane_state->crtc) - crtc_state =3D drm_atomic_get_new_crtc_state(state, - plane_state->crtc); - pstate =3D to_dpu_plane_state(plane_state); for (i =3D 0; i < STAGES_PER_PLANE; i++) prev_adjacent_pstate[i] =3D prev_adjacent_plane_state[i] ? @@ -1288,6 +1256,10 @@ static int dpu_plane_virtual_assign_resources(struct= drm_crtc *crtc, if (!plane_state->fb) return -EINVAL; =20 + ret =3D dpu_plane_split(plane, plane_state, crtc_state); + if (ret) + return ret; + fmt =3D msm_framebuffer_format(plane_state->fb); reqs.yuv =3D MSM_FORMAT_IS_YUV(fmt); reqs.scale =3D (plane_state->src_w >> 16 !=3D plane_state->crtc_w) || @@ -1318,14 +1290,59 @@ static int dpu_plane_virtual_assign_resources(struc= t drm_crtc *crtc, return dpu_plane_atomic_check_sspp(plane, state, crtc_state); } =20 +static int dpu_plane_assign_resources(struct drm_crtc *crtc, + struct dpu_global_state *global_state, + struct drm_atomic_state *state, + struct drm_plane_state *plane_state, + const struct drm_crtc_state *crtc_state, + struct drm_plane_state **prev_adjacent_plane_state) +{ + struct drm_plane *plane =3D plane_state->plane; + struct dpu_kms *dpu_kms =3D _dpu_plane_get_kms(plane); + struct dpu_plane_state *pstate =3D to_dpu_plane_state(plane_state); + struct dpu_sw_pipe *pipe =3D &pstate->pipe[0]; + struct dpu_sw_pipe *r_pipe =3D &pstate->pipe[1]; + struct dpu_sw_pipe_cfg *pipe_cfg =3D &pstate->pipe_cfg[0]; + struct dpu_sw_pipe_cfg *r_pipe_cfg =3D &pstate->pipe_cfg[1]; + struct dpu_plane *pdpu =3D to_dpu_plane(plane); + int ret; + + if (!plane_state->visible) + return 0; + + pipe->sspp =3D dpu_rm_get_sspp(&dpu_kms->rm, pdpu->pipe); + if (!pipe->sspp) + return -EINVAL; + + ret =3D dpu_plane_split(plane, plane_state, crtc_state); + if (ret) + return ret; + + if (!dpu_plane_try_multirect_parallel(pipe, pipe_cfg, r_pipe, r_pipe_cfg, + pipe->sspp, + msm_framebuffer_format(plane_state->fb), + dpu_kms->catalog->caps->max_linewidth)) { + DPU_DEBUG_PLANE(pdpu, "invalid " DRM_RECT_FMT " /" DRM_RECT_FMT + " max_line:%u, can't use split source\n", + DRM_RECT_ARG(&pipe_cfg->src_rect), + DRM_RECT_ARG(&r_pipe_cfg->src_rect), + dpu_kms->catalog->caps->max_linewidth); + return -E2BIG; + } + + return dpu_plane_atomic_check_sspp(plane, state, crtc_state); +} + int dpu_assign_plane_resources(struct dpu_global_state *global_state, struct drm_atomic_state *state, struct drm_crtc *crtc, struct drm_plane_state **states, unsigned int num_planes) { - unsigned int i; struct drm_plane_state *prev_adjacent_plane_state[STAGES_PER_PLANE] =3D {= NULL }; + const struct drm_crtc_state *crtc_state =3D NULL; + unsigned int i; + int ret; =20 for (i =3D 0; i < num_planes; i++) { struct drm_plane_state *plane_state =3D states[i]; @@ -1334,8 +1351,19 @@ int dpu_assign_plane_resources(struct dpu_global_sta= te *global_state, !plane_state->visible) continue; =20 - int ret =3D dpu_plane_virtual_assign_resources(crtc, global_state, + if (plane_state->crtc) + crtc_state =3D drm_atomic_get_new_crtc_state(state, + plane_state->crtc); + + if (!dpu_use_virtual_planes) + ret =3D dpu_plane_assign_resources(crtc, global_state, + state, plane_state, + crtc_state, + prev_adjacent_plane_state); + else + ret =3D dpu_plane_virtual_assign_resources(crtc, global_state, state, plane_state, + crtc_state, prev_adjacent_plane_state); if (ret) return ret; --=20 2.43.0 From nobody Sat Feb 7 09:46:35 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 024762E62B4 for ; Wed, 21 Jan 2026 08:02:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982542; cv=none; b=GjZ45YNmnpH6djMxNJzR/ObI2JOLw3QXUmV1x3KJOy+CTikDfOR3b/dB/UOioBajQHtHue7o8gpLw24up1JMYy0SDhdbiR4F/YfEkMGuimW96eR0g2HDhhLYxIc92c0e7XNowSX8OVr0WVO2sPdQmGV9gJj7JpEkRpPPqIlzFU8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982542; c=relaxed/simple; bh=S1T74Y6D2F9qA1dfaYrbbsQtI+apSIgdZMEVXSOwbbM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ar7XEbQsy3WBjZB1/9Clhlh1qb27MDo8Lf3Qm0nXkqYbt9hc7352HjEdcAKbIa7WxOY6kR0wAuhZ9oKNKYN23YOB+YhLnOBqQqjEQTmWbiKQoPylNJi02bHQshZbQtIwZjC5ogkF/zrYyLH4oScWAv5KEhayxLHGLdVjrXmnCrc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=YI7ZqVSV; arc=none smtp.client-ip=209.85.214.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="YI7ZqVSV" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2a78e381fc1so4431975ad.3 for ; Wed, 21 Jan 2026 00:02:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1768982539; x=1769587339; 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=FBDteOxdBzOojlPhsjzryNojfnZi+drcSiJZtd7Uqqo=; b=YI7ZqVSV3om+R/kUjNgIgIktg4fyZ8editOIXDmhtalOlUbGYX0sus0yJBzr2JPsdr QtiDYPP5bIf9AT2aNdCwVEhQzV+oXIIFhEUjudr3ZZaAXs33IANlVdvPbp+qw6fmxycG f28Xq0qv/qZlh+VhAwlnCjwnMMQGzm4/8/8MevRA5rflzSF6CKbYqNEZbx83RJHAA2LG TaFqFaSa9yWateK1/5tdkmBeuN6UgfJdFwV/DcB0OWBfled8rzIXPbEBjUyRO5uRWzqq If0G5Ct3gB6HrXZAGJ5F1uMQ9SRyDXHk6J1ImB7CR2ojW3W/bGZ4VuvSF+zhhndNqWzq LymA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768982539; x=1769587339; 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=FBDteOxdBzOojlPhsjzryNojfnZi+drcSiJZtd7Uqqo=; b=KhsEamnT1wU38/aB2tWbmwuSoQhMSPcsfzgALc2Q9PmSPBgUPe3rz9azke+04Ocl3f MfYmCudAMD+sV3GAa9XOPo7gFazjSq5CZydByrxZzJpiKdAp9BYYxGKOhkLrSRky3sAp bHyRM7SThiMViBU9Lix2xCQPjGVwSx7XP7MCrwwAZGVxFmTZ8ZKTQ5s2qMNM3zRTrqU6 rgYtdsS/rbzkMB2x6DPPR3ECKbxXcia0RaS5/+N2fjDwUrQus0H+vsiRVw81bY4RE0IE k5ypnQuHdBOtxy3aOCaNBjZYP75hwYnmsfG97WfNIpnpgE5gF3VP63oKIVEN+w0IY4nq /GXA== X-Forwarded-Encrypted: i=1; AJvYcCVTV2mngRQRz2IPbRm6MlyrXLxD2uOL0YaKm8nLagRQEtBoQ2FWZYJmLpE4emT6e7hTTDzsOhTzA4mmwR0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1b38lVLSAw1/wW9wTJB8pKcv994QNugo8nxO1pbS25jzRRcni YzKSc/lKRqiAIgcpOkJ1LVA9hyfKoCkJ5shIfhDVI5+WMYV2hip6LzbF9O/b5CcA9/rSG3WqqX9 Rp1lU4RcMNLAR X-Gm-Gg: AZuq6aJkrkaGU6YUBNQqeistO4S/kIXUvdDGgUylX/ykRsXOWozvJB8Lpm4f1O1cMuV JSgezfBK27i17ixvuBhRpqQJyVxGnepPBiUwppSxdH+Jg8e1bw8JV+b6A6Of5En43zEeJvASCxn oLrBh2QiVBE5ABphsD++7l3nPSstzHHd8OefhIBFhx1W7k6GVwdFWEzZFjSg02N+vq1vrfgbA6i iVHiHvAt6FwlBG/vhVwiTtLOYtXAOeod+7qoe2O+BU6mCa1rgjT+7Cbom5fZ9waI77NMQxX6f0T qKbEtGpslWR0s/KtYR7pn7t33PcNi3wpypR9k+MNlyJqVcutV6O+5iFNdTsY0+f92NZP+iSVD7x Il6wbQWRmr7JFu0tu0/MLOdF3CnpTCmn4VukbLbyvosVnmLfJUN4q72CDacv6 X-Received: by 2002:a17:902:fc4d:b0:2a2:dc1f:78d8 with SMTP id d9443c01a7336-2a7176cc6dfmr164302875ad.42.1768982538308; Wed, 21 Jan 2026 00:02:18 -0800 (PST) Received: from [127.0.1.1] ([2a12:a305:4::4039]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a7190d14cfsm146851545ad.38.2026.01.21.00.02.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Jan 2026 00:02:17 -0800 (PST) From: Jun Nie Date: Wed, 21 Jan 2026 16:01:52 +0800 Subject: [PATCH v17 3/4] drm/msm/dpu: support plane splitting in quad-pipe case 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: <20260121-msm-next-quad-pipe-split-v17-3-6eb6d8675ca2@linaro.org> References: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> In-Reply-To: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> To: Abhinav Kumar , Dmitry Baryshkov , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Rob Clark , Neil Armstrong Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jun Nie , Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768982516; l=9242; i=jun.nie@linaro.org; s=20240403; h=from:subject:message-id; bh=S1T74Y6D2F9qA1dfaYrbbsQtI+apSIgdZMEVXSOwbbM=; b=fIAULDF7cS2VXPNYOVzkpJvCZ62aZuyDv4TDf2ZEV/exFmMAMp5rvC8XEvzTix4AuY2hj5usz vgmIAa0BTaGBA9fRJtDDFwa+ugQ9eUaV1BYAYQA8flXfAN3X/7zHk31 X-Developer-Key: i=jun.nie@linaro.org; a=ed25519; pk=MNiBt/faLPvo+iJoP1hodyY2x6ozVXL8QMptmsKg3cc= The content of every half of screen is sent out via one interface in dual-DSI case. The content for every interface is blended by a LM pair in quad-pipe case, thus a LM pair should not blend any content that cross the half of screen in this case. Clip plane into pipes per left and right half screen ROI if topology is quad pipe case. The clipped rectangle on every half of screen is futher handled by two pipes if its width exceeds a limit for a single pipe. Signed-off-by: Jun Nie Reviewed-by: Dmitry Baryshkov Reviewed-by: Jessica Zhang Patchwork: https://patchwork.freedesktop.org/patch/675416/ Link: https://lore.kernel.org/r/20250918-v6-16-rc2-quad-pipe-upstream-4-v16= -9-ff6232e3472f@linaro.org Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 11 +++ drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 2 + drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 139 +++++++++++++++++++++-----= ---- 3 files changed, 110 insertions(+), 42 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm= /disp/dpu1/dpu_crtc.c index debdbbe6160dd..87a934e3801f3 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -1606,6 +1606,17 @@ int dpu_crtc_vblank(struct drm_crtc *crtc, bool en) return 0; } =20 +/** + * dpu_crtc_get_num_lm - Get mixer number in this CRTC pipeline + * @state: Pointer to drm crtc state object + */ +unsigned int dpu_crtc_get_num_lm(const struct drm_crtc_state *state) +{ + struct dpu_crtc_state *cstate =3D to_dpu_crtc_state(state); + + return cstate->num_mixers; +} + #ifdef CONFIG_DEBUG_FS static int _dpu_debugfs_status_show(struct seq_file *s, void *data) { diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm= /disp/dpu1/dpu_crtc.h index 94392b9b92454..6eaba5696e8e6 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h @@ -267,4 +267,6 @@ static inline enum dpu_crtc_client_type dpu_crtc_get_cl= ient_type( =20 void dpu_crtc_frame_event_cb(struct drm_crtc *crtc, u32 event); =20 +unsigned int dpu_crtc_get_num_lm(const struct drm_crtc_state *state); + #endif /* _DPU_CRTC_H_ */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/ms= m/disp/dpu1/dpu_plane.c index 3c629f4df461d..2637abefe2602 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c @@ -881,50 +881,107 @@ static int dpu_plane_split(struct drm_plane *plane, struct dpu_plane_state *pstate =3D to_dpu_plane_state(new_plane_state); struct dpu_sw_pipe_cfg *pipe_cfg; struct dpu_sw_pipe_cfg *r_pipe_cfg; + const struct drm_display_mode *mode =3D &crtc_state->adjusted_mode; uint32_t max_linewidth; + u32 num_lm; + int stage_id, num_stages; =20 if (!new_plane_state->visible) return 0; =20 - /* move the assignment here, to ease handling to another pairs later */ - pipe_cfg =3D &pstate->pipe_cfg[0]; - r_pipe_cfg =3D &pstate->pipe_cfg[1]; - /* state->src is 16.16, src_rect is not */ - drm_rect_fp_to_int(&pipe_cfg->src_rect, &new_plane_state->src); - - pipe_cfg->dst_rect =3D new_plane_state->dst; + num_lm =3D dpu_crtc_get_num_lm(crtc_state); =20 max_linewidth =3D pdpu->catalog->caps->max_linewidth; =20 - drm_rect_rotate(&pipe_cfg->src_rect, - new_plane_state->fb->width, new_plane_state->fb->height, - new_plane_state->rotation); + /* + * We have 1 mixer pair cfg for 1:1:1 and 2:2:1 topology, 2 mixer pair + * configs for left and right half screen in case of 4:4:2 topology. + * But we may have 2 rect to split wide plane that exceeds limit with 1 + * config for 2:2:1. So need to handle both wide plane splitting, and + * two halves of screen splitting for quad-pipe case. Check dest + * rectangle left/right clipping first, then check wide rectangle + * splitting in every half next. + */ + num_stages =3D (num_lm + 1) / 2; + /* iterate mixer configs for this plane, to separate left/right with the = id */ + for (stage_id =3D 0; stage_id < num_stages; stage_id++) { + struct drm_rect mixer_rect =3D { + .x1 =3D stage_id * mode->hdisplay / num_stages, + .y1 =3D 0, + .x2 =3D (stage_id + 1) * mode->hdisplay / num_stages, + .y2 =3D mode->vdisplay + }; + int cfg_idx =3D stage_id * PIPES_PER_STAGE; + + pipe_cfg =3D &pstate->pipe_cfg[cfg_idx]; + r_pipe_cfg =3D &pstate->pipe_cfg[cfg_idx + 1]; + + drm_rect_fp_to_int(&pipe_cfg->src_rect, &new_plane_state->src); + + drm_rect_rotate(&pipe_cfg->src_rect, + new_plane_state->fb->width, new_plane_state->fb->height, + new_plane_state->rotation); + + pipe_cfg->dst_rect =3D new_plane_state->dst; + + DPU_DEBUG_PLANE(pdpu, "checking src " DRM_RECT_FMT + " vs clip window " DRM_RECT_FMT "\n", + DRM_RECT_ARG(&pipe_cfg->src_rect), + DRM_RECT_ARG(&mixer_rect)); + + /* + * If this plane does not fall into mixer rect, check next + * mixer rect. + */ + if (!drm_rect_clip_scaled(&pipe_cfg->src_rect, + &pipe_cfg->dst_rect, + &mixer_rect)) { + memset(pipe_cfg, 0, 2 * sizeof(struct dpu_sw_pipe_cfg)); =20 - if ((drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) || - _dpu_plane_calc_clk(&crtc_state->adjusted_mode, pipe_cfg) > max_mdp_= clk_rate) { - if (drm_rect_width(&pipe_cfg->src_rect) > 2 * max_linewidth) { - DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n", - DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); - return -E2BIG; + continue; } =20 - *r_pipe_cfg =3D *pipe_cfg; - pipe_cfg->src_rect.x2 =3D (pipe_cfg->src_rect.x1 + pipe_cfg->src_rect.x2= ) >> 1; - pipe_cfg->dst_rect.x2 =3D (pipe_cfg->dst_rect.x1 + pipe_cfg->dst_rect.x2= ) >> 1; - r_pipe_cfg->src_rect.x1 =3D pipe_cfg->src_rect.x2; - r_pipe_cfg->dst_rect.x1 =3D pipe_cfg->dst_rect.x2; - } else { - memset(r_pipe_cfg, 0, sizeof(*r_pipe_cfg)); - } + pipe_cfg->dst_rect.x1 -=3D mixer_rect.x1; + pipe_cfg->dst_rect.x2 -=3D mixer_rect.x1; + + DPU_DEBUG_PLANE(pdpu, "Got clip src:" DRM_RECT_FMT " dst: " DRM_RECT_FMT= "\n", + DRM_RECT_ARG(&pipe_cfg->src_rect), DRM_RECT_ARG(&pipe_cfg->dst_rect)); + + /* Split wide rect into 2 rect */ + if ((drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) || + _dpu_plane_calc_clk(mode, pipe_cfg) > max_mdp_clk_rate) { + + if (drm_rect_width(&pipe_cfg->src_rect) > 2 * max_linewidth) { + DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n", + DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); + return -E2BIG; + } + + memcpy(r_pipe_cfg, pipe_cfg, sizeof(struct dpu_sw_pipe_cfg)); + pipe_cfg->src_rect.x2 =3D (pipe_cfg->src_rect.x1 + pipe_cfg->src_rect.x= 2) >> 1; + pipe_cfg->dst_rect.x2 =3D (pipe_cfg->dst_rect.x1 + pipe_cfg->dst_rect.x= 2) >> 1; + r_pipe_cfg->src_rect.x1 =3D pipe_cfg->src_rect.x2; + r_pipe_cfg->dst_rect.x1 =3D pipe_cfg->dst_rect.x2; + DPU_DEBUG_PLANE(pdpu, "Split wide plane into:" + DRM_RECT_FMT " and " DRM_RECT_FMT "\n", + DRM_RECT_ARG(&pipe_cfg->src_rect), + DRM_RECT_ARG(&r_pipe_cfg->src_rect)); + } else { + memset(r_pipe_cfg, 0, sizeof(struct dpu_sw_pipe_cfg)); + } =20 - drm_rect_rotate_inv(&pipe_cfg->src_rect, - new_plane_state->fb->width, new_plane_state->fb->height, - new_plane_state->rotation); - if (drm_rect_width(&r_pipe_cfg->src_rect) !=3D 0) - drm_rect_rotate_inv(&r_pipe_cfg->src_rect, - new_plane_state->fb->width, new_plane_state->fb->height, + drm_rect_rotate_inv(&pipe_cfg->src_rect, + new_plane_state->fb->width, + new_plane_state->fb->height, new_plane_state->rotation); =20 + if (drm_rect_width(&r_pipe_cfg->src_rect) !=3D 0) + drm_rect_rotate_inv(&r_pipe_cfg->src_rect, + new_plane_state->fb->width, + new_plane_state->fb->height, + new_plane_state->rotation); + } + return 0; } =20 @@ -998,20 +1055,18 @@ static int dpu_plane_atomic_check_sspp(struct drm_pl= ane *plane, drm_atomic_get_new_plane_state(state, plane); struct dpu_plane *pdpu =3D to_dpu_plane(plane); struct dpu_plane_state *pstate =3D to_dpu_plane_state(new_plane_state); - struct dpu_sw_pipe *pipe =3D &pstate->pipe[0]; - struct dpu_sw_pipe *r_pipe =3D &pstate->pipe[1]; - struct dpu_sw_pipe_cfg *pipe_cfg =3D &pstate->pipe_cfg[0]; - struct dpu_sw_pipe_cfg *r_pipe_cfg =3D &pstate->pipe_cfg[1]; - int ret =3D 0; =20 - ret =3D dpu_plane_atomic_check_pipe(pdpu, pipe, pipe_cfg, - &crtc_state->adjusted_mode, - new_plane_state); - if (ret) - return ret; + struct dpu_sw_pipe *pipe; + struct dpu_sw_pipe_cfg *pipe_cfg; + int ret =3D 0, i; =20 - if (drm_rect_width(&r_pipe_cfg->src_rect) !=3D 0) { - ret =3D dpu_plane_atomic_check_pipe(pdpu, r_pipe, r_pipe_cfg, + for (i =3D 0; i < PIPES_PER_PLANE; i++) { + pipe =3D &pstate->pipe[i]; + pipe_cfg =3D &pstate->pipe_cfg[i]; + if (!drm_rect_width(&pipe_cfg->src_rect)) + continue; + DPU_DEBUG_PLANE(pdpu, "pipe %d is in use, validate it\n", i); + ret =3D dpu_plane_atomic_check_pipe(pdpu, pipe, pipe_cfg, &crtc_state->adjusted_mode, new_plane_state); if (ret) --=20 2.43.0 From nobody Sat Feb 7 09:46:35 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 95F6147279C for ; Wed, 21 Jan 2026 08:02:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982549; cv=none; b=YoScoANZyTCbZrPwUWFkd0gU+gl9n23QiJ5joR6/Sb9zO27q0VrR1hmxyHZRldIOT9/VTSPJP68+w3Ir2v1CA8iqq7KJ/T9xYVwJ07ZsNWHrJnZV7pawdCLWZFrz5bOwgUB+n1XfdFTukL8JU4O4n5BLCuFxBUuDe6X685bmtVc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768982549; c=relaxed/simple; bh=sUxkfSflUjvUQUuerLM3rVhcLEqQsQK+6PsY7hltyxs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vEWcCWu4YDKIBZOMmdTClcGxfJkA4nuY1DvdhYTlxDBChACfEcqhFUMx39d5aIitcb6zAZj26Sf2r0yIk8B8H125gbVshkd01wDAXFCNsg7e/YCL5igqc0aCb0opPoDkgMsa9eOfjIrPscKJpK8e+Q99J788OZWfGSsIgoRyX6w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=myFCAyAF; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="myFCAyAF" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2a79ded11a2so4408775ad.3 for ; Wed, 21 Jan 2026 00:02:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1768982544; x=1769587344; 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=5qHVChkDZvzveTCvrkA+LEiIGKaNQUDMs3gLCdYxj3I=; b=myFCAyAFlKo1X6tTo+KSxpLcNOsG6dah/LXbAV30j1AlapWdCnDIg5YzQUOCOslG0e idjy/jKu5MRyQVMEwJM1gfDBVYvYJU5sZZlg2OHZj2O2y/kkGw2S/Ib3gLTTm4L1NwHz 6ATihK1biWfp19Rp9wqNgmPuBNCxlPRCAQS+VDsa1BC3fsfMrwkrm7nRmK823/Uu6WLU +PeAwk3jetEOZuiJeEcnrA+/qfP7KTAdt+LylAbSYV69Zyt22VJ6F4ttHcw3Ryy7sVI1 MZOJs0+IfcGD2wS80wnDNohRxyodpvwtf8+XgvXKlrPXCpXGjiL46QeR5KHyIYL5TN7t 1cnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768982544; x=1769587344; 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=5qHVChkDZvzveTCvrkA+LEiIGKaNQUDMs3gLCdYxj3I=; b=F+216mXLVHS1k3nwfL9FhR1zza0qBQag7zZW6WK2IJb3snErmLgT32jsXnQzDfyaEd Oa8fYuPnpEb06j6OUgQCdWgwNt9qTpyDWtxts2cNruTDAdODRk0VpZy9EIimkfWvFyMe 5R7KbowCmaEdnJx1GdZ8wWGChiljbFBmpqFUCB4YQPMGT5FUTNUaNYM1PWPzFvwhN7Hd VXiNF8cHgQY1Npiy3bb0KkwYEHvIOpjwnGVruncX6lKIuwJkpiSZC4hRuTGKNlSUXhBS cKOw9eNUg5NEbSZyC7TWrKsnJQD9gCugWbqwgEVHxGawMi0ySEG8RV4zyHgC4a406c14 VcFg== X-Forwarded-Encrypted: i=1; AJvYcCXqD+qHtYmlxSFRD7KmUovpaz6iL2uHvCX69UqawxQyjocesaES3bVeGsU9UqAsD6h/RrEnePOjEtp1F4k=@vger.kernel.org X-Gm-Message-State: AOJu0YwjwP0niuVLl4MoYDl1p0kkpMt2Fg2U3w8tC5x2OAcrLZzjeEPV BnzyNrBWJsC3tHIRyLnrzsbGSjeS9C8AH0AFGFTHcERvRvC7x8MyaqLJB67FaeceG/s= X-Gm-Gg: AZuq6aJwU8v72VqV8VQkUVZvHiNBNJSbmlMAfocZ6WpfRmqnN1nIlj8QT+S7IU2ABGo OTK/CtvaAwHmvIMbsW9o4akfkYTpfq5j//GovS/vXVtDjhFotH8DJHYRc8xQNVUkFVDTZGXcVXm OjY1BMLCjGrYNbmAz24MA8cTaSkO1C0zezR55dPT95+1oCP4JYFC3lVp7xc+qUF6QoGByJo4/22 BOqYlAhkFZM5EMxJzZpuc3P3fOK+YG9SPOvPOtwJxeIbeZrAunZLuIRO8RgcAkdminU34KORewB geaLVX2HeGLdXfCFT3/GPt+M/Cj85nNw6QRjfsoWE+drRWdcqh4napQMf90T6KJJe3uy30k2f0o qFW8fC3CtXiEaRW9luTskCfBwnjZBoaFuC/afw7Esf0Ul+Yf7twi6ZVRvgTAH X-Received: by 2002:a17:902:e84a:b0:2a0:c942:8adf with SMTP id d9443c01a7336-2a7690523c5mr34762105ad.8.1768982544103; Wed, 21 Jan 2026 00:02:24 -0800 (PST) Received: from [127.0.1.1] ([2a12:a305:4::4039]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a7190d14cfsm146851545ad.38.2026.01.21.00.02.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Jan 2026 00:02:23 -0800 (PST) From: Jun Nie Date: Wed, 21 Jan 2026 16:01:53 +0800 Subject: [PATCH v17 4/4] drm/msm/dpu: Enable quad-pipe for DSC and dual-DSI case 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: <20260121-msm-next-quad-pipe-split-v17-4-6eb6d8675ca2@linaro.org> References: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> In-Reply-To: <20260121-msm-next-quad-pipe-split-v17-0-6eb6d8675ca2@linaro.org> To: Abhinav Kumar , Dmitry Baryshkov , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Rob Clark , Neil Armstrong Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jun Nie , Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768982516; l=8588; i=jun.nie@linaro.org; s=20240403; h=from:subject:message-id; bh=sUxkfSflUjvUQUuerLM3rVhcLEqQsQK+6PsY7hltyxs=; b=y3ioZjedRLc3Kb02B59ZZ2Ks9gl1YJEXKqXkge5ok2884XWHnZIUqZmXickAM8lTgONIE9lEp pGm2MOalot8BCgwxTM/SIpByvTAp+46nyVc/SglATdzBvqbLcbcB+ys X-Developer-Key: i=jun.nie@linaro.org; a=ed25519; pk=MNiBt/faLPvo+iJoP1hodyY2x6ozVXL8QMptmsKg3cc= To support high-resolution cases that exceed the width limitation of a pair of SSPPs, or scenarios that surpass the maximum MDP clock rate, additional pipes are necessary to enable parallel data processing within the SSPP width constraints and MDP clock rate. Pipe array is extended to 4. Request 4 mixers and 4 DSCs for high-resolution cases where both DSC and dual interfaces are enabled for virtual plane case. More use cases can be incorporated later if quad-pipe capabilities are required. Signed-off-by: Jun Nie Reviewed-by: Dmitry Baryshkov Reviewed-by: Jessica Zhang Patchwork: https://patchwork.freedesktop.org/patch/675418/ Link: https://lore.kernel.org/r/20250918-v6-16-rc2-quad-pipe-upstream-4-v16= -10-ff6232e3472f@linaro.org Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 28 +++++++++++++++++---= --- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 6 ++--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 29 ++++++++------------= ---- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 2 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 2 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 2 +- 6 files changed, 36 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm= /disp/dpu1/dpu_crtc.c index 87a934e3801f3..a7ca79564c523 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -200,7 +200,7 @@ static int dpu_crtc_get_lm_crc(struct drm_crtc *crtc, struct dpu_crtc_state *crtc_state) { struct dpu_crtc_mixer *m; - u32 crcs[CRTC_DUAL_MIXERS]; + u32 crcs[CRTC_QUAD_MIXERS]; =20 int rc =3D 0; int i; @@ -1328,6 +1328,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 num_rt_intf; =20 drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask) dpu_encoder_update_topology(drm_enc, &topology, crtc_state->state, @@ -1341,11 +1342,14 @@ static struct msm_display_topology dpu_crtc_get_top= ology( * Dual display * 2 LM, 2 INTF ( Split display using 2 interfaces) * + * If DSC is enabled, try to use 4:4:2 topology if there is enough + * resource and virtual plane is enabled. Otherwise, use 2:2:2 topology. + * * Single display * 1 LM, 1 INTF * 2 LM, 1 INTF (stream merge to support high resolution interfaces) * - * If DSC is enabled, use 2 LMs for 2:2:1 topology + * If DSC is enabled, use 2:2:1 topology * * Add dspps to the reservation requirements if ctm is requested * @@ -1357,14 +1361,24 @@ static struct msm_display_topology dpu_crtc_get_top= ology( * (mode->hdisplay > MAX_HDISPLAY_SPLIT) check. */ =20 - if (topology.num_intf =3D=3D 2 && !topology.cwb_enabled) - topology.num_lm =3D 2; - else if (topology.num_dsc =3D=3D 2) + num_rt_intf =3D topology.num_intf; + if (topology.cwb_enabled) + num_rt_intf--; + + if (topology.num_dsc) { + if (dpu_use_virtual_planes && + dpu_kms->catalog->dsc_count >=3D num_rt_intf * 2) + topology.num_dsc =3D num_rt_intf * 2; + else + topology.num_dsc =3D num_rt_intf; + topology.num_lm =3D topology.num_dsc; + } else if (num_rt_intf =3D=3D 2) { topology.num_lm =3D 2; - else if (dpu_kms->catalog->caps->has_3d_merge) + } else if (dpu_kms->catalog->caps->has_3d_merge) { topology.num_lm =3D (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1; - else + } else { topology.num_lm =3D 1; + } =20 if (crtc_state->ctm) topology.num_dspp =3D topology.num_lm; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm= /disp/dpu1/dpu_crtc.h index 6eaba5696e8e6..455073c7025b0 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h @@ -210,7 +210,7 @@ struct dpu_crtc_state { =20 bool bw_control; bool bw_split_vote; - struct drm_rect lm_bounds[CRTC_DUAL_MIXERS]; + struct drm_rect lm_bounds[CRTC_QUAD_MIXERS]; =20 uint64_t input_fence_timeout_ns; =20 @@ -218,10 +218,10 @@ struct dpu_crtc_state { =20 /* HW Resources reserved for the crtc */ u32 num_mixers; - struct dpu_crtc_mixer mixers[CRTC_DUAL_MIXERS]; + struct dpu_crtc_mixer mixers[CRTC_QUAD_MIXERS]; =20 u32 num_ctls; - struct dpu_hw_ctl *hw_ctls[CRTC_DUAL_MIXERS]; + struct dpu_hw_ctl *hw_ctls[CRTC_QUAD_MIXERS]; =20 enum dpu_crtc_crc_source crc_source; int crc_frame_skip_count; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/= msm/disp/dpu1/dpu_encoder.c index eba1d52211f68..058a7c8727f7c 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c @@ -55,7 +55,7 @@ #define MAX_PHYS_ENCODERS_PER_VIRTUAL \ (MAX_H_TILES_PER_DISPLAY * NUM_PHYS_ENCODER_TYPES) =20 -#define MAX_CHANNELS_PER_ENC 2 +#define MAX_CHANNELS_PER_ENC 4 #define MAX_CWB_PER_ENC 2 =20 #define IDLE_SHORT_TIMEOUT 1 @@ -661,7 +661,6 @@ void dpu_encoder_update_topology(struct drm_encoder *dr= m_enc, struct dpu_encoder_virt *dpu_enc =3D to_dpu_encoder_virt(drm_enc); struct msm_drm_private *priv =3D dpu_enc->base.dev->dev_private; struct msm_display_info *disp_info =3D &dpu_enc->disp_info; - struct dpu_kms *dpu_kms =3D to_dpu_kms(priv->kms); struct drm_connector *connector; struct drm_connector_state *conn_state; struct drm_framebuffer *fb; @@ -675,22 +674,12 @@ void dpu_encoder_update_topology(struct drm_encoder *= drm_enc, =20 dsc =3D dpu_encoder_get_dsc_config(drm_enc); =20 - /* We only support 2 DSC mode (with 2 LM and 1 INTF) */ - if (dsc) { - /* - * Use 2 DSC encoders, 2 layer mixers and 1 or 2 interfaces - * when Display Stream Compression (DSC) is enabled, - * and when enough DSC blocks are available. - * This is power-optimal and can drive up to (including) 4k - * screens. - */ - WARN(topology->num_intf > 2, - "DSC topology cannot support more than 2 interfaces\n"); - if (topology->num_intf >=3D 2 || dpu_kms->catalog->dsc_count >=3D 2) - topology->num_dsc =3D 2; - else - topology->num_dsc =3D 1; - } + /* + * Set DSC number as 1 to mark the enabled status, will be adjusted + * in dpu_crtc_get_topology() + */ + if (dsc) + topology->num_dsc =3D 1; =20 connector =3D drm_atomic_get_new_connector_for_encoder(state, drm_enc); if (!connector) @@ -2180,8 +2169,8 @@ static void dpu_encoder_helper_reset_mixers(struct dp= u_encoder_phys *phys_enc) { int i, num_lm; struct dpu_global_state *global_state; - struct dpu_hw_blk *hw_lm[2]; - struct dpu_hw_mixer *hw_mixer[2]; + struct dpu_hw_blk *hw_lm[MAX_CHANNELS_PER_ENC]; + struct dpu_hw_mixer *hw_mixer[MAX_CHANNELS_PER_ENC]; struct dpu_hw_ctl *ctl =3D phys_enc->hw_ctl; =20 /* reset all mixers for this encoder */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h b/drivers/gpu= /drm/msm/disp/dpu1/dpu_encoder_phys.h index 61b22d9494546..09395d7910ac8 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h @@ -302,7 +302,7 @@ static inline enum dpu_3d_blend_mode dpu_encoder_helper= _get_3d_blend_mode( =20 /* Use merge_3d unless DSC MERGE topology is used */ if (phys_enc->split_role =3D=3D ENC_ROLE_SOLO && - dpu_cstate->num_mixers =3D=3D CRTC_DUAL_MIXERS && + (dpu_cstate->num_mixers !=3D 1) && !dpu_encoder_use_dsc_merge(phys_enc->parent)) return BLEND_3D_H_ROW_INT; =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 4964e70610d1b..336757103b5af 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h @@ -24,7 +24,7 @@ #define DPU_MAX_IMG_WIDTH 0x3fff #define DPU_MAX_IMG_HEIGHT 0x3fff =20 -#define CRTC_DUAL_MIXERS 2 +#define CRTC_QUAD_MIXERS 4 =20 #define MAX_XIN_COUNT 16 =20 diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h b/drivers/gpu/drm/= msm/disp/dpu1/dpu_hw_mdss.h index 046b683d4c66d..31451241f0839 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h @@ -34,7 +34,7 @@ #define DPU_MAX_PLANES 4 #endif =20 -#define STAGES_PER_PLANE 1 +#define STAGES_PER_PLANE 2 #define PIPES_PER_STAGE 2 #define PIPES_PER_PLANE (PIPES_PER_STAGE * STAGES_PER_PLANE) #ifndef DPU_MAX_DE_CURVES --=20 2.43.0