Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp5066623ybb; Tue, 24 Mar 2020 10:20:04 -0700 (PDT) X-Google-Smtp-Source: ADFU+vuKgkNSJ/WEeH1AHe98oE1ZClJs3ncSI5nTfg/2rcYze4Yd3D2GhoiuH/Bkniwy/bgrxAd1 X-Received: by 2002:a9d:567:: with SMTP id 94mr21340862otw.201.1585070404283; Tue, 24 Mar 2020 10:20:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585070404; cv=none; d=google.com; s=arc-20160816; b=uVdCfYH1+r1hC7QNcmIbA/KzbLMqBI5J72GG30Ekj6CEEiURfuOMHJKDLno+ndcMtM mzVi3wV75M2CyZ89ehzoBGQ6QHvQCRvsRLMTm+wrt6hibrTrEU+BmR1f+WPvm1gg34yy fQsIUlu98Ml6a98tCQ1Lm8VwgdDvHiLKWPcTqsqkSTV27PUu6b7oHAIAMjEayOr6ZG7v 6V1PPYkz0oiTA38M4DcYqTY+OpmuKBOOjRJaxuz/mC8JzBJ+ougDOLAT1h7Mnd6Juy7H SVB1HtvrN6aKmq/xnCpMGPIimBPNn2s1vlRk+jgAXmByqr2i71HSEcI8BQ2AQYzKEX8R PFDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=XRJN4hAd2JSQKinm27+NMrgSgf1fumexIMPLfZ+Oaqg=; b=BEGZcIvL5eKtTpfN7pPLlgz3ImnUfEXlPwR6L7IKNkBELWPHC6xLbJAC/GRagPlsJt YqYbkpKOuTbwy372NGWxf1oMf/agfsksDiIssqViv+/kN23TkivNvWCg+E6ThnPkQhfC HpwRWMYiCmo0d69X5y0HDrERfTFZUZhdSBOMCrzChd+Ozqui8j4M4wjH9bDUUBJZPR1X XpnGkUn+/2U8ORLnPt7hJ3cb/IXn4MxKtR5ElTa47aE2JtCZbuPyFYjS8Yf26i1b6U1k eMSue5juStRdYj+CLMHnV5RHzUM0U/MtCi65YlYJKlbxVvdlkmqJrN7qdnthVovCmG+A ItYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@synopsys.com header.s=mail header.b=hLKJX3IJ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w23si826148ook.92.2020.03.24.10.19.50; Tue, 24 Mar 2020 10:20:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@synopsys.com header.s=mail header.b=hLKJX3IJ; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=synopsys.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727846AbgCXRTX (ORCPT + 99 others); Tue, 24 Mar 2020 13:19:23 -0400 Received: from smtprelay-out1.synopsys.com ([149.117.87.133]:51432 "EHLO smtprelay-out1.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727640AbgCXRTU (ORCPT ); Tue, 24 Mar 2020 13:19:20 -0400 Received: from mailhost.synopsys.com (mdc-mailhost1.synopsys.com [10.225.0.209]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by smtprelay-out1.synopsys.com (Postfix) with ESMTPS id 244D1C0A42; Tue, 24 Mar 2020 17:19:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1585070359; bh=3xjZWrAqFbXLAL//uBwoharcysYnAej6Vn0b4tQKGX0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:In-Reply-To: References:From; b=hLKJX3IJr4D9wPAqWp0tJQDL6oQhgJvJPge4a01TJekfDs3xVzqd7Vi+WrIkZb3Fe xP9zKkd0CTadV3IMAwmmEGrm+M3hRAqDB1D3xt3VxZk1UK5OOyYpxNH04WeoPL5Xu4 q1FTW17DlUZSMjyqA+qfbFWWG0DPEBIKvBsWAIXGWkMd4lO6SK3JmFspQldf83Vs/c g+KvZ7a+66aovlKugCfI6S1kSr4mmzfOPRyLby6bpnv3/XIFOQ+dUaoQ/ZLo+Yq7AX S4QSZXYsJDeTAxFJwOvabO8mAKOE2eYr0J/jxtncq7iYlf04a4e0AVqZezknVbdQIM Q4Hl9aZ+9VIcQ== Received: from de02dwia024.internal.synopsys.com (de02dwia024.internal.synopsys.com [10.225.19.81]) by mailhost.synopsys.com (Postfix) with ESMTP id 2C627A005E; Tue, 24 Mar 2020 17:19:16 +0000 (UTC) From: Angelo Ribeiro To: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Angelo Ribeiro , Maarten Lankhorst , Maxime Ripard , David Airlie , Daniel Vetter , Gustavo Pimentel , Joao Pinto Subject: [PATCH 2/4] drm: ipk: Add DRM driver for DesignWare IPK DSI Date: Tue, 24 Mar 2020 18:18:20 +0100 Message-Id: <6a4cd3f4e56aa46b3ea438de245a27f1c47c46c1.1585067507.git.angelo.ribeiro@synopsys.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for Synopsys DesignWare VPG (Video Pattern Generator) and DRM driver for Synopsys DesignWare DSI Host IPK solution. Cc: Maarten Lankhorst Cc: Maxime Ripard Cc: David Airlie Cc: Daniel Vetter Cc: Gustavo Pimentel Cc: Joao Pinto Signed-off-by: Angelo Ribeiro --- drivers/gpu/drm/Kconfig | 2 + drivers/gpu/drm/Makefile | 1 + drivers/gpu/drm/ipk/Kconfig | 13 + drivers/gpu/drm/ipk/Makefile | 6 + drivers/gpu/drm/ipk/dw-drv.c | 189 +++++++++++++++ drivers/gpu/drm/ipk/dw-ipk.h | 30 +++ drivers/gpu/drm/ipk/dw-vpg.c | 559 +++++++++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/ipk/dw-vpg.h | 55 +++++ 8 files changed, 855 insertions(+) create mode 100644 drivers/gpu/drm/ipk/Kconfig create mode 100644 drivers/gpu/drm/ipk/Makefile create mode 100644 drivers/gpu/drm/ipk/dw-drv.c create mode 100644 drivers/gpu/drm/ipk/dw-ipk.h create mode 100644 drivers/gpu/drm/ipk/dw-vpg.c create mode 100644 drivers/gpu/drm/ipk/dw-vpg.h diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 4359497..29ea1d1 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -388,6 +388,8 @@ source "drivers/gpu/drm/mcde/Kconfig" source "drivers/gpu/drm/tidss/Kconfig" +source "drivers/gpu/drm/ipk/Kconfig" + # Keep legacy drivers last menuconfig DRM_LEGACY diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 7f72ef5..c5afb63 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -124,3 +124,4 @@ obj-$(CONFIG_DRM_PANFROST) += panfrost/ obj-$(CONFIG_DRM_ASPEED_GFX) += aspeed/ obj-$(CONFIG_DRM_MCDE) += mcde/ obj-$(CONFIG_DRM_TIDSS) += tidss/ +obj-$(CONFIG_DRM_IPK) += ipk/ diff --git a/drivers/gpu/drm/ipk/Kconfig b/drivers/gpu/drm/ipk/Kconfig new file mode 100644 index 0000000..1f87444 --- /dev/null +++ b/drivers/gpu/drm/ipk/Kconfig @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0-only +config DRM_IPK + tristate "DRM Support for Synopsys DesignWare IPK DSI" + depends on DRM + select DRM_KMS_HELPER + select DRM_GEM_CMA_HELPER + select DRM_KMS_CMA_HELPER + select DRM_PANEL_BRIDGE + select VIDEOMODE_HELPERS + help + Enable support for the Synopsys DesignWare DRM DSI. + To compile this driver as a module, choose M here: the module + will be called ipk-drm. diff --git a/drivers/gpu/drm/ipk/Makefile b/drivers/gpu/drm/ipk/Makefile new file mode 100644 index 0000000..51d2774 --- /dev/null +++ b/drivers/gpu/drm/ipk/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-only +ipk-drm-y := \ + dw-drv.o \ + dw-vpg.o + +obj-$(CONFIG_DRM_IPK) += ipk-drm.o diff --git a/drivers/gpu/drm/ipk/dw-drv.c b/drivers/gpu/drm/ipk/dw-drv.c new file mode 100644 index 0000000..6205f1c --- /dev/null +++ b/drivers/gpu/drm/ipk/dw-drv.c @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2019-2020 Synopsys, Inc. and/or its affiliates. + * Synopsys DesignWare MIPI DSI DRM driver + * + * Author: Angelo Ribeiro + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dw-ipk.h" +#include "dw-vpg.h" + +static const struct drm_mode_config_funcs dw_ipk_drm_modecfg_funcs = { + .fb_create = drm_gem_fb_create_with_dirty, + .atomic_check = drm_atomic_helper_check, + .atomic_commit = drm_atomic_helper_commit, +}; + +static int dw_ipk_load(struct drm_device *drm) +{ + int ret; + + drm_mode_config_init(drm); + + drm->mode_config.min_width = 0; + drm->mode_config.min_height = 0; + + /* To handle orientation */ + drm->mode_config.max_width = 2048; + drm->mode_config.max_height = 2048; + + drm->mode_config.funcs = &dw_ipk_drm_modecfg_funcs; + + /* TODO + * Optional framebuffer memory resources allocation + */ + + ret = vpg_load(drm); + if (ret) + return ret; + + /* Calls all the crtc's, encoder's and connector's reset */ + drm_mode_config_reset(drm); + + /* Initialize and enable output polling */ + drm_kms_helper_poll_init(drm); + + return ret; +} + +static void dw_ipk_unload(struct drm_device *drm) +{ + DRM_DEBUG_DRIVER("\n"); + + drm_kms_helper_poll_fini(drm); + vpg_unload(drm); +} + +DEFINE_DRM_GEM_CMA_FOPS(ipk_drm_driver_fops); + +static int ipk_gem_cma_dumb_create(struct drm_file *file, + struct drm_device *dev, + struct drm_mode_create_dumb *args) +{ + unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); + int err; + + /* + * In order to optimize data transfer, pitch is aligned on + * 128 bytes, height is aligned on 4 bytes + */ + args->pitch = roundup(min_pitch, 128); + args->height = roundup(args->height, 4); + + err = drm_gem_cma_dumb_create_internal(file, dev, args); + if (err < 0) + drm_err(dev, "dumb_create failed %d\n", err); + + return err; +} + +static struct drm_driver dw_ipk_drm_driver = { + .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_ATOMIC, + .name = "dw_ipk", + .desc = "DW IPK DSI Host Controller", + .date = "20190725", + .major = 1, + .minor = 0, + .patchlevel = 0, + .fops = &ipk_drm_driver_fops, + .dumb_create = ipk_gem_cma_dumb_create, + .prime_handle_to_fd = drm_gem_prime_handle_to_fd, + .prime_fd_to_handle = drm_gem_prime_fd_to_handle, + .gem_free_object_unlocked = drm_gem_cma_free_object, + .gem_vm_ops = &drm_gem_cma_vm_ops, + .gem_prime_export = drm_gem_prime_export, + .gem_prime_import = drm_gem_prime_import, + .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table, + .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table, + .gem_prime_vmap = drm_gem_cma_prime_vmap, + .gem_prime_vunmap = drm_gem_cma_prime_vunmap, + .gem_prime_mmap = drm_gem_cma_prime_mmap, +}; + +static int dw_ipk_drm_platform_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct drm_device *drm; + struct ipk_device *ipk; + int ret; + + DRM_DEBUG_DRIVER("\n"); + + ipk = kzalloc(sizeof(*ipk), GFP_KERNEL); + if (!ipk) + return -ENOMEM; + + ipk->platform = pdev; + drm = &ipk->drm; + + ret = drm_dev_init(&ipk->drm, &dw_ipk_drm_driver, dev); + if (ret) { + kfree(ipk); + return ret; + } + + platform_set_drvdata(pdev, drm); + + ret = dw_ipk_load(drm); + if (ret) + goto err_put; + + ret = drm_dev_register(drm, 0); + if (ret) + goto err_put; + + drm_fbdev_generic_setup(drm, 24); + + return ret; + +err_put: + drm_dev_put(drm); + return ret; +} + +static int dw_ipk_drm_platform_remove(struct platform_device *pdev) +{ + struct drm_device *drm = platform_get_drvdata(pdev); + + drm_dev_unregister(drm); + dw_ipk_unload(drm); + drm_dev_put(drm); + + return 0; +} + +static const struct of_device_id dw_ipk_dt_ids[] = { + {.compatible = "snps,dw-ipk-vpg"}, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, dw_ipk_dt_ids); + +static struct platform_driver dw_ipk_drm_platform_driver = { + .probe = dw_ipk_drm_platform_probe, + .remove = dw_ipk_drm_platform_remove, + .driver = { + .name = "dw-ipk-drm", + .of_match_table = dw_ipk_dt_ids, + }, +}; + +module_platform_driver(dw_ipk_drm_platform_driver); + +MODULE_DESCRIPTION("Synopsys DesignWare IPK DRM driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Angelo Ribeiro "); diff --git a/drivers/gpu/drm/ipk/dw-ipk.h b/drivers/gpu/drm/ipk/dw-ipk.h new file mode 100644 index 0000000..4abb6dd --- /dev/null +++ b/drivers/gpu/drm/ipk/dw-ipk.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2019-2020 Synopsys, Inc. and/or its affiliates. + * Synopsys DesignWare MIPI DSI Controller + */ + +#ifndef _DW_IPK_H +#define _DW_IPK_H + +#include "drm/drm_device.h" +#include + +struct ipk_pipeline { + struct drm_framebuffer *fb; + struct drm_crtc crtc; + struct drm_plane *plane; + struct drm_bridge *bridge; +}; + +struct ipk_device { + struct drm_device drm; + struct platform_device *platform; + struct ipk_pipeline pipeline; + struct vpg_device *vpg; +}; + +#define drm_device_to_ipk_device(target) \ + container_of(target, struct ipk_device, drm) + +#endif /* _DW_IPK_H */ diff --git a/drivers/gpu/drm/ipk/dw-vpg.c b/drivers/gpu/drm/ipk/dw-vpg.c new file mode 100644 index 0000000..feb3e90 --- /dev/null +++ b/drivers/gpu/drm/ipk/dw-vpg.c @@ -0,0 +1,559 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2019-2020 Synopsys, Inc. and/or its affiliates. + * Synopsys DesignWare MIPI DSI controller + * + * Author: Angelo Ribeiro + * Author: Luis Oliveira + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include