From patchwork Wed Mar 22 13:25:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Woodhouse X-Patchwork-Id: 742032 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vp9S62zqKz9s7f for ; Thu, 23 Mar 2017 00:26:14 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=infradead.org header.i=@infradead.org header.b="k1i3sNzl"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759815AbdCVN0M (ORCPT ); Wed, 22 Mar 2017 09:26:12 -0400 Received: from bombadil.infradead.org ([65.50.211.133]:59670 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934437AbdCVNZy (ORCPT ); Wed, 22 Mar 2017 09:25:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Sender:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Cc:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=2R0UL1OLG1D9/drLhWQP6ptZ5BWNZxcAQOctdB0yGzk=; b=k1i3sNzlthPK+5Msw8/HRUG/3 PUFr+XvMUJmnyq13og/M/t80ppy1w5i0khsAw6BkMriPKOzRgaH4aOIuPKYXDmy1IiTRpyhAA1rSR b6XcT/9n3z5BPE5iV4iZ9QL/7eW2DNWUk1rZRfkj1Pabj/hCMFOulLA7IuY7uuy+iGIWE5/OTASq0 uEtUsFqyBTzm6YC8VkzeDIq9bYk7JgQaj1viJP4YQdc7wgcwec+4WrsSva4Xka9W45Ux3JGX+2HRW sPj1601pOmmKAx+zICUlKgxtrU0GB7aA/uzT3AAiZa6HAvutYgncmXt9xp5suuYojROIsVFgqIMaY IMtGr2o8Q==; Received: from i7.infradead.org ([90.155.92.213]) by bombadil.infradead.org with esmtpsa (Exim 4.87 #1 (Red Hat Linux)) id 1cqgGa-000721-Q4; Wed, 22 Mar 2017 13:25:32 +0000 Received: from dwoodhou by i7.infradead.org with local (Exim 4.87 #1 (Red Hat Linux)) id 1cqgGZ-0005qd-5w; Wed, 22 Mar 2017 13:25:31 +0000 From: David Woodhouse To: linux-pci@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 06/17] pci: Add HAVE_PCI_MMAP_IO to architectures which can mmap() I/O space Date: Wed, 22 Mar 2017 13:25:20 +0000 Message-Id: <42237243c5aa180dd305769d06079d5842aeb32a.1490188942.git.dwmw2@infradead.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: References: In-Reply-To: References: X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: David Woodhouse This is relatively esoteric, and knowing that we don't have it makes life easier in some cases rather than just an eventual -EINVAL from pci_mmap_page_range(). Signed-off-by: David Woodhouse --- arch/microblaze/include/asm/pci.h | 3 ++- arch/powerpc/include/asm/pci.h | 1 + arch/sparc/include/asm/pci_64.h | 1 + arch/xtensa/include/asm/pci.h | 1 + drivers/pci/pci-sysfs.c | 14 +++++++++----- drivers/pci/proc.c | 10 ++++++++-- 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/arch/microblaze/include/asm/pci.h b/arch/microblaze/include/asm/pci.h index ab381d2..41f5986 100644 --- a/arch/microblaze/include/asm/pci.h +++ b/arch/microblaze/include/asm/pci.h @@ -48,7 +48,8 @@ extern int pci_proc_domain(struct pci_bus *bus); struct vm_area_struct; /* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ -#define HAVE_PCI_MMAP 1 +#define HAVE_PCI_MMAP 1 +#define HAVE_PCI_MMAP_IO 1 extern int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val, size_t count); diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h index 55887d1..849a7dd 100644 --- a/arch/powerpc/include/asm/pci.h +++ b/arch/powerpc/include/asm/pci.h @@ -80,6 +80,7 @@ struct vm_area_struct; /* Tell drivers/pci/proc.c that we have pci_mmap_page_range() and it does WC */ #define HAVE_PCI_MMAP 1 +#define HAVE_PCI_MMAP_IO 1 #define arch_can_pci_mmap_wc() 1 extern int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val, diff --git a/arch/sparc/include/asm/pci_64.h b/arch/sparc/include/asm/pci_64.h index 516fda7..4fe2f05 100644 --- a/arch/sparc/include/asm/pci_64.h +++ b/arch/sparc/include/asm/pci_64.h @@ -42,6 +42,7 @@ static inline int pci_proc_domain(struct pci_bus *bus) /* Platform support for /proc/bus/pci/X/Y mmap()s. */ #define HAVE_PCI_MMAP +#define HAVE_PCI_MMAP_IO #define HAVE_ARCH_PCI_GET_UNMAPPED_AREA #define get_pci_unmapped_area get_fb_unmapped_area diff --git a/arch/xtensa/include/asm/pci.h b/arch/xtensa/include/asm/pci.h index e594eee..e4c1b43e 100644 --- a/arch/xtensa/include/asm/pci.h +++ b/arch/xtensa/include/asm/pci.h @@ -48,6 +48,7 @@ struct pci_dev; /* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ #define HAVE_PCI_MMAP 1 +#define HAVE_PCI_MMAP_IO 1 /* This was wrapped in #if 0 since the first merge of xtensa support... #define arch_can_pci_mmap_wc() 1 diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index cf2c7d8..07cb2fc 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -1174,11 +1174,15 @@ static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine) } else { pdev->res_attr[num] = res_attr; sprintf(res_attr_name, "resource%d", num); - res_attr->mmap = pci_mmap_resource_uc; - } - if (pci_resource_flags(pdev, num) & IORESOURCE_IO) { - res_attr->read = pci_read_resource_io; - res_attr->write = pci_write_resource_io; + if (pci_resource_flags(pdev, num) & IORESOURCE_IO) { + res_attr->read = pci_read_resource_io; + res_attr->write = pci_write_resource_io; +#ifdef HAVE_PCI_MMAP_IO + res_attr->mmap = pci_mmap_resource_uc; +#endif + } else { + res_attr->mmap = pci_mmap_resource_uc; + } } res_attr->attr.name = res_attr_name; res_attr->attr.mode = S_IRUSR | S_IWUSR; diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index c49be71..f387231 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c @@ -200,11 +200,12 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd, ret = pci_domain_nr(dev->bus); break; -#ifdef HAVE_PCI_MMAP +#ifdef HAVE_PCI_MMAP_IO case PCIIOC_MMAP_IS_IO: fpriv->mmap_state = pci_mmap_io; break; - +#endif +#ifdef HAVE_PCI_MMAP case PCIIOC_MMAP_IS_MEM: fpriv->mmap_state = pci_mmap_mem; break; @@ -239,6 +240,11 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma) if (!capable(CAP_SYS_RAWIO)) return -EPERM; +#ifndef HAVE_PCI_MMAP_IO + if (fpriv->mmap_state == pci_mmap_io) + return -EINVAL; +#endif + if (fpriv->mmap_state == pci_mmap_io) res_bit = IORESOURCE_IO; else