Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp4447782ybi; Mon, 27 May 2019 18:55:41 -0700 (PDT) X-Google-Smtp-Source: APXvYqwQ/JUVj0pEtp1PrGXEQQfjIA2g5EkgGdNaSyDxOQMpDxSTfF95wkDELdRZhB71dczYES2w X-Received: by 2002:a17:902:d70c:: with SMTP id w12mr81696801ply.95.1559008541630; Mon, 27 May 2019 18:55:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559008541; cv=none; d=google.com; s=arc-20160816; b=SFkH+QC8rTePLFM0TPyqIkFyjQg2GZno+vq4NaF9dMJQWEh2Ak9OJdi6nqdd3/3O4+ 8feUlxXPty/vBQWvnODM3Rnq0R/qo3/POePhJDrqTpJoqPxbRqeByV8Vbmzw78gSN6k6 62v6++zf1vbAcoeYXy54fE6KFrZSzXpzzmJNdrx8pUMmJpCJoCOs1H5d1FOtbHJ4UW7o GOEsVr0eI9YINmu20pBLbee0EZki8YuiAx9/bIfYpkCI8SFctF3z/m+THFQlPtCxD+rK 71jkXUK96NW5zF8bFw8NpneKmRx4AmcQmHcai3ms4RmF+9qZY3bV7wMAKhkqJQfrwUsx wjZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=JLPclwTSwCcU8aM0d/Ir7tZK51JmrIP9D9fNR/dDUAI=; b=hlOFtP8GxKhGwVDFPMAp+maBloguX46JLsaWD/sVvpWsmIgEbY1DApN0Whwd7DRwgK Ob010QjytP0Vvjh/5gwS5JBkH68Ye/hdFP34Wg9jTyd4fUOAYkFUOw8dNQOQGe2P0nf6 QIQJXJZOah+IZRKvWh6MMMnbFvYnbJSijx2sr0FRdNRVVdYlTFmAxWQSCoYJzhvUmDnV U2ATH+j5uNPONe9I/3iLY8I8foPUNiTlNLEmuj1xecgCKnj6Rudznkgb6ERBPneHyMdc n5c3zzQx47x5CBmXdWDyDk/BMldgxZ3Ox2RgCgG3R1qsDcfUHYFYgbOW2AevIx1WmoED aUgQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@anastas.io header.s=mail header.b=hyf9Q8Z6; 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; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=anastas.io Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f6si16053998pgm.502.2019.05.27.18.55.26; Mon, 27 May 2019 18:55:41 -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; dkim=fail header.i=@anastas.io header.s=mail header.b=hyf9Q8Z6; 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; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=anastas.io Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727914AbfE1ByV (ORCPT + 99 others); Mon, 27 May 2019 21:54:21 -0400 Received: from alpha.anastas.io ([104.248.188.109]:35907 "EHLO alpha.anastas.io" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727890AbfE1ByV (ORCPT ); Mon, 27 May 2019 21:54:21 -0400 Received: from authenticated-user (alpha.anastas.io [104.248.188.109]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by alpha.anastas.io (Postfix) with ESMTPSA id 4DE997F8F9; Mon, 27 May 2019 20:54:19 -0500 (CDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=anastas.io; s=mail; t=1559008460; bh=S+yWBPX56gfd9GxiSJQNtc5ODUe0FOjbu3z+0qj/29c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hyf9Q8Z6xg0ysEC/qTcXj7HEMeWHbzE0s06MANDXAnsuBi38wlXhQrGcK6vLLNIm0 Y7IgJ4MStJzZB4qAMay5MRaL4bzraWcNmTOO8iZ2dZ/n0f2MKd788Hp6wWhouURh0m OnDXjA1OqKWM7kf30vLOmIwpeXTZpZxmVtLpRpOEjZoz8t08xKPJNwAEZjlGdH6um+ xokMNSqeVrqVt4LU6bQdfkv4JnM8c7i2Mn/KaQHuJWAQCc1a19PKGKmPFnwdzOmsNu kPwTvvbkypcduuXoNdARh2upcVQxQccxneXayHdxQ4c7R2JmuPJ11hkKOp0qyfoYkv VwOK6mi0QWWaA== From: Shawn Anastasio To: linux-pci@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Cc: bhelgaas@google.com, benh@kernel.crashing.org, paulus@samba.org, mpe@ellerman.id.au, sbobroff@linux.ibm.com, xyjxie@linux.vnet.ibm.com, rppt@linux.ibm.com, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] powerpc/pseries: Allow user-specified PCI resource alignment after init Date: Mon, 27 May 2019 20:54:12 -0500 Message-Id: <20190528015412.30521-4-shawn@anastas.io> In-Reply-To: <20190528015412.30521-1-shawn@anastas.io> References: <20190528015412.30521-1-shawn@anastas.io> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On pseries, custom PCI resource alignment specified with the commandline argument pci=resource_alignment is disabled due to PCI resources being managed by the firmware. However, in the case of PCI hotplug the resources are managed by the kernel, so custom alignments should be honored in these cases. This is done by only honoring custom alignments after initial PCI initialization is done, to ensure that all devices managed by the firmware are excluded. Without this ability, sub-page BARs sometimes get mapped in between page boundaries for hotplugged devices and are therefore unusable with the VFIO framework. This change allows users to request page alignment for devices they wish to access via VFIO using the pci=resource_alignment commandline argument. In the future, this could be extended to provide page-aligned resources by default for hotplugged devices, similar to what is done on powernv by commit 382746376993 ("powerpc/powernv: Override pcibios_default_alignment() to force PCI devices to be page aligned") Signed-off-by: Shawn Anastasio --- arch/powerpc/include/asm/machdep.h | 3 +++ arch/powerpc/kernel/pci-common.c | 9 +++++++++ arch/powerpc/platforms/pseries/setup.c | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index 2fbfaa9176ed..46eb62c0954e 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h @@ -179,6 +179,9 @@ struct machdep_calls { resource_size_t (*pcibios_default_alignment)(void); + /* Called when determining PCI resource alignment */ + int (*pcibios_ignore_alignment_request)(void); + #ifdef CONFIG_PCI_IOV void (*pcibios_fixup_sriov)(struct pci_dev *pdev); resource_size_t (*pcibios_iov_resource_alignment)(struct pci_dev *, int resno); diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index ff4b7539cbdf..1a6ded45a701 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -238,6 +238,15 @@ resource_size_t pcibios_default_alignment(void) return 0; } +resource_size_t pcibios_ignore_alignment_request(void) +{ + if (ppc_md.pcibios_ignore_alignment_request) + return ppc_md.pcibios_ignore_alignment_request(); + + /* Fall back to default method of checking PCI_PROBE_ONLY */ + return pci_has_flag(PCI_PROBE_ONLY); +} + #ifdef CONFIG_PCI_IOV resource_size_t pcibios_iov_resource_alignment(struct pci_dev *pdev, int resno) { diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index e4f0dfd4ae33..07f03be02afe 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c @@ -82,6 +82,8 @@ EXPORT_SYMBOL(CMO_PageSize); int fwnmi_active; /* TRUE if an FWNMI handler is present */ +static int initial_pci_init_done; /* TRUE if initial pcibios init has completed */ + static void pSeries_show_cpuinfo(struct seq_file *m) { struct device_node *root; @@ -749,6 +751,23 @@ static resource_size_t pseries_pci_iov_resource_alignment(struct pci_dev *pdev, } #endif +static void pseries_after_init(void) +{ + initial_pci_init_done = 1; +} + +static int pseries_ignore_alignment_request(void) +{ + if (initial_pci_init_done) + /* + * Allow custom alignments after init for things + * like PCI hotplugging. + */ + return 0; + + return pci_has_flag(PCI_PROBE_ONLY); +} + static void __init pSeries_setup_arch(void) { set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT); @@ -797,6 +816,9 @@ static void __init pSeries_setup_arch(void) } ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare; + ppc_md.pcibios_after_init = pseries_after_init; + ppc_md.pcibios_ignore_alignment_request = + pseries_ignore_alignment_request; } static void pseries_panic(char *str) -- 2.20.1