From nobody Mon Jun 8 20:41:47 2026 Received: from mx3.molgen.mpg.de (mx3.molgen.mpg.de [141.14.17.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA9873AE6F4 for ; Tue, 26 May 2026 16:20:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=141.14.17.11 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779812409; cv=none; b=eMp1zGPKvm1kZ4XlpMO8hMZoOjWi+c7CtJHlZc24j8M386u0lwZGaGHkC3GMj7Y9DXHl6S9dfjH0nk7d5IApuohtSF+LOcy2q2keSfi+tQHblBLxb4CLta7X1hp9jWuGQd/wjq/1+F3taTrLbEfYI/fc91fj20T9YvO13ApcIlk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779812409; c=relaxed/simple; bh=qoHcO/rb4zWn6xFIzHXfy+m7lX8RABxtMSvAa86fMj8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type; b=mN4trHhD0NzKIkz3hxooUEfDp/E+L9a8y+58Kfou3kmqCdVfcucun1NL3Vz+uuGKrjONoX3sSe9Xbn/M+cZFLu6V7sNr0XYVDsN4SboCIWafuBONrZcFLqQpIABt4HLAosKzHS3RiL/wTn6ZJzkUzpr5trNt3tiWHJ5cPyO+HK4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=molgen.mpg.de; spf=pass smtp.mailfrom=molgen.mpg.de; arc=none smtp.client-ip=141.14.17.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=molgen.mpg.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=molgen.mpg.de Received: from abreu.molgen.mpg.de (g42.guest.molgen.mpg.de [141.14.220.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: pmenzel) by mx.molgen.mpg.de (Postfix) with ESMTPSA id 801AD4C19741A2; Tue, 26 May 2026 18:19:35 +0200 (CEST) From: Paul Menzel To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter Cc: Paul Menzel , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm/i915/audio: skip ELD query for force-off connectors Date: Tue, 26 May 2026 18:19:24 +0200 Message-ID: <20260526161925.17041-1-pmenzel@molgen.mpg.de> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When a connector is forced off via the `video=3D` command-line parameter (`video=3D:d`), `intel_audio_component_get_eld()` returns -EINVAL for that port because `find_audio_state()` finds no active encoder. The audio driver interprets this as an error rather than a clean =E2=80=9Cno mo= nitor present=E2=80=9D reply, and, on the Dell XPS 13 9360, at `drm.debug=3D0x04`= the repeated calls generate the log below: i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port B i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port B i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port B i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port C i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port C i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port C i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port D i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port D i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i915]] Not valid= for port D Add `intel_audio_connector_is_forced_off()` which scans the connector list to check whether any connector on the given port has `force =3D=3D DRM_FORCE_OFF`. When the caller finds no audio state and the port=E2=80=99s connector is forced off, report `*enabled =3D false` and ret= urn 0 so the audio driver sees a clean =E2=80=9Cnot connected=E2=80=9D answer and st= ops querying that port. With `video=3DDP-2:d drm.debug=3D0x04` the unneeded calls are gone (port C): [ 90.458772] i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i= 915]] Not valid for port B [ 90.459649] i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i= 915]] Not valid for port B [ 90.460547] i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i= 915]] Not valid for port B [ 90.461581] i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i= 915]] Not valid for port D [ 90.462509] i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i= 915]] Not valid for port D [ 90.463385] i915 0000:00:02.0: [drm:intel_audio_component_get_eld [i= 915]] Not valid for port D Assisted-by: Claude Sonnet 4.6 Signed-off-by: Paul Menzel --- drivers/gpu/drm/i915/display/intel_audio.c | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i= 915/display/intel_audio.c index 081627e0d917..7864b9a485d5 100644 --- a/drivers/gpu/drm/i915/display/intel_audio.c +++ b/drivers/gpu/drm/i915/display/intel_audio.c @@ -36,6 +36,7 @@ #include "intel_cdclk.h" #include "intel_crtc.h" #include "intel_de.h" +#include "intel_display.h" #include "intel_display_types.h" #include "intel_display_wa.h" #include "intel_lpe_audio.h" @@ -1211,6 +1212,28 @@ static int intel_audio_component_sync_audio_rate(str= uct device *kdev, int port, return err; } =20 +static bool intel_audio_connector_is_forced_off(struct intel_display *disp= lay, + int port) +{ + struct drm_connector_list_iter conn_iter; + struct intel_connector *connector; + bool forced_off =3D false; + + drm_connector_list_iter_begin(display->drm, &conn_iter); + for_each_intel_connector_iter(connector, &conn_iter) { + struct intel_encoder *encoder =3D intel_attached_encoder(connector); + + if (encoder && encoder->port =3D=3D port && + connector->base.force =3D=3D DRM_FORCE_OFF) { + forced_off =3D true; + break; + } + } + drm_connector_list_iter_end(&conn_iter); + + return forced_off; +} + static int intel_audio_component_get_eld(struct device *kdev, int port, int cpu_transcoder, bool *enabled, unsigned char *buf, int max_bytes) @@ -1223,9 +1246,13 @@ static int intel_audio_component_get_eld(struct devi= ce *kdev, int port, =20 audio_state =3D find_audio_state(display, port, cpu_transcoder); if (!audio_state) { + mutex_unlock(&display->audio.mutex); + if (intel_audio_connector_is_forced_off(display, port)) { + *enabled =3D false; + return 0; + } drm_dbg_kms(display->drm, "Not valid for port %c\n", port_name(port)); - mutex_unlock(&display->audio.mutex); return -EINVAL; } =20 --=20 2.53.0