- transition from "ioctl" interface

Signed-off-by: Ben Skeggs <bske...@nvidia.com>
---
 drivers/gpu/drm/nouveau/include/nvif/conn.h   |  6 ---
 .../gpu/drm/nouveau/include/nvif/driverif.h   |  3 ++
 drivers/gpu/drm/nouveau/nvif/conn.c           | 22 ++++----
 .../gpu/drm/nouveau/nvkm/engine/disp/uconn.c  | 50 ++++++++-----------
 4 files changed, 35 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/include/nvif/conn.h 
b/drivers/gpu/drm/nouveau/include/nvif/conn.h
index 0f0ca002fe47..40c6424d82bf 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/conn.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/conn.h
@@ -17,12 +17,6 @@ struct nvif_conn {
 int nvif_conn_ctor(struct nvif_disp *, const char *name, int id, struct 
nvif_conn *);
 void nvif_conn_dtor(struct nvif_conn *);
 
-static inline int
-nvif_conn_id(struct nvif_conn *conn)
-{
-       return conn->object.handle;
-}
-
 int nvif_conn_event_ctor(struct nvif_conn *, const char *name, 
nvif_event_func, u8 types,
                         struct nvif_event *);
 #endif
diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h 
b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
index fb741c7293f6..489f50d6ee00 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
@@ -238,6 +238,9 @@ struct nvif_conn_impl {
                NVIF_CONN_DP,
                NVIF_CONN_EDP,
        } type;
+
+       int (*event)(struct nvif_conn_priv *, u64 handle, u8 types,
+                    const struct nvif_event_impl **, struct nvif_event_priv 
**);
 };
 
 struct nvif_disp_impl {
diff --git a/drivers/gpu/drm/nouveau/nvif/conn.c 
b/drivers/gpu/drm/nouveau/nvif/conn.c
index 48927282a7ce..d4e9f0275d1e 100644
--- a/drivers/gpu/drm/nouveau/nvif/conn.c
+++ b/drivers/gpu/drm/nouveau/nvif/conn.c
@@ -23,25 +23,23 @@
 #include <nvif/disp.h>
 #include <nvif/printf.h>
 
-#include <nvif/if0011.h>
-
 int
 nvif_conn_event_ctor(struct nvif_conn *conn, const char *name, nvif_event_func 
func, u8 types,
                     struct nvif_event *event)
 {
-       struct {
-               struct nvif_event_v0 base;
-               struct nvif_conn_event_v0 conn;
-       } args;
        int ret;
 
-       args.conn.version = 0;
-       args.conn.types = types;
+       if (!conn->impl->event)
+               return -ENODEV;
 
-       ret = nvif_event_ctor_(&conn->object, name ?: "nvifConnHpd", 
nvif_conn_id(conn),
-                              func, true, &args.base, sizeof(args), false, 
event);
-       NVIF_DEBUG(&conn->object, "[NEW EVENT:HPD types:%02x]", types);
-       return ret;
+       ret = conn->impl->event(conn->priv, nvif_handle(&event->object), types,
+                               &event->impl, &event->priv);
+       NVIF_ERRON(ret, &conn->object, "[NEW EVENT:HPD types:%02x]", types);
+       if (ret)
+               return ret;
+
+       nvif_event_ctor(&conn->object, name ?: "nvifConnHpd", conn->id, func, 
event);
+       return 0;
 }
 
 void
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c
index 5f72db9276b8..9c7b83c99b80 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c
@@ -98,24 +98,15 @@ nvkm_connector_is_dp_dms(u8 type)
 }
 
 static int
-nvkm_uconn_uevent(struct nvkm_object *object, void *argv, u32 argc, struct 
nvkm_uevent *uevent)
+nvkm_uconn_event(struct nvif_conn_priv *uconn, u64 handle, u8 types,
+                const struct nvif_event_impl **pimpl, struct nvif_event_priv 
**ppriv)
 {
-       struct nvkm_conn *conn = container_of(object, struct nvif_conn_priv, 
object)->conn;
+       struct nvkm_conn *conn = uconn->conn;
        struct nvkm_disp *disp = conn->disp;
        struct nvkm_device *device = disp->engine.subdev.device;
        struct nvkm_outp *outp;
-       union nvif_conn_event_args *args = argv;
        u64 bits = 0;
 
-       if (!uevent) {
-               if (!disp->rm.client.gsp && conn->info.hpd == DCB_GPIO_UNUSED)
-                       return -ENOSYS;
-               return 0;
-       }
-
-       if (argc != sizeof(args->v0) || args->v0.version != 0)
-               return -ENOSYS;
-
        list_for_each_entry(outp, &conn->disp->outps, head) {
                if (outp->info.connector == conn->index)
                        break;
@@ -125,33 +116,34 @@ nvkm_uconn_uevent(struct nvkm_object *object, void *argv, 
u32 argc, struct nvkm_
                return -EINVAL;
 
        if (disp->rm.client.gsp) {
-               if (args->v0.types & NVIF_CONN_EVENT_V0_PLUG  ) bits |= 
NVKM_DPYID_PLUG;
-               if (args->v0.types & NVIF_CONN_EVENT_V0_UNPLUG) bits |= 
NVKM_DPYID_UNPLUG;
-               if (args->v0.types & NVIF_CONN_EVENT_V0_IRQ   ) bits |= 
NVKM_DPYID_IRQ;
+               if (types & NVIF_CONN_EVENT_V0_PLUG  ) bits |= NVKM_DPYID_PLUG;
+               if (types & NVIF_CONN_EVENT_V0_UNPLUG) bits |= 
NVKM_DPYID_UNPLUG;
+               if (types & NVIF_CONN_EVENT_V0_IRQ   ) bits |= NVKM_DPYID_IRQ;
 
-               return nvkm_uevent_add(uevent, &disp->rm.event, outp->index, 
bits,
-                                      nvkm_uconn_uevent_gsp);
+               return nvkm_uevent_new_(&uconn->object, handle, 
&disp->rm.event, true,
+                                       outp->index, bits, 
nvkm_uconn_uevent_gsp, pimpl, ppriv);
        }
 
        if (outp->dp.aux && !outp->info.location) {
-               if (args->v0.types & NVIF_CONN_EVENT_V0_PLUG  ) bits |= 
NVKM_I2C_PLUG;
-               if (args->v0.types & NVIF_CONN_EVENT_V0_UNPLUG) bits |= 
NVKM_I2C_UNPLUG;
-               if (args->v0.types & NVIF_CONN_EVENT_V0_IRQ   ) bits |= 
NVKM_I2C_IRQ;
+               if (types & NVIF_CONN_EVENT_V0_PLUG  ) bits |= NVKM_I2C_PLUG;
+               if (types & NVIF_CONN_EVENT_V0_UNPLUG) bits |= NVKM_I2C_UNPLUG;
+               if (types & NVIF_CONN_EVENT_V0_IRQ   ) bits |= NVKM_I2C_IRQ;
 
-               return nvkm_uevent_add(uevent, &device->i2c->event, 
outp->dp.aux->id, bits,
-                                      nvkm_uconn_uevent_aux);
+               return nvkm_uevent_new_(&uconn->object, handle, 
&device->i2c->event, true,
+                                       outp->dp.aux->id, bits, 
nvkm_uconn_uevent_aux,
+                                       pimpl, ppriv);
        }
 
-       if (args->v0.types & NVIF_CONN_EVENT_V0_PLUG  ) bits |= NVKM_GPIO_HI;
-       if (args->v0.types & NVIF_CONN_EVENT_V0_UNPLUG) bits |= NVKM_GPIO_LO;
-       if (args->v0.types & NVIF_CONN_EVENT_V0_IRQ) {
+       if (types & NVIF_CONN_EVENT_V0_PLUG  ) bits |= NVKM_GPIO_HI;
+       if (types & NVIF_CONN_EVENT_V0_UNPLUG) bits |= NVKM_GPIO_LO;
+       if (types & NVIF_CONN_EVENT_V0_IRQ) {
                /* TODO: support DP IRQ on ANX9805 and remove this hack. */
                if (!outp->info.location && 
!nvkm_connector_is_dp_dms(conn->info.type))
                        return -EINVAL;
        }
 
-       return nvkm_uevent_add(uevent, &device->gpio->event, conn->info.hpd, 
bits,
-                              nvkm_uconn_uevent_gpio);
+       return nvkm_uevent_new_(&uconn->object, handle, &device->gpio->event, 
true,
+                               conn->info.hpd, bits, nvkm_uconn_uevent_gpio, 
pimpl, ppriv);
 }
 
 static void
@@ -182,7 +174,6 @@ nvkm_uconn_dtor(struct nvkm_object *object)
 static const struct nvkm_object_func
 nvkm_uconn = {
        .dtor = nvkm_uconn_dtor,
-       .uevent = nvkm_uconn_uevent,
 };
 
 int
@@ -244,6 +235,9 @@ nvkm_uconn_new(struct nvkm_disp *disp, u8 id, const struct 
nvif_conn_impl **pimp
        nvkm_object_ctor(&nvkm_uconn, &(struct nvkm_oclass) {}, &uconn->object);
        uconn->impl = nvkm_uconn_impl;
        uconn->impl.type = type;
+       if (disp->rm.client.gsp || conn->info.hpd != DCB_GPIO_UNUSED)
+               uconn->impl.event = nvkm_uconn_event;
+
        uconn->conn = conn;
 
        *pimpl = &uconn->impl;
-- 
2.41.0

Reply via email to