- transition from "ioctl" interfaces Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx> --- .../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