Commit d0bd1079 authored by Alex Ramírez's avatar Alex Ramírez Committed by Lyude Paul
Browse files

drm/nouveau: implement missing DCB connector types; gracefully handle unknown connectors

* 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: 8b7d92ca ("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: default avatarAlex Ramírez <lxrmrz732@rocketmail.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
[Lyude: Remove unneeded parenthesis around nvkm_warn()]
Signed-off-by: default avatarLyude Paul <lyude@redhat.com>
Link: https://patch.msgid.link/20251213005327.9495-3-lxrmrz732@gmail.com
parent 3036b4ce
Loading
Loading
Loading
Loading
+53 −20
Original line number Diff line number Diff line
@@ -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) {
		/* 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;
		}