Received: by 10.223.185.116 with SMTP id b49csp3726769wrg; Mon, 19 Feb 2018 05:05:53 -0800 (PST) X-Google-Smtp-Source: AH8x226q+wxXQwbmfBUFdTcsiyWvc0Cp0qc8pZyRe75CNhEIEdsuGta2CfgWk4SQ4WBT97fOp9iV X-Received: by 10.101.64.204 with SMTP id u12mr12362160pgp.280.1519045552971; Mon, 19 Feb 2018 05:05:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519045552; cv=none; d=google.com; s=arc-20160816; b=PO5rQyjQEJS3iWnGHMgf6AuFIROZGdKP9Y97vGUOVzw3tD6H8w+UpCRQYKlUbDXGc9 wDyfhLWII7RnPlMXUO4WqxRWh6dpYiBMTd30jatlri/PYxy/qPKlHTegb0IN0nb21tUm +G+r2sSm6TAU79fTieAcbAO3wk558P+eMgMSSs4BR6p12/3apWwROWKzdQZHILuQDzO3 eIa3KLtF8qFNdBsrO44yM1Ib1kG56unvYD4/XamT/uf5qUH8vUnn8aY1jo93Is029PyQ qp2j1cyZvsT8TIfmJVEMXUwrSF3B6eZHGPx9xHO+u7k4x3jR8WnLiaK0d+ggQ4ZC46Ra WSNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:to:from :dkim-signature:arc-authentication-results; bh=e5u6//cL8epxYclbfVGSSdvop28CE0dQImexA+e291Y=; b=XwcBKRd0OSIhF/5Tz4GtjUZaRHCS6UVpnu+83Ja4XK+Oa3V+JL0TxdRW8/e03RnEpx rgrE9woYZ9DvBOC+LU4SbJMt1ZMIwCBOewEWhauqwrKE7IErn6TsWHR2np7utBq97sBO WGE+tsp4GJOOof8mt0Q36m1sJjvROIq+wijWEuF8eLHLRh2gnlEYPzowoPp4YjjlI8j0 cu6Kj6zs3wmkb7sqFiqb7O43RMSUAr3NBKDZj9FlJijp2X+C1qXkCtmiQy0zwC7p6N3Y SGV70bEmIT2ilOy5/kT4B33dCPoSA8hQdvbf5oObJb0rHH7nxwfGygsS8dS72lBYkT5l b7jQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amazon.co.uk header.s=amazon201209 header.b=Okbw/Zra; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.co.uk Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 141si11138652pfz.106.2018.02.19.05.05.34; Mon, 19 Feb 2018 05:05:52 -0800 (PST) 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=pass header.i=@amazon.co.uk header.s=amazon201209 header.b=Okbw/Zra; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.co.uk Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752781AbeBSNE0 (ORCPT + 99 others); Mon, 19 Feb 2018 08:04:26 -0500 Received: from smtp-fw-33001.amazon.com ([207.171.190.10]:3704 "EHLO smtp-fw-33001.amazon.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752638AbeBSNEY (ORCPT ); Mon, 19 Feb 2018 08:04:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.co.uk; i=@amazon.co.uk; q=dns/txt; s=amazon201209; t=1519045464; x=1550581464; h=from:to:subject:date:message-id; bh=e5u6//cL8epxYclbfVGSSdvop28CE0dQImexA+e291Y=; b=Okbw/ZraRn55rXFeVNkB8/xdlfs02K0tqns8YymAktqVSjazKsWlxMJw uDVC5sRjWrWR6SjZBKsFjCZV0aAxvAddpdHetn2HyMfNNXlkodNM3ASeI 5ATyK8tEGXYlOdWLsEkcOTuAQjafx7WZmWjWJ4TpnjU8M+v6H+OEY+jU/ Q=; X-IronPort-AV: E=Sophos;i="5.46,535,1511827200"; d="scan'208";a="720365549" Received: from sea3-co-svc-lb6-vlan2.sea.amazon.com (HELO email-inbound-relay-1e-c7c08562.us-east-1.amazon.com) ([10.47.22.34]) by smtp-border-fw-out-33001.sea14.amazon.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 19 Feb 2018 13:04:23 +0000 Received: from uc8d3ff76b9bc5848a9cc.ant.amazon.com (iad1-ws-svc-lb91-vlan2.amazon.com [10.0.103.146]) by email-inbound-relay-1e-c7c08562.us-east-1.amazon.com (8.14.7/8.14.7) with ESMTP id w1JD4JLg041570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 19 Feb 2018 13:04:21 GMT Received: from uc8d3ff76b9bc5848a9cc.ant.amazon.com (localhost [127.0.0.1]) by uc8d3ff76b9bc5848a9cc.ant.amazon.com (8.15.2/8.15.2/Debian-3) with ESMTP id w1JD4IIY022693; Mon, 19 Feb 2018 13:04:18 GMT Received: (from dwmw@localhost) by uc8d3ff76b9bc5848a9cc.ant.amazon.com (8.15.2/8.15.2/Submit) id w1JD4HKs022689; Mon, 19 Feb 2018 13:04:17 GMT From: David Woodhouse To: davem@davemloft.net, sparclinux@vger.kernel.org, bhelgaas@google.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org Subject: [PATCH] sparc: Use generic pci_mmap_resource_range() Date: Mon, 19 Feb 2018 13:04:12 +0000 Message-Id: <1519045452-22645-1-git-send-email-dwmw@amazon.co.uk> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit f719582435 ("PCI: Add pci_mmap_resource_range() and use it for ARM64") added this generic function with the intent of using it everywhere and ultimately killing the old arch-specific implementations. Let's get on with that eradication... Signed-off-by: David Woodhouse --- arch/sparc/include/asm/pci_64.h | 1 + arch/sparc/kernel/pci.c | 155 ---------------------------------------- 2 files changed, 1 insertion(+), 155 deletions(-) diff --git a/arch/sparc/include/asm/pci_64.h b/arch/sparc/include/asm/pci_64.h index 671274e..95d41c8 100644 --- a/arch/sparc/include/asm/pci_64.h +++ b/arch/sparc/include/asm/pci_64.h @@ -43,6 +43,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 ARCH_GENERIC_PCI_MMAP_RESOURCE #define arch_can_pci_mmap_io() 1 #define HAVE_ARCH_PCI_GET_UNMAPPED_AREA #define get_pci_unmapped_area get_fb_unmapped_area diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index 220d0f3..1c1f632 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -721,161 +721,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) return 0; } -/* Platform support for /proc/bus/pci/X/Y mmap()s. */ - -/* If the user uses a host-bridge as the PCI device, he may use - * this to perform a raw mmap() of the I/O or MEM space behind - * that controller. - * - * This can be useful for execution of x86 PCI bios initialization code - * on a PCI card, like the xfree86 int10 stuff does. - */ -static int __pci_mmap_make_offset_bus(struct pci_dev *pdev, struct vm_area_struct *vma, - enum pci_mmap_state mmap_state) -{ - struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; - unsigned long space_size, user_offset, user_size; - - if (mmap_state == pci_mmap_io) { - space_size = resource_size(&pbm->io_space); - } else { - space_size = resource_size(&pbm->mem_space); - } - - /* Make sure the request is in range. */ - user_offset = vma->vm_pgoff << PAGE_SHIFT; - user_size = vma->vm_end - vma->vm_start; - - if (user_offset >= space_size || - (user_offset + user_size) > space_size) - return -EINVAL; - - if (mmap_state == pci_mmap_io) { - vma->vm_pgoff = (pbm->io_space.start + - user_offset) >> PAGE_SHIFT; - } else { - vma->vm_pgoff = (pbm->mem_space.start + - user_offset) >> PAGE_SHIFT; - } - - return 0; -} - -/* Adjust vm_pgoff of VMA such that it is the physical page offset - * corresponding to the 32-bit pci bus offset for DEV requested by the user. - * - * Basically, the user finds the base address for his device which he wishes - * to mmap. They read the 32-bit value from the config space base register, - * add whatever PAGE_SIZE multiple offset they wish, and feed this into the - * offset parameter of mmap on /proc/bus/pci/XXX for that device. - * - * Returns negative error code on failure, zero on success. - */ -static int __pci_mmap_make_offset(struct pci_dev *pdev, - struct vm_area_struct *vma, - enum pci_mmap_state mmap_state) -{ - unsigned long user_paddr, user_size; - int i, err; - - /* First compute the physical address in vma->vm_pgoff, - * making sure the user offset is within range in the - * appropriate PCI space. - */ - err = __pci_mmap_make_offset_bus(pdev, vma, mmap_state); - if (err) - return err; - - /* If this is a mapping on a host bridge, any address - * is OK. - */ - if ((pdev->class >> 8) == PCI_CLASS_BRIDGE_HOST) - return err; - - /* Otherwise make sure it's in the range for one of the - * device's resources. - */ - user_paddr = vma->vm_pgoff << PAGE_SHIFT; - user_size = vma->vm_end - vma->vm_start; - - for (i = 0; i <= PCI_ROM_RESOURCE; i++) { - struct resource *rp = &pdev->resource[i]; - resource_size_t aligned_end; - - /* Active? */ - if (!rp->flags) - continue; - - /* Same type? */ - if (i == PCI_ROM_RESOURCE) { - if (mmap_state != pci_mmap_mem) - continue; - } else { - if ((mmap_state == pci_mmap_io && - (rp->flags & IORESOURCE_IO) == 0) || - (mmap_state == pci_mmap_mem && - (rp->flags & IORESOURCE_MEM) == 0)) - continue; - } - - /* Align the resource end to the next page address. - * PAGE_SIZE intentionally added instead of (PAGE_SIZE - 1), - * because actually we need the address of the next byte - * after rp->end. - */ - aligned_end = (rp->end + PAGE_SIZE) & PAGE_MASK; - - if ((rp->start <= user_paddr) && - (user_paddr + user_size) <= aligned_end) - break; - } - - if (i > PCI_ROM_RESOURCE) - return -EINVAL; - - return 0; -} - -/* Set vm_page_prot of VMA, as appropriate for this architecture, for a pci - * device mapping. - */ -static void __pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vma, - enum pci_mmap_state mmap_state) -{ - /* Our io_remap_pfn_range takes care of this, do nothing. */ -} - -/* Perform the actual remap of the pages for a PCI device mapping, as appropriate - * for this architecture. The region in the process to map is described by vm_start - * and vm_end members of VMA, the base physical address is found in vm_pgoff. - * The pci device structure is provided so that architectures may make mapping - * decisions on a per-device or per-bus basis. - * - * Returns a negative error code on failure, zero on success. - */ -int pci_mmap_page_range(struct pci_dev *dev, int bar, - struct vm_area_struct *vma, - enum pci_mmap_state mmap_state, int write_combine) -{ - int ret; - - ret = __pci_mmap_make_offset(dev, vma, mmap_state); - if (ret < 0) - return ret; - - __pci_mmap_set_pgprot(dev, vma, mmap_state); - - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - ret = io_remap_pfn_range(vma, vma->vm_start, - vma->vm_pgoff, - vma->vm_end - vma->vm_start, - vma->vm_page_prot); - if (ret) - return ret; - - return 0; -} - #ifdef CONFIG_NUMA int pcibus_to_node(struct pci_bus *pbus) { -- 2.7.4