From patchwork Wed Aug 26 01:49:05 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: An Wu X-Patchwork-Id: 2292326 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hV6yh0jmGz1xxf for ; Wed, 26 Aug 2026 11:49:32 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1wz2lZ-0005XO-Ew; Wed, 26 Aug 2026 01:49:25 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1wz2lX-0005Wb-AO for kernel-team@lists.ubuntu.com; Wed, 26 Aug 2026 01:49:23 +0000 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 1F3913F342 for ; Wed, 26 Aug 2026 01:49:23 +0000 (UTC) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2d371c85362so1185565ad.2 for ; Tue, 25 Aug 2026 18:49:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787708961; x=1788313761; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=rOu87acPzxYcpyUQEWwCsUwmkyC6XpmfTQLf3Tzfu/Q=; b=eEHpH80CmbDdom45zMfSo9I3MjbcHHndAJN0/z5bSmYppFB2nCLe3MCT8QaVCEqJ1M wtoeAK50NhLoDYva5oTL2xIuw+VlIrjY6BxiYRisUNfsA+Ovnk24bd6JHp11r7ol6jaO wa0miT35diiLWiET+mKAH1DNn+LGPKWYGrAVq5nAnLy5bsN1l04tcTXBmFD8f9fFJMiP O5tp8heM0xRm/sVT/eTOLTB78Xx4FscQyoIIEuu/1Nn9+isCk8FBV+FkSdb/hRJxKlcx 7Y0fiRHoa6PXc+3SUwSx4RPnm0BrORIIl9dMvy1jP2Ljw8SUqJDmn0At4IVcZoMOVUTD g+zw== X-Gm-Message-State: AFuF++lhInntpJrUx7vP0Zbf5NQFeM8/3RzEk7a6jd+VkAIV3pmoZzdm 3TahxjU0jqALPKA4XQZ5PWcpRTS1Hn0aOsZCByZbd5JoKeEddeCiv6Qu3dcqpjYk3X9Wgv6QHeS qhW2Nw3jmyODQUW4eYUeGQ+NHwTMao8C78hN8AtGAli3BHMWtTNA931bLfgkp3lPW7kzGgcitPJ YYjRV0AMXcLizqSme1 X-Gm-Gg: AR+sD13XrflvL83ZzVhTfoDoZNx9T0j5pX9gc0/mEXXEB/QZhnb9fjFhOnv0v7KoJlV fXxzziSzcKHkq4PjP0M/BUiM3Xtq2a8mJq+0zmNSUEgZz4WK9luGNMlMs4p4V8tnnprpinW6hj2 k5oHN4vhe18xwkaQcFURKbxADkKjH9C1+SPX+i/Z6TIUFcXG0sFFhm4TnTLbbkP24q0xxOB6VSb 1+2TYhV3TuaX8AkqSIk3elF4wnBRlWhrEx+9PwMKfapbP9Plx1g6TBiutSUqRavMtzxM6ao/nIT NZolEBjJQyd5d0gy1GghQhrQMgYHJPfGIdLUcMYONZL1iAx70IexvQSb03L2U0hCMdMbUMpnq+0 Vh6imtEGIF5g83tPtYEmZmvXGa/h7T946h9tsR1WaFU6+9go8hiL9a9UperQeiHJopock1iBqBT Y8ufwchGZjnUoa5cEKxOAlrIC6y8vE1vban2IgdVkXN52tJKS/o5HihRmuwPwvoktvO4r7D8QMu bdDqeVCoG70Q+4bhyJa1nqYIA+VrnpdP8RgXcKpXDII X-Received: by 2002:a17:903:3bd0:b0:2d3:a50c:5e19 with SMTP id d9443c01a7336-2d7079ae039mr21115505ad.1.1787708961611; Tue, 25 Aug 2026 18:49:21 -0700 (PDT) X-Received: by 2002:a17:903:3bd0:b0:2d3:a50c:5e19 with SMTP id d9443c01a7336-2d7079ae039mr21115235ad.1.1787708961219; Tue, 25 Aug 2026 18:49:21 -0700 (PDT) Received: from an-XPS-15-9520.buildd (2001-b011-2008-e559-5718-5b76-35fc-d292.dynamic-ip6.hinet.net. [2001:b011:2008:e559:5718:5b76:35fc:d292]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d70493dfc0sm2961035ad.14.2026.08.25.18.49.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 18:49:20 -0700 (PDT) To: kernel-team@lists.ubuntu.com Subject: [SRU][J:linux-hwe-6.8][PATCH v2 1/2] drm/i915/vbt: Add fields dedicated_external and dyn_port_over_tc Date: Wed, 26 Aug 2026 09:49:05 +0800 Message-Id: <20260826014906.1472193-2-an.wu@canonical.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260826014906.1472193-1-an.wu@canonical.com> References: <20260826014906.1472193-1-an.wu@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: ChunAn Wu via kernel-team From: An Wu Reply-To: ChunAn Wu Cc: paolo.gentili@canonical.com Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2164507 VBT version 264 adds new fields associated to Xe3p_LPD's new ways of configuring SoC for TC ports and PHYs. Update the code to match the updates in VBT. The new field dedicated_external is used to represent TC ports that are connected to PHYs outside of the Type-C subsystem, meaning that they behave like dedicated ports and don't require the extra Type-C programming. In an upcoming change, we will update the driver to take this field into consideration when detecting the type of port. The new field dyn_port_over_tc is used to inform that the TC port can be dynamically allocated for a legacy connector in the Type-C subsystem, which is a new feature in Xe3p_LPD. In upcoming changes, we will use that field in order to handle the IOM resource management programming required for that. Note that, when dedicated_external is set, the fields dp_usb_type_c and tbt are tagged as "don't care" in the spec, so they should be ignored in that case, so also add a sanitization function to take care of forcing them to zero when dedicated_external is true. v2: - Use sanitization function to force dp_usb_type_c and tbt fields to be zero instead of adding a intel_bios_encoder_is_dedicated_external() check in each of their respective accessor functions. (Jani) - Print info about dedicated external ports in print_ddi_port(). (Jani) v3: - Also zero out field dyn_port_over_tc when dedicated_external is set. (Imre) - Use intel_bios_encoder_is_dedicated_external() directly instead of storing return value into variable in print_ddi_port(). (Imre) - Also print info for dyn_port_over_tc in print_ddi_port(). (Imre) Bspec: 20124, 68954, 74304 Cc: Imre Deak Cc: Jani Nikula Cc: Shekhar Chauhan Signed-off-by: Gustavo Sousa Reviewed-by: Imre Deak Link: https://patch.msgid.link/20251202012306.9315-2-matthew.s.atwood@intel.com Signed-off-by: Matt Roper (backported from commit 203c7904f2d85ac768749112ddedb522965316f9) [an: adjusted context for the Jammy 6.8 i915 VBT parser, which uses drm_i915_private rather than intel_display in this area.] Signed-off-by: ChunAn Wu --- drivers/gpu/drm/i915/display/intel_bios.c | 71 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_bios.h | 2 + drivers/gpu/drm/i915/display/intel_vbt_defs.h | 3 +- 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c index 9482ea78b0a7..edf2a159fb8a 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.c +++ b/drivers/gpu/drm/i915/display/intel_bios.c @@ -2514,6 +2514,54 @@ static void sanitize_hdmi_level_shift(struct intel_bios_encoder_data *devdata, } } +static void sanitize_dedicated_external(struct intel_bios_encoder_data *devdata, + enum port port) +{ + struct drm_i915_private *i915 = devdata->i915; + + if (!intel_bios_encoder_is_dedicated_external(devdata)) + return; + + /* + * Since dedicated_external is for ports connected to PHYs outside of + * the Type-C subsystem, clear bits that would only make sense for ports + * with PHYs in the Type-C subsystem. + */ + + /* + * Bit dp_usb_type_c is marked as "don't care" in Bspec when + * dedicated_external is set. + */ + if (devdata->child.dp_usb_type_c) { + drm_dbg_kms(&i915->drm, + "VBT claims Port %c supports USB Type-C, but the port is dedicated external, ignoring\n", + port_name(port)); + devdata->child.dp_usb_type_c = 0; + } + + /* + * Bit tbt is marked as "don't care" in Bspec when dedicated_external is + * set. + */ + if (devdata->child.tbt) { + drm_dbg_kms(&i915->drm, + "VBT claims Port %c supports TBT, but the port is dedicated external, ignoring\n", + port_name(port)); + devdata->child.tbt = 0; + } + + /* + * DDI allocation for TC capable ports only make sense for PHYs in the + * Type-C subsystem. + */ + if (devdata->child.dyn_port_over_tc) { + drm_dbg_kms(&i915->drm, + "VBT claims Port %c supports dynamic DDI allocation in TCSS, but the port is dedicated external, ignoring\n", + port_name(port)); + devdata->child.dyn_port_over_tc = 0; + } +} + static bool intel_bios_encoder_supports_crt(const struct intel_bios_encoder_data *devdata) { @@ -2635,6 +2683,16 @@ static void print_ddi_port(const struct intel_bios_encoder_data *devdata) supports_typec_usb, supports_tbt, devdata->dsc != NULL); + if (intel_bios_encoder_is_dedicated_external(devdata)) + drm_dbg_kms(&i915->drm, + "Port %c is dedicated external\n", + port_name(port)); + + if (intel_bios_encoder_supports_dyn_port_over_tc(devdata)) + drm_dbg_kms(&i915->drm, + "Port %c supports dynamic DDI allocation in TCSS\n", + port_name(port)); + hdmi_level_shift = intel_bios_hdmi_level_shift(devdata); if (hdmi_level_shift >= 0) { drm_dbg_kms(&i915->drm, @@ -2692,6 +2750,7 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata) return; } + sanitize_dedicated_external(devdata, port); sanitize_device_type(devdata, port); sanitize_hdmi_level_shift(devdata, port); } @@ -3647,6 +3706,18 @@ bool intel_bios_encoder_supports_tbt(const struct intel_bios_encoder_data *devda return devdata->i915->display.vbt.version >= 209 && devdata->child.tbt; } +bool intel_bios_encoder_is_dedicated_external(const struct intel_bios_encoder_data *devdata) +{ + return devdata->i915->display.vbt.version >= 264 && + devdata->child.dedicated_external; +} + +bool intel_bios_encoder_supports_dyn_port_over_tc(const struct intel_bios_encoder_data *devdata) +{ + return devdata->i915->display.vbt.version >= 264 && + devdata->child.dyn_port_over_tc; +} + bool intel_bios_encoder_lane_reversal(const struct intel_bios_encoder_data *devdata) { return devdata && devdata->child.lane_reversal; diff --git a/drivers/gpu/drm/i915/display/intel_bios.h b/drivers/gpu/drm/i915/display/intel_bios.h index 49e24b7cf675..0142f971cfdc 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.h +++ b/drivers/gpu/drm/i915/display/intel_bios.h @@ -263,6 +263,8 @@ bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdat bool intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata); bool intel_bios_encoder_supports_typec_usb(const struct intel_bios_encoder_data *devdata); bool intel_bios_encoder_supports_tbt(const struct intel_bios_encoder_data *devdata); +bool intel_bios_encoder_is_dedicated_external(const struct intel_bios_encoder_data *devdata); +bool intel_bios_encoder_supports_dyn_port_over_tc(const struct intel_bios_encoder_data *devdata); bool intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata); bool intel_bios_encoder_supports_dp_dual_mode(const struct intel_bios_encoder_data *devdata); bool intel_bios_encoder_is_lspcon(const struct intel_bios_encoder_data *devdata); diff --git a/drivers/gpu/drm/i915/display/intel_vbt_defs.h b/drivers/gpu/drm/i915/display/intel_vbt_defs.h index b50cd0dcabda..580bc8d40ebc 100644 --- a/drivers/gpu/drm/i915/display/intel_vbt_defs.h +++ b/drivers/gpu/drm/i915/display/intel_vbt_defs.h @@ -477,7 +477,8 @@ struct child_device_config { u8 dvo_function; u8 dp_usb_type_c:1; /* 195+ */ u8 tbt:1; /* 209+ */ - u8 flags2_reserved:2; /* 195+ */ + u8 dedicated_external:1; /* 264+ */ + u8 dyn_port_over_tc:1; /* 264+ */ u8 dp_port_trace_length:4; /* 209+ */ u8 dp_gpio_index; /* 195+ */ u16 dp_gpio_pin_num; /* 195+ */ From patchwork Wed Aug 26 01:49:06 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: An Wu X-Patchwork-Id: 2292327 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hV6yj634Sz1xtN for ; Wed, 26 Aug 2026 11:49:33 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1wz2la-0005YP-Qo; Wed, 26 Aug 2026 01:49:26 +0000 Received: from smtp-relay-internal-1.internal ([10.131.114.114] helo=smtp-relay-internal-1.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1wz2lZ-0005XD-1e for kernel-team@lists.ubuntu.com; Wed, 26 Aug 2026 01:49:25 +0000 Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) (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) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id E3D3C3F131 for ; Wed, 26 Aug 2026 01:49:24 +0000 (UTC) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-38ff2cd7b76so127330a91.2 for ; Tue, 25 Aug 2026 18:49:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787708963; x=1788313763; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Yn9trGHhzld3SPaKfmKGybaWw/EaolOK+m9crnd2Wfo=; b=s/WgdsU0KGuOkwkKKoOZvyv2saEJhDzcogJVDLR+KlfyTp3upPCZZtb+Neq4t8sCYt YAujxskWEgpIVu/pd8E03yxIKvx9FbymRv0dOnKbpN7nfGBdAQ61JRQzeMEHBF85BqFl i3y3SjOlTe8NJV7oUMWBe0BqBUDbYbdWH4CUlT+uaouCrE4WYWbqnMSH5HziGSB62YHn YqdkKv02+Vj4LxYepgLTUWljVx6nEtt5joGQcsBURKfR06ynJmgWV/au07rr3PUF0d3v do4scZAJV07CaE2yqje8SjOcnFe6USGH1qqkIKOdtERgCkQag5hvMknksO2c0gh+N7mQ C52w== X-Gm-Message-State: AFuF++mbiUKSYVNxLCN9Wqls6i5DrnpmUkNc7fNEm9Bsxpw7uZ9/6XnD jf+k8ShFFn16irD8IU4EuaJ7nqOHOjcKvVTXmmqYZkAnXjKUr//A7lxwxxTDSYRnQyoD2CIIhzo Qtt5hX8f2iOAozlTIm0X9KPEvvwpiLIhQBzwEP9bOzLuI36x09cU4T5tmLFFXzM7QkBpnDXDQTf V/T7I8syvBNxE3usNN X-Gm-Gg: AR+sD120vMrq8jwaUURzDsM/qOuezSLHOBXmYrliatiN5TbPsVvSyFvU1QE1Ecr6lYM zoP3g32as/K09KDX5od3tyrAnj1/yr7WzdYe8NLXTAliGCv9PAtuviT0UCp9n5BsqlftcCQtU+r DAJmooi3K0zL+adAidB+2OF8v6KeBrwEY5IdF4auLMF+v+Zfpa2L760cNVHMlnaE5/8Qj3ZNuN+ mi8B8IXhvvKDC+2fpz3tg3azOMFx+Cg/VZ8unDiwGIK6l4M/PdOJ4i6XgsqpuGWz5uwx5JiP8zN /8qU4lzySbOJLxzjrIqlbdBUMI9VyskEMjHvM6ehLq7yJna5kHHjOlLGZxG6CYNZ6t/xODn23PK s9rMBD0HEsb9RhX931zOB18eWZHG0ZDDUgK9vgeCHFfc/dcABS42hinqLGBDKLokUZYtd6xkPy3 6bOpmgfuKipIO+7G2ReAZBNFNzu5K04DIJwPl5Kjqitj/HnnopGByTHI1yFU9+HW0STwY/HsS6F Bmo2l9BHdvoTZs+m5RDmSFq7OHq9H5ZuWIC+QIQT2ze X-Received: by 2002:a17:903:3bd0:b0:2cc:f4d4:29a0 with SMTP id d9443c01a7336-2d707b6aa0bmr21255495ad.3.1787708963409; Tue, 25 Aug 2026 18:49:23 -0700 (PDT) X-Received: by 2002:a17:903:3bd0:b0:2cc:f4d4:29a0 with SMTP id d9443c01a7336-2d707b6aa0bmr21255225ad.3.1787708963030; Tue, 25 Aug 2026 18:49:23 -0700 (PDT) Received: from an-XPS-15-9520.buildd (2001-b011-2008-e559-5718-5b76-35fc-d292.dynamic-ip6.hinet.net. [2001:b011:2008:e559:5718:5b76:35fc:d292]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d70493dfc0sm2961035ad.14.2026.08.25.18.49.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2026 18:49:22 -0700 (PDT) To: kernel-team@lists.ubuntu.com Subject: [SRU][J:linux-hwe-6.8][PATCH v2 2/2] drm/i915/display: Handle dedicated external ports in intel_encoder_is_tc() Date: Wed, 26 Aug 2026 09:49:06 +0800 Message-Id: <20260826014906.1472193-3-an.wu@canonical.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260826014906.1472193-1-an.wu@canonical.com> References: <20260826014906.1472193-1-an.wu@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: ChunAn Wu via kernel-team From: An Wu Reply-To: ChunAn Wu Cc: paolo.gentili@canonical.com Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/2164507 Starting with Xe3p_LPD, the VBT has a new field, called in the driver "dedicated_external", which tells that a Type-C capable port is physically connected to a PHY outside of the Type-C subsystem. When that's the case, the driver must not do the extra Type-C programming for that port. Update intel_encoder_is_tc() to check for that case. While at it, add a note to intel_phy_is_tc() to remind us that it is about whether the respective port is a Type-C capable port rather than the PHY itself. (Maybe it would be a nice idea to rename intel_phy_is_tc()?) Note that this was handled with a new bool member added to struct intel_digital_port instead of having querying the VBT directly because VBT memory is freed (intel_bios_driver_remove) before encoder cleanup (intel_ddi_encoder_destroy), which would cause an oops to happen when the latter calls intel_encoder_is_tc(). This could be fixed by keeping VBT data around longer, but that's left for a follow-up work, if deemed necessary. v2: - Drop printing info about dedicated external, now that we are doing it when parsing the VBT. (Jani) - Add a FIXME comment on the code explaining why we need to store dedicated_external in struct intel_digital_port. (Jani) v3: - Simplify the code by using NULL check for dig_port to avoid using intel_encoder_is_dig_port(). (Imre) Cc: Imre Deak Cc: Jani Nikula Cc: Shekhar Chauhan Signed-off-by: Gustavo Sousa Reviewed-by: Imre Deak Link: https://patch.msgid.link/20251202012306.9315-4-matthew.s.atwood@intel.com Signed-off-by: Matt Roper (backported from commit df5dd52a6de486e32576ac5851b4e9429182274b) [an: adjusted context for Jammy 6.8 and added guards for the observed 6.8 shutdown panic path where intel_phy_is_tc() is true but dig_port->tc is NULL. Without these guards, fbcon restore during shutdown can still enter TC mode/DPLL handling and dereference dig_port->tc.] Signed-off-by: ChunAn Wu --- drivers/gpu/drm/i915/display/intel_ddi.c | 11 +++++++++++ drivers/gpu/drm/i915/display/intel_display.c | 4 ++++ .../gpu/drm/i915/display/intel_display_types.h | 1 + drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 15 +++++++++++++-- drivers/gpu/drm/i915/display/intel_tc.c | 2 +- 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 2a506489d030..8a5122f6e20d 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -4951,6 +4951,17 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, encoder = &dig_port->base; encoder->devdata = devdata; + /* + * FIXME: We currently need to store dedicated_external because devdata + * does not live long enough for when intel_encoder_is_tc() is called on + * the unbind path. This needs to be fixed by making sure that the VBT + * data is kept long enough, so that + * intel_bios_encoder_is_dedicated_external() can be called directly + * from intel_encoder_is_tc(). + */ + if (intel_bios_encoder_is_dedicated_external(devdata)) + dig_port->dedicated_external = true; + if (DISPLAY_VER(dev_priv) >= 13 && port >= PORT_D_XELPD) { drm_encoder_init(&dev_priv->drm, &encoder->base, &intel_ddi_funcs, DRM_MODE_ENCODER_TMDS, diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index d50f4a170746..cb7ed0c2d121 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -1940,6 +1940,10 @@ bool intel_encoder_is_snps(struct intel_encoder *encoder) bool intel_encoder_is_tc(struct intel_encoder *encoder) { struct drm_i915_private *i915 = to_i915(encoder->base.dev); + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); + + if (dig_port && dig_port->dedicated_external) + return false; return intel_phy_is_tc(i915, intel_encoder_to_phy(encoder)); } diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index 9910860c7eb1..ad09ad13f762 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -1875,6 +1875,7 @@ struct intel_digital_port { struct intel_lspcon lspcon; enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool); bool release_cl2_override; + bool dedicated_external; u8 max_lanes; /* Used for DP and ICL+ TypeC/DP and TypeC/HDMI ports. */ enum aux_ch aux_ch; diff --git a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c index fa4a142b4369..a50de7bb162b 100644 --- a/drivers/gpu/drm/i915/display/intel_dpll_mgr.c +++ b/drivers/gpu/drm/i915/display/intel_dpll_mgr.c @@ -3386,6 +3386,13 @@ static int icl_get_tc_phy_dplls(struct intel_atomic_state *state, return ret; } +static bool icl_encoder_has_tc_port(struct intel_encoder *encoder) +{ + struct intel_digital_port *dig_port = enc_to_dig_port(encoder); + + return dig_port && dig_port->tc; +} + static int icl_compute_dplls(struct intel_atomic_state *state, struct intel_crtc *crtc, struct intel_encoder *encoder) @@ -3395,8 +3402,10 @@ static int icl_compute_dplls(struct intel_atomic_state *state, if (intel_phy_is_combo(i915, phy)) return icl_compute_combo_phy_dpll(state, crtc); - else if (intel_phy_is_tc(i915, phy)) + else if (intel_phy_is_tc(i915, phy) && icl_encoder_has_tc_port(encoder)) return icl_compute_tc_phy_dplls(state, crtc); + else if (intel_phy_is_tc(i915, phy)) + return icl_compute_combo_phy_dpll(state, crtc); MISSING_CASE(phy); @@ -3412,8 +3421,10 @@ static int icl_get_dplls(struct intel_atomic_state *state, if (intel_phy_is_combo(i915, phy)) return icl_get_combo_phy_dpll(state, crtc, encoder); - else if (intel_phy_is_tc(i915, phy)) + else if (intel_phy_is_tc(i915, phy) && icl_encoder_has_tc_port(encoder)) return icl_get_tc_phy_dplls(state, crtc, encoder); + else if (intel_phy_is_tc(i915, phy)) + return icl_get_combo_phy_dpll(state, crtc, encoder); MISSING_CASE(phy); diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c index 2fce14389787..de226e00fd08 100644 --- a/drivers/gpu/drm/i915/display/intel_tc.c +++ b/drivers/gpu/drm/i915/display/intel_tc.c @@ -105,7 +105,7 @@ static bool intel_tc_port_in_mode(struct intel_digital_port *dig_port, enum phy phy = intel_port_to_phy(i915, dig_port->base.port); struct intel_tc_port *tc = to_tc_port(dig_port); - return intel_phy_is_tc(i915, phy) && tc->mode == mode; + return intel_phy_is_tc(i915, phy) && tc && tc->mode == mode; } bool intel_tc_port_in_tbt_alt_mode(struct intel_digital_port *dig_port)