Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp10649894rwd; Thu, 22 Jun 2023 02:57:34 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7jEesYHFmXvEJKaESo+SMC2k6XeG55hVIcBdK7ndH1jjK4jxTIdNzahgAAvdFOOJDt3oyh X-Received: by 2002:a05:620a:8bcc:b0:762:5aeb:23e7 with SMTP id qy12-20020a05620a8bcc00b007625aeb23e7mr1796945qkn.68.1687427854415; Thu, 22 Jun 2023 02:57:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687427854; cv=none; d=google.com; s=arc-20160816; b=Z4Boe+9GvM1fGZ1LK65X8b8WkatR/UAzIsWMck0Ls3u5tgVcKzGKb9c3t8Rcy4dNwK KhRy7MtbHkgvR/1ZOMoo0jyfxcECxAj9G0H/w0sNil5MBC49Qw7mskaaXGuIWiMhlPpy qvY0rFaB23KdU7ko0su9UOsnPosoDNIwTKJrz5GsxSYV4HsLN4swvPEvXzl5tLPgptLc UvYDYVD/t33RQoaMYk9Cc9UiPlFuJvn3Zr11Fgt6MKIvoVba6JNU0lAFz3jQG71XcUWE GmcJ93C5P3eVRs345/WieUk9d3MvbSILUYmIo0UgKi9M3t4D0X1wG1GtUmy9h6ygViUj AW4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=QWghbV+pJmIbWURAw8lHatV6YNYcOvYABmZnUwtb1aI=; b=fcsqgG+4HaQ2YDzMHF8XQ05VlZHg8wkV14+OT3tvNuH/tMRwnhskYsqvbPLIElFsjB 1dBvsHv5v79XC7CBzGpt/bEhu9TMzl1NK1EM2Z07NPXKt+5V09mAp8enPvkbAqJivp86 sfygNHPbcE+99l0RFBD/cyAic6AaZjRDC4Em/aQiFoeVKhqzDfjsXz5mb6hTerhW5Xn9 7lk/gmcwLiFLbxbr9Pn4NRxqtET7Dou+CxT131xJzUQh/XE65D4tvF6ZsGgSXWGez5Nm g3Z8YOtCT2L3A3yoO+w2qhAiXpy9y6mPo13rsv0XDKtukHpamlf3ekbIfouv3zdlCcs7 YZCg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x22-20020a656ab6000000b0054ff38f6448si6138153pgu.238.2023.06.22.02.57.18; Thu, 22 Jun 2023 02:57:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230189AbjFVJbO (ORCPT + 99 others); Thu, 22 Jun 2023 05:31:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36452 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232342AbjFVJ3u (ORCPT ); Thu, 22 Jun 2023 05:29:50 -0400 Received: from laurent.telenet-ops.be (laurent.telenet-ops.be [IPv6:2a02:1800:110:4::f00:19]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 389A74ECB for ; Thu, 22 Jun 2023 02:22:47 -0700 (PDT) Received: from ramsan.of.borg ([IPv6:2a02:1810:ac12:ed20:991a:a831:ea4b:6058]) by laurent.telenet-ops.be with bizsmtp id C9Nj2A00c1yfRTD019Njli; Thu, 22 Jun 2023 11:22:43 +0200 Received: from rox.of.borg ([192.168.97.57]) by ramsan.of.borg with esmtp (Exim 4.95) (envelope-from ) id 1qCGWX-000Bwo-Uv; Thu, 22 Jun 2023 11:22:43 +0200 Received: from geert by rox.of.borg with local (Exim 4.95) (envelope-from ) id 1qCGWZ-003VxS-I3; Thu, 22 Jun 2023 11:22:43 +0200 From: Geert Uytterhoeven To: Laurent Pinchart , Kieran Bingham , David Airlie , Daniel Vetter , Thomas Zimmermann , Magnus Damm Cc: dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven Subject: [PATCH 24/39] drm: renesas: shmobile: Unify plane allocation Date: Thu, 22 Jun 2023 11:21:36 +0200 Message-Id: <95c2af42a89c65ca603126e56c0423407dfc873f.1687423204.git.geert+renesas@glider.be> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.4 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Unify primary and overlay plane allocation: - Enhance shmob_drm_plane_create() so it can be used to create the primary plane, too, - Move overlay plane creation next to primary plane creation. As overlay plane index zero now means the primary plane, this requires shifting all overlay plane indices by one. Signed-off-by: Geert Uytterhoeven --- Perhaps it would be better to not use dynamic allocation, but store "struct drm_plane primary" and "struct shmob_drm_plane planes[5]" in struct drm_shmob_device instead, like is done for the crtc and encoder? --- .../gpu/drm/renesas/shmobile/shmob_drm_crtc.c | 39 ++------ .../gpu/drm/renesas/shmobile/shmob_drm_drv.c | 9 -- .../drm/renesas/shmobile/shmob_drm_plane.c | 96 +++++++++++-------- .../drm/renesas/shmobile/shmob_drm_plane.h | 3 +- 4 files changed, 70 insertions(+), 77 deletions(-) diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c index 28a70536693f7788..3f6af12f45988124 100644 --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_crtc.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -501,47 +500,29 @@ static const struct drm_crtc_funcs crtc_funcs = { .disable_vblank = shmob_drm_disable_vblank, }; -static const uint32_t modeset_formats[] = { - DRM_FORMAT_RGB565, - DRM_FORMAT_RGB888, - DRM_FORMAT_ARGB8888, - DRM_FORMAT_XRGB8888, - DRM_FORMAT_NV12, - DRM_FORMAT_NV21, - DRM_FORMAT_NV16, - DRM_FORMAT_NV61, - DRM_FORMAT_NV24, - DRM_FORMAT_NV42, -}; - -static const struct drm_plane_funcs primary_plane_funcs = { - DRM_PLANE_NON_ATOMIC_FUNCS, -}; - int shmob_drm_crtc_create(struct shmob_drm_device *sdev) { struct drm_crtc *crtc = &sdev->crtc.crtc; - struct drm_plane *primary; + struct drm_plane *primary, *plane; + unsigned int i; int ret; sdev->crtc.dpms = DRM_MODE_DPMS_OFF; - primary = __drm_universal_plane_alloc(&sdev->ddev, sizeof(*primary), 0, - 0, &primary_plane_funcs, - modeset_formats, - ARRAY_SIZE(modeset_formats), - NULL, DRM_PLANE_TYPE_PRIMARY, - NULL); + primary = shmob_drm_plane_create(sdev, 0); if (IS_ERR(primary)) return PTR_ERR(primary); + for (i = 1; i < 5; ++i) { + plane = shmob_drm_plane_create(sdev, i); + if (IS_ERR(plane)) + return PTR_ERR(plane); + } + ret = drm_crtc_init_with_planes(&sdev->ddev, crtc, primary, NULL, &crtc_funcs, NULL); - if (ret < 0) { - drm_plane_cleanup(primary); - kfree(primary); + if (ret < 0) return ret; - } drm_crtc_helper_add(crtc, &crtc_helper_funcs); diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c index c15ebbe74cac501f..c98e2bdd888c3274 100644 --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c @@ -154,7 +154,6 @@ static int shmob_drm_probe(struct platform_device *pdev) struct shmob_drm_platform_data *pdata = pdev->dev.platform_data; struct shmob_drm_device *sdev; struct drm_device *ddev; - unsigned int i; int ret; if (pdata == NULL) { @@ -195,14 +194,6 @@ static int shmob_drm_probe(struct platform_device *pdev) return dev_err_probe(&pdev->dev, ret, "failed to initialize mode setting\n"); - for (i = 0; i < 4; ++i) { - ret = shmob_drm_plane_create(sdev, i); - if (ret < 0) { - dev_err(&pdev->dev, "failed to create plane %u\n", i); - goto err_modeset_cleanup; - } - } - ret = drm_vblank_init(ddev, 1); if (ret < 0) { dev_err(&pdev->dev, "failed to initialize vblank\n"); diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c index c58b9dca34736342..63886015baaebfc0 100644 --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "shmob_drm_drv.h" #include "shmob_drm_kms.h" @@ -64,57 +65,58 @@ static void __shmob_drm_plane_setup(struct shmob_drm_plane *splane, struct drm_framebuffer *fb) { struct shmob_drm_device *sdev = to_shmob_device(splane->plane.dev); + unsigned int ovl_idx = splane->index - 1; u32 format; /* TODO: Support ROP3 mode */ format = LDBBSIFR_EN | (splane->alpha << LDBBSIFR_LAY_SHIFT) | splane->format->ldbbsifr; -#define plane_reg_dump(sdev, splane, reg) \ +#define plane_reg_dump(sdev, ovl_idx, reg) \ dev_dbg(sdev->ddev.dev, "%s(%u): %s 0x%08x 0x%08x\n", __func__, \ - splane->index, #reg, \ - lcdc_read(sdev, reg(splane->index)), \ - lcdc_read(sdev, reg(splane->index) + LCDC_SIDE_B_OFFSET)) - - plane_reg_dump(sdev, splane, LDBnBSIFR); - plane_reg_dump(sdev, splane, LDBnBSSZR); - plane_reg_dump(sdev, splane, LDBnBLOCR); - plane_reg_dump(sdev, splane, LDBnBSMWR); - plane_reg_dump(sdev, splane, LDBnBSAYR); - plane_reg_dump(sdev, splane, LDBnBSACR); - - lcdc_write(sdev, LDBCR, LDBCR_UPC(splane->index)); - dev_dbg(sdev->ddev.dev, "%s(%u): %s 0x%08x\n", __func__, splane->index, + ovl_idx, #reg, \ + lcdc_read(sdev, reg(ovl_idx)), \ + lcdc_read(sdev, reg(ovl_idx) + LCDC_SIDE_B_OFFSET)) + + plane_reg_dump(sdev, ovl_idx, LDBnBSIFR); + plane_reg_dump(sdev, ovl_idx, LDBnBSSZR); + plane_reg_dump(sdev, ovl_idx, LDBnBLOCR); + plane_reg_dump(sdev, ovl_idx, LDBnBSMWR); + plane_reg_dump(sdev, ovl_idx, LDBnBSAYR); + plane_reg_dump(sdev, ovl_idx, LDBnBSACR); + + lcdc_write(sdev, LDBCR, LDBCR_UPC(ovl_idx)); + dev_dbg(sdev->ddev.dev, "%s(%u): %s 0x%08x\n", __func__, ovl_idx, "LDBCR", lcdc_read(sdev, LDBCR)); - lcdc_write(sdev, LDBnBSIFR(splane->index), format); + lcdc_write(sdev, LDBnBSIFR(ovl_idx), format); - lcdc_write(sdev, LDBnBSSZR(splane->index), + lcdc_write(sdev, LDBnBSSZR(ovl_idx), (splane->crtc_h << LDBBSSZR_BVSS_SHIFT) | (splane->crtc_w << LDBBSSZR_BHSS_SHIFT)); - lcdc_write(sdev, LDBnBLOCR(splane->index), + lcdc_write(sdev, LDBnBLOCR(ovl_idx), (splane->crtc_y << LDBBLOCR_CVLC_SHIFT) | (splane->crtc_x << LDBBLOCR_CHLC_SHIFT)); - lcdc_write(sdev, LDBnBSMWR(splane->index), + lcdc_write(sdev, LDBnBSMWR(ovl_idx), fb->pitches[0] << LDBBSMWR_BSMW_SHIFT); shmob_drm_plane_compute_base(splane, fb, splane->src_x, splane->src_y); - lcdc_write(sdev, LDBnBSAYR(splane->index), splane->dma[0]); + lcdc_write(sdev, LDBnBSAYR(ovl_idx), splane->dma[0]); if (shmob_drm_format_is_yuv(splane->format)) - lcdc_write(sdev, LDBnBSACR(splane->index), splane->dma[1]); + lcdc_write(sdev, LDBnBSACR(ovl_idx), splane->dma[1]); lcdc_write(sdev, LDBCR, - LDBCR_UPF(splane->index) | LDBCR_UPD(splane->index)); - dev_dbg(sdev->ddev.dev, "%s(%u): %s 0x%08x\n", __func__, splane->index, + LDBCR_UPF(ovl_idx) | LDBCR_UPD(ovl_idx)); + dev_dbg(sdev->ddev.dev, "%s(%u): %s 0x%08x\n", __func__, ovl_idx, "LDBCR", lcdc_read(sdev, LDBCR)); - plane_reg_dump(sdev, splane, LDBnBSIFR); - plane_reg_dump(sdev, splane, LDBnBSSZR); - plane_reg_dump(sdev, splane, LDBnBLOCR); - plane_reg_dump(sdev, splane, LDBnBSMWR); - plane_reg_dump(sdev, splane, LDBnBSAYR); - plane_reg_dump(sdev, splane, LDBnBSACR); + plane_reg_dump(sdev, ovl_idx, LDBnBSIFR); + plane_reg_dump(sdev, ovl_idx, LDBnBSSZR); + plane_reg_dump(sdev, ovl_idx, LDBnBLOCR); + plane_reg_dump(sdev, ovl_idx, LDBnBSMWR); + plane_reg_dump(sdev, ovl_idx, LDBnBSAYR); + plane_reg_dump(sdev, ovl_idx, LDBnBSACR); } void shmob_drm_plane_setup(struct drm_plane *plane) @@ -169,16 +171,22 @@ static int shmob_drm_plane_disable(struct drm_plane *plane, { struct shmob_drm_device *sdev = to_shmob_device(plane->dev); struct shmob_drm_plane *splane = to_shmob_plane(plane); + unsigned int ovl_idx = splane->index - 1; splane->format = NULL; - lcdc_write(sdev, LDBCR, LDBCR_UPC(splane->index)); - lcdc_write(sdev, LDBnBSIFR(splane->index), 0); + lcdc_write(sdev, LDBCR, LDBCR_UPC(ovl_idx)); + lcdc_write(sdev, LDBnBSIFR(ovl_idx), 0); lcdc_write(sdev, LDBCR, - LDBCR_UPF(splane->index) | LDBCR_UPD(splane->index)); + LDBCR_UPF(ovl_idx) | LDBCR_UPD(ovl_idx)); return 0; } +static const struct drm_plane_funcs primary_plane_funcs = { + .update_plane = drm_plane_helper_update_primary, + .disable_plane = drm_plane_helper_disable_primary, +}; + static const struct drm_plane_funcs shmob_drm_plane_funcs = { .update_plane = shmob_drm_plane_update, .disable_plane = shmob_drm_plane_disable, @@ -197,19 +205,31 @@ static const uint32_t formats[] = { DRM_FORMAT_NV42, }; -int shmob_drm_plane_create(struct shmob_drm_device *sdev, unsigned int index) +struct drm_plane *shmob_drm_plane_create(struct shmob_drm_device *sdev, + unsigned int index) { + const struct drm_plane_funcs *funcs; struct shmob_drm_plane *splane; + enum drm_plane_type type; + + if (!index) { + type = DRM_PLANE_TYPE_PRIMARY; + funcs = &primary_plane_funcs; + } else { + type = DRM_PLANE_TYPE_OVERLAY; + funcs = &shmob_drm_plane_funcs; + } - splane = drmm_universal_plane_alloc(&sdev->ddev, struct shmob_drm_plane, - plane, 1, &shmob_drm_plane_funcs, - formats, ARRAY_SIZE(formats), NULL, - DRM_PLANE_TYPE_OVERLAY, NULL); + splane = drmm_universal_plane_alloc(&sdev->ddev, + struct shmob_drm_plane, plane, 1, + funcs, formats, + ARRAY_SIZE(formats), NULL, type, + NULL); if (IS_ERR(splane)) - return PTR_ERR(splane); + return ERR_CAST(splane); splane->index = index; splane->alpha = 255; - return 0; + return &splane->plane; } diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.h b/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.h index e72b21a4288fc23f..29cf6732d479a509 100644 --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.h +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.h @@ -13,7 +13,8 @@ struct drm_plane; struct shmob_drm_device; -int shmob_drm_plane_create(struct shmob_drm_device *sdev, unsigned int index); +struct drm_plane *shmob_drm_plane_create(struct shmob_drm_device *sdev, + unsigned int index); void shmob_drm_plane_setup(struct drm_plane *plane); #endif /* __SHMOB_DRM_PLANE_H__ */ -- 2.34.1