- transition from "ioctl" interfaces

Signed-off-by: Ben Skeggs <bske...@nvidia.com>
---
 .../gpu/drm/nouveau/include/nvif/driverif.h   |  3 ++
 drivers/gpu/drm/nouveau/include/nvif/if0012.h | 23 ---------
 drivers/gpu/drm/nouveau/nvif/outp.c           | 40 +++++++--------
 .../gpu/drm/nouveau/nvkm/engine/disp/uoutp.c  | 50 +++++++++----------
 4 files changed, 45 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h 
b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
index 39b0e8d002f8..9ab54de43ba3 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
@@ -276,6 +276,9 @@ struct nvif_outp_impl {
        int (*detect)(struct nvif_outp_priv *, enum nvif_outp_detect_status *);
        int (*edid_get)(struct nvif_outp_priv *, u8 *data, u16 *size);
 
+       int (*inherit)(struct nvif_outp_priv *, enum nvif_outp_proto,
+                      u8 *or, u8 *link, u8 *head, u8 *proto_evo);
+
        int (*load_detect)(struct nvif_outp_priv *, u32 loadval, u8 *load);
 
        struct {
diff --git a/drivers/gpu/drm/nouveau/include/nvif/if0012.h 
b/drivers/gpu/drm/nouveau/include/nvif/if0012.h
index 586b44fa8814..09e2f61673a8 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/if0012.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/if0012.h
@@ -4,7 +4,6 @@
 
 #include <drm/display/drm_dp.h>
 
-#define NVIF_OUTP_V0_INHERIT       0x10
 #define NVIF_OUTP_V0_ACQUIRE       0x11
 #define NVIF_OUTP_V0_RELEASE       0x12
 
@@ -46,28 +45,6 @@ union nvif_outp_acquire_args {
        } v0;
 };
 
-union nvif_outp_inherit_args {
-       struct nvif_outp_inherit_v0 {
-               __u8 version;
-#define NVIF_OUTP_INHERIT_V0_RGB_CRT 0x00
-#define NVIF_OUTP_INHERIT_V0_TV      0x01
-#define NVIF_OUTP_INHERIT_V0_TMDS    0x02
-#define NVIF_OUTP_INHERIT_V0_LVDS    0x03
-#define NVIF_OUTP_INHERIT_V0_DP      0x04
-               // In/out. Input is one of the above values, output is the 
actual hw protocol
-               __u8 proto;
-               __u8 or;
-               __u8 link;
-               __u8 head;
-               union {
-                       struct {
-                               // TODO: Figure out padding, and whether we 
even want this field
-                               __u8 hda;
-                       } tmds;
-               };
-       } v0;
-};
-
 union nvif_outp_release_args {
        struct nvif_outp_release_vn {
        } vn;
diff --git a/drivers/gpu/drm/nouveau/nvif/outp.c 
b/drivers/gpu/drm/nouveau/nvif/outp.c
index 59499eebc5ac..c98af48b4b33 100644
--- a/drivers/gpu/drm/nouveau/nvif/outp.c
+++ b/drivers/gpu/drm/nouveau/nvif/outp.c
@@ -354,71 +354,65 @@ nvif_outp_acquire_dac(struct nvif_outp *outp)
 }
 
 static int
-nvif_outp_inherit(struct nvif_outp *outp,
-                 u8 proto,
-                 struct nvif_outp_inherit_v0 *args,
-                 u8 *proto_out)
+nvif_outp_inherit(struct nvif_outp *outp, enum nvif_outp_proto proto, u8 
*head, u8 *proto_evo)
 {
+       u8 or, link;
        int ret;
 
-       args->version = 0;
-       args->proto = proto;
-
-       ret = nvif_mthd(&outp->object, NVIF_OUTP_V0_INHERIT, args, 
sizeof(*args));
+       ret = outp->impl->inherit(outp->priv, proto, &or, &link, head, 
proto_evo);
        if (ret)
                return ret;
 
-       outp->or.id = args->or;
-       outp->or.link = args->link;
-       *proto_out = args->proto;
+       outp->or.id = or;
+       outp->or.link = link;
        return 0;
 }
 
 int
 nvif_outp_inherit_lvds(struct nvif_outp *outp, u8 *proto_out)
 {
-       struct nvif_outp_inherit_v0 args;
+       u8 head;
        int ret;
 
-       ret = nvif_outp_inherit(outp, NVIF_OUTP_INHERIT_V0_LVDS, &args, 
proto_out);
+       ret = nvif_outp_inherit(outp, NVIF_OUTP_LVDS, &head, proto_out);
        NVIF_ERRON(ret && ret != -ENODEV, &outp->object, "[INHERIT proto:LVDS] 
ret:%d", ret);
-       return ret ?: args.head;
+       return ret ?: head;
 }
 
 int
 nvif_outp_inherit_tmds(struct nvif_outp *outp, u8 *proto_out)
 {
-       struct nvif_outp_inherit_v0 args;
+       u8 head;
        int ret;
 
-       ret = nvif_outp_inherit(outp, NVIF_OUTP_INHERIT_V0_TMDS, &args, 
proto_out);
+       ret = nvif_outp_inherit(outp, NVIF_OUTP_TMDS, &head, proto_out);
        NVIF_ERRON(ret && ret != -ENODEV, &outp->object, "[INHERIT proto:TMDS] 
ret:%d", ret);
-       return ret ?: args.head;
+       return ret ?: head;
 }
 
 int
 nvif_outp_inherit_dp(struct nvif_outp *outp, u8 *proto_out)
 {
-       struct nvif_outp_inherit_v0 args;
+       u8 head;
        int ret;
 
-       ret = nvif_outp_inherit(outp, NVIF_OUTP_INHERIT_V0_DP, &args, 
proto_out);
+       ret = nvif_outp_inherit(outp, NVIF_OUTP_DP, &head, proto_out);
        NVIF_ERRON(ret && ret != -ENODEV, &outp->object, "[INHERIT proto:DP] 
ret:%d", ret);
 
        // TODO: Get current link info
 
-       return ret ?: args.head;
+       return ret ?: head;
 }
 
 int
 nvif_outp_inherit_rgb_crt(struct nvif_outp *outp, u8 *proto_out)
 {
-       struct nvif_outp_inherit_v0 args;
+       u8 head;
        int ret;
 
-       ret = nvif_outp_inherit(outp, NVIF_OUTP_INHERIT_V0_RGB_CRT, &args, 
proto_out);
+       ret = nvif_outp_inherit(outp, NVIF_OUTP_RGB_CRT, &head, proto_out);
        NVIF_ERRON(ret && ret != -ENODEV, &outp->object, "[INHERIT 
proto:RGB_CRT] ret:%d", ret);
-       return ret ?: args.head;
+       return ret ?: head;
 }
 
 int
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c
index d3f69d6a10f3..3f242a03f77b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c
@@ -405,44 +405,40 @@ nvkm_uoutp_mthd_acquire(struct nvkm_outp *outp, void 
*argv, u32 argc)
 }
 
 static int
-nvkm_uoutp_mthd_inherit(struct nvkm_outp *outp, void *argv, u32 argc)
+nvkm_uoutp_inherit(struct nvif_outp_priv *uoutp, enum nvif_outp_proto proto,
+                  u8 *or, u8 *link, u8 *head, u8 *proto_evo)
 {
-       union nvif_outp_inherit_args *args = argv;
+       struct nvkm_outp *outp = uoutp->outp;
        struct nvkm_ior *ior;
-       int ret = 0;
+       int ret = -ENODEV;
 
-       if (argc != sizeof(args->v0) || args->v0.version != 0)
-               return -ENOSYS;
+       nvkm_uoutp_lock(uoutp);
 
        /* Ensure an ior is hooked up to this outp already */
        ior = outp->func->inherit(outp);
        if (!ior || !ior->arm.head)
-               return -ENODEV;
+               goto done;
 
        /* With iors, there will be a separate output path for each type of 
connector - and all of
         * them will appear to be hooked up. Figure out which one is actually 
the one we're using
         * based on the protocol we were given over nvif
         */
-       switch (args->v0.proto) {
-       case NVIF_OUTP_INHERIT_V0_TMDS:
+       switch (proto) {
+       case NVIF_OUTP_TMDS:
                if (ior->arm.proto != TMDS)
-                       return -ENODEV;
+                       goto done;
                break;
-       case NVIF_OUTP_INHERIT_V0_DP:
+       case NVIF_OUTP_DP:
                if (ior->arm.proto != DP)
-                       return -ENODEV;
+                       goto done;
                break;
-       case NVIF_OUTP_INHERIT_V0_LVDS:
+       case NVIF_OUTP_LVDS:
                if (ior->arm.proto != LVDS)
-                       return -ENODEV;
+                       goto done;
                break;
-       case NVIF_OUTP_INHERIT_V0_TV:
-               if (ior->arm.proto != TV)
-                       return -ENODEV;
-               break;
-       case NVIF_OUTP_INHERIT_V0_RGB_CRT:
+       case NVIF_OUTP_RGB_CRT:
                if (ior->arm.proto != CRT)
-                       return -ENODEV;
+                       goto done;
                break;
        default:
                ret = -EINVAL;
@@ -452,18 +448,22 @@ nvkm_uoutp_mthd_inherit(struct nvkm_outp *outp, void 
*argv, u32 argc)
        /* Make sure that userspace hasn't already acquired this */
        if (outp->acquired) {
                OUTP_ERR(outp, "cannot inherit an already acquired (%02x) 
outp", outp->acquired);
-               return -EBUSY;
+               ret = -EBUSY;
+               goto done;
        }
 
        /* Mark the outp acquired by userspace now that we've confirmed it's 
already active */
        OUTP_TRACE(outp, "inherit %02x |= %02x %p", outp->acquired, 
NVKM_OUTP_USER, ior);
        nvkm_outp_acquire_ior(outp, NVKM_OUTP_USER, ior);
 
-       args->v0.or = ior->id;
-       args->v0.link = ior->arm.link;
-       args->v0.head = ffs(ior->arm.head) - 1;
-       args->v0.proto = ior->arm.proto_evo;
+       *or = ior->id;
+       *link = ior->arm.link;
+       *head = ffs(ior->arm.head) - 1;
+       *proto_evo = ior->arm.proto_evo;
 
+       ret = 0;
+done:
+       nvkm_uoutp_unlock(uoutp);
        return ret;
 }
 
@@ -549,7 +549,6 @@ static int
 nvkm_uoutp_mthd_noacquire(struct nvkm_outp *outp, u32 mthd, void *argv, u32 
argc, bool *invalid)
 {
        switch (mthd) {
-       case NVIF_OUTP_V0_INHERIT    : return nvkm_uoutp_mthd_inherit    (outp, 
argv, argc);
        case NVIF_OUTP_V0_ACQUIRE    : return nvkm_uoutp_mthd_acquire    (outp, 
argv, argc);
        case NVIF_OUTP_V0_BL_GET     : return nvkm_uoutp_mthd_bl_get     (outp, 
argv, argc);
        case NVIF_OUTP_V0_BL_SET     : return nvkm_uoutp_mthd_bl_set     (outp, 
argv, argc);
@@ -599,6 +598,7 @@ nvkm_uoutp_del(struct nvif_outp_priv *uoutp)
 static const struct nvif_outp_impl
 nvkm_uoutp_impl = {
        .del = nvkm_uoutp_del,
+       .inherit = nvkm_uoutp_inherit,
 };
 
 static void *
-- 
2.41.0

Reply via email to