From: Alex Ramirez <[email protected]>

* Implement missing DCB connectors in uconn.c previously defined in conn.h.
* Replace kernel WARN_ON macro with printk message to more gracefully signify
  an unknown connector was encountered.

With this patch, unknown connectors are explicitly marked with value 0
(DCB_CONNECTOR_VGA) to match the tested current behavior. Although 0xff
(DCB_CONNECTOR_NONE) may be more suitable, I don't want to introduce a breaking 
change.

Fixes: 8b7d92cad953 ("drm/nouveau/kms/nv50-: create connectors based on nvkm 
info")
Link: 
https://download.nvidia.com/open-gpu-doc/DCB/1/DCB-4.0-Specification.html#_connector_table_entry
Signed-off-by: Alex Ramirez <[email protected]>
---
 .../gpu/drm/nouveau/nvkm/engine/disp/uconn.c  | 73 ++++++++++++++-----
 1 file changed, 53 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c
index 2dab6612c4fc..d1fed2beee63 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c
@@ -191,27 +191,60 @@ nvkm_uconn_new(const struct nvkm_oclass *oclass, void 
*argv, u32 argc, struct nv
        spin_lock(&disp->client.lock);
        if (!conn->object.func) {
                switch (conn->info.type) {
-               case DCB_CONNECTOR_VGA      : args->v0.type = NVIF_CONN_V0_VGA; 
break;
-               case DCB_CONNECTOR_TV_0     :
-               case DCB_CONNECTOR_TV_1     :
-               case DCB_CONNECTOR_TV_3     : args->v0.type = NVIF_CONN_V0_TV; 
break;
-               case DCB_CONNECTOR_DMS59_0  :
-               case DCB_CONNECTOR_DMS59_1  :
-               case DCB_CONNECTOR_DVI_I    : args->v0.type = 
NVIF_CONN_V0_DVI_I; break;
-               case DCB_CONNECTOR_DVI_D    : args->v0.type = 
NVIF_CONN_V0_DVI_D; break;
-               case DCB_CONNECTOR_LVDS     : args->v0.type = 
NVIF_CONN_V0_LVDS; break;
-               case DCB_CONNECTOR_LVDS_SPWG: args->v0.type = 
NVIF_CONN_V0_LVDS_SPWG; break;
-               case DCB_CONNECTOR_DMS59_DP0:
-               case DCB_CONNECTOR_DMS59_DP1:
-               case DCB_CONNECTOR_DP       :
-               case DCB_CONNECTOR_mDP      :
-               case DCB_CONNECTOR_USB_C    : args->v0.type = NVIF_CONN_V0_DP; 
break;
-               case DCB_CONNECTOR_eDP      : args->v0.type = NVIF_CONN_V0_EDP; 
break;
-               case DCB_CONNECTOR_HDMI_0   :
-               case DCB_CONNECTOR_HDMI_1   :
-               case DCB_CONNECTOR_HDMI_C   : args->v0.type = 
NVIF_CONN_V0_HDMI; break;
+               /* VGA */
+               case DCB_CONNECTOR_DVI_A        :
+               case DCB_CONNECTOR_POD_VGA      :
+               case DCB_CONNECTOR_VGA          : args->v0.type = 
NVIF_CONN_V0_VGA; break;
+
+               /* TV */
+               case DCB_CONNECTOR_TV_0         :
+               case DCB_CONNECTOR_TV_1         :
+               case DCB_CONNECTOR_TV_2         :
+               case DCB_CONNECTOR_TV_SCART     :
+               case DCB_CONNECTOR_TV_SCART_D   :
+               case DCB_CONNECTOR_TV_DTERM     :
+               case DCB_CONNECTOR_POD_TV_3     :
+               case DCB_CONNECTOR_POD_TV_1     :
+               case DCB_CONNECTOR_POD_TV_0     :
+               case DCB_CONNECTOR_TV_3         : args->v0.type = 
NVIF_CONN_V0_TV; break;
+
+               /* DVI */
+               case DCB_CONNECTOR_DVI_I_TV_1   :
+               case DCB_CONNECTOR_DVI_I_TV_0   :
+               case DCB_CONNECTOR_DVI_I_TV_2   :
+               case DCB_CONNECTOR_DVI_ADC      :
+               case DCB_CONNECTOR_DMS59_0      :
+               case DCB_CONNECTOR_DMS59_1      :
+               case DCB_CONNECTOR_DVI_I        : args->v0.type = 
NVIF_CONN_V0_DVI_I; break;
+               case DCB_CONNECTOR_TMDS         :
+               case DCB_CONNECTOR_DVI_D        : args->v0.type = 
NVIF_CONN_V0_DVI_D; break;
+
+               /* LVDS */
+               case DCB_CONNECTOR_LVDS         : args->v0.type = 
NVIF_CONN_V0_LVDS; break;
+               case DCB_CONNECTOR_LVDS_SPWG    : args->v0.type = 
NVIF_CONN_V0_LVDS_SPWG; break;
+
+               /* DP */
+               case DCB_CONNECTOR_DMS59_DP0    :
+               case DCB_CONNECTOR_DMS59_DP1    :
+               case DCB_CONNECTOR_DP           :
+               case DCB_CONNECTOR_mDP          :
+               case DCB_CONNECTOR_USB_C        : args->v0.type = 
NVIF_CONN_V0_DP; break;
+               case DCB_CONNECTOR_eDP          : args->v0.type = 
NVIF_CONN_V0_EDP; break;
+
+               /* HDMI */
+               case DCB_CONNECTOR_HDMI_0       :
+               case DCB_CONNECTOR_HDMI_1       :
+               case DCB_CONNECTOR_HDMI_C       : args->v0.type = 
NVIF_CONN_V0_HDMI; break;
+
+               /*
+                * Dock & unused outputs.
+                * BNC, SPDIF, WFD, and detached LVDS go here.
+                */
                default:
-                       WARN_ON(1);
+                       nvkm_warn(&(disp->engine.subdev),
+                                 "unimplemented connector type 0x%02x\n",
+                                 conn->info.type);
+                       args->v0.type = NVIF_CONN_V0_VGA;
                        ret = -EINVAL;
                        break;
                }
-- 
2.51.1

Reply via email to