]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/nouveau: implement missing DCB connector types; gracefully handle unknown connectors
authorAlex Ramírez <lxrmrz732@rocketmail.com>
Sat, 13 Dec 2025 00:53:27 +0000 (19:53 -0500)
committerLyude Paul <lyude@redhat.com>
Wed, 21 Jan 2026 20:47:40 +0000 (15:47 -0500)
* 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 Ramírez <lxrmrz732@rocketmail.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
[Lyude: Remove unneeded parenthesis around nvkm_warn()]
Signed-off-by: Lyude Paul <lyude@redhat.com>
Link: https://patch.msgid.link/20251213005327.9495-3-lxrmrz732@gmail.com
drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c

index 2dab6612c4fc84651e8b8d7fa2fd7056c057399a..23d1e5c27bb1e49aa634c45c9d027045c7b878d8 100644 (file)
@@ -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;
                }