[PATCH 106/156] drm/nouveau/nvif: rework outp "detect" api

Ben Skeggs bskeggs at nvidia.com
Tue Apr 16 23:39:12 UTC 2024


- transition from "ioctl" interface

Signed-off-by: Ben Skeggs <bskeggs at nvidia.com>
---
 .../gpu/drm/nouveau/include/nvif/driverif.h   |  8 ++++
 drivers/gpu/drm/nouveau/include/nvif/if0012.h | 11 -----
 drivers/gpu/drm/nouveau/include/nvif/outp.h   |  6 ---
 drivers/gpu/drm/nouveau/nouveau_connector.c   |  6 +--
 drivers/gpu/drm/nouveau/nouveau_dp.c          |  2 +-
 drivers/gpu/drm/nouveau/nvif/outp.c           | 21 ++-------
 .../gpu/drm/nouveau/nvkm/engine/disp/uoutp.c  | 47 ++++++++++++++-----
 7 files changed, 53 insertions(+), 48 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
index 8d00ed58323f..fd05065374fe 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
@@ -244,6 +244,12 @@ struct nvif_conn_impl {
 		     const struct nvif_event_impl **, struct nvif_event_priv **);
 };
 
+enum nvif_outp_detect_status {
+	NVIF_OUTP_DETECT_NOT_PRESENT,
+	NVIF_OUTP_DETECT_PRESENT,
+	NVIF_OUTP_DETECT_UNKNOWN,
+};
+
 struct nvif_outp_impl {
 	void (*del)(struct nvif_outp_priv *);
 
@@ -267,6 +273,8 @@ struct nvif_outp_impl {
 	u8 ddc;
 	u8 conn;
 
+	int (*detect)(struct nvif_outp_priv *, enum nvif_outp_detect_status *);
+
 	struct {
 		u32 freq_max;
 	} rgb_crt;
diff --git a/drivers/gpu/drm/nouveau/include/nvif/if0012.h b/drivers/gpu/drm/nouveau/include/nvif/if0012.h
index d1e2f0ff8965..c0c13cb64994 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_DETECT        0x00
 #define NVIF_OUTP_V0_EDID_GET      0x01
 
 #define NVIF_OUTP_V0_INHERIT       0x10
@@ -33,16 +32,6 @@
 #define NVIF_OUTP_V0_DP_MST_ID_PUT 0x77
 #define NVIF_OUTP_V0_DP_MST_VCPI   0x78
 
-union nvif_outp_detect_args {
-	struct nvif_outp_detect_v0 {
-		__u8 version;
-#define NVIF_OUTP_DETECT_V0_NOT_PRESENT 0x00
-#define NVIF_OUTP_DETECT_V0_PRESENT     0x01
-#define NVIF_OUTP_DETECT_V0_UNKNOWN     0x02
-		__u8 status;
-	} v0;
-};
-
 union nvif_outp_edid_get_args {
 	struct nvif_outp_edid_get_v0 {
 		__u8  version;
diff --git a/drivers/gpu/drm/nouveau/include/nvif/outp.h b/drivers/gpu/drm/nouveau/include/nvif/outp.h
index 56bfbc41a576..7a64a7d2ac97 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/outp.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/outp.h
@@ -21,12 +21,6 @@ struct nvif_outp {
 int nvif_outp_ctor(struct nvif_disp *, const char *name, int id, struct nvif_outp *);
 void nvif_outp_dtor(struct nvif_outp *);
 
-enum nvif_outp_detect_status {
-	NOT_PRESENT,
-	PRESENT,
-	UNKNOWN,
-};
-
 enum nvif_outp_detect_status nvif_outp_detect(struct nvif_outp *);
 int nvif_outp_edid_get(struct nvif_outp *, u8 **pedid);
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index b1bd8264b703..3063ef792023 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -434,11 +434,11 @@ nouveau_connector_ddc_detect(struct drm_connector *connector)
 			} else {
 				status = nvif_outp_detect(&nv_encoder->outp);
 				switch (status) {
-				case PRESENT:
+				case NVIF_OUTP_DETECT_PRESENT:
 					return nv_encoder;
-				case NOT_PRESENT:
+				case NVIF_OUTP_DETECT_NOT_PRESENT:
 					continue;
-				case UNKNOWN:
+				case NVIF_OUTP_DETECT_UNKNOWN:
 					break;
 				default:
 					WARN_ON(1);
diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c
index a72c45809484..cf196af96609 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dp.c
+++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
@@ -256,7 +256,7 @@ nouveau_dp_detect(struct nouveau_connector *nv_connector,
 	}
 
 	hpd = nvif_outp_detect(&nv_encoder->outp);
-	if (hpd == NOT_PRESENT) {
+	if (hpd == NVIF_OUTP_DETECT_NOT_PRESENT) {
 		nvif_outp_dp_aux_pwr(&nv_encoder->outp, false);
 		goto out;
 	}
diff --git a/drivers/gpu/drm/nouveau/nvif/outp.c b/drivers/gpu/drm/nouveau/nvif/outp.c
index a8012a71a50c..b704886c1bb6 100644
--- a/drivers/gpu/drm/nouveau/nvif/outp.c
+++ b/drivers/gpu/drm/nouveau/nvif/outp.c
@@ -467,26 +467,15 @@ nvif_outp_edid_get(struct nvif_outp *outp, u8 **pedid)
 enum nvif_outp_detect_status
 nvif_outp_detect(struct nvif_outp *outp)
 {
-	struct nvif_outp_detect_v0 args;
+	enum nvif_outp_detect_status status;
 	int ret;
 
-	args.version = 0;
-
-	ret = nvif_mthd(&outp->object, NVIF_OUTP_V0_DETECT, &args, sizeof(args));
-	NVIF_ERRON(ret, &outp->object, "[DETECT] status:%02x", args.status);
+	ret = outp->impl->detect(outp->priv, &status);
+	NVIF_ERRON(ret, &outp->object, "[DETECT] status:%02x", status);
 	if (ret)
-		return UNKNOWN;
-
-	switch (args.status) {
-	case NVIF_OUTP_DETECT_V0_NOT_PRESENT: return NOT_PRESENT;
-	case NVIF_OUTP_DETECT_V0_PRESENT: return PRESENT;
-	case NVIF_OUTP_DETECT_V0_UNKNOWN: return UNKNOWN;
-	default:
-		WARN_ON(1);
-		break;
-	}
+		return NVIF_OUTP_DETECT_UNKNOWN;
 
-	return UNKNOWN;
+	return status;
 }
 
 void
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c
index b585b781e928..2324549787b6 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c
@@ -35,6 +35,31 @@ struct nvif_outp_priv {
 	struct nvif_outp_impl impl;
 };
 
+static inline void
+nvkm_uoutp_unlock(struct nvif_outp_priv *uoutp)
+{
+	mutex_unlock(&uoutp->outp->disp->super.mutex);
+}
+
+static inline void
+nvkm_uoutp_lock(struct nvif_outp_priv *uoutp)
+{
+	mutex_lock(&uoutp->outp->disp->super.mutex);
+}
+
+static inline int
+nvkm_uoutp_lock_acquired(struct nvif_outp_priv *uoutp)
+{
+	nvkm_uoutp_lock(uoutp);
+
+	if (!uoutp->outp->ior) {
+		nvkm_uoutp_unlock(uoutp);
+		return -EIO;
+	}
+
+	return 0;
+}
+
 static int
 nvkm_uoutp_mthd_dp_mst_vcpi(struct nvkm_outp *outp, void *argv, u32 argc)
 {
@@ -480,22 +505,20 @@ nvkm_uoutp_mthd_edid_get(struct nvkm_outp *outp, void *argv, u32 argc)
 }
 
 static int
-nvkm_uoutp_mthd_detect(struct nvkm_outp *outp, void *argv, u32 argc)
+nvkm_uoutp_detect(struct nvif_outp_priv *uoutp, enum nvif_outp_detect_status *status)
 {
-	union nvif_outp_detect_args *args = argv;
+	struct nvkm_outp *outp = uoutp->outp;
 	int ret;
 
-	if (argc != sizeof(args->v0) || args->v0.version != 0)
-		return -ENOSYS;
-	if (!outp->func->detect)
-		return -EINVAL;
-
+	nvkm_uoutp_lock(uoutp);
 	ret = outp->func->detect(outp);
+	nvkm_uoutp_unlock(uoutp);
+
 	switch (ret) {
-	case 0: args->v0.status = NVIF_OUTP_DETECT_V0_NOT_PRESENT; break;
-	case 1: args->v0.status = NVIF_OUTP_DETECT_V0_PRESENT; break;
+	case 0: *status = NVIF_OUTP_DETECT_NOT_PRESENT; break;
+	case 1: *status = NVIF_OUTP_DETECT_PRESENT; break;
 	default:
-		args->v0.status = NVIF_OUTP_DETECT_V0_UNKNOWN;
+		*status = NVIF_OUTP_DETECT_UNKNOWN;
 		break;
 	}
 
@@ -528,7 +551,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_DETECT     : return nvkm_uoutp_mthd_detect     (outp, argv, argc);
 	case NVIF_OUTP_V0_EDID_GET   : return nvkm_uoutp_mthd_edid_get   (outp, argv, argc);
 	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);
@@ -627,6 +649,9 @@ nvkm_uoutp_new(struct nvkm_disp *disp, u8 id, const struct nvif_outp_impl **pimp
 	uoutp->impl = nvkm_uoutp_impl;
 	uoutp->impl.id = id;
 
+	if (outp->func->detect)
+		uoutp->impl.detect = nvkm_uoutp_detect;
+
 	switch (outp->info.type) {
 	case DCB_OUTPUT_ANALOG:
 		uoutp->impl.type = NVIF_OUTP_DAC;
-- 
2.41.0



More information about the Nouveau mailing list