From patchwork Wed May 22 07:21:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 10955225 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6D8A61708 for ; Wed, 22 May 2019 07:22:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4B39828A9C for ; Wed, 22 May 2019 07:22:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3D22E28AA1; Wed, 22 May 2019 07:22:18 +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=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A722028AA0 for ; Wed, 22 May 2019 07:22:11 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 67A3F89518; Wed, 22 May 2019 07:22:09 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lf1-x141.google.com (mail-lf1-x141.google.com [IPv6:2a00:1450:4864:20::141]) by gabe.freedesktop.org (Postfix) with ESMTPS id B4C1389518 for ; Wed, 22 May 2019 07:22:06 +0000 (UTC) Received: by mail-lf1-x141.google.com with SMTP id h13so864267lfc.7 for ; Wed, 22 May 2019 00:22:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1t2+xak5dw5io6kGKu1uJQwTYeXcP8lctuLfmbX9rfM=; b=kC4hYFgLdwLmorqNItdPoBVzj279Vxkx3qoFBmAF8fBZOa1lFxiPJ8xQtvF6Z4ZzNy PHHSv3DHnRg3B9AY7IL85z4zvaJCZr/UlfWW9FdtKlqg+MqvN7Ze2MyCxkiR1bragayy HZuDLedF+FUk0ztMwEKibud+6Wl8ygVrAlEzlhPbbWstZSSVQJJoCp+uwauf5GxLxb2w HEMdAFAKu6YyozAoO2XlIPhFKHNkqJdjNKtPJVkSHstVWvA9Q9xj42CvaEctwCPZ1wAy sPUyKx4UYH/4FLsbrY1KSwsziAC/3jIq7EiQSNOuD7LJJyhnHe+Nce8lTKBnQg1Q0ARq 7zbg== X-Gm-Message-State: APjAAAXQQ82oIVDolcOdPQJOZYocxATSlWkp/7xLw3cOhcgvNvWG4qsJ 75nQqNA5SM9Q4fBx0VfLX7kdHr0Wklw= X-Google-Smtp-Source: APXvYqzDP+mwbyGw5HHKU8X4sxuGeKPbXKpoLg0SLWxqUOgt4zbuJDzgqjUPz87jUqoKl/JrdB4b6A== X-Received: by 2002:a05:6512:507:: with SMTP id o7mr22025762lfb.137.1558509722773; Wed, 22 May 2019 00:22:02 -0700 (PDT) Received: from genomnajs.ideon.se ([85.235.10.227]) by smtp.gmail.com with ESMTPSA id q124sm4924679ljq.75.2019.05.22.00.22.00 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 22 May 2019 00:22:01 -0700 (PDT) From: Linus Walleij To: dri-devel@lists.freedesktop.org, Maarten Lankhorst , Maxime Ripard , Sean Paul Subject: [PATCH v3] drm/mcde: Add new driver for ST-Ericsson MCDE Date: Wed, 22 May 2019 09:21:53 +0200 Message-Id: <20190522072153.13727-1-linus.walleij@linaro.org> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1t2+xak5dw5io6kGKu1uJQwTYeXcP8lctuLfmbX9rfM=; b=U/7u+7nrVfkUynX/QMRn3D0zPIL6F4PDVFqXDm5qfefPH8fDXdR6us3GeZz8ziN1l3 o4VMgDkJ3OUGDwib6T/Wq/4iIe3qyTBsZybygZd9sL1PG7YhWbgizNoRDLlryc6c3RVD Tv+2FVCABc+QtH8EFspDBYGkz4znYNHaq/qYew55kpbTyE6Hjxv3RrWebRg50ntUj6mZ A14sl3kewZ0UKFG/U/zk8msLqQpzT4GkRbjY+fEY7AO0DJPr1vC1APSvLGU0JWGZxwKZ /cvRp5O1TrSjaauhOLvquOpAEclPu3Au1TNPNXemV+IEgrlwXMbbCFusiK9m8HULaeVU NX/A== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP This adds a new DRM driver for the ST-Ericsson Multi Channel Display Engine, MCDE display controller. This hardware has three independent DSI hosts and can composit and display several memory buffers onto an LCD display. It was developed for several years inside of ST-Ericsson and shipped with a few million mobile phones from Sony and Samsung, as well as with the Snowball community development board. The driver is currently pretty rudimentary but supports a simple framebuffer so we can get penguins and graphics when using these SoCs. Signed-off-by: Linus Walleij Acked-by: Daniel Vetter Signed-off-by: Sam Ravnborg --- ChangeLog v2->v3: - Break out functions for enabling and disabling the display pipeline, use abstract enums to indicate FIFOs, channels, external sources, formatters and overlays. - Break out functions to configure channel, FIFO, external sources, formatter and overlays. This makes it more clear how the display pipeline is actually set up. - Split out the registers to separate include files for the mcde_display.c and mcde_dsi.c driver files. Keep the few registers in mcde_drv.c locally. - Switch event handling and display update in the .update() callback so that we arm the vblank IRQ before we send the display update, so there is no risk of missing the vblank IRQ. - Use drm_gem_fb_simple_display_pipe_prepare_fb() - Use drm_gem_fb_create_with_dirty() and we start to get better explicit commits of the dirty framebuffers, with the core enabling and using the vblank, interrupt count going up. - Get rid of the helper variables "enabled" and "vblank_irq_on" that were competing with atomic updates. Instead call the drm_atomic_helper_commit_tail_rpm() from the mode config helpers .atomic_commit_tail() so that the CRTC is always enabled before sending an update and voila it magically works. - Order includes alphabetically. - Get rid of - Move to using an embedded struct drm_device and using drm_dev_init() ChangeLog v1->v2: - Replace the quirky custom encoder structure and hacks in the FBDEV core with a straight-forward internal DSI bridge which is in turn connected to the panel bridge. It works like a charm, much to my surprise. - Drop the panel port graph parsing for the DSI host to panels: the panels are children of the DSI node, so just spin over the children and take the first working panel. - Move clock lookup and handling for the DSI HS and LP clocks to the DSI driver file as this is now cleanly associated with respective DSI port. --- Documentation/gpu/drivers.rst | 1 + Documentation/gpu/mcde.rst | 8 + MAINTAINERS | 7 + drivers/gpu/drm/Kconfig | 2 + drivers/gpu/drm/Makefile | 1 + drivers/gpu/drm/mcde/Kconfig | 18 + drivers/gpu/drm/mcde/Makefile | 3 + drivers/gpu/drm/mcde/mcde_display.c | 1145 ++++++++++++++++++++++ drivers/gpu/drm/mcde/mcde_display_regs.h | 518 ++++++++++ drivers/gpu/drm/mcde/mcde_drm.h | 44 + drivers/gpu/drm/mcde/mcde_drv.c | 572 +++++++++++ drivers/gpu/drm/mcde/mcde_dsi.c | 1044 ++++++++++++++++++++ drivers/gpu/drm/mcde/mcde_dsi_regs.h | 385 ++++++++ 13 files changed, 3748 insertions(+) create mode 100644 Documentation/gpu/mcde.rst create mode 100644 drivers/gpu/drm/mcde/Kconfig create mode 100644 drivers/gpu/drm/mcde/Makefile create mode 100644 drivers/gpu/drm/mcde/mcde_display.c create mode 100644 drivers/gpu/drm/mcde/mcde_display_regs.h create mode 100644 drivers/gpu/drm/mcde/mcde_drm.h create mode 100644 drivers/gpu/drm/mcde/mcde_drv.c create mode 100644 drivers/gpu/drm/mcde/mcde_dsi.c create mode 100644 drivers/gpu/drm/mcde/mcde_dsi_regs.h diff --git a/Documentation/gpu/drivers.rst b/Documentation/gpu/drivers.rst index 044a7025477c..4bfb7068e9f7 100644 --- a/Documentation/gpu/drivers.rst +++ b/Documentation/gpu/drivers.rst @@ -7,6 +7,7 @@ GPU Driver Documentation amdgpu amdgpu-dc i915 + mcde meson pl111 tegra diff --git a/Documentation/gpu/mcde.rst b/Documentation/gpu/mcde.rst new file mode 100644 index 000000000000..c69e977defda --- /dev/null +++ b/Documentation/gpu/mcde.rst @@ -0,0 +1,8 @@ +.. SPDX-License-Identifier: GPL-2.0 + +======================================================= + drm/mcde ST-Ericsson MCDE Multi-channel display engine +======================================================= + +.. kernel-doc:: drivers/gpu/drm/mcde/mcde_drv.c + :doc: ST-Ericsson MCDE DRM Driver diff --git a/MAINTAINERS b/MAINTAINERS index 5cfbea4ce575..56cbc8780507 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -5128,6 +5128,13 @@ S: Maintained F: drivers/gpu/drm/tinydrm/st7735r.c F: Documentation/devicetree/bindings/display/sitronix,st7735r.txt +DRM DRIVER FOR ST-ERICSSON MCDE +M: Linus Walleij +T: git git://anongit.freedesktop.org/drm/drm-misc +S: Maintained +F: drivers/gpu/drm/mcde/ +F: Documentation/devicetree/bindings/display/ste,mcde.txt + DRM DRIVER FOR TDFX VIDEO CARDS S: Orphan / Obsolete F: drivers/gpu/drm/tdfx/ diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index e360a4a131e1..0fe1d59e4479 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -342,6 +342,8 @@ source "drivers/gpu/drm/panfrost/Kconfig" source "drivers/gpu/drm/aspeed/Kconfig" +source "drivers/gpu/drm/mcde/Kconfig" + # Keep legacy drivers last menuconfig DRM_LEGACY diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 72f5036d9bfa..15e4841fe4cd 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -113,3 +113,4 @@ obj-$(CONFIG_DRM_VBOXVIDEO) += vboxvideo/ obj-$(CONFIG_DRM_LIMA) += lima/ obj-$(CONFIG_DRM_PANFROST) += panfrost/ obj-$(CONFIG_DRM_ASPEED_GFX) += aspeed/ +obj-$(CONFIG_DRM_MCDE) += mcde/ diff --git a/drivers/gpu/drm/mcde/Kconfig b/drivers/gpu/drm/mcde/Kconfig new file mode 100644 index 000000000000..b3990126562c --- /dev/null +++ b/drivers/gpu/drm/mcde/Kconfig @@ -0,0 +1,18 @@ +config DRM_MCDE + tristate "DRM Support for ST-Ericsson MCDE (Multichannel Display Engine)" + depends on DRM + depends on CMA + depends on ARM || COMPILE_TEST + depends on OF + select MFD_SYSCON + select DRM_MIPI_DSI + select DRM_BRIDGE + select DRM_PANEL_BRIDGE + select DRM_KMS_HELPER + select DRM_KMS_CMA_HELPER + select DRM_GEM_CMA_HELPER + select VT_HW_CONSOLE_BINDING if FRAMEBUFFER_CONSOLE + help + Choose this option for DRM support for the ST-Ericsson MCDE + Multi-Channel Display Engine. + If M is selected the module will be called mcde_drm. diff --git a/drivers/gpu/drm/mcde/Makefile b/drivers/gpu/drm/mcde/Makefile new file mode 100644 index 000000000000..fe28f4e0fe46 --- /dev/null +++ b/drivers/gpu/drm/mcde/Makefile @@ -0,0 +1,3 @@ +mcde_drm-y += mcde_drv.o mcde_dsi.o mcde_display.o + +obj-$(CONFIG_DRM_MCDE) += mcde_drm.o diff --git a/drivers/gpu/drm/mcde/mcde_display.c b/drivers/gpu/drm/mcde/mcde_display.c new file mode 100644 index 000000000000..f31221a23012 --- /dev/null +++ b/drivers/gpu/drm/mcde/mcde_display.c @@ -0,0 +1,1145 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 Linus Walleij + * Parts of this file were based on the MCDE driver by Marcus Lorentzon + * (C) ST-Ericsson SA 2013 + */ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include