Received: by 10.192.165.148 with SMTP id m20csp829815imm; Fri, 27 Apr 2018 08:10:18 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqmFq4GCsgRZo4mUSrV0cvJnllg5r6SFq5+VlCYc9nB+iEUKx3B+Uch8/xUsTvxpTlG81xO X-Received: by 2002:a65:534a:: with SMTP id w10-v6mr2466018pgr.76.1524841818370; Fri, 27 Apr 2018 08:10:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524841818; cv=none; d=google.com; s=arc-20160816; b=YSL0ivcFWmJX9MNBpGn/S10P2Fm9x75aVNc5AM4V/NKOeBzrU9vq8fzLmL+H/wlLRq vNAth4neMWT7skBeJSCztn9R21MDq6SKei9sH+83360zIfPf3L3CshFE3ceM7yo25vNt 3QK4sdxBvevxEOmFOvXtijeQBxuwcwpfF8q7z2rKx6McDP4xolyQdnDGXzENK4WbDnvU 83pW0Jng31YGpqH4jaJxsREJd5EC5MqSW7q1hlq5MKSPSAJ8CGXgY5W5/TzBuHJ8kGg8 jTjVPfP7RfrjhBjAvHhmHMBOsn7OZO9cJx1n0kRKQ+SXghuwXvzozLNz3W0oC12v1Bty Jbyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition :content-transfer-encoding:mime-version:robot-unsubscribe:robot-id :git-commit-id:subject:to:references:in-reply-to:reply-to:cc :message-id:from:date:arc-authentication-results; bh=j9tc67TRYd+BVZk5asTH3hblMefauAZ5HHjjJ4U22E4=; b=THCt6MnvePoKtJdl0aOhJ8hC/xgzGwPfa0wfIOrvQ3jjUiO7RfLL+Jl3b0rgqvulxi YTLk/agkfl7xivLIHclaCHI+nnbOnSac1TPRI8Gw8DAjcI1vLXbW0KsiE+KZZGsYjF8+ QjdgFMes8nAjZHD0WoFpcESRLoGRBPnA+mg7G7teIrysIA8O58boTMMvQuFeClpoL+L1 +P3X4t6aYjLDwjjFoPQFoUT1ORnb77x1l6W1z1PAAY6bzvh3STwmKev9d8xt08V1xc3m 97526lTdIUDrd/RfXX8c/wVikZtkvKsl0GcVFr+7wDXS0KKK2ReUNsR8PCp7MF2Q3YKI UavA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f7-v6si1322491pgq.207.2018.04.27.08.10.04; Fri, 27 Apr 2018 08:10:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933915AbeD0PI7 (ORCPT + 99 others); Fri, 27 Apr 2018 11:08:59 -0400 Received: from terminus.zytor.com ([198.137.202.136]:41687 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933714AbeD0PI4 (ORCPT ); Fri, 27 Apr 2018 11:08:56 -0400 Received: from terminus.zytor.com (localhost [127.0.0.1]) by terminus.zytor.com (8.15.2/8.15.2) with ESMTP id w3RF6mba2331052; Fri, 27 Apr 2018 08:06:48 -0700 Received: (from tipbot@localhost) by terminus.zytor.com (8.15.2/8.15.2/Submit) id w3RF6mmO2331049; Fri, 27 Apr 2018 08:06:48 -0700 Date: Fri, 27 Apr 2018 08:06:48 -0700 X-Authentication-Warning: terminus.zytor.com: tipbot set sender to tipbot@zytor.com using -f From: tip-bot for Rajneesh Bhardwaj Message-ID: Cc: hpa@zytor.com, mingo@kernel.org, andriy.shevchenko@linux.intel.com, rajneesh.bhardwaj@intel.com, anshuman.gupta@intel.com, tglx@linutronix.de, alan@linux.intel.com, linux-kernel@vger.kernel.org Reply-To: alan@linux.intel.com, linux-kernel@vger.kernel.org, andriy.shevchenko@linux.intel.com, rajneesh.bhardwaj@intel.com, anshuman.gupta@intel.com, tglx@linutronix.de, hpa@zytor.com, mingo@kernel.org In-Reply-To: <1522336015-22994-1-git-send-email-anshuman.gupta@intel.com> References: <1522336015-22994-1-git-send-email-anshuman.gupta@intel.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/dma] x86/i8237: Register device based on FADT legacy boot flag Git-Commit-ID: f79b1c573cb4dc551919f81ed5797419f6fc1f3a X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on terminus.zytor.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: f79b1c573cb4dc551919f81ed5797419f6fc1f3a Gitweb: https://git.kernel.org/tip/f79b1c573cb4dc551919f81ed5797419f6fc1f3a Author: Rajneesh Bhardwaj AuthorDate: Thu, 29 Mar 2018 20:36:55 +0530 Committer: Thomas Gleixner CommitDate: Fri, 27 Apr 2018 16:44:29 +0200 x86/i8237: Register device based on FADT legacy boot flag From Skylake onwards, the platform controller hub (Sunrisepoint PCH) does not support legacy DMA operations to IO ports 81h-83h, 87h, 89h-8Bh, 8Fh. Currently this driver registers as syscore ops and its resume function is called on every resume from S3. On Skylake and Kabylake, this causes a resume delay of around 100ms due to port IO operations, which is a problem. This change allows to load the driver only when the platform bios explicitly supports such devices or has a cut-off date earlier than 2017 due to the following reasons: - The platforms released before year 2017 have support for the 8237. (except Sunrisepoint PCH e.g. Skylake) - Some of the BIOS that were released for platforms (Skylake, Kabylake) during 2016-17 are buggy. These BIOS do not set/unset the ACPI_FADT_LEGACY_DEVICES field in FADT table properly based on the presence or absence of the DMA device. Very recently, open source system firmware like coreboot started unsetting ACPI_FADT_LEGACY_DEVICES field in FADT table if the 8237 DMA device is not present on the PCH. Please refer to chapter 21 of 6th Generation Intel® Core™ Processor Platform Controller Hub Family: BIOS Specification. Signed-off-by: Rajneesh Bhardwaj Signed-off-by: Anshuman Gupta Signed-off-by: Thomas Gleixner Reviewed-by: Andy Shevchenko Cc: rjw@rjwysocki.net Cc: hpa@zytor.com Cc: Alan Cox Link: https://lkml.kernel.org/r/1522336015-22994-1-git-send-email-anshuman.gupta@intel.com --- arch/x86/include/asm/x86_init.h | 1 + arch/x86/kernel/i8237.c | 25 +++++++++++++++++++++++++ arch/x86/kernel/platform-quirks.c | 7 ++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index ce8b4da07e35..db98e3ab3295 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -301,5 +301,6 @@ extern struct x86_apic_ops x86_apic_ops; extern void x86_early_init_platform_quirks(void); extern void x86_init_noop(void); extern void x86_init_uint_noop(unsigned int unused); +extern bool x86_pnpbios_disabled(void); #endif diff --git a/arch/x86/kernel/i8237.c b/arch/x86/kernel/i8237.c index 8eeaa81de066..0a3e70fd00d6 100644 --- a/arch/x86/kernel/i8237.c +++ b/arch/x86/kernel/i8237.c @@ -9,10 +9,12 @@ * your option) any later version. */ +#include #include #include #include +#include /* * This module just handles suspend/resume issues with the @@ -49,6 +51,29 @@ static struct syscore_ops i8237_syscore_ops = { static int __init i8237A_init_ops(void) { + /* + * From SKL PCH onwards, the legacy DMA device is removed in which the + * I/O ports (81h-83h, 87h, 89h-8Bh, 8Fh) related to it are removed + * as well. All removed ports must return 0xff for a inb() request. + * + * Note: DMA_PAGE_2 (port 0x81) should not be checked for detecting + * the presence of DMA device since it may be used by BIOS to decode + * LPC traffic for POST codes. Original LPC only decodes one byte of + * port 0x80 but some BIOS may choose to enhance PCH LPC port 0x8x + * decoding. + */ + if (dma_inb(DMA_PAGE_0) == 0xFF) + return -ENODEV; + + /* + * It is not required to load this driver as newer SoC may not + * support 8237 DMA or bus mastering from LPC. Platform firmware + * must announce the support for such legacy devices via + * ACPI_FADT_LEGACY_DEVICES field in FADT table. + */ + if (x86_pnpbios_disabled() && dmi_get_bios_year() >= 2017) + return -ENODEV; + register_syscore_ops(&i8237_syscore_ops); return 0; } diff --git a/arch/x86/kernel/platform-quirks.c b/arch/x86/kernel/platform-quirks.c index 235fe6008ac8..b348a672f71d 100644 --- a/arch/x86/kernel/platform-quirks.c +++ b/arch/x86/kernel/platform-quirks.c @@ -33,9 +33,14 @@ void __init x86_early_init_platform_quirks(void) x86_platform.set_legacy_features(); } +bool __init x86_pnpbios_disabled(void) +{ + return x86_platform.legacy.devices.pnpbios == 0; +} + #if defined(CONFIG_PNPBIOS) bool __init arch_pnpbios_disabled(void) { - return x86_platform.legacy.devices.pnpbios == 0; + return x86_pnpbios_disabled(); } #endif