From patchwork Sun Aug 16 04:12:14 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inki Dae X-Patchwork-Id: 7021891 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 886EFC05AC for ; Sun, 16 Aug 2015 04:12:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6C47C20734 for ; Sun, 16 Aug 2015 04:12:22 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 065DC2072B for ; Sun, 16 Aug 2015 04:12:21 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8404D6E00C; Sat, 15 Aug 2015 21:12:19 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2DC586E00C for ; Sat, 15 Aug 2015 21:12:18 -0700 (PDT) Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NT5001B2QCG5T30@mailout2.samsung.com> for dri-devel@lists.freedesktop.org; Sun, 16 Aug 2015 13:12:16 +0900 (KST) Received: from epcpsbgm2new.samsung.com ( [172.20.52.116]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id E9.70.28411.F9D00D55; Sun, 16 Aug 2015 13:12:16 +0900 (KST) X-AuditID: cbfee68e-f79c56d000006efb-26-55d00d9f9f34 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2new.samsung.com (EPCPMTA) with SMTP id B2.D1.07062.F9D00D55; Sun, 16 Aug 2015 13:12:15 +0900 (KST) Received: from localhost.localdomain ([10.252.83.67]) by mmp2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NT500IDHQCFHG10@mmp2.samsung.com>; Sun, 16 Aug 2015 13:12:15 +0900 (KST) From: Inki Dae To: dri-devel@lists.freedesktop.org Subject: [PATCH] drm: make sure to check callbacks of ENCODER and CRTC helpers Date: Sun, 16 Aug 2015 13:12:14 +0900 Message-id: <1439698334-19925-1-git-send-email-inki.dae@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGLMWRmVeSWpSXmKPExsWyRsSkRHcB74VQg9k7mS16z51ksrjy9T2b xaT7E1gcmD22f3vA6nG/+ziTR9+WVYwBzFFcNimpOZllqUX6dglcGZvWX2UvOCpV8ensJKYG xn2iXYycHBICJhI73/5lg7DFJC7cWw9kc3EICaxglNg+bT8TTNGtH+vZIRKzGCU2t+xhhXC+ M0rcXXeHHaSKTUBVYuKK+2CjRASUJf5OXMUIYjMLmErMev6DpYuRg0NYwE+i6QsXSJgFqHxl Vy8LiM0r4CKxru001DI5iZPHJoPNlxC4zSZx4P0pRogGAYlvkw+BzZEQkJXYdIAZol5S4uCK GywTGAUXMDKsYhRNLUguKE5KLzLSK07MLS7NS9dLzs/dxAgMvtP/nvXtYLx5wPoQowAHoxIP r8Sh86FCrIllxZW5hxhNgTZMZJYSTc4HhnheSbyhsZmRhamJqbGRuaWZkjhvgtTPYCGB9MSS 1OzU1ILUovii0pzU4kOMTBycUg2M81gv8s/bvz6/S3nO7Sm58nNaFFUqld/1cnLenXHuuadG 3aTj1fcfbdEzua17ZT7PySXJAi8fH9HIfVtrcJq7/3jl/9br8YkmxjuuREhuN9sWt4Z945w7 OrXZ6RMOHtKsSoyxX9ZkOe9HtuKdv8Yprzd1Gh3lSLzCteRRTkhy8PtvmvusjgWrKrEUZyQa ajEXFScCALps48s5AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrMLMWRmVeSWpSXmKPExsVy+t9jQd35vBdCDV5es7DoPXeSyeLK1/ds FpPuT2BxYPbY/u0Bq8f97uNMHn1bVjEGMEc1MNpkpCampBYppOYl56dk5qXbKnkHxzvHm5oZ GOoaWlqYKynkJeam2iq5+AToumXmAK1SUihLzCkFCgUkFhcr6dthmhAa4qZrAdMYoesbEgTX Y2SABhLWMGZsWn+VveCoVMWns5OYGhj3iXYxcnJICJhI3Pqxnh3CFpO4cG89WxcjF4eQwCxG ic0te1ghnO+MEnfX3QGrYhNQlZi44j4biC0ioCzxd+IqRhCbWcBUYtbzHyxdjBwcwgJ+Ek1f uEDCLEDlK7t6WUBsXgEXiXVtp5kglslJnDw2mXUCI/cCRoZVjBKpBckFxUnpuUZ5qeV6xYm5 xaV56XrJ+bmbGMEB/kx6B+PhXe6HGAU4GJV4eAuOnA8VYk0sK67MPcQowcGsJMIbdgYoxJuS WFmVWpQfX1Sak1p8iNEU6ICJzFKiyfnA6MsriTc0NjEzsjQyN7QwMjZXEufVN9kUKiSQnliS mp2aWpBaBNPHxMEp1cAY1XowTDX+4ScHk3ptk/YywyUTmtkdl9w6mNB8Q1Wx4b7J+beXN2X+ m31PTZSNb6Y+nxXfgYQJH7ZXLFhffW/HHie10xnTlx04YfLqnF8rs9Trw1l3LR30vkQsVPHP XbSue8pspanRajWmp4pnuvmd3XzUcerjVTrvfB4eZT1dUftj7afPS6z0lViKMxINtZiLihMB X5U944YCAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch fixes NULL pointer access issues to ENCODER and CRTC drivers. Vendor specific DRM KMS drivers may not set their helper callbacks to ENCODER dn CRTC drivers. In this case, that will incur NULL pointer access when modeset is tried. So this patch makes sure to check if the callbacks are NULL or not. Signed-off-by: Inki Dae --- drivers/gpu/drm/drm_crtc_helper.c | 44 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index ef53475..aa1f42f 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c @@ -318,16 +318,22 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, } encoder_funcs = encoder->helper_private; - if (!(ret = encoder_funcs->mode_fixup(encoder, mode, - adjusted_mode))) { - DRM_DEBUG_KMS("Encoder fixup failed\n"); - goto done; + if (encoder_funcs->mode_fixup) { + ret = encoder_funcs->mode_fixup(encoder, mode, + adjusted_mode); + if (!ret) { + DRM_DEBUG_KMS("Encoder fixup failed\n"); + goto done; + } } } - if (!(ret = crtc_funcs->mode_fixup(crtc, mode, adjusted_mode))) { - DRM_DEBUG_KMS("CRTC fixup failed\n"); - goto done; + if (crtc_funcs->mode_fixup) { + ret = crtc_funcs->mode_fixup(crtc, mode, adjusted_mode); + if (!ret) { + DRM_DEBUG_KMS("CRTC fixup failed\n"); + goto done; + } } DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); @@ -343,21 +349,26 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, encoder_funcs = encoder->helper_private; /* Disable the encoders as the first thing we do. */ - encoder_funcs->prepare(encoder); + if (encoder_funcs->prepare) + encoder_funcs->prepare(encoder); drm_bridge_post_disable(encoder->bridge); } drm_crtc_prepare_encoders(dev); - crtc_funcs->prepare(crtc); + if (crtc_funcs->prepare) + crtc_funcs->prepare(crtc); /* Set up the DPLL and any encoders state that needs to adjust or depend * on the DPLL. */ - ret = !crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb); - if (!ret) - goto done; + if (crtc_funcs->mode_set) { + ret = !crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, + old_fb); + if (!ret) + goto done; + } drm_for_each_encoder(encoder, dev) { @@ -368,13 +379,15 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, encoder->base.id, encoder->name, mode->base.id, mode->name); encoder_funcs = encoder->helper_private; - encoder_funcs->mode_set(encoder, mode, adjusted_mode); + if (encoder_funcs->mode_set) + encoder_funcs->mode_set(encoder, mode, adjusted_mode); drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); } /* Now enable the clocks, plane, pipe, and connectors that we set up. */ - crtc_funcs->commit(crtc); + if (crtc_funcs->commit) + crtc_funcs->commit(crtc); drm_for_each_encoder(encoder, dev) { @@ -384,7 +397,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, drm_bridge_pre_enable(encoder->bridge); encoder_funcs = encoder->helper_private; - encoder_funcs->commit(encoder); + if (encoder_funcs->commit) + encoder_funcs->commit(encoder); drm_bridge_enable(encoder->bridge); }