From patchwork Fri Feb 28 07:01:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 13995797 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 72579C282C5 for ; Fri, 28 Feb 2025 07:02:43 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 89DF210E2B5; Fri, 28 Feb 2025 07:02:42 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="fvvQVjWN"; dkim-atps=neutral Received: from mail-yw1-f180.google.com (mail-yw1-f180.google.com [209.85.128.180]) by gabe.freedesktop.org (Postfix) with ESMTPS id C85E910E217 for ; Fri, 28 Feb 2025 07:02:37 +0000 (UTC) Received: by mail-yw1-f180.google.com with SMTP id 00721157ae682-6fb95249855so15316257b3.2 for ; Thu, 27 Feb 2025 23:02:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740726156; x=1741330956; darn=lists.freedesktop.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=76hHvO8Bl/I0mjdoUJi3zSXk1/JY7P+qo7pgD6ZGcok=; b=fvvQVjWN2p+mTxmOtCvNPxBo8r25QUqR3RgyVzrg4gWuZt5Zb4PrEVQpsDvnCkZTR3 7VyIPt1yN9iiSYAueEQkEDOS5WHVOe6BOBAnMxyC0Yl5iYGST/3l3WO6fryhXDuqF+ZD QuRLgEmVFZJpAvc94h0ctwB4nrxElccbBdkpwaIYuvEX3/ZKjVfl7KOlarEoUibQjBwC EZbP4SBeRkLyDvw7Rm27tWxNopXa2G6XEhtNXgW3U7ElthhkzzPcr+n9LstVaElwm9xZ MxzBcF+6BYfKpIw9CxdVPinLnsq6yCk7vuXNDSk8OkINoGfYTvX/7Wk7tVW69y5muY3F VoEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740726156; x=1741330956; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=76hHvO8Bl/I0mjdoUJi3zSXk1/JY7P+qo7pgD6ZGcok=; b=shBA7o8WftJ2dw9sRWbyU/ZX3p0U8qXlzMWx9N0Fe6CyUdRn9mTIGEANMdtLdzMd34 C6IzdB6sblUpT1H7tMs53lWqzQE3coLS1/IIUr/HilL4BFJDjq/GBFvOyzE2bwjRWhim stt5I4lhB4VvmvfqWbkiTNJy8hyF3n4QauPse5FMOn3RjybE83FhTr41kYsxZnO6YJuV Hg/8C6T1NpokGr5iA6ZM/SN5VLWRKuxZNqrGXfikcjpp6YyaE0U3Y6ANxGasPNsXcaKl tlDZqRb6rp95UiDQAhGvTOdMLjgKqgAw9+SpjNSgu5O6GUptXzM5Zg3R+dYhWRgZNxo8 7yCw== X-Gm-Message-State: AOJu0YzfRN0IVy163C2h2DzvdQ+5y5B5REos+boi71AhP7m5gR03nUcp aSOvU8jep2JcgxhGTEiIzqacCWBdvgCMD5qcG/SXN/uVjL8WDxixLLzWXb9lHejUI8/xF4ilmYt delPr5w5sTHr+zi9bVAwSbMiJJvTpm96XlPfvx/Py X-Gm-Gg: ASbGncsPljsnkKNlclmzJVitinoTCfxtw5TAxuQ4qiIJcvOIWdD5eK7C/iWrQxO+YhM rJLejR411VVjGOszYrfSj47adeQumk8GM2nnmMaX44+vYtpsuiwMNY66TRXL/7V5KjnQMrrowDv o4sez1Gg== X-Google-Smtp-Source: AGHT+IEXwUKNMLWTcFkgF/HwwKHPAqsCZrvSPApYpxOXHMrSbQFrK13NQI2bYw5tu5JW/LseOfJAZNG1/TwUNrCFBk0= X-Received: by 2002:a05:690c:4b09:b0:6fd:43c5:4deb with SMTP id 00721157ae682-6fd4a129ee4mr27829097b3.25.1740726155566; Thu, 27 Feb 2025 23:02:35 -0800 (PST) MIME-Version: 1.0 From: "H.J. Lu" Date: Fri, 28 Feb 2025 15:01:59 +0800 X-Gm-Features: AQ5f1Jrko0Kj65XEUnfjnHcBCXGLBqu-LBdi1sS2ohyAZ8Q-P4yhZ25wdwZ_UtY Message-ID: Subject: [PATCH] drm/i915/bios: Workaround broken video BIOS in LG Gram 2021 To: Intel Graphics Development X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" LG Gram 2021 laptop 17Z95P-K.ADE9U1 OpRegion has FW size: 0x2200 VBT size: 0x2000 BDB offset: 0x30 BDB size: 0x216e Add intel_init_opregion_quirks to use FW size as VBT size on LG Gram 17Z95P-K.ADE9U1 and update intel_bios_is_valid_vbt to use FW size, instead of VBT size if the quirk is applied, in range_overflows_t for BDB size overflow check. This fixes: https://gitlab.freedesktop.org/drm/intel/-/issues/4763 Signed-off-by: H.J. Lu From 228e4a56101adf299c8635c7cba900185b9256d0 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 7 Jun 2022 19:00:18 -0700 Subject: [PATCH] drm/i915/bios: Workaround broken video BIOS in LG Gram 2021 LG Gram 2021 laptop 17Z95P-K.ADE9U1 OpRegion has FW size: 0x2200 VBT size: 0x2000 BDB offset: 0x30 BDB size: 0x216e Add intel_init_opregion_quirks to use FW size as VBT size on LG Gram 17Z95P-K.ADE9U1 and update intel_bios_is_valid_vbt to use FW size, instead of VBT size if the quirk is applied, in range_overflows_t for BDB size overflow check. This fixes: https://gitlab.freedesktop.org/drm/intel/-/issues/4763 Signed-off-by: H.J. Lu --- drivers/gpu/drm/i915/display/intel_bios.c | 8 ++-- drivers/gpu/drm/i915/display/intel_opregion.c | 3 ++ drivers/gpu/drm/i915/display/intel_quirks.c | 40 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_quirks.h | 2 + 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c index e0e4e9b62d8d..bf4fb3ca617e 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.c +++ b/drivers/gpu/drm/i915/display/intel_bios.c @@ -39,6 +39,7 @@ #include "intel_display.h" #include "intel_display_types.h" #include "intel_gmbus.h" +#include "intel_quirks.h" #define _INTEL_BIOS_PRIVATE #include "intel_vbt_defs.h" @@ -2999,16 +3000,17 @@ bool intel_bios_is_valid_vbt(struct intel_display *display, return false; } - size = vbt->vbt_size; - if (range_overflows_t(size_t, vbt->bdb_offset, sizeof(struct bdb_header), - size)) { + vbt->vbt_size)) { drm_dbg_kms(display->drm, "BDB header incomplete\n"); return false; } + if (!intel_has_quirk(display, QUIRK_USE_FW_SIZE_AS_VBT_SIZE)) + size = vbt->vbt_size; + bdb = get_bdb_header(vbt); if (range_overflows_t(size_t, vbt->bdb_offset, bdb->bdb_size, size)) { drm_dbg_kms(display->drm, "BDB incomplete\n"); diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c index 0eaa6cd6fe80..b17c91a56ea5 100644 --- a/drivers/gpu/drm/i915/display/intel_opregion.c +++ b/drivers/gpu/drm/i915/display/intel_opregion.c @@ -38,6 +38,7 @@ #include "intel_display_types.h" #include "intel_opregion.h" #include "intel_pci_config.h" +#include "intel_quirks.h" #define OPREGION_HEADER_OFFSET 0 #define OPREGION_ACPI_OFFSET 0x100 @@ -969,6 +970,8 @@ int intel_opregion_setup(struct intel_display *display) if (dmi_check_system(intel_no_opregion_vbt)) goto out; + intel_init_opregion_quirks(display); + if (opregion->header->over.major >= 2 && opregion->asle && opregion->asle->rvda && opregion->asle->rvds) { resource_size_t rvda = opregion->asle->rvda; diff --git a/drivers/gpu/drm/i915/display/intel_quirks.c b/drivers/gpu/drm/i915/display/intel_quirks.c index 8b30e9fd936e..5a9d1d83cc78 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.c +++ b/drivers/gpu/drm/i915/display/intel_quirks.c @@ -166,6 +166,36 @@ static const struct intel_dmi_quirk intel_dmi_quirks[] = { }, }; +static void quirk_opregion_use_fw_size_as_vbt_size(struct intel_display *display) +{ + intel_set_quirk(display, QUIRK_USE_FW_SIZE_AS_VBT_SIZE); + drm_info(display->drm, "Applying FW size as VBT size quirk in OpRegion\n"); +} + +static int intel_dmi_opregion_use_fw_size_as_vbt_size(const struct dmi_system_id *id) +{ + DRM_INFO("Use FW size as VBT size on %s in OpRegion\n", id->ident); + return 1; +} + +static const struct intel_dmi_quirk intel_dmi_opregion_quirks[] = { + { + .dmi_id_list = &(const struct dmi_system_id[]) { + { + .callback = intel_dmi_opregion_use_fw_size_as_vbt_size, + .ident = "LG Gram 17Z95P-K.ADE9U1", + .matches = {DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LG Electronics"), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "17Z95P-K.ADE9U1"), + DMI_EXACT_MATCH(DMI_BIOS_VERSION, "T4ZF0040 X64"), + DMI_EXACT_MATCH(DMI_BIOS_DATE, "10/06/2021"), + }, + }, + { } + }, + .hook = quirk_opregion_use_fw_size_as_vbt_size, + }, +}; + static struct intel_quirk intel_quirks[] = { /* Lenovo U160 cannot use SSC on LVDS */ { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable }, @@ -296,3 +326,13 @@ bool intel_has_dpcd_quirk(struct intel_dp *intel_dp, enum intel_quirk_id quirk) { return intel_dp->quirks.mask & BIT(quirk); } + +void intel_init_opregion_quirks(struct intel_display *display) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(intel_dmi_opregion_quirks); i++) { + if (dmi_check_system(*intel_dmi_opregion_quirks[i].dmi_id_list) != 0) + intel_dmi_opregion_quirks[i].hook(display); + } +} diff --git a/drivers/gpu/drm/i915/display/intel_quirks.h b/drivers/gpu/drm/i915/display/intel_quirks.h index cafdebda7535..00a0abd09224 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.h +++ b/drivers/gpu/drm/i915/display/intel_quirks.h @@ -20,6 +20,7 @@ enum intel_quirk_id { QUIRK_LVDS_SSC_DISABLE, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK, QUIRK_FW_SYNC_LEN, + QUIRK_USE_FW_SIZE_AS_VBT_SIZE, }; void intel_init_quirks(struct intel_display *display); @@ -27,5 +28,6 @@ void intel_init_dpcd_quirks(struct intel_dp *intel_dp, const struct drm_dp_dpcd_ident *ident); bool intel_has_quirk(struct intel_display *display, enum intel_quirk_id quirk); bool intel_has_dpcd_quirk(struct intel_dp *intel_dp, enum intel_quirk_id quirk); +void intel_init_opregion_quirks(struct intel_display *display); #endif /* __INTEL_QUIRKS_H__ */ -- 2.48.1