From mboxrd@z Thu Jan 1 00:00:00 1970 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78C30C36005 for ; Mon, 28 Apr 2025 09:22:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 90A526B0006; Mon, 28 Apr 2025 05:22:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8B72D6B0007; Mon, 28 Apr 2025 05:22:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 781346B000A; Mon, 28 Apr 2025 05:22:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 56AFF6B0006 for ; Mon, 28 Apr 2025 05:22:52 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 6D55B5D878 for ; Mon, 28 Apr 2025 09:22:53 +0000 (UTC) X-FDA: 83382913026.29.ACF54F0 Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by imf02.hostedemail.com (Postfix) with ESMTP id E881480013 for ; Mon, 28 Apr 2025 09:22:51 +0000 (UTC) Authentication-Results: imf02.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=QyNg16EO; spf=pass (imf02.hostedemail.com: domain of leon@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=leon@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1745832171; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=MVmqltPZXFb/xC11nqbi6OpGVqhPlPM5j0w6Iej/2D8=; b=Jz2rLtu2hYSj3gEN2ss2ivnxg9GTGki3Br9P0GSxP7T/a8PeBqYYsSHMixH7L6d/DVYJ73 H1nwYZaugmAr3YGepiV3kvuXAloiAIJq+6yRsfHG8r0QKALkjZVQTMAAXiAMnUjunaI01V anKz4AMJo7aMk7TI1dHiAwAXHZvNzXw= ARC-Authentication-Results: i=1; imf02.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=QyNg16EO; spf=pass (imf02.hostedemail.com: domain of leon@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=leon@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1745832171; a=rsa-sha256; cv=none; b=B+hDMkcAXzehcpiwaFNQFzxi1ZVXyf4gfsTnGcrWt2prDnb9FCSb+PJl14vrEKhUYN6H05 2xguu3ye3QfGZxSyWCf7Wdp7QWny1J5xLenvreVPCVpx0HKaqL8Aa48jKO+Nf6TqgkM4zZ Teyul+Ixq4qLH82WuG7t7TNvTMONub4= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 495936115E; Mon, 28 Apr 2025 09:22:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CFE92C4CEE9; Mon, 28 Apr 2025 09:22:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745832170; bh=KNETdLZSwm9vDRb7tfRzLdFkAW3npwZ5glNzbA77Pw0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QyNg16EOsc3ZqETJYD1AU0Ecv7YEeFIaUVFjugCRozHn2KUNMlIdCpZ4dKSw6n91g 4fYomuJsYCESg/2W5f22tHa+x9S6RwqSGJ3sNLoZc8ZuXNBhaugrOA+rVNU3Bonb9t 3K03/IrlWNZy5B3tX0NWpyAPgYrG0s1znb8+bOgMhKSdIgMWewvPHf1qlhLUuosCXR B3aQFlErki3Wyarbnwpc0/bC8pNR/xbJqXk9NlKCaEOwBtMdflnTjGmQnrp2W/F10L fmaDFeaoPp9edXKGVmYjv7azKz8IKVYGDodgURYLHRduvNq7xZi7g1hXqt6VqqjhPJ BWh76EAjTlWMw== From: Leon Romanovsky To: Marek Szyprowski , Jens Axboe , Christoph Hellwig , Keith Busch Cc: Jake Edge , Jonathan Corbet , Jason Gunthorpe , Zhu Yanjun , Robin Murphy , Joerg Roedel , Will Deacon , Sagi Grimberg , Bjorn Helgaas , Logan Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Alex Williamson , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Andrew Morton , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-rdma@vger.kernel.org, iommu@lists.linux.dev, linux-nvme@lists.infradead.org, linux-pci@vger.kernel.org, kvm@vger.kernel.org, linux-mm@kvack.org, Niklas Schnelle , Chuck Lever , Luis Chamberlain , Matthew Wilcox , Dan Williams , Kanchan Joshi , Chaitanya Kulkarni , Leon Romanovsky Subject: [PATCH v10 02/24] dma-mapping: move the PCI P2PDMA mapping helpers to pci-p2pdma.h Date: Mon, 28 Apr 2025 12:22:08 +0300 Message-ID: <1c9f2a2e97f77d6eebb5e19651723c0459e0dc29.1745831017.git.leon@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: zwqzgo13qmjyyzijxe5njdiddkgs86ec X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: E881480013 X-Rspam-User: X-HE-Tag: 1745832171-358702 X-HE-Meta: U2FsdGVkX1+HF9KYZt1kJHWrqPGRqk+Gzjp3hGmgyKZvqLnSB1ICvanhDvbkelXP9zK/sFnI6MWD9XslSrCzl4qJTbfUsQFbgH81lmcXBmT9alzdgO21FwtMj33XD0r/o/bDk6Ef4MCJ0XTxlXXYfilS/Ln0BCpqv7ST/Bjx5+csyc4Yso/65BJj4DPei7/zlknP8miPj1eEQF+GvbeM0xoqN0Sq4Ri9KGsxAJb7RzigFXOZMLuRn4BJ7pEdkK2ZfNIbAYfhGio6584vkpDrLOu90o63qxVddwdyn+bUV0JxZCISH7rLHCxc70+UT0ZnRLeIgXeOf43DbQLn7A3Uvz4NgGwNiRBllGDuHAgq+jfrBaCmc0e56TLKyt/dhQbIU9Iy1Hpbgh8WX2X7VMtuZOhpThnSpOAUUNbHiMopSOkUmavqrsiXsjMVlxoQyD6y401gLVIAWc+mdnxfPz5J2Otd3zwyiPQfLU6HF23f94nHiW7y4tXbc6zgDpAW74m0OP06QowG02MiLbPq0hYwDiJf6oYpuNOLjZTRe9j3R6LsF7fgS2Gm1sGeSOt8EGqutwkZ0PZDK4kC+vKk0WX4Qb1DiBeXTfbVhy7e6JxvnOFesu5SLoAUBPokqXSbe+reVcYQ5R6PHNKPAgTLTB5KABCVwbGalYTOhtaPv1sNGtGlJd4KIsULVd6CO/4Z+r/U1gJTrpYGn/CSr6w1ljYC2a4YCZ+f4Czp8QEU8eL+v0tIHWXltx5vuUvls+7KdWgG4xqZKdL2JPey8nbuQCOIKX/seGGo1YCYagBkZzYjj0HiF//sDsMDMljJTbX80TbF2HKWtnrrBRLzihwXqRBiY14SJLrBkakPUkpX01ayJh+7X4DBqp3Wsho0d7QV5aXCysIe3ki75VdcSbmpuaZ+x/6ZgSueiEzKl4vi7fTyJY9EKmenAD61B6U0vqpiM+XzaPi5kyaV6RgYmViSa4X j9YMTPGg 3QMBLYmkiwD5PevBv+bSPQIKLFV+pipp6Vr9le3NTkbqKTJmm+xLw0TRZiWJQkN83zjZGd8cQXiwWdbm8OHwxipCgfMhhcsqgbpghl8M/0+nxkLzmZXfohnBcNl+Rar16XfGf4LikUWdEYz7HMgwcsetojqoJI+2A1OmwD15ngtbFmbNHJExxHuIa3ECuZ/bFOjbcDghBoaGnmFR0kxIzLgQty9zrNIOzy0Zvswp530qTl07Cq1KSSNDidXYQrtDZdNuCEV09+fP/wU1/+tARSaVp6bHcSUNHeJaupAB0A7PzTAS3GO2QVpH/Zy4UVz4nLtpoazyNq9TR8RlhltnRjQ6j7w== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Christoph Hellwig To support the upcoming non-scatterlist mapping helpers, we need to go back to have them called outside of the DMA API. Thus move them out of dma-map-ops.h, which is only for DMA API implementations to pci-p2pdma.h, which is for driver use. Note that the core helper is still not exported as the mapping is expected to be done only by very highlevel subsystem code at least for now. Signed-off-by: Christoph Hellwig Reviewed-by: Logan Gunthorpe Acked-by: Bjorn Helgaas Tested-by: Jens Axboe Reviewed-by: Luis Chamberlain Signed-off-by: Leon Romanovsky --- drivers/iommu/dma-iommu.c | 1 + include/linux/dma-map-ops.h | 85 ------------------------------------- include/linux/pci-p2pdma.h | 85 +++++++++++++++++++++++++++++++++++++ kernel/dma/direct.c | 1 + 4 files changed, 87 insertions(+), 85 deletions(-) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 8a89e63c5973..9ba8d8bc0ce9 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h index c3086edeccc6..f48e5fb88bd5 100644 --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -434,89 +434,4 @@ static inline void debug_dma_dump_mappings(struct device *dev) #endif /* CONFIG_DMA_API_DEBUG */ extern const struct dma_map_ops dma_dummy_ops; - -enum pci_p2pdma_map_type { - /* - * PCI_P2PDMA_MAP_UNKNOWN: Used internally for indicating the mapping - * type hasn't been calculated yet. Functions that return this enum - * never return this value. - */ - PCI_P2PDMA_MAP_UNKNOWN = 0, - - /* - * Not a PCI P2PDMA transfer. - */ - PCI_P2PDMA_MAP_NONE, - - /* - * PCI_P2PDMA_MAP_NOT_SUPPORTED: Indicates the transaction will - * traverse the host bridge and the host bridge is not in the - * allowlist. DMA Mapping routines should return an error when - * this is returned. - */ - PCI_P2PDMA_MAP_NOT_SUPPORTED, - - /* - * PCI_P2PDMA_BUS_ADDR: Indicates that two devices can talk to - * each other directly through a PCI switch and the transaction will - * not traverse the host bridge. Such a mapping should program - * the DMA engine with PCI bus addresses. - */ - PCI_P2PDMA_MAP_BUS_ADDR, - - /* - * PCI_P2PDMA_MAP_THRU_HOST_BRIDGE: Indicates two devices can talk - * to each other, but the transaction traverses a host bridge on the - * allowlist. In this case, a normal mapping either with CPU physical - * addresses (in the case of dma-direct) or IOVA addresses (in the - * case of IOMMUs) should be used to program the DMA engine. - */ - PCI_P2PDMA_MAP_THRU_HOST_BRIDGE, -}; - -struct pci_p2pdma_map_state { - struct dev_pagemap *pgmap; - enum pci_p2pdma_map_type map; - u64 bus_off; -}; - -/* helper for pci_p2pdma_state(), do not use directly */ -void __pci_p2pdma_update_state(struct pci_p2pdma_map_state *state, - struct device *dev, struct page *page); - -/** - * pci_p2pdma_state - check the P2P transfer state of a page - * @state: P2P state structure - * @dev: device to transfer to/from - * @page: page to map - * - * Check if @page is a PCI P2PDMA page, and if yes of what kind. Returns the - * map type, and updates @state with all information needed for a P2P transfer. - */ -static inline enum pci_p2pdma_map_type -pci_p2pdma_state(struct pci_p2pdma_map_state *state, struct device *dev, - struct page *page) -{ - if (IS_ENABLED(CONFIG_PCI_P2PDMA) && is_pci_p2pdma_page(page)) { - if (state->pgmap != page_pgmap(page)) - __pci_p2pdma_update_state(state, dev, page); - return state->map; - } - return PCI_P2PDMA_MAP_NONE; -} - -/** - * pci_p2pdma_bus_addr_map - map a PCI_P2PDMA_MAP_BUS_ADDR P2P transfer - * @state: P2P state structure - * @paddr: physical address to map - * - * Map a physically contiguous PCI_P2PDMA_MAP_BUS_ADDR transfer. - */ -static inline dma_addr_t -pci_p2pdma_bus_addr_map(struct pci_p2pdma_map_state *state, phys_addr_t paddr) -{ - WARN_ON_ONCE(state->map != PCI_P2PDMA_MAP_BUS_ADDR); - return paddr + state->bus_off; -} - #endif /* _LINUX_DMA_MAP_OPS_H */ diff --git a/include/linux/pci-p2pdma.h b/include/linux/pci-p2pdma.h index 2c07aa6b7665..075c20b161d9 100644 --- a/include/linux/pci-p2pdma.h +++ b/include/linux/pci-p2pdma.h @@ -104,4 +104,89 @@ static inline struct pci_dev *pci_p2pmem_find(struct device *client) return pci_p2pmem_find_many(&client, 1); } +enum pci_p2pdma_map_type { + /* + * PCI_P2PDMA_MAP_UNKNOWN: Used internally as an initial state before + * the mapping type has been calculated. Exported routines for the API + * will never return this value. + */ + PCI_P2PDMA_MAP_UNKNOWN = 0, + + /* + * Not a PCI P2PDMA transfer. + */ + PCI_P2PDMA_MAP_NONE, + + /* + * PCI_P2PDMA_MAP_NOT_SUPPORTED: Indicates the transaction will + * traverse the host bridge and the host bridge is not in the + * allowlist. DMA Mapping routines should return an error when + * this is returned. + */ + PCI_P2PDMA_MAP_NOT_SUPPORTED, + + /* + * PCI_P2PDMA_MAP_BUS_ADDR: Indicates that two devices can talk to + * each other directly through a PCI switch and the transaction will + * not traverse the host bridge. Such a mapping should program + * the DMA engine with PCI bus addresses. + */ + PCI_P2PDMA_MAP_BUS_ADDR, + + /* + * PCI_P2PDMA_MAP_THRU_HOST_BRIDGE: Indicates two devices can talk + * to each other, but the transaction traverses a host bridge on the + * allowlist. In this case, a normal mapping either with CPU physical + * addresses (in the case of dma-direct) or IOVA addresses (in the + * case of IOMMUs) should be used to program the DMA engine. + */ + PCI_P2PDMA_MAP_THRU_HOST_BRIDGE, +}; + +struct pci_p2pdma_map_state { + struct dev_pagemap *pgmap; + enum pci_p2pdma_map_type map; + u64 bus_off; +}; + +/* helper for pci_p2pdma_state(), do not use directly */ +void __pci_p2pdma_update_state(struct pci_p2pdma_map_state *state, + struct device *dev, struct page *page); + +/** + * pci_p2pdma_state - check the P2P transfer state of a page + * @state: P2P state structure + * @dev: device to transfer to/from + * @page: page to map + * + * Check if @page is a PCI P2PDMA page, and if yes of what kind. Returns the + * map type, and updates @state with all information needed for a P2P transfer. + */ +static inline enum pci_p2pdma_map_type +pci_p2pdma_state(struct pci_p2pdma_map_state *state, struct device *dev, + struct page *page) +{ + if (IS_ENABLED(CONFIG_PCI_P2PDMA) && is_pci_p2pdma_page(page)) { + if (state->pgmap != page_pgmap(page)) + __pci_p2pdma_update_state(state, dev, page); + return state->map; + } + return PCI_P2PDMA_MAP_NONE; +} + +/** + * pci_p2pdma_bus_addr_map - Translate a physical address to a bus address + * for a PCI_P2PDMA_MAP_BUS_ADDR transfer. + * @state: P2P state structure + * @paddr: physical address to map + * + * Map a physically contiguous PCI_P2PDMA_MAP_BUS_ADDR transfer. + */ +static inline dma_addr_t +pci_p2pdma_bus_addr_map(struct pci_p2pdma_map_state *state, phys_addr_t paddr) +{ + WARN_ON_ONCE(state->map != PCI_P2PDMA_MAP_BUS_ADDR); + return paddr + state->bus_off; +} + #endif /* _LINUX_PCI_P2P_H */ diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index cec43cd5ed62..24c359d9c879 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "direct.h" /* -- 2.49.0