From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 F1E833ACF1C for ; Wed, 22 Jul 2026 06:36:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784702199; cv=none; b=DEkMuSNkftCYifv3caUF/UJzQ4YkEcrGJx/w5f4Myb4/Te4RGyqfywa7A3mzPl4RKFBCXUosPlWYwyWrWKTb16SJUetiKcIQNeZvAN1pBDQGvUMWv6BtaS8AhGxQGF/EhvbQQ17Meb0c9hJKA0ulOpVyK9mQJ0LyyGxAdbrcUa4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784702199; c=relaxed/simple; bh=qvvzQGIvCJFBeyjflw7v8rndU0UY2akeaNn006NwjUA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J9IfdKmvclJOU3UQECVY+/p75EWtQFRmu0bxJetK6hcYD3kiyF4yFU7R02jjltt9y6mJba1JyGi15MmcWGZRD6i2tIv1ZmLep+JYbS7ojCp1p9g6CbBpjsqRJqfMfB2m2evzPBxAvc/O9COfnAwWTqVZ5z/zbNAZVuC278g5Jmo= 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=pvtWZFqP; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=LSY7GkPn; arc=none smtp.client-ip=205.220.168.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="pvtWZFqP"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="LSY7GkPn" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66M54CRI3474518 for ; Wed, 22 Jul 2026 06:36:37 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= 9yG3RAW2UmHvNScmd7UPrq6tcvvwfJPeN7NawmzDlzY=; b=pvtWZFqPMgNtioFh WhFwJh29HDck7RTrym/Y+jJ+G2ARZinYo21MMc8ks+fpWLtTfVEDEBpcdzq2LyYP u4MyLZfWVu7MpJS7Hdz3rQxFXslRf05XtYo0Nalx/Q+Y9pnsBp+2hqtmOMiiGQWS bUvRgZNwl7ZMQvtUFwB0QYSFbDbHYKGwZAzO9uVymbT5DVMcPKNqPTpatTcM50Hu YgmIMEvbeOyh93bv4ZHzae1RllXBGy55HQslZg9xx1hqZ6J8D67+1niM1yFcIHJZ ZdJcccjVHJ6VcaVw8kbjkqxs2ynPTFI5CZqJN7jCdhFLjpbKa8ADWsjYxjGFZDei Tfh1ag== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fjd6ftm77-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 06:36:37 +0000 (GMT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-52769fc3f2eso21041971cf.0 for ; Tue, 21 Jul 2026 23:36:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784702196; x=1785306996; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=9yG3RAW2UmHvNScmd7UPrq6tcvvwfJPeN7NawmzDlzY=; b=LSY7GkPnE8Y+rrFFTBxh8oM08iakYPG/TxhQ5UewssNFvVo22yqGjCexR1hBcWswdM w+KzjQIfM+Azp2JC/90LetCmJO12YZIhwCD6AFIdsCphTVXJoLPc02OvDrw51WEWKf/E g3HTO+TNX0/X4s9OkDdKe6B+LmVHwPObVf2cOWoAVN67EBDhzZ7KDsxruBTmtdmWKe7X OZMeGpBqaxihJqhvYOxHTTQAv6FRTlGTPRf518ZBAhil2qpxIIzlfSHTSZ6BraCOdEct y1n2wwrf9kDutg+YCK4fvK/FMVxVPg3lNd6B2IMy8UUKVOaXuiv5PLqK3cF3d4UsB14s 5D3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784702196; x=1785306996; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=9yG3RAW2UmHvNScmd7UPrq6tcvvwfJPeN7NawmzDlzY=; b=UOO+kmr2MUZ2VD8oBHMF1WOOCy+2XcT9L0NRnel6YVo1t36LT6996vagieXRec2M/o gBBGgJmsH9FTq8hpGKsQ1K+Kd10UUhqSR77xondxK4+YPpettI0LKNnLHSCL7j+3ULWe s9OsS+uGX/wr8ddN3gE+KpsHAIpXO1OZ7wrgvJVh6jA0EdoITjxqhp7o0/iQzBrsfp82 XpmRn/x5NLsYWyfofL6JG/Wg0NaqUFKJ9jJWNTkmO8B7nfx4TKrYtiJGh3PwNLyUi0QY 9d0ozJ2HgssiX6d9oZk+VdOnNXzZJbzKWmi7Yg9qhW9mSjdjrCoyZxs/t3peMP0uzmtR KUsQ== X-Forwarded-Encrypted: i=1; AHgh+RozUJzlGvT/UF9HP9doeGUVEXhJE7bt4LdCcmDOP8kLtqSYekcHA9r+iBsN8+7LboCweGgC1lA5S9FMbww=@vger.kernel.org X-Gm-Message-State: AOJu0Yzt+JOMYJb/DvZs5SCfcic71ID1mKIwpL/RbmyxN+aZa7MRAXFu t8xMD8rYUCFmwYdkokzu4NUH0Fk3DzX5zzcVT5kcceN40PhcChwA9aDx8WiD3yigg8QknMHPu/p lhYhk3jPxYn/VN/dxapKhu9wbSWmgmLYPayHRZ+mrjGDtOLf9g/PYDQ2P0OLbiX1/BPQ= X-Gm-Gg: AR+sD1291attJmQnK4JRVta4KsHNaKqZXUBC+Rp/NbBVPREgZsh3jHy4LVgYzTzIe4w JTsq+Cw8/nhCf9aAQNvdbFBKkkDxw87NkLwYpeBVOUK1Ik5q/zIDOY+fY7n1kl0RdxEWrotxA+N 2HjhSLSfSGxTpfMNcC7DN5mwLPOjdrgof4q3olBFtr+hTXRFd5+8OsAhQVghcgA6s3JXegB4uwO 7IMnSxhY79EwoaJ2N9XflM64Qpy2/BTxX3A12RFgewsB+JLyuPY6TM1zZ6Ipy+TNY9/+zcSuK4C 9CkXxdKzJ8wh/PBbc6w9/KztwIJrkYcU2B0uPJVCMFO8slPFlrh+iXzRtqRFjXPxjVILFOb+fwr C/8ERSnXkS1WRBNsknSUm7avFn9IUEqgrnYD749HI5AE5RZKnsFlP4L1114ISurMB0CdxWyrNZy 8EyHMhQ+8efp5MWQ== X-Received: by 2002:a05:622a:2b09:b0:51c:ae7:fa1d with SMTP id d75a77b69052e-5213c006b33mr212219761cf.5.1784702195957; Tue, 21 Jul 2026 23:36:35 -0700 (PDT) X-Received: by 2002:a05:622a:2b09:b0:51c:ae7:fa1d with SMTP id d75a77b69052e-5213c006b33mr212219531cf.5.1784702195241; Tue, 21 Jul 2026 23:36:35 -0700 (PDT) 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-5b2a9b8c6f6sm309696e87.4.2026.07.21.23.36.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jul 2026 23:36:34 -0700 (PDT) From: Dmitry Baryshkov Date: Wed, 22 Jul 2026 09:36:18 +0300 Subject: [PATCH 03/24] drm/msm: create the display connectors from common code 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: 7bit Message-Id: <20260722-drm-msm-display-interface-v1-3-368c10fe62fd@oss.qualcomm.com> References: <20260722-drm-msm-display-interface-v1-0-368c10fe62fd@oss.qualcomm.com> In-Reply-To: <20260722-drm-msm-display-interface-v1-0-368c10fe62fd@oss.qualcomm.com> To: Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=8599; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=qvvzQGIvCJFBeyjflw7v8rndU0UY2akeaNn006NwjUA=; b=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ1ZCyrOkDRmncvJrb3pdjN9zu85iavCiJTG8Wj+yqycHa 0tdVi3qZDRmYWDkYpAVU2TxKWiZGrMpOezDjqn1MINYmUCmMHBxCsBE3GM4GNa2Fc0QXVCp4JDy 9HXzh1q76X5ZNxbEfbLbuPlVi4xelJT31cyoVzF9Ew9tV5LfrB8o+y8pKeyi5+74j/4HGYq0Yi7 x93ku4HIMmDdv3qzYH/m9ygUMr9dLXgrOC5rx6EXJesk+w9yCeRMZSiZbVe+QeK86b3njsQldZ9 l2qRWHTr1sq/rNxpGR3W/OyuAfd5hSGA6sDbhispR5J2dh7xtNrY0nwl8aLppfuEfpYZRh0ByuX zfUvNoV/wq/m8RbaLDUpkXGg+fI7Q/usS9iZhom+d9T/hdnLLnKOjnT8uTmR9VRjSlX83ef+Nsd e2mXqZTC5FnCbXK6+d2TObsXtN/WnHiHPfXfh8xFNkxKAA== X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: xmx2IIVfr8LZxW8XNsRrVGNJIR3ZeiES X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDA2MCBTYWx0ZWRfX/3OcjMVkhC8g W/Za2mmDYKT+zSwxqcjbq82809L/0q80D/2FIw0Pxf9qzDKwtfGJfJDEh/MV9kzosOQISbeRci6 050Xc4B2hdIsAZoB/sz3T2Gqs6TIZCfSYy97zZ6MsQw5ynwroxBPTOoxbFi9lRJKoUbHFxqJOpq EGKlzjJPbg7fnupLgWwftuYjKz70Vtn2C/ApkhA8R+RLkhLVGch4i3drqoVeGpiAHtyJZ60Plnk GBCJVZrZBhQh+R6qeMaChdEU9osVZlWAXTkan5gcnEIndIDd5MFKi71hHakrocI9bwXXq2IUkPb ef1EyCOAl5wDygNW8LOGyPT12p3ZcV4C7nxe3CfX5bCMxG/OuaixyTBdUtRu4v3iBCnQGkS18Hy wyv17PHjePjfVV4C1agW/Rp2FydcDl/LlwdpeIQwxdYOYxkRjcOxv3wvVWUF6Wvnc/1au4e+TAx 2x36e+rg7CfE+FM4aqw== X-Authority-Analysis: v=2.4 cv=e/o2j6p/ c=1 sm=1 tr=0 ts=6a6064f5 cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=WN0DelYTnYdyuVf2XKsA:9 a=QEXdDO2ut3YA:10 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-ORIG-GUID: xmx2IIVfr8LZxW8XNsRrVGNJIR3ZeiES X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDA2MCBTYWx0ZWRfXwdZbr69tfX+T 253nAMNGoesdkkS+XKVv85msFEQP4pUj+GL/ipZdgxBG86QK/wfMiBo0PxgJORgm+IA7BdayHXv nX+NGWWXQP8+OKkwMaicgWXzqBeh4Zg= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_02,2026-07-21_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 spamscore=0 bulkscore=0 priorityscore=1501 impostorscore=0 lowpriorityscore=0 phishscore=0 clxscore=1015 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220060 Each KMS backend (mdp4, mdp5, dpu1) open-codes the loop over the DSI, DP and HDMI sub-blocks and the calls to msm_dsi_modeset_init(), msm_dp_modeset_init() and msm_hdmi_modeset_init() that build the bridges and connectors. The dispatch, including the bonded-DSI handling, is duplicated three times with subtle variations. The encoder each sub-block is attached to is genuinely backend-specific (the DPU builds a display-info descriptor, MDP5 requests a CTL, MDP4 uses fixed CRTC masks), but the connector setup that follows is not. Have each backend only create the encoder and record it in struct msm_kms, and move the msm_*_modeset_init() dispatch into a common msm_kms_init_connectors() called from msm_drm_kms_init() after the backend's ->hw_init(), where the encoders and, on DPU, the GEM address space (kms->vm) that msm_dsi_host_modeset_init() allocates the DSI TX buffer from are set up. No functional change intended. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 34 ++++-------------- drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 18 +++------- drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 9 +++-- drivers/gpu/drm/msm/msm_kms.c | 60 ++++++++++++++++++++++++++++++++ drivers/gpu/drm/msm/msm_kms.h | 3 ++ 5 files changed, 78 insertions(+), 46 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index ede935a426d1..42dff1a98292 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -627,21 +627,11 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev, return PTR_ERR(encoder); } - rc = msm_dsi_modeset_init(priv->kms->dsi[i], dev, encoder); - if (rc) { - DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n", - i, rc); - break; - } - - if (msm_dsi_is_bonded_dsi(priv->kms->dsi[i]) && priv->kms->dsi[other]) { - rc = msm_dsi_modeset_init(priv->kms->dsi[other], dev, encoder); - if (rc) { - DPU_ERROR("modeset_init failed for dsi[%d], rc = %d\n", - other, rc); - break; - } - } + /* + * A bonded pair is driven by a single encoder; the connector + * setup for both hosts is handled from common code later. + */ + priv->kms->dsi_encoder[i] = encoder; } return rc; @@ -653,7 +643,6 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev, { struct drm_encoder *encoder = NULL; struct msm_display_info info; - int rc; int i; for (i = 0; i < ARRAY_SIZE(priv->kms->dp); i++) { @@ -671,11 +660,7 @@ static int _dpu_kms_initialize_displayport(struct drm_device *dev, return PTR_ERR(encoder); } - rc = msm_dp_modeset_init(priv->kms->dp[i], dev, encoder); - if (rc) { - DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc); - return rc; - } + priv->kms->dp_encoder[i] = encoder; } return 0; @@ -687,7 +672,6 @@ static int _dpu_kms_initialize_hdmi(struct drm_device *dev, { struct drm_encoder *encoder = NULL; struct msm_display_info info; - int rc; if (!priv->kms->hdmi) return 0; @@ -703,11 +687,7 @@ static int _dpu_kms_initialize_hdmi(struct drm_device *dev, return PTR_ERR(encoder); } - rc = msm_hdmi_modeset_init(priv->kms->hdmi, dev, encoder); - if (rc) { - DPU_ERROR("modeset_init failed for DP, rc = %d\n", rc); - return rc; - } + priv->kms->hdmi_encoder = encoder; return 0; } diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c index 7726edb0d4ed..cd566a287f6f 100644 --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c @@ -243,14 +243,9 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms, /* DTV can be hooked to DMA_E: */ encoder->possible_crtcs = 1 << 1; - if (priv->kms->hdmi) { - /* Construct bridge/connector for HDMI: */ - ret = msm_hdmi_modeset_init(priv->kms->hdmi, dev, encoder); - if (ret) { - DRM_DEV_ERROR(dev->dev, "failed to initialize HDMI: %d\n", ret); - return ret; - } - } + /* the bridge/connector for HDMI is set up from common code */ + if (priv->kms->hdmi) + priv->kms->hdmi_encoder = encoder; break; case DRM_MODE_ENCODER_DSI: @@ -271,12 +266,7 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms, /* TODO: Add DMA_S later? */ encoder->possible_crtcs = 1 << DMA_P; - ret = msm_dsi_modeset_init(priv->kms->dsi[dsi_id], dev, encoder); - if (ret) { - DRM_DEV_ERROR(dev->dev, "failed to initialize DSI: %d\n", - ret); - return ret; - } + priv->kms->dsi_encoder[dsi_id] = encoder; break; default: diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c index 0a004ab9fc85..68b71a7c6666 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c @@ -330,7 +330,7 @@ static int modeset_init_intf(struct mdp5_kms *mdp5_kms, break; } - ret = msm_hdmi_modeset_init(priv->kms->hdmi, dev, encoder); + priv->kms->hdmi_encoder = encoder; break; case INTF_DSI: { @@ -360,10 +360,9 @@ static int modeset_init_intf(struct mdp5_kms *mdp5_kms, break; } - ret = msm_dsi_modeset_init(priv->kms->dsi[dsi_id], dev, encoder); - if (!ret) - mdp5_encoder_set_intf_mode(encoder, - msm_dsi_is_cmd_mode(priv->kms->dsi[dsi_id])); + priv->kms->dsi_encoder[dsi_id] = encoder; + mdp5_encoder_set_intf_mode(encoder, + msm_dsi_is_cmd_mode(priv->kms->dsi[dsi_id])); break; } diff --git a/drivers/gpu/drm/msm/msm_kms.c b/drivers/gpu/drm/msm/msm_kms.c index e5d0ea629448..87530145e82b 100644 --- a/drivers/gpu/drm/msm/msm_kms.c +++ b/drivers/gpu/drm/msm/msm_kms.c @@ -260,6 +260,57 @@ void msm_drm_kms_uninit(struct device *dev) kms->funcs->destroy(kms); } +/* + * Set up the bridges and connectors for the display sub-blocks, using the + * encoders the backend created in ->kms_init(). + */ +static int msm_kms_init_connectors(struct drm_device *ddev) +{ + struct msm_drm_private *priv = ddev->dev_private; + struct msm_kms *kms = priv->kms; + int i, ret; + + /* + * The slave link of a bonded DSI pair shares its master's encoder and + * creates no connector of its own; msm_dsi_modeset_init() handles that + * internally, so it needs no special-casing here. + */ + for (i = 0; i < ARRAY_SIZE(kms->dsi); i++) { + if (!kms->dsi[i]) + continue; + + ret = msm_dsi_modeset_init(kms->dsi[i], ddev, kms->dsi_encoder[i]); + if (ret) { + DRM_DEV_ERROR(ddev->dev, + "modeset_init failed for dsi[%d]: %d\n", i, ret); + return ret; + } + } + + for (i = 0; i < ARRAY_SIZE(kms->dp); i++) { + if (!kms->dp[i]) + continue; + + ret = msm_dp_modeset_init(kms->dp[i], ddev, kms->dp_encoder[i]); + if (ret) { + DRM_DEV_ERROR(ddev->dev, + "modeset_init failed for dp[%d]: %d\n", i, ret); + return ret; + } + } + + if (kms->hdmi) { + ret = msm_hdmi_modeset_init(kms->hdmi, ddev, kms->hdmi_encoder); + if (ret) { + DRM_DEV_ERROR(ddev->dev, + "modeset_init failed for HDMI: %d\n", ret); + return ret; + } + } + + return 0; +} + int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) { struct msm_drm_private *priv = dev_get_drvdata(dev); @@ -298,6 +349,15 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv) goto err_msm_uninit; } + /* + * The backend created the encoders for each display sub-block in + * ->hw_init(); now set up the bridges and connectors for them from + * common code. + */ + ret = msm_kms_init_connectors(ddev); + if (ret) + goto err_msm_uninit; + drm_helper_move_panel_connectors_to_head(ddev); drm_for_each_crtc(crtc, ddev) { diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h index f25b31e502d2..06646091604a 100644 --- a/drivers/gpu/drm/msm/msm_kms.h +++ b/drivers/gpu/drm/msm/msm_kms.h @@ -140,10 +140,13 @@ struct msm_kms { struct drm_device *dev; struct hdmi *hdmi; + struct drm_encoder *hdmi_encoder; struct msm_dsi *dsi[MSM_DSI_CONTROLLER_COUNT]; + struct drm_encoder *dsi_encoder[MSM_DSI_CONTROLLER_COUNT]; struct msm_dp *dp[MSM_DP_CONTROLLER_COUNT]; + struct drm_encoder *dp_encoder[MSM_DP_CONTROLLER_COUNT]; /* irq number to be passed on to msm_irq_install */ int irq; -- 2.47.3