[PATCH 062/156] drm/nouveau/nvif: rework driver "new client" api

Ben Skeggs bskeggs at nvidia.com
Tue Apr 16 23:38:28 UTC 2024


- transition from "ioctl" interface

Signed-off-by: Ben Skeggs <bskeggs at nvidia.com>
---
 drivers/gpu/drm/nouveau/include/nvif/class.h  |  2 -
 drivers/gpu/drm/nouveau/include/nvif/client.h |  3 +-
 .../gpu/drm/nouveau/include/nvif/driverif.h   |  6 +++
 drivers/gpu/drm/nouveau/include/nvif/if0000.h | 11 -----
 .../drm/nouveau/include/nvkm/core/object.h    | 10 ++++
 drivers/gpu/drm/nouveau/nouveau_drm.c         | 28 +----------
 drivers/gpu/drm/nouveau/nvif/client.c         | 26 +++--------
 drivers/gpu/drm/nouveau/nvkm/core/client.c    | 46 ++++++-------------
 drivers/gpu/drm/nouveau/nvkm/core/object.c    | 33 +++++++++++++
 9 files changed, 72 insertions(+), 93 deletions(-)
 delete mode 100644 drivers/gpu/drm/nouveau/include/nvif/if0000.h

diff --git a/drivers/gpu/drm/nouveau/include/nvif/class.h b/drivers/gpu/drm/nouveau/include/nvif/class.h
index 824e052dcc25..b6bba7231750 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/class.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/class.h
@@ -3,8 +3,6 @@
 #define __NVIF_CLASS_H__
 
 /* these class numbers are made up by us, and not nvidia-assigned */
-#define NVIF_CLASS_CLIENT                            /* if0000.h */ -0x00000000
-
 #define NVIF_CLASS_CONTROL                           /* if0001.h */ -0x00000001
 
 #define NVIF_CLASS_SW_NV04                           /* if0004.h */ -0x00000004
diff --git a/drivers/gpu/drm/nouveau/include/nvif/client.h b/drivers/gpu/drm/nouveau/include/nvif/client.h
index f8e4e25d6e86..1659e989df52 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/client.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/client.h
@@ -12,8 +12,7 @@ struct nvif_client {
 	const struct nvif_driver *driver;
 };
 
-int  nvif_client_ctor(struct nvif_client *parent, const char *name, u64 device,
-		      struct nvif_client *);
+int  nvif_client_ctor(struct nvif_client *parent, const char *name, struct nvif_client *);
 void nvif_client_dtor(struct nvif_client *);
 int  nvif_client_suspend(struct nvif_client *);
 int  nvif_client_resume(struct nvif_client *);
diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
index 655bd389044d..a6f95c8475b1 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
@@ -14,5 +14,11 @@ struct nvif_driver {
 
 struct nvif_client_impl {
 	void (*del)(struct nvif_client_priv *);
+
+	struct {
+		int (*new)(struct nvif_client_priv *parent,
+			   const struct nvif_client_impl **, struct nvif_client_priv **,
+			   u64 handle);
+	} client;
 };
 #endif
diff --git a/drivers/gpu/drm/nouveau/include/nvif/if0000.h b/drivers/gpu/drm/nouveau/include/nvif/if0000.h
deleted file mode 100644
index 4b31496b37e1..000000000000
--- a/drivers/gpu/drm/nouveau/include/nvif/if0000.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-#ifndef __NVIF_IF0000_H__
-#define __NVIF_IF0000_H__
-
-struct nvif_client_v0 {
-	__u8  version;
-	__u8  pad01[7];
-	__u64 device;
-	char  name[32];
-};
-#endif
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/object.h b/drivers/gpu/drm/nouveau/include/nvkm/core/object.h
index 10107ef3ca49..9ab163d9a4d0 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/core/object.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/core/object.h
@@ -58,6 +58,16 @@ int nvkm_object_unmap(struct nvkm_object *);
 int nvkm_object_bind(struct nvkm_object *, struct nvkm_gpuobj *, int align,
 		     struct nvkm_gpuobj **);
 
+void nvkm_object_link_(struct nvif_client_priv *, struct nvkm_object *parent, struct nvkm_object *);
+int nvkm_object_link_rb(struct nvif_client_priv *, struct nvkm_object *parent, u64 handle,
+		        struct nvkm_object *);
+
+static inline void
+nvkm_object_link(struct nvkm_object *parent, struct nvkm_object *object)
+{
+	nvkm_object_link_(parent->client, parent, object);
+}
+
 bool nvkm_object_insert(struct nvkm_object *);
 void nvkm_object_remove(struct nvkm_object *);
 struct nvkm_object *nvkm_object_search(struct nvkm_client *, u64 object,
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index d793afd929c9..5e4c706bf150 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -113,30 +113,6 @@ static struct drm_driver driver_stub;
 static struct drm_driver driver_pci;
 static struct drm_driver driver_platform;
 
-static u64
-nouveau_pci_name(struct pci_dev *pdev)
-{
-	u64 name = (u64)pci_domain_nr(pdev->bus) << 32;
-	name |= pdev->bus->number << 16;
-	name |= PCI_SLOT(pdev->devfn) << 8;
-	return name | PCI_FUNC(pdev->devfn);
-}
-
-static u64
-nouveau_platform_name(struct platform_device *platformdev)
-{
-	return platformdev->id;
-}
-
-static u64
-nouveau_name(struct drm_device *dev)
-{
-	if (dev_is_pci(dev->dev))
-		return nouveau_pci_name(to_pci_dev(dev->dev));
-	else
-		return nouveau_platform_name(to_platform_device(dev->dev));
-}
-
 static inline bool
 nouveau_cli_work_ready(struct dma_fence *fence)
 {
@@ -234,7 +210,6 @@ nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
 		{ NVIF_CLASS_VMM_NV04 , -1 },
 		{}
 	};
-	u64 device = nouveau_name(drm->dev);
 	int ret;
 
 	snprintf(cli->name, sizeof(cli->name), "%s", sname);
@@ -246,8 +221,7 @@ nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
 	mutex_init(&cli->lock);
 
 	mutex_lock(&drm->client_mutex);
-	ret = nvif_client_ctor(&drm->_client, cli->name, device,
-			       &cli->base);
+	ret = nvif_client_ctor(&drm->_client, cli->name, &cli->base);
 	mutex_unlock(&drm->client_mutex);
 	if (ret) {
 		NV_PRINTK(err, cli, "Client allocation failed: %d\n", ret);
diff --git a/drivers/gpu/drm/nouveau/nvif/client.c b/drivers/gpu/drm/nouveau/nvif/client.c
index 4c4a856ab861..0211fa76431f 100644
--- a/drivers/gpu/drm/nouveau/nvif/client.c
+++ b/drivers/gpu/drm/nouveau/nvif/client.c
@@ -26,9 +26,7 @@
 #include <nvif/driver.h>
 #include <nvif/driverif.h>
 #include <nvif/ioctl.h>
-
-#include <nvif/class.h>
-#include <nvif/if0000.h>
+#include <nvif/printf.h>
 
 int
 nvif_client_suspend(struct nvif_client *client)
@@ -45,12 +43,6 @@ nvif_client_resume(struct nvif_client *client)
 void
 nvif_client_dtor(struct nvif_client *client)
 {
-	if (!client->impl) {
-		nvif_object_dtor(&client->object);
-		client->driver = NULL;
-		return;
-	}
-
 	client->impl->del(client->priv);
 	client->impl = NULL;
 	client->object.client = NULL;
@@ -58,22 +50,18 @@ nvif_client_dtor(struct nvif_client *client)
 }
 
 int
-nvif_client_ctor(struct nvif_client *parent, const char *name, u64 device,
-		 struct nvif_client *client)
+nvif_client_ctor(struct nvif_client *parent, const char *name, struct nvif_client *client)
 {
-	struct nvif_client_v0 args = { .device = device };
 	int ret;
 
-	strscpy_pad(args.name, name, sizeof(args.name));
-	ret = nvif_object_ctor(parent != client ? &parent->object : NULL,
-			       name ? name : "nvifClient", 0,
-			       NVIF_CLASS_CLIENT, &args, sizeof(args),
-			       &client->object);
+	ret = parent->impl->client.new(parent->priv, &client->impl, &client->priv,
+				       nvif_handle(&client->object));
+	NVIF_ERRON(ret, &parent->object, "[NEW client]");
 	if (ret)
 		return ret;
 
-	client->object.client = client;
-	client->object.handle = ~0;
+	nvif_object_ctor(&parent->object, name ?: "nvifClient", 0, 0, &client->object);
+	client->object.priv = client->priv;
 	client->driver = parent->driver;
 	return 0;
 }
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/client.c b/drivers/gpu/drm/nouveau/nvkm/core/client.c
index fa8d0795805e..b57cc0d5a148 100644
--- a/drivers/gpu/drm/nouveau/nvkm/core/client.c
+++ b/drivers/gpu/drm/nouveau/nvkm/core/client.c
@@ -28,43 +28,25 @@
 #include <nvif/class.h>
 #include <nvif/driverif.h>
 #include <nvif/event.h>
-#include <nvif/if0000.h>
 #include <nvif/unpack.h>
 
 static int
-nvkm_uclient_new(const struct nvkm_oclass *oclass, void *argv, u32 argc,
-		 struct nvkm_object **pobject)
+nvkm_client_new_client(struct nvif_client_priv *parent,
+		       const struct nvif_client_impl **pimpl, struct nvif_client_priv **ppriv,
+		       u64 handle)
 {
-	union {
-		struct nvif_client_v0 v0;
-	} *args = argv;
 	struct nvkm_client *client;
-	int ret = -ENOSYS;
-
-	if (!(ret = nvif_unpack(ret, &argv, &argc, args->v0, 0, 0, false))){
-		args->v0.name[sizeof(args->v0.name) - 1] = 0;
-		ret = nvkm_client_new(args->v0.name, oclass->client->device,
-				      oclass->client->event, &client);
-		if (ret)
-			return ret;
-	} else
+	int ret;
+
+	ret = nvkm_client_new("client", parent->device, parent->event, &client);
+	if (ret)
 		return ret;
 
-	client->object.client = oclass->client;
-	client->object.handle = oclass->handle;
-	client->object.object = oclass->object;
-	client->debug = oclass->client->debug;
-	*pobject = &client->object;
-	return 0;
-}
+	*pimpl = &nvkm_client_impl;
+	*ppriv = client;
 
-static const struct nvkm_sclass
-nvkm_uclient_sclass = {
-	.oclass = NVIF_CLASS_CLIENT,
-	.minver = 0,
-	.maxver = 0,
-	.ctor = nvkm_uclient_new,
-};
+	return nvkm_object_link_rb(parent, &parent->object, handle, &client->object);
+}
 
 static void
 nvkm_client_del(struct nvif_client_priv *client)
@@ -77,6 +59,7 @@ nvkm_client_del(struct nvif_client_priv *client)
 const struct nvif_client_impl
 nvkm_client_impl = {
 	.del = nvkm_client_del,
+	.client.new = nvkm_client_new_client,
 };
 
 static int
@@ -93,8 +76,7 @@ nvkm_client_child_get(struct nvkm_object *object, int index,
 	const struct nvkm_sclass *sclass;
 
 	switch (index) {
-	case 0: sclass = &nvkm_uclient_sclass; break;
-	case 1: sclass = &nvkm_udevice_sclass; break;
+	case 0: sclass = &nvkm_udevice_sclass; break;
 	default:
 		return -EINVAL;
 	}
@@ -120,7 +102,7 @@ int
 nvkm_client_new(const char *name, struct nvkm_device *device, int (*event)(u64, void *, u32),
 		struct nvif_client_priv **pclient)
 {
-	struct nvkm_oclass oclass = { .base = nvkm_uclient_sclass };
+	struct nvkm_oclass oclass = {};
 	struct nvkm_client *client;
 
 	if (!(client = *pclient = kzalloc(sizeof(*client), GFP_KERNEL)))
diff --git a/drivers/gpu/drm/nouveau/nvkm/core/object.c b/drivers/gpu/drm/nouveau/nvkm/core/object.c
index 390c265cf8af..d34a8ee1a0ae 100644
--- a/drivers/gpu/drm/nouveau/nvkm/core/object.c
+++ b/drivers/gpu/drm/nouveau/nvkm/core/object.c
@@ -247,10 +247,15 @@ void
 nvkm_object_del(struct nvkm_object **pobject)
 {
 	struct nvkm_object *object = *pobject;
+
 	if (object && !WARN_ON(!object->func)) {
 		*pobject = nvkm_object_dtor(object);
 		nvkm_object_remove(object);
+
+		spin_lock_irq(&object->client->obj_lock);
 		list_del(&object->head);
+		spin_unlock_irq(&object->client->obj_lock);
+
 		kfree(*pobject);
 		*pobject = NULL;
 	}
@@ -298,3 +303,31 @@ nvkm_object_new(const struct nvkm_oclass *oclass, void *data, u32 size,
 		oclass->base.func ? oclass->base.func : &nvkm_object_func;
 	return nvkm_object_new_(func, oclass, data, size, pobject);
 }
+
+void
+nvkm_object_link_(struct nvif_client_priv *client, struct nvkm_object *parent,
+		  struct nvkm_object *object)
+{
+	object->client = client;
+
+	spin_lock_irq(&client->obj_lock);
+	list_add_tail(&object->head, &parent->tree);
+	spin_unlock_irq(&client->obj_lock);
+}
+
+int
+nvkm_object_link_rb(struct nvif_client_priv *client, struct nvkm_object *parent, u64 handle,
+		    struct nvkm_object *object)
+{
+	nvkm_object_link_(client, parent, object);
+
+	object->object = handle;
+
+	if (!nvkm_object_insert(object)) {
+		nvkm_object_fini(object, false);
+		nvkm_object_del(&object);
+		return -EEXIST;
+	}
+
+	return 0;
+}
-- 
2.41.0



More information about the Nouveau mailing list