From patchwork Wed Mar 29 20:51:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sui Jingfeng <15330273260@189.cn> X-Patchwork-Id: 76818 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp691460vqo; Wed, 29 Mar 2023 14:15:57 -0700 (PDT) X-Google-Smtp-Source: AK7set8qvX3AFxKn+AxM2lBQreKqVtibYmlov9munWjfjW4JybYtsYRhyV6h/Ck6sX+jNMiYy/42 X-Received: by 2002:a05:6a20:c28a:b0:c7:770a:557f with SMTP id bs10-20020a056a20c28a00b000c7770a557fmr16762522pzb.50.1680124556784; Wed, 29 Mar 2023 14:15:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680124556; cv=none; d=google.com; s=arc-20160816; b=bJM2Rb2TyOWirASiLUXDAxMXa8JVVfzI6twXXqR91tpMfs5Q3kowvhvFmeTUxsYKKk hvvKamyRk9PNV6UwnQLCxh6EXBKqRBAg/ygVUvV2iSdE9wtOf+HzhlWbZO1OTMwEjk6f R0wEeiRDt24qwQ5SNG7QahEfD82av1o4fN87SZn0cH/xlQkvmgnPSTOnGIgviikRqxGf ifPlnvEiXomrxZV4049+cAP1CLidMtqsuRACDdg/IAmGPkYGhP8W1BNVLsvO/UtbsAlT MQtwte0NFj/Seu+xOTnW95vyJ012aM42FiR6+zvvNiILJHO20YFTFK3+XfsILx1QlFtR djdw== 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:sender :hmm_source_type:hmm_attache_num:hmm_source_ip; bh=MxT0/nLkqFx2Za4zRQ483NpjHunl3bE/LM5EqR1WCw0=; b=GPJXmSGSVsVNlo72Ay6MaH883Fvt9so2zRV/vqI5+42wG8X+1Sjr0dQ6eCW8LXX5mp XTuZapQsggF24fgvc1FOE7gqWqagZk8Y5tX6ltOcyr0U9JmHwSra3cdmxhnaXIJ4W5JE rByzEgLPo1Ud65/edX6iEPr2jkJ0UDKYBd/Oq41QKrvO0WSk6MxWgo3cozayyjuNtgae enuMvbQAIX0Nzu1f+FS7M2AeVIrLifpek1Cz4gusMMJ2dNFISQjmVBM3hd/WFAalivo7 tLOnkbM//n0Q8oYg0brpC32zsR9pkYRjZZZ9axZRcZjvngAQ94Ubxg98XPD/wayGXNcJ C4lQ== 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 Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 38-20020a631766000000b005030a59a818si30827527pgx.402.2023.03.29.14.15.42; Wed, 29 Mar 2023 14:15:56 -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 S230018AbjC2UwH (ORCPT + 99 others); Wed, 29 Mar 2023 16:52:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229574AbjC2Uvq (ORCPT ); Wed, 29 Mar 2023 16:51:46 -0400 Received: from 189.cn (ptr.189.cn [183.61.185.104]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 550C75264 for ; Wed, 29 Mar 2023 13:51:45 -0700 (PDT) HMM_SOURCE_IP: 10.64.8.43:36106.2084148567 HMM_ATTACHE_NUM: 0000 HMM_SOURCE_TYPE: SMTP Received: from clientip-114.242.206.180 (unknown [10.64.8.43]) by 189.cn (HERMES) with SMTP id ACC9F1002C5; Thu, 30 Mar 2023 04:51:44 +0800 (CST) Received: from ([114.242.206.180]) by gateway-151646-dep-7b48884fd-tj646 with ESMTP id c1edc99e9a6b4656b719d8890ec08287 for l.stach@pengutronix.de; Thu, 30 Mar 2023 04:51:44 CST X-Transaction-ID: c1edc99e9a6b4656b719d8890ec08287 X-Real-From: 15330273260@189.cn X-Receive-IP: 114.242.206.180 X-MEDUSA-Status: 0 Sender: 15330273260@189.cn From: Sui Jingfeng <15330273260@189.cn> To: Lucas Stach , Russell King , Christian Gmeiner , David Airlie , Daniel Vetter , Li Yi Cc: linux-kernel@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Sui Jingfeng Subject: [PATCH v3 4/6] drm/etnaviv: add helpers for private data construction and destruction Date: Thu, 30 Mar 2023 04:51:27 +0800 Message-Id: <20230329205129.1513734-5-15330273260@189.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230329205129.1513734-1-15330273260@189.cn> References: <20230329205129.1513734-1-15330273260@189.cn> MIME-Version: 1.0 X-Spam-Status: No, score=0.6 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FROM_LOCAL_DIGITS,FROM_LOCAL_HEX,SPF_HELO_PASS,SPF_PASS autolearn=no 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-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761738287048719973?= X-GMAIL-MSGID: =?utf-8?q?1761738287048719973?= From: Sui Jingfeng struct etnaviv_drm_private contains a lot of common resources that is shared by all GPUs, members of it is large enough. This patch introduce two dedicate functions which is for the construction and destruction of the instance of this structure. The idea is avoid to leak its members to outside, then the error handling code can be simplified. Signed-off-by: Sui Jingfeng --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 71 +++++++++++++++++---------- drivers/gpu/drm/etnaviv/etnaviv_drv.h | 4 ++ 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c index ce0537af80bd..93dfa4b1a38b 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -539,28 +539,17 @@ static const struct drm_driver etnaviv_drm_driver = { .minor = 3, }; -/* - * Platform driver: - */ -static int etnaviv_bind(struct device *dev) +static int etnaviv_alloc_private(struct device *dev, + struct etnaviv_drm_private **ppriv) { struct etnaviv_drm_private *priv; - struct drm_device *drm; int ret; - drm = drm_dev_alloc(&etnaviv_drm_driver, dev); - if (IS_ERR(drm)) - return PTR_ERR(drm); - priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { dev_err(dev, "failed to allocate private data\n"); - ret = -ENOMEM; - goto out_put; + return -ENOMEM; } - drm->dev_private = priv; - - dma_set_max_seg_size(dev, SZ_2G); xa_init_flags(&priv->active_contexts, XA_FLAGS_ALLOC); @@ -569,18 +558,55 @@ static int etnaviv_bind(struct device *dev) priv->num_gpus = 0; priv->shm_gfp_mask = GFP_HIGHUSER | __GFP_RETRY_MAYFAIL | __GFP_NOWARN; - priv->cmdbuf_suballoc = etnaviv_cmdbuf_suballoc_new(drm->dev); + priv->cmdbuf_suballoc = etnaviv_cmdbuf_suballoc_new(dev); if (IS_ERR(priv->cmdbuf_suballoc)) { - dev_err(drm->dev, "Failed to create cmdbuf suballocator\n"); + dev_err(dev, "Failed to create cmdbuf suballocator\n"); ret = PTR_ERR(priv->cmdbuf_suballoc); - goto out_free_priv; + kfree(priv); + return ret; } + *ppriv = priv; + + return 0; +} + +static void etnaviv_free_private(struct etnaviv_drm_private *priv) +{ + etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc); + + xa_destroy(&priv->active_contexts); + + kfree(priv); +} + +/* + * Platform driver: + */ +static int etnaviv_bind(struct device *dev) +{ + struct etnaviv_drm_private *priv; + struct drm_device *drm; + int ret; + + drm = drm_dev_alloc(&etnaviv_drm_driver, dev); + if (IS_ERR(drm)) + return PTR_ERR(drm); + + ret = etnaviv_alloc_private(dev, &priv); + if (ret) + goto out_put; + + priv->drm = drm; + drm->dev_private = priv; + + dma_set_max_seg_size(dev, SZ_2G); + dev_set_drvdata(dev, drm); ret = component_bind_all(dev, drm); if (ret < 0) - goto out_destroy_suballoc; + goto out_free_priv; load_gpu(drm); @@ -592,10 +618,8 @@ static int etnaviv_bind(struct device *dev) out_unbind: component_unbind_all(dev, drm); -out_destroy_suballoc: - etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc); out_free_priv: - kfree(priv); + etnaviv_free_private(priv); out_put: drm_dev_put(drm); @@ -611,12 +635,9 @@ static void etnaviv_unbind(struct device *dev) component_unbind_all(dev, drm); - etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc); - - xa_destroy(&priv->active_contexts); + etnaviv_free_private(priv); drm->dev_private = NULL; - kfree(priv); drm_dev_put(drm); } diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h index b3eb1662e90c..87fb52c03c5e 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h @@ -35,6 +35,7 @@ struct etnaviv_file_private { }; struct etnaviv_drm_private { + struct drm_device *drm; int num_gpus; struct etnaviv_gpu *gpu[ETNA_MAX_PIPES]; gfp_t shm_gfp_mask; @@ -45,6 +46,9 @@ struct etnaviv_drm_private { struct xarray active_contexts; u32 next_context_id; + /* hint for platform support cached coherent caching mode */ + bool has_cached_coherent; + /* list of GEM objects: */ struct mutex gem_lock; struct list_head gem_list;