[(repost),4/5] drm/nouveau: add DisplayPort CEC-Tunneling-over-AUX support

Submitted by Hans Verkuil on Aug. 17, 2018, 2:11 p.m.

Details

Message ID 20180817141122.9541-5-hverkuil@xs4all.nl
State New
Headers show
Series "drm/nouveau+amdgpu: add DP CEC-Tunneling-over-AUX (repost)" ( rev: 1 ) in Nouveau

Not browsing as part of any series.

Commit Message

Hans Verkuil Aug. 17, 2018, 2:11 p.m.
From: Hans Verkuil <hans.verkuil@cisco.com>

Add DisplayPort CEC-Tunneling-over-AUX support to nouveau.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
---
 drivers/gpu/drm/nouveau/nouveau_connector.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index 51932c72334e..eb4f766b5958 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -400,8 +400,10 @@  nouveau_connector_destroy(struct drm_connector *connector)
 	kfree(nv_connector->edid);
 	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
-	if (nv_connector->aux.transfer)
+	if (nv_connector->aux.transfer) {
+		drm_dp_cec_unregister_connector(&nv_connector->aux);
 		drm_dp_aux_unregister(&nv_connector->aux);
+	}
 	kfree(connector);
 }
 
@@ -608,6 +610,7 @@  nouveau_connector_detect(struct drm_connector *connector, bool force)
 
 		nouveau_connector_set_encoder(connector, nv_encoder);
 		conn_status = connector_status_connected;
+		drm_dp_cec_set_edid(&nv_connector->aux, nv_connector->edid);
 		goto out;
 	}
 
@@ -1108,11 +1111,14 @@  nouveau_connector_hotplug(struct nvif_notify *notify)
 
 	if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) {
 		NV_DEBUG(drm, "service %s\n", name);
+		drm_dp_cec_irq(&nv_connector->aux);
 		if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP)))
 			nv50_mstm_service(nv_encoder->dp.mstm);
 	} else {
 		bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG);
 
+		if (!plugged)
+			drm_dp_cec_unset_edid(&nv_connector->aux);
 		NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", name);
 		if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) {
 			if (!plugged)
@@ -1302,7 +1308,6 @@  nouveau_connector_create(struct drm_device *dev, int index)
 			kfree(nv_connector);
 			return ERR_PTR(ret);
 		}
-
 		funcs = &nouveau_connector_funcs;
 		break;
 	default:
@@ -1356,6 +1361,14 @@  nouveau_connector_create(struct drm_device *dev, int index)
 		break;
 	}
 
+	switch (type) {
+	case DRM_MODE_CONNECTOR_DisplayPort:
+	case DRM_MODE_CONNECTOR_eDP:
+		drm_dp_cec_register_connector(&nv_connector->aux,
+					      connector->name, dev->dev);
+		break;
+	}
+
 	ret = nvif_notify_init(&disp->disp.object, nouveau_connector_hotplug,
 			       true, NV04_DISP_NTFY_CONN,
 			       &(struct nvif_notify_conn_req_v0) {

Comments

On Fri, 2018-08-17 at 16:11 +0200, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil@cisco.com>
> 
> Add DisplayPort CEC-Tunneling-over-AUX support to nouveau.
> 
> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
> ---
>  drivers/gpu/drm/nouveau/nouveau_connector.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c
> b/drivers/gpu/drm/nouveau/nouveau_connector.c
> index 51932c72334e..eb4f766b5958 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> @@ -400,8 +400,10 @@ nouveau_connector_destroy(struct drm_connector
> *connector)
>  	kfree(nv_connector->edid);
>  	drm_connector_unregister(connector);
>  	drm_connector_cleanup(connector);
> -	if (nv_connector->aux.transfer)
> +	if (nv_connector->aux.transfer) {
With the comments I made about this on patch 1 addressed/resolved:

Reviewed-by: Lyude Paul <lyude@redhat.com>

> +		drm_dp_cec_unregister_connector(&nv_connector->aux);
>  		drm_dp_aux_unregister(&nv_connector->aux);
> +	}
>  	kfree(connector);
>  }
>  
> @@ -608,6 +610,7 @@ nouveau_connector_detect(struct drm_connector *connector,
> bool force)
>  
>  		nouveau_connector_set_encoder(connector, nv_encoder);
>  		conn_status = connector_status_connected;
> +		drm_dp_cec_set_edid(&nv_connector->aux, nv_connector->edid);
>  		goto out;
>  	}
>  
> @@ -1108,11 +1111,14 @@ nouveau_connector_hotplug(struct nvif_notify *notify)
>  
>  	if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) {
>  		NV_DEBUG(drm, "service %s\n", name);
> +		drm_dp_cec_irq(&nv_connector->aux);
>  		if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP)))
>  			nv50_mstm_service(nv_encoder->dp.mstm);
>  	} else {
>  		bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG);
>  
> +		if (!plugged)
> +			drm_dp_cec_unset_edid(&nv_connector->aux);
>  		NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", name);
>  		if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) {
>  			if (!plugged)
> @@ -1302,7 +1308,6 @@ nouveau_connector_create(struct drm_device *dev, int
> index)
>  			kfree(nv_connector);
>  			return ERR_PTR(ret);
>  		}
> -
>  		funcs = &nouveau_connector_funcs;
>  		break;
>  	default:
> @@ -1356,6 +1361,14 @@ nouveau_connector_create(struct drm_device *dev, int
> index)
>  		break;
>  	}
>  
> +	switch (type) {
> +	case DRM_MODE_CONNECTOR_DisplayPort:
> +	case DRM_MODE_CONNECTOR_eDP:
> +		drm_dp_cec_register_connector(&nv_connector->aux,
> +					      connector->name, dev->dev);
> +		break;
> +	}
> +
>  	ret = nvif_notify_init(&disp->disp.object, nouveau_connector_hotplug,
>  			       true, NV04_DISP_NTFY_CONN,
>  			       &(struct nvif_notify_conn_req_v0) {