From nobody Thu Dec 18 08:36:23 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 11758C10DC2 for ; Wed, 29 Nov 2023 22:03:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234722AbjK2WC7 (ORCPT ); Wed, 29 Nov 2023 17:02:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52002 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234796AbjK2WCu (ORCPT ); Wed, 29 Nov 2023 17:02:50 -0500 Received: from out-186.mta0.migadu.com (out-186.mta0.migadu.com [91.218.175.186]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6471010FA for ; Wed, 29 Nov 2023 14:02:54 -0800 (PST) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1701295372; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CjRthmPILVriJhUM7AXvpo2tC/O/x2FXTC5+lL0juis=; b=mEmvbaOQo71fCMzVMHMCevUj8E1PQLEfM9CxPla107Qen6uGwXqukGicjBBGrIJk63031v 7FYZOscvzeXRZ1KGaCxx2zGU9k7W2ptm4WqzwM+ivkZx9sU9ff6ajjI2ENYh1p5JCh34vy DWFHp3mt9RhFTPua9xPSxl8JiIeJ578= From: Sui Jingfeng To: Lucas Stach Cc: Christian Gmeiner , dri-devel@lists.freedesktop.org, etnaviv@lists.freedesktop.org, linux-kernel@vger.kernel.org, Sui Jingfeng Subject: [etnaviv-next v12 6/8] drm/etnaviv: Embed struct drm_device in struct etnaviv_drm_private Date: Thu, 30 Nov 2023 06:02:29 +0800 Message-Id: <20231129220231.12763-7-sui.jingfeng@linux.dev> In-Reply-To: <20231129220231.12763-1-sui.jingfeng@linux.dev> References: <20231129220231.12763-1-sui.jingfeng@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Sui Jingfeng The instance of struct drm_device and struct etnaviv_drm_private are intended to be shared by all GPU cores. Embedding struct drm_device into struct etnaviv_drm_private allow us to allocate storage for them togather. And use container_of() to retrieve pointer for the containing structure. Signed-off-by: Sui Jingfeng --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 73 +++++++++----------- drivers/gpu/drm/etnaviv/etnaviv_drv.h | 8 ++- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 6 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 2 +- drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 6 +- drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 4 +- 6 files changed, 47 insertions(+), 52 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnavi= v/etnaviv_drv.c index 883352aded32..4a7a451237d5 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -45,14 +45,9 @@ static struct device_node *etnaviv_of_first_available_no= de(void) return NULL; } =20 -static struct etnaviv_drm_private *etnaviv_alloc_private(struct device *de= v) +static int etnaviv_private_init(struct device *dev, + struct etnaviv_drm_private *priv) { - struct etnaviv_drm_private *priv; - - priv =3D kzalloc(sizeof(*priv), GFP_KERNEL); - if (!priv) - return ERR_PTR(-ENOMEM); - xa_init_flags(&priv->active_contexts, XA_FLAGS_ALLOC); =20 mutex_init(&priv->gem_lock); @@ -62,17 +57,16 @@ static struct etnaviv_drm_private *etnaviv_alloc_privat= e(struct device *dev) =20 priv->cmdbuf_suballoc =3D etnaviv_cmdbuf_suballoc_new(dev); if (IS_ERR(priv->cmdbuf_suballoc)) { - kfree(priv); dev_err(dev, "Failed to create cmdbuf suballocator\n"); - return ERR_PTR(-ENOMEM); + return -ENOMEM; } =20 priv->cached_coherent =3D dev_is_dma_coherent(dev); =20 - return priv; + return 0; } =20 -static void etnaviv_free_private(struct etnaviv_drm_private *priv) +static void etnaviv_private_fini(struct etnaviv_drm_private *priv) { if (!priv) return; @@ -80,13 +74,11 @@ static void etnaviv_free_private(struct etnaviv_drm_pri= vate *priv) etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc); =20 xa_destroy(&priv->active_contexts); - - kfree(priv); } =20 static void load_gpu(struct drm_device *dev) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); unsigned int i; =20 for (i =3D 0; i < ETNA_MAX_PIPES; i++) { @@ -104,7 +96,7 @@ static void load_gpu(struct drm_device *dev) =20 static int etnaviv_open(struct drm_device *dev, struct drm_file *file) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct etnaviv_file_private *ctx; int ret, i; =20 @@ -147,7 +139,7 @@ static int etnaviv_open(struct drm_device *dev, struct = drm_file *file) =20 static void etnaviv_postclose(struct drm_device *dev, struct drm_file *fil= e) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct etnaviv_file_private *ctx =3D file->driver_priv; unsigned int i; =20 @@ -172,7 +164,7 @@ static void etnaviv_postclose(struct drm_device *dev, s= truct drm_file *file) #ifdef CONFIG_DEBUG_FS static int etnaviv_gem_show(struct drm_device *dev, struct seq_file *m) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); =20 etnaviv_gem_describe_objects(priv, m); =20 @@ -266,7 +258,7 @@ static int show_each_gpu(struct seq_file *m, void *arg) { struct drm_info_node *node =3D (struct drm_info_node *) m->private; struct drm_device *dev =3D node->minor->dev; - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct etnaviv_gpu *gpu; int (*show)(struct etnaviv_gpu *gpu, struct seq_file *m) =3D node->info_ent->data; @@ -309,7 +301,7 @@ static void etnaviv_debugfs_init(struct drm_minor *mino= r) static int etnaviv_ioctl_get_param(struct drm_device *dev, void *data, struct drm_file *file) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct drm_etnaviv_param *args =3D data; struct etnaviv_gpu *gpu; =20 @@ -402,7 +394,7 @@ static int etnaviv_ioctl_wait_fence(struct drm_device *= dev, void *data, struct drm_file *file) { struct drm_etnaviv_wait_fence *args =3D data; - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct drm_etnaviv_timespec *timeout =3D &args->timeout; struct etnaviv_gpu *gpu; =20 @@ -450,7 +442,7 @@ static int etnaviv_ioctl_gem_userptr(struct drm_device = *dev, void *data, static int etnaviv_ioctl_gem_wait(struct drm_device *dev, void *data, struct drm_file *file) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct drm_etnaviv_gem_wait *args =3D data; struct drm_etnaviv_timespec *timeout =3D &args->timeout; struct drm_gem_object *obj; @@ -484,7 +476,7 @@ static int etnaviv_ioctl_gem_wait(struct drm_device *de= v, void *data, static int etnaviv_ioctl_pm_query_dom(struct drm_device *dev, void *data, struct drm_file *file) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct drm_etnaviv_pm_domain *args =3D data; struct etnaviv_gpu *gpu; =20 @@ -501,7 +493,7 @@ static int etnaviv_ioctl_pm_query_dom(struct drm_device= *dev, void *data, static int etnaviv_ioctl_pm_query_sig(struct drm_device *dev, void *data, struct drm_file *file) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct drm_etnaviv_pm_signal *args =3D data; struct etnaviv_gpu *gpu; =20 @@ -557,20 +549,18 @@ int etnaviv_drm_bind(struct device *dev, bool compone= nt) struct drm_device *drm; int ret; =20 - drm =3D drm_dev_alloc(&etnaviv_drm_driver, dev); - if (IS_ERR(drm)) - return PTR_ERR(drm); + priv =3D devm_drm_dev_alloc(dev, &etnaviv_drm_driver, + struct etnaviv_drm_private, drm); =20 - priv =3D etnaviv_alloc_private(dev); - if (IS_ERR(priv)) { - ret =3D PTR_ERR(priv); - goto out_put; - } + if (IS_ERR(priv)) + return PTR_ERR(priv); + + etnaviv_private_init(dev, priv); =20 - priv->drm =3D drm; - drm->dev_private =3D priv; etna_drm_priv_ptr =3D priv; =20 + drm =3D &priv->drm; + dma_set_max_seg_size(dev, SZ_2G); =20 if (component) @@ -595,9 +585,7 @@ int etnaviv_drm_bind(struct device *dev, bool component) else etnaviv_gpu_unbind(dev, NULL, drm); out_free_priv: - etnaviv_free_private(priv); -out_put: - drm_dev_put(drm); + etnaviv_private_fini(priv); =20 return ret; } @@ -605,7 +593,12 @@ int etnaviv_drm_bind(struct device *dev, bool componen= t) void etnaviv_drm_unbind(struct device *dev, bool component) { struct etnaviv_drm_private *priv =3D etna_drm_priv_ptr; - struct drm_device *drm =3D priv->drm; + struct drm_device *drm; + + if (!priv) + return; + + drm =3D &priv->drm; =20 drm_dev_unregister(drm); =20 @@ -614,11 +607,7 @@ void etnaviv_drm_unbind(struct device *dev, bool compo= nent) else etnaviv_gpu_unbind(dev, NULL, drm); =20 - etnaviv_free_private(priv); - - drm->dev_private =3D NULL; - - drm_dev_put(drm); + etnaviv_private_fini(priv); } =20 /* diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnavi= v/etnaviv_drv.h index acc2e77ad2db..6c9d934cbcbd 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h @@ -35,7 +35,7 @@ struct etnaviv_file_private { }; =20 struct etnaviv_drm_private { - struct drm_device *drm; + struct drm_device drm; int num_gpus; struct etnaviv_gpu *gpu[ETNA_MAX_PIPES]; gfp_t shm_gfp_mask; @@ -60,6 +60,12 @@ struct etnaviv_drm_private { struct list_head gem_list; }; =20 +static inline struct etnaviv_drm_private * +to_etnaviv_priv(struct drm_device *ddev) +{ + return container_of(ddev, struct etnaviv_drm_private, drm); +} + int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, struct drm_file *file); =20 diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnavi= v/etnaviv_gem.c index a72ca0a6883e..eed98bb9e446 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c @@ -498,7 +498,7 @@ static const struct etnaviv_gem_ops etnaviv_gem_shmem_o= ps =3D { void etnaviv_gem_free_object(struct drm_gem_object *obj) { struct etnaviv_gem_object *etnaviv_obj =3D to_etnaviv_bo(obj); - struct etnaviv_drm_private *priv =3D obj->dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(obj->dev); struct etnaviv_vram_mapping *mapping, *tmp; =20 /* object should not be active */ @@ -529,7 +529,7 @@ void etnaviv_gem_free_object(struct drm_gem_object *obj) =20 void etnaviv_gem_obj_add(struct drm_device *dev, struct drm_gem_object *ob= j) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct etnaviv_gem_object *etnaviv_obj =3D to_etnaviv_bo(obj); =20 mutex_lock(&priv->gem_lock); @@ -596,7 +596,7 @@ static int etnaviv_gem_new_impl(struct drm_device *dev,= u32 flags, int etnaviv_gem_new_handle(struct drm_device *dev, struct drm_file *file, u32 size, u32 flags, u32 *handle) { - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct drm_gem_object *obj =3D NULL; int ret; =20 diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm= /etnaviv/etnaviv_gem_submit.c index 3d0f8d182506..6b40a39fb8cd 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c @@ -413,7 +413,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, vo= id *data, struct drm_file *file) { struct etnaviv_file_private *ctx =3D file->driver_priv; - struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(dev); struct drm_etnaviv_gem_submit *args =3D data; struct drm_etnaviv_gem_submit_reloc *relocs; struct drm_etnaviv_gem_submit_pmr *pmrs; diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnavi= v/etnaviv_gpu.c index c5a6d5809e2b..070650ac38ed 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c @@ -38,7 +38,7 @@ static const struct platform_device_id gpu_ids[] =3D { =20 int etnaviv_gpu_get_param(struct etnaviv_gpu *gpu, u32 param, u64 *value) { - struct etnaviv_drm_private *priv =3D gpu->drm->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(gpu->drm); =20 switch (param) { case ETNAVIV_PARAM_GPU_MODEL: @@ -785,7 +785,7 @@ static void etnaviv_gpu_hw_init(struct etnaviv_gpu *gpu) =20 int etnaviv_gpu_init(struct etnaviv_gpu *gpu) { - struct etnaviv_drm_private *priv =3D gpu->drm->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(gpu->drm); dma_addr_t cmdbuf_paddr; int ret, i; =20 @@ -1774,7 +1774,7 @@ static const struct thermal_cooling_device_ops coolin= g_ops =3D { int etnaviv_gpu_bind(struct device *dev, struct device *master, void *data) { struct drm_device *drm =3D data; - struct etnaviv_drm_private *priv =3D drm->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(drm); struct etnaviv_gpu *gpu =3D dev_get_drvdata(dev); int ret; =20 diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnavi= v/etnaviv_mmu.c index 1661d589bf3e..c38272868328 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c @@ -490,7 +490,7 @@ void etnaviv_iommu_dump(struct etnaviv_iommu_context *c= ontext, void *buf) int etnaviv_iommu_global_init(struct etnaviv_gpu *gpu) { enum etnaviv_iommu_version version =3D ETNAVIV_IOMMU_V1; - struct etnaviv_drm_private *priv =3D gpu->drm->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(gpu->drm); struct etnaviv_iommu_global *global; struct device *dev =3D gpu->drm->dev; =20 @@ -550,7 +550,7 @@ int etnaviv_iommu_global_init(struct etnaviv_gpu *gpu) =20 void etnaviv_iommu_global_fini(struct etnaviv_gpu *gpu) { - struct etnaviv_drm_private *priv =3D gpu->drm->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(gpu->drm); struct etnaviv_iommu_global *global =3D priv->mmu_global; =20 if (!global) --=20 2.34.1