Received: by 2002:a05:7412:251c:b0:e2:908c:2ebd with SMTP id w28csp2580892rda; Wed, 25 Oct 2023 06:57:42 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG03HpzuMggwOXGD2pkBslxFyMvAKfwJte5CPpF+RTR2yUINRnIRMyfinWd6h5cMPk1ZO+b X-Received: by 2002:a25:da52:0:b0:d9c:cd0e:cc29 with SMTP id n79-20020a25da52000000b00d9ccd0ecc29mr14521696ybf.37.1698242261822; Wed, 25 Oct 2023 06:57:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1698242261; cv=none; d=google.com; s=arc-20160816; b=vIZLLY8NITlFMuFW1FfhqPC/07ga/M8pFu7SS3N9h5we2eA81zrHrxM83SF9JIw7xC fKprjLTiVMSIkttaBrhFoe+BPZbqkYw4vz65/9cP/tKbL/LEY0i9fiZa2YjQeAu0bzMV wiT9k7mppjrnFx32mn3dQnJud9BNetoxwVWca6xSzlZrGJxCNJauflKfGq/86Uzrj8E3 GUc+/ZNSHfBaZgm0n2yb8xqPooMHfvNQ8FWgQjJk6OoOhcGANxyKypFkAMgrsOFkUMdu y728l+QQFaCtJP/RmzVbMxnncEFdJY+KeM2SFpqu+GFB1+oMYwOxq4ADh2gceyAH5rcj U46Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=32pUk8akeWCF+NTRftoysnznti+gRrj1/t5B8bDnzpQ=; fh=KwUBEF4ZA2m4ajOO1EZkrPn/cF9Z6URP/Ilodh+KyFg=; b=v50FwtIrz2Nf9mnJWssW2Qx5dLbhFm86llmYbpCWiGQDr5AHTTmjx/PsJu/6mFqki6 SJRg1mwGWOaiCYuJmIPORlccGGjA0/4R3WqG9NA+xN8HH7cP46tunL4VygeaP3j7GTRi 4MNiPybYN8bGs1kHKkliV+aQ3H9x4O0wqNE6UPGJtBnR8HbeTrVAGINp+ho7RcyKL1WO I9n43pz9MaeS1Af6juxJtRiA2UAQ1WdHJ9YZKZrE7gTAZQRkbIKNn1iGeWJf/sMfrjLa yBN1lCKmqrQ7JIEczRWSED8Wbhp4+B6Gsj0PfnGQe5ykfGhFgrp7xmsVR9lWLfWpY1cx 4QHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ahC34Et4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id o123-20020a254181000000b00d9cba33b88dsi10393212yba.67.2023.10.25.06.57.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Oct 2023 06:57:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ahC34Et4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 574DB8101EC3; Wed, 25 Oct 2023 06:57:40 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233317AbjJYN5i (ORCPT + 99 others); Wed, 25 Oct 2023 09:57:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56864 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232809AbjJYN5h (ORCPT ); Wed, 25 Oct 2023 09:57:37 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8B804132; Wed, 25 Oct 2023 06:57:31 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9F05FC433C7; Wed, 25 Oct 2023 13:57:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1698242251; bh=mL9aaBJh7T4dWkfq57W9E21rwjuh1Dt0dXBpKyIZtA4=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ahC34Et4TkfTRirGAN2NqFk+LWAL4dV6tJrge28TGVmvlgK8OHAtr4S/mvlbi810K q3H2Ib4H9hw5mPctEaDZOj2zcNEouX+SApw328WgQ+LlQ1QhU+bZzbmWfNdR/vn9fq J8YpFTwF7mv48aWDbMUjn8mJ29e6Ay5xoGBIL482uPSk/fBsLbbPEc518JsnZZNDBi VW7AOVyLiIFvZjfA2kEIgIxcuiI3Yx0/AA5CjI+Vkpkqi44Pyl4fRCHrxE3OELYQSB WKvItQ/mYZQdJel2dZWuc4dc90EmJUhS7Es8iQl1O/XuIFNTM/CiwcuszdcoCqIuc0 NoIhoLFwHK7QA== Date: Wed, 25 Oct 2023 15:57:28 +0200 From: Maxime Ripard To: Keith Zhao Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org, David Airlie , Daniel Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Emil Renner Berthing , Paul Walmsley , Palmer Dabbelt , Albert Ou , Maarten Lankhorst , Thomas Zimmermann , Philipp Zabel , Sumit Semwal , christian.koenig@amd.com, Bjorn Andersson , Heiko Stuebner , Shawn Guo , Jagan Teki , Chris Morgan , Jack Zhu , Shengyang Chen , Changhuang Liang Subject: Re: [PATCH v2 5/6] drm/vs: Add KMS crtc&plane Message-ID: References: <20231025103957.3776-1-keith.zhao@starfivetech.com> <20231025103957.3776-6-keith.zhao@starfivetech.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="gne3qq4wbplxfl5j" Content-Disposition: inline In-Reply-To: <20231025103957.3776-6-keith.zhao@starfivetech.com> X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS 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 X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Wed, 25 Oct 2023 06:57:40 -0700 (PDT) --gne3qq4wbplxfl5j Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Oct 25, 2023 at 06:39:56PM +0800, Keith Zhao wrote: > +static struct drm_crtc_state * > +vs_crtc_atomic_duplicate_state(struct drm_crtc *crtc) > +{ > + struct vs_crtc_state *ori_state; > + struct vs_crtc_state *state; > + > + if (!crtc->state) > + return NULL; > + > + ori_state = to_vs_crtc_state(crtc->state); > + state = kzalloc(sizeof(*state), GFP_KERNEL); > + if (!state) > + return NULL; > + > + __drm_atomic_helper_crtc_duplicate_state(crtc, &state->base); > + > + state->output_fmt = ori_state->output_fmt; That field is never set in your patch. > + state->encoder_type = ori_state->encoder_type; That isn't either, and it's not clear why you would need the encoder_type stored in the CRTC? > + state->bpp = ori_state->bpp; You seem to derive that from output_fmt, it doesn't need to be in the CRTC state. > + state->underflow = ori_state->underflow; Assuming you're setting this from the interrupt handler, it's unsafe, you shouldn't do that. What are you using it for? > +static const struct drm_prop_enum_list vs_sync_mode_enum_list[] = { > + { VS_SINGLE_DC, "single dc mode" }, > + { VS_MULTI_DC_PRIMARY, "primary dc for multi dc mode" }, > + { VS_MULTI_DC_SECONDARY, "secondary dc for multi dc mode" }, > +}; Custom driver properties are a no-go: https://docs.kernel.org/gpu/drm-kms.html#requirements And https://docs.kernel.org/gpu/drm-uapi.html#open-source-userspace-requirements > +void vs_dc_enable(struct vs_dc *dc, struct drm_crtc *crtc) > +{ > + struct vs_crtc_state *crtc_state = to_vs_crtc_state(crtc->state); > + struct drm_display_mode *mode = &crtc->state->adjusted_mode; > + struct dc_hw_display display; Why are you rolling your own structure here, if it's exactly equivalent to what drm_display_mode and the crtc_state provide? > +void vs_dc_commit(struct vs_dc *dc) > +{ > + dc_hw_enable_shadow_register(&dc->hw, false); > + > + dc_hw_commit(&dc->hw); > + > + if (dc->first_frame) > + dc->first_frame = false; > + > + dc_hw_enable_shadow_register(&dc->hw, true); > +} It's not clear to me what you're trying to do here, does the hardware have latched registers that are only updated during vblank? > +static int dc_bind(struct device *dev, struct device *master, void *data) > +{ > + struct drm_device *drm_dev = data; > + struct vs_dc *dc = dev_get_drvdata(dev); > + struct device_node *port; > + struct vs_crtc *crtc; > + struct vs_dc_info *dc_info; > + struct vs_plane *plane; > + struct vs_plane_info *plane_info; > + int i, ret; > + u32 ctrc_mask = 0; > + > + if (!drm_dev || !dc) { > + dev_err(dev, "devices are not created.\n"); > + return -ENODEV; > + } > + > + ret = dc_init(dev); > + if (ret < 0) { > + drm_err(drm_dev, "Failed to initialize DC hardware.\n"); > + return ret; > + } > + > + port = of_get_child_by_name(dev->of_node, "port"); > + if (!port) { > + drm_err(drm_dev, "no port node found\n"); > + return -ENODEV; > + } > + of_node_put(port); > + > + dc_info = dc->hw.info; > + > + for (i = 0; i < dc_info->panel_num; i++) { > + crtc = vs_crtc_create(drm_dev, dc_info); > + if (!crtc) { > + drm_err(drm_dev, "Failed to create CRTC.\n"); > + ret = -ENOMEM; > + return ret; > + } > + > + crtc->base.port = port; > + crtc->dev = dev; > + dc->crtc[i] = crtc; > + ctrc_mask |= drm_crtc_mask(&crtc->base); > + } > + > + for (i = 0; i < dc_info->plane_num; i++) { > + plane_info = (struct vs_plane_info *)&dc_info->planes[i]; > + > + if (!strcmp(plane_info->name, "Primary") || !strcmp(plane_info->name, "Cursor")) { > + plane = vs_plane_create(drm_dev, plane_info, dc_info->layer_num, > + drm_crtc_mask(&dc->crtc[0]->base)); > + } else if (!strcmp(plane_info->name, "Primary_1") || > + !strcmp(plane_info->name, "Cursor_1")) { Please use an enum and an id there. > +static int vs_plane_atomic_set_property(struct drm_plane *plane, > + struct drm_plane_state *state, > + struct drm_property *property, > + uint64_t val) > +{ > + struct drm_device *dev = plane->dev; > + struct vs_plane *vs_plane = to_vs_plane(plane); > + struct vs_plane_state *vs_plane_state = to_vs_plane_state(state); > + int ret = 0; > + > + if (property == vs_plane->degamma_mode) { > + if (vs_plane_state->degamma != val) { > + vs_plane_state->degamma = val; > + vs_plane_state->degamma_changed = true; > + } else { > + vs_plane_state->degamma_changed = false; > + } > + } else if (property == vs_plane->watermark_prop) { > + ret = _vs_plane_set_property_blob_from_id(dev, > + &vs_plane_state->watermark, > + val, > + sizeof(struct drm_vs_watermark)); > + return ret; > + } else if (property == vs_plane->color_mgmt_prop) { > + ret = _vs_plane_set_property_blob_from_id(dev, > + &vs_plane_state->color_mgmt, > + val, > + sizeof(struct drm_vs_color_mgmt)); > + return ret; > + } else if (property == vs_plane->roi_prop) { > + ret = _vs_plane_set_property_blob_from_id(dev, > + &vs_plane_state->roi, > + val, > + sizeof(struct drm_vs_roi)); > + return ret; > + } else { > + return -EINVAL; > + } > + > + return 0; > +} Same story than above for properties Honestly, that driver is pretty massive, and you should be simplifying it a lot of you want the initial contribution to be as smooth as possible. Things like all the tiling formats, the underflowing handling, all those properties, etc can (and should) be added in a second step once the foundations are in. Maxime --gne3qq4wbplxfl5j Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCZTkexwAKCRDj7w1vZxhR xVc2AQDt1GUu/XJrbLjzUqX2QBMsMrPFuT0gkDUTQBP87bT4TQD/fxbMJ+PO/Guy dWrnZFx2MNMwz2yBjRVOwStrbI0sWQo= =dDhB -----END PGP SIGNATURE----- --gne3qq4wbplxfl5j--