From patchwork Thu Jul 21 13:25:03 2016
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Philipp Zabel
X-Patchwork-Id: 9241707
Return-Path:
Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org
[172.30.200.125])
by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id
7F6C5607D3 for ;
Thu, 21 Jul 2016 13:25:21 +0000 (UTC)
Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1])
by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 70EAA27C39
for ;
Thu, 21 Jul 2016 13:25:21 +0000 (UTC)
Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486)
id 65DCC27DE0; Thu, 21 Jul 2016 13:25:21 +0000 (UTC)
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
pdx-wl-mail.web.codeaurora.org
X-Spam-Level:
X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED
autolearn=ham version=3.3.1
Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177])
by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D07AD27C39
for ;
Thu, 21 Jul 2016 13:25:20 +0000 (UTC)
Received: from gabe.freedesktop.org (localhost [127.0.0.1])
by gabe.freedesktop.org (Postfix) with ESMTP id 0444D6E9E7;
Thu, 21 Jul 2016 13:25:13 +0000 (UTC)
X-Original-To: dri-devel@lists.freedesktop.org
Delivered-To: dri-devel@lists.freedesktop.org
Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de
[IPv6:2001:67c:670:201:290:27ff:fe1d:cc33])
by gabe.freedesktop.org (Postfix) with ESMTPS id 695686E9E7
for ;
Thu, 21 Jul 2016 13:25:09 +0000 (UTC)
Received: from dude.hi.pengutronix.de ([2001:67c:670:100:1d::7]
helo=dude.pengutronix.de.)
by metis.ext.pengutronix.de with esmtp (Exim 4.80)
(envelope-from )
id 1bQDyM-00048O-1J; Thu, 21 Jul 2016 15:25:06 +0200
From: Philipp Zabel
To: dri-devel@lists.freedesktop.org
Subject: [PATCH] drm/imx: imx-ldb: store LVDS bus configuration in ldb
channel
Date: Thu, 21 Jul 2016 15:25:03 +0200
Message-Id: <1469107503-2491-1-git-send-email-p.zabel@pengutronix.de>
X-Mailer: git-send-email 2.8.1
X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7
X-SA-Exim-Mail-From: p.zabel@pengutronix.de
X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de);
SAEximRunCond expanded to false
X-PTX-Original-Recipient: dri-devel@lists.freedesktop.org
Cc: Daniel Vetter , kernel@pengutronix.de
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-Virus-Scanned: ClamAV using ClamSMTP
The code in imx_ldb_encoder_mode_set crashes trying to access the
crtc->state->state drm_atomic_state pointer if that was previously
cleared by drm_atomic_helper_swap_state.
Instead of trying to walk all connectors during encoder mode_set to
determine the LVDS bus format from panel or external bridge connector
display info, store it in imx_crtc_state during encoder atomic_check,
where it is already known, and just retrieve it from imx_crtc_state
during encoder mode_set.
Fixes: 49f98bc4d44a4 ("drm/imx: store internal bus configuration in crtc state")
Signed-off-by: Philipp Zabel
---
drivers/gpu/drm/imx/imx-drm.h | 1 +
drivers/gpu/drm/imx/imx-ldb.c | 22 +++++-----------------
2 files changed, 6 insertions(+), 17 deletions(-)
diff --git a/drivers/gpu/drm/imx/imx-drm.h b/drivers/gpu/drm/imx/imx-drm.h
index bdaa381..5e2f68a 100644
--- a/drivers/gpu/drm/imx/imx-drm.h
+++ b/drivers/gpu/drm/imx/imx-drm.h
@@ -19,6 +19,7 @@ struct imx_crtc_state {
u32 bus_flags;
int di_hsync_pin;
int di_vsync_pin;
+ u32 ldb_bus_format;
};
static inline struct imx_crtc_state *to_imx_crtc_state(struct drm_crtc_state *s)
diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
index dc2b420..871dff9 100644
--- a/drivers/gpu/drm/imx/imx-ldb.c
+++ b/drivers/gpu/drm/imx/imx-ldb.c
@@ -262,7 +262,10 @@ static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder,
unsigned long serial_clk;
unsigned long di_clk = mode->clock * 1000;
int mux = drm_of_encoder_active_port_id(imx_ldb_ch->child, encoder);
- u32 bus_format = imx_ldb_ch->bus_format;
+ struct drm_crtc_state *crtc_state = encoder->crtc->state;
+ struct imx_crtc_state *imx_crtc_state = to_imx_crtc_state(crtc_state);
+ u32 bus_format = imx_ldb_ch->bus_format ?:
+ imx_crtc_state->ldb_bus_format;
if (mode->clock > 170000) {
dev_warn(ldb->dev,
@@ -297,22 +300,6 @@ static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder,
ldb->ldb_ctrl &= ~LDB_DI1_VS_POL_ACT_LOW;
}
- if (!bus_format) {
- struct drm_connector_state *conn_state;
- struct drm_connector *connector;
- int i;
-
- for_each_connector_in_state(encoder->crtc->state->state,
- connector, conn_state, i) {
- struct drm_display_info *di = &connector->display_info;
-
- if (conn_state->crtc == encoder->crtc &&
- di->num_bus_formats) {
- bus_format = di->bus_formats[0];
- break;
- }
- }
- }
imx_ldb_ch_set_bus_format(imx_ldb_ch, bus_format);
}
@@ -404,6 +391,7 @@ static int imx_ldb_encoder_atomic_check(struct drm_encoder *encoder,
imx_crtc_state->di_hsync_pin = 2;
imx_crtc_state->di_vsync_pin = 3;
+ imx_crtc_state->ldb_bus_format = bus_format;
return 0;
}