From nobody Wed Feb 11 07:07:34 2026 Received: from out-180.mta0.migadu.com (out-180.mta0.migadu.com [91.218.175.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B5055029B for ; Sun, 19 May 2024 16:54:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716137697; cv=none; b=BcDSbyRJ0l9EbuARZzkOXn2Vh1UrNuK+zs/jhAd9HYbEhwqeS8swZ1nnK/VHkqGJ1nrh0neJj8bfemH9eA4shf4Yn335Kx8iQL61zmGKjVHJ08NoO9kNVOgNRaI+fMjlbcjoeqz78dTI0vGWiv8lYUMJQPjWvdQxs6aqfdol2zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716137697; c=relaxed/simple; bh=4goH//CjiHV5XvHFG0rMLcn1PCdbbTf2Udhx5eMCgrU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=fuH/zA4j9yRnxZ/MVUO5oKO/NiF+QCb1I9feg4e/xjS2CEuJTgdvme2kgOh9b8KWC8Lmf11QF6B36IxgvcRPn9e5q/MzeN+rKc59/TbV00hgh/Vnl0AbXrkhiYNQW9gw9/MNiHmOAqkBow9GynsnmHiT60XvXBwvdrxIIilB0aU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=FZ0O73IC; arc=none smtp.client-ip=91.218.175.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="FZ0O73IC" X-Envelope-To: l.stach@pengutronix.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1716137693; 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=KrrrUAMvLGSMTDh1k6FGYebCnWRlfKpEJuCQOvt4lG0=; b=FZ0O73ICs+SYi6csaJNZ9pvooDQrgDy5pufCjf6szXgt5YlAwdygBvDcA9INZJ+NMdJyxz gdSpP6Z4mD5/m4m2OQZuCUug/RlvpiudtGlH+vOsTKwwgE0pX79o5sV4OGvdWEOmniw5Xc jXKOzhL75nSQMn9nDLZAv7L+zgIwIss= X-Envelope-To: linux+etnaviv@armlinux.org.uk X-Envelope-To: christian.gmeiner@gmail.com X-Envelope-To: linux-kernel@vger.kernel.org X-Envelope-To: etnaviv@lists.freedesktop.org X-Envelope-To: dri-devel@lists.freedesktop.org X-Envelope-To: sui.jingfeng@linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Sui Jingfeng To: Lucas Stach Cc: Russell King , Christian Gmeiner , linux-kernel@vger.kernel.org, etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Sui Jingfeng Subject: [etnaviv-next v14 3/8] drm/etnaviv: Embed struct drm_device into struct etnaviv_drm_private Date: Mon, 20 May 2024 00:53:16 +0800 Message-Id: <20240519165321.2123356-4-sui.jingfeng@linux.dev> In-Reply-To: <20240519165321.2123356-1-sui.jingfeng@linux.dev> References: <20240519165321.2123356-1-sui.jingfeng@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Both the instance of struct drm_device and the instance of struct etnaviv_drm_private are intended to be shared by all GPU cores, both have only one instance created across drm/etnaviv driver. After embedded in, the whole structure can be allocated with devm_drm_dev_alloc(). And the DRM device created is automatically put on driver detach, so we don't need to call drm_dev_put() explicitly on driver leave. It's also eliminate the need to use the .dev_private member, which is deprecated according to the drm document. We can also use container_of() to retrieve pointer for the containing structure. Signed-off-by: Sui Jingfeng --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 65 ++++++++------------ drivers/gpu/drm/etnaviv/etnaviv_drv.h | 7 +++ 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, 40 insertions(+), 50 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnavi= v/etnaviv_drv.c index 22c78bc944c4..e3eb31ba9a2b 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -41,14 +41,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); @@ -58,15 +53,14 @@ 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 - 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; @@ -76,13 +70,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++) { @@ -100,7 +92,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 @@ -143,7 +135,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 @@ -168,7 +160,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 @@ -262,7 +254,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; @@ -305,7 +297,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 @@ -398,7 +390,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 @@ -446,7 +438,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; @@ -480,7 +472,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 @@ -497,7 +489,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 @@ -556,17 +548,14 @@ static int etnaviv_bind(struct device *dev) 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); + if (IS_ERR(priv)) + return PTR_ERR(priv); =20 - priv =3D etnaviv_alloc_private(dev); - if (IS_ERR(priv)) { - ret =3D PTR_ERR(priv); - goto out_put; - } + etnaviv_private_init(dev, priv); =20 - drm->dev_private =3D priv; + drm =3D &priv->drm; =20 dma_set_max_seg_size(dev, SZ_2G); =20 @@ -587,9 +576,7 @@ static int etnaviv_bind(struct device *dev) out_unbind: component_unbind_all(dev, drm); out_free_priv: - etnaviv_free_private(priv); -out_put: - drm_dev_put(drm); + etnaviv_private_fini(priv); =20 return ret; } @@ -597,17 +584,13 @@ static int etnaviv_bind(struct device *dev) static void etnaviv_unbind(struct device *dev) { struct drm_device *drm =3D dev_get_drvdata(dev); - struct etnaviv_drm_private *priv =3D drm->dev_private; + struct etnaviv_drm_private *priv =3D to_etnaviv_priv(drm); =20 drm_dev_unregister(drm); =20 component_unbind_all(dev, drm); =20 - etnaviv_free_private(priv); - - drm->dev_private =3D NULL; - - drm_dev_put(drm); + etnaviv_private_fini(priv); } =20 static const struct component_master_ops etnaviv_master_ops =3D { diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnavi= v/etnaviv_drv.h index b3eb1662e90c..1f9b50b5a6aa 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 { }; =20 struct etnaviv_drm_private { + struct drm_device drm; int num_gpus; struct etnaviv_gpu *gpu[ETNA_MAX_PIPES]; gfp_t shm_gfp_mask; @@ -50,6 +51,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 71a6d2b1c80f..aa95a5e98374 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c @@ -486,7 +486,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 */ @@ -517,7 +517,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); @@ -584,7 +584,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 e0c36f564fa6..02d7efdc82c0 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: @@ -789,7 +789,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 @@ -1779,7 +1779,7 @@ static int etnaviv_gpu_bind(struct device *dev, struc= t 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