mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Frank.Li@oss.nxp.com
To: Alasdair Kergon <agk@redhat.com>,
	Mike Snitzer <snitzer@kernel.org>,
	 Mikulas Patocka <mpatocka@redhat.com>,
	 Benjamin Marzinski <bmarzins@redhat.com>,
	Song Liu <song@kernel.org>,  Yu Kuai <yukuai@fygo.io>,
	Li Nan <magiclinan@didiglobal.com>,  Xiao Ni <xiao@kernel.org>,
	Dan Williams <djbw@kernel.org>,
	 Herbert Xu <herbert@gondor.apana.org.au>,
	 "David S. Miller" <davem@davemloft.net>,
	Jonathan Corbet <corbet@lwn.net>,
	 Shuah Khan <skhan@linuxfoundation.org>,
	 Randy Dunlap <rdunlap@infradead.org>
Cc: dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org,
	 linux-raid@vger.kernel.org, linux-crypto@vger.kernel.org,
	 linux-doc@vger.kernel.org, Anatolij Gustschin <agust@denx.de>,
	 Saeed Bishara <saeed@marvell.com>,
	Rameshwar Prasad Sahu <rsahu@apm.com>,
	 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
	 Anup Patel <anup.patel@broadcom.com>,
	Frank Li <Frank.Li@nxp.com>
Subject: [PATCH RFC 4/4] crypto: remove async_tx framework
Date: Thu, 15 Oct 2026 15:22:28 -0400	[thread overview]
Message-ID: <20261015-asycn_tx_remove-v1-4-056a7085e0a1@nxp.com> (raw)
In-Reply-To: <20261015-asycn_tx_remove-v1-0-056a7085e0a1@nxp.com>

From: Frank Li <Frank.Li@nxp.com>

Remove the async_tx API and all associated files now that the last
consumer (md/raid5) has been converted to synchronous operations:

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
 Documentation/crypto/async-tx-api.rst | 270 ---------------
 Documentation/crypto/index.rst        |   1 -
 crypto/Kconfig                        |   5 -
 crypto/Makefile                       |   4 -
 crypto/async_tx/Kconfig               |  28 --
 crypto/async_tx/Makefile              |   7 -
 crypto/async_tx/async_memcpy.c        |  97 ------
 crypto/async_tx/async_pq.c            | 464 --------------------------
 crypto/async_tx/async_raid6_recov.c   | 595 ----------------------------------
 crypto/async_tx/async_tx.c            | 299 -----------------
 crypto/async_tx/async_xor.c           | 380 ----------------------
 crypto/async_tx/raid6test.c           | 250 --------------
 include/linux/async_tx.h              | 187 -----------
 13 files changed, 2587 deletions(-)

diff --git a/Documentation/crypto/async-tx-api.rst b/Documentation/crypto/async-tx-api.rst
deleted file mode 100644
index 49fcfc66314ac..0000000000000
--- a/Documentation/crypto/async-tx-api.rst
+++ /dev/null
@@ -1,270 +0,0 @@
-.. SPDX-License-Identifier: GPL-2.0
-
-=====================================
-Asynchronous Transfers/Transforms API
-=====================================
-
-.. Contents
-
-  1. INTRODUCTION
-
-  2 GENEALOGY
-
-  3 USAGE
-  3.1 General format of the API
-  3.2 Supported operations
-  3.3 Descriptor management
-  3.4 When does the operation execute?
-  3.5 When does the operation complete?
-  3.6 Constraints
-  3.7 Example
-
-  4 DMAENGINE DRIVER DEVELOPER NOTES
-  4.1 Conformance points
-  4.2 "My application needs exclusive control of hardware channels"
-
-  5 SOURCE
-
-1. Introduction
-===============
-
-The async_tx API provides methods for describing a chain of asynchronous
-bulk memory transfers/transforms with support for inter-transactional
-dependencies.  It is implemented as a dmaengine client that smooths over
-the details of different hardware offload engine implementations.  Code
-that is written to the API can optimize for asynchronous operation and
-the API will fit the chain of operations to the available offload
-resources.
-
-2.Genealogy
-===========
-
-The API was initially designed to offload the memory copy and
-xor-parity-calculations of the md-raid5 driver using the offload engines
-present in the Intel(R) Xscale series of I/O processors.  It also built
-on the 'dmaengine' layer developed for offloading memory copies in the
-network stack using Intel(R) I/OAT engines.  The following design
-features surfaced as a result:
-
-1. implicit synchronous path: users of the API do not need to know if
-   the platform they are running on has offload capabilities.  The
-   operation will be offloaded when an engine is available and carried out
-   in software otherwise.
-2. cross channel dependency chains: the API allows a chain of dependent
-   operations to be submitted, like xor->copy->xor in the raid5 case.  The
-   API automatically handles cases where the transition from one operation
-   to another implies a hardware channel switch.
-3. dmaengine extensions to support multiple clients and operation types
-   beyond 'memcpy'
-
-3. Usage
-========
-
-3.1 General format of the API
------------------------------
-
-::
-
-  struct dma_async_tx_descriptor *
-  async_<operation>(<op specific parameters>, struct async_submit_ctl *submit)
-
-3.2 Supported operations
-------------------------
-
-========  ====================================================================
-memcpy    memory copy between a source and a destination buffer
-memset    fill a destination buffer with a byte value
-xor       xor a series of source buffers and write the result to a
-	  destination buffer
-xor_val   xor a series of source buffers and set a flag if the
-	  result is zero.  The implementation attempts to prevent
-	  writes to memory
-pq	  generate the p+q (raid6 syndrome) from a series of source buffers
-pq_val    validate that a p and or q buffer are in sync with a given series of
-	  sources
-datap	  (raid6_recov_datap) recover a raid6 data block and the p block
-	  from the given sources
-2data	  (raid6_recov_2data) recover 2 raid6 data blocks from the given
-	  sources
-========  ====================================================================
-
-3.3 Descriptor management
--------------------------
-
-The return value is non-NULL and points to a 'descriptor' when the operation
-has been queued to execute asynchronously.  Descriptors are recycled
-resources, under control of the offload engine driver, to be reused as
-operations complete.  When an application needs to submit a chain of
-operations it must guarantee that the descriptor is not automatically recycled
-before the dependency is submitted.  This requires that all descriptors be
-acknowledged by the application before the offload engine driver is allowed to
-recycle (or free) the descriptor.  A descriptor can be acked by one of the
-following methods:
-
-1. setting the ASYNC_TX_ACK flag if no child operations are to be submitted
-2. submitting an unacknowledged descriptor as a dependency to another
-   async_tx call will implicitly set the acknowledged state.
-3. calling async_tx_ack() on the descriptor.
-
-3.4 When does the operation execute?
-------------------------------------
-
-Operations do not immediately issue after return from the
-async_<operation> call.  Offload engine drivers batch operations to
-improve performance by reducing the number of mmio cycles needed to
-manage the channel.  Once a driver-specific threshold is met the driver
-automatically issues pending operations.  An application can force this
-event by calling async_tx_issue_pending_all().  This operates on all
-channels since the application has no knowledge of channel to operation
-mapping.
-
-3.5 When does the operation complete?
--------------------------------------
-
-There are two methods for an application to learn about the completion
-of an operation.
-
-1. Call dma_wait_for_async_tx().  This call causes the CPU to spin while
-   it polls for the completion of the operation.  It handles dependency
-   chains and issuing pending operations.
-2. Specify a completion callback.  The callback routine runs in tasklet
-   context if the offload engine driver supports interrupts, or it is
-   called in application context if the operation is carried out
-   synchronously in software.  The callback can be set in the call to
-   async_<operation>, or when the application needs to submit a chain of
-   unknown length it can use the async_trigger_callback() routine to set a
-   completion interrupt/callback at the end of the chain.
-
-3.6 Constraints
----------------
-
-1. Calls to async_<operation> are not permitted in IRQ context.  Other
-   contexts are permitted provided constraint #2 is not violated.
-2. Completion callback routines cannot submit new operations.  This
-   results in recursion in the synchronous case and spin_locks being
-   acquired twice in the asynchronous case.
-
-3.7 Example
------------
-
-Perform a xor->copy->xor operation where each operation depends on the
-result from the previous operation::
-
-    #include <linux/async_tx.h>
-
-    static void callback(void *param)
-    {
-	    complete(param);
-    }
-
-    #define NDISKS  2
-
-    static void run_xor_copy_xor(struct page **xor_srcs,
-				 struct page *xor_dest,
-				 size_t xor_len,
-				 struct page *copy_src,
-				 struct page *copy_dest,
-				 size_t copy_len)
-    {
-	    struct dma_async_tx_descriptor *tx;
-	    struct async_submit_ctl submit;
-	    addr_conv_t addr_conv[NDISKS];
-	    struct completion cmp;
-
-	    init_async_submit(&submit, ASYNC_TX_XOR_DROP_DST, NULL, NULL, NULL,
-			    addr_conv);
-	    tx = async_xor(xor_dest, xor_srcs, 0, NDISKS, xor_len, &submit);
-
-	    submit.depend_tx = tx;
-	    tx = async_memcpy(copy_dest, copy_src, 0, 0, copy_len, &submit);
-
-	    init_completion(&cmp);
-	    init_async_submit(&submit, ASYNC_TX_XOR_DROP_DST | ASYNC_TX_ACK, tx,
-			    callback, &cmp, addr_conv);
-	    tx = async_xor(xor_dest, xor_srcs, 0, NDISKS, xor_len, &submit);
-
-	    async_tx_issue_pending_all();
-
-	    wait_for_completion(&cmp);
-    }
-
-See include/linux/async_tx.h for more information on the flags.  See the
-ops_run_* and ops_complete_* routines in drivers/md/raid5.c for more
-implementation examples.
-
-4. Driver Development Notes
-===========================
-
-4.1 Conformance points
-----------------------
-
-There are a few conformance points required in dmaengine drivers to
-accommodate assumptions made by applications using the async_tx API:
-
-1. Completion callbacks are expected to happen in tasklet context
-2. dma_async_tx_descriptor fields are never manipulated in IRQ context
-3. Use async_tx_run_dependencies() in the descriptor clean up path to
-   handle submission of dependent operations
-
-4.2 "My application needs exclusive control of hardware channels"
------------------------------------------------------------------
-
-Primarily this requirement arises from cases where a DMA engine driver
-is being used to support device-to-memory operations.  A channel that is
-performing these operations cannot, for many platform specific reasons,
-be shared.  For these cases the dma_request_channel() interface is
-provided.
-
-The interface is::
-
-  struct dma_chan *dma_request_channel(dma_cap_mask_t mask,
-				       dma_filter_fn filter_fn,
-				       void *filter_param);
-
-Where dma_filter_fn is defined as::
-
-  typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param);
-
-When the optional 'filter_fn' parameter is set to NULL
-dma_request_channel simply returns the first channel that satisfies the
-capability mask.  Otherwise, when the mask parameter is insufficient for
-specifying the necessary channel, the filter_fn routine can be used to
-disposition the available channels in the system. The filter_fn routine
-is called once for each free channel in the system.  Upon seeing a
-suitable channel filter_fn returns DMA_ACK which flags that channel to
-be the return value from dma_request_channel.  A channel allocated via
-this interface is exclusive to the caller, until dma_release_channel()
-is called.
-
-The DMA_PRIVATE capability flag is used to tag dma devices that should
-not be used by the general-purpose allocator.  It can be set at
-initialization time if it is known that a channel will always be
-private.  Alternatively, it is set when dma_request_channel() finds an
-unused "public" channel.
-
-A couple caveats to note when implementing a driver and consumer:
-
-1. Once a channel has been privately allocated it will no longer be
-   considered by the general-purpose allocator even after a call to
-   dma_release_channel().
-2. Since capabilities are specified at the device level a dma_device
-   with multiple channels will either have all channels public, or all
-   channels private.
-
-5. Source
----------
-
-include/linux/dmaengine.h:
-    core header file for DMA drivers and api users
-drivers/dma/dmaengine.c:
-    offload engine channel management routines
-drivers/dma/:
-    location for offload engine drivers
-include/linux/async_tx.h:
-    core header file for the async_tx api
-crypto/async_tx/async_tx.c:
-    async_tx interface to dmaengine and common code
-crypto/async_tx/async_memcpy.c:
-    copy offload
-crypto/async_tx/async_xor.c:
-    xor and xor zero sum offload
diff --git a/Documentation/crypto/index.rst b/Documentation/crypto/index.rst
index 705f186d662ba..7cd3b0281963d 100644
--- a/Documentation/crypto/index.rst
+++ b/Documentation/crypto/index.rst
@@ -18,7 +18,6 @@ for cryptographic use cases, as well as programming examples.
    api-intro
    architecture
 
-   async-tx-api
    asymmetric-keys
    devel-algos
    userspace-if
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 981d5dc422d4c..e1570f8cbc1be 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -3,11 +3,6 @@
 # Generic algorithms support
 #
 
-#
-# async_tx api: hardware offloaded memory transfer/transform support
-#
-source "crypto/async_tx/Kconfig"
-
 #
 # Cryptographic API Configuration
 #
diff --git a/crypto/Makefile b/crypto/Makefile
index 33bb5ad595e8f..4a6fe43c3d22f 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -188,10 +188,6 @@ ecrdsa_generic-y += ecrdsa_params.asn1.o
 ecrdsa_generic-y += ecrdsa_pub_key.asn1.o
 obj-$(CONFIG_CRYPTO_ECRDSA) += ecrdsa_generic.o
 
-#
-# generic algorithms and the async_tx api
-#
-obj-$(CONFIG_ASYNC_CORE) += async_tx/
 obj-$(CONFIG_ASYMMETRIC_KEY_TYPE) += asymmetric_keys/
 crypto_simd-y := simd.o
 obj-$(CONFIG_CRYPTO_SIMD) += crypto_simd.o
diff --git a/crypto/async_tx/Kconfig b/crypto/async_tx/Kconfig
deleted file mode 100644
index 89bafa2efc300..0000000000000
--- a/crypto/async_tx/Kconfig
+++ /dev/null
@@ -1,28 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-config ASYNC_CORE
-	tristate
-
-config ASYNC_MEMCPY
-	tristate
-	select ASYNC_CORE
-
-config ASYNC_XOR
-	tristate
-	select ASYNC_CORE
-	select XOR_BLOCKS
-
-config ASYNC_PQ
-	tristate
-	select ASYNC_CORE
-
-config ASYNC_RAID6_RECOV
-	tristate
-	select ASYNC_CORE
-	select ASYNC_PQ
-	select ASYNC_XOR
-
-config ASYNC_TX_DISABLE_PQ_VAL_DMA
-	bool
-
-config ASYNC_TX_DISABLE_XOR_VAL_DMA
-	bool
diff --git a/crypto/async_tx/Makefile b/crypto/async_tx/Makefile
deleted file mode 100644
index 056e482453730..0000000000000
--- a/crypto/async_tx/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-obj-$(CONFIG_ASYNC_CORE) += async_tx.o
-obj-$(CONFIG_ASYNC_MEMCPY) += async_memcpy.o
-obj-$(CONFIG_ASYNC_XOR) += async_xor.o
-obj-$(CONFIG_ASYNC_PQ) += async_pq.o
-obj-$(CONFIG_ASYNC_RAID6_RECOV) += async_raid6_recov.o
-obj-$(CONFIG_ASYNC_RAID6_TEST) += raid6test.o
diff --git a/crypto/async_tx/async_memcpy.c b/crypto/async_tx/async_memcpy.c
deleted file mode 100644
index c538e30e99094..0000000000000
--- a/crypto/async_tx/async_memcpy.c
+++ /dev/null
@@ -1,97 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * copy offload engine support
- *
- * Copyright © 2006, Intel Corporation.
- *
- *      Dan Williams <dan.j.williams@intel.com>
- *
- *      with architecture considerations by:
- *      Neil Brown <neilb@suse.de>
- *      Jeff Garzik <jeff@garzik.org>
- */
-#include <linux/kernel.h>
-#include <linux/highmem.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/dma-mapping.h>
-#include <linux/async_tx.h>
-
-/**
- * async_memcpy - attempt to copy memory with a dma engine.
- * @dest: destination page
- * @src: src page
- * @dest_offset: offset into 'dest' to start transaction
- * @src_offset: offset into 'src' to start transaction
- * @len: length in bytes
- * @submit: submission / completion modifiers
- *
- * honored flags: ASYNC_TX_ACK
- */
-struct dma_async_tx_descriptor *
-async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
-	     unsigned int src_offset, size_t len,
-	     struct async_submit_ctl *submit)
-{
-	struct dma_chan *chan = async_tx_find_channel(submit, DMA_MEMCPY,
-						      &dest, 1, &src, 1, len);
-	struct dma_device *device = chan ? chan->device : NULL;
-	struct dma_async_tx_descriptor *tx = NULL;
-	struct dmaengine_unmap_data *unmap = NULL;
-
-	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, 2, GFP_NOWAIT);
-
-	if (unmap && is_dma_copy_aligned(device, src_offset, dest_offset, len)) {
-		unsigned long dma_prep_flags = 0;
-
-		if (submit->cb_fn)
-			dma_prep_flags |= DMA_PREP_INTERRUPT;
-		if (submit->flags & ASYNC_TX_FENCE)
-			dma_prep_flags |= DMA_PREP_FENCE;
-
-		unmap->to_cnt = 1;
-		unmap->addr[0] = dma_map_page(device->dev, src, src_offset, len,
-					      DMA_TO_DEVICE);
-		unmap->from_cnt = 1;
-		unmap->addr[1] = dma_map_page(device->dev, dest, dest_offset, len,
-					      DMA_FROM_DEVICE);
-		unmap->len = len;
-
-		tx = device->device_prep_dma_memcpy(chan, unmap->addr[1],
-						    unmap->addr[0], len,
-						    dma_prep_flags);
-	}
-
-	if (tx) {
-		pr_debug("%s: (async) len: %zu\n", __func__, len);
-
-		dma_set_unmap(tx, unmap);
-		async_tx_submit(chan, tx, submit);
-	} else {
-		void *dest_buf, *src_buf;
-		pr_debug("%s: (sync) len: %zu\n", __func__, len);
-
-		/* wait for any prerequisite operations */
-		async_tx_quiesce(&submit->depend_tx);
-
-		dest_buf = kmap_atomic(dest) + dest_offset;
-		src_buf = kmap_atomic(src) + src_offset;
-
-		memcpy(dest_buf, src_buf, len);
-
-		kunmap_atomic(src_buf);
-		kunmap_atomic(dest_buf);
-
-		async_tx_sync_epilog(submit);
-	}
-
-	dmaengine_unmap_put(unmap);
-
-	return tx;
-}
-EXPORT_SYMBOL_GPL(async_memcpy);
-
-MODULE_AUTHOR("Intel Corporation");
-MODULE_DESCRIPTION("asynchronous memcpy api");
-MODULE_LICENSE("GPL");
diff --git a/crypto/async_tx/async_pq.c b/crypto/async_tx/async_pq.c
deleted file mode 100644
index 27f99349e310b..0000000000000
--- a/crypto/async_tx/async_pq.c
+++ /dev/null
@@ -1,464 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Copyright(c) 2007 Yuri Tikhonov <yur@emcraft.com>
- * Copyright(c) 2009 Intel Corporation
- */
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/dma-mapping.h>
-#include <linux/raid/pq.h>
-#include <linux/raid/pq_tables.h>
-#include <linux/async_tx.h>
-#include <linux/gfp.h>
-
-/*
- * struct pq_scribble_page - space to hold throwaway P or Q buffer for
- * synchronous gen_syndrome
- */
-static struct page *pq_scribble_page;
-
-/* the struct page *blocks[] parameter passed to async_gen_syndrome()
- * and async_syndrome_val() contains the 'P' destination address at
- * blocks[disks-2] and the 'Q' destination address at blocks[disks-1]
- *
- * note: these are macros as they are used as lvalues
- */
-#define P(b, d) (b[d-2])
-#define Q(b, d) (b[d-1])
-
-#define MAX_DISKS 255
-
-/*
- * do_async_gen_syndrome - asynchronously calculate P and/or Q
- */
-static __async_inline struct dma_async_tx_descriptor *
-do_async_gen_syndrome(struct dma_chan *chan,
-		      const unsigned char *scfs, int disks,
-		      struct dmaengine_unmap_data *unmap,
-		      enum dma_ctrl_flags dma_flags,
-		      struct async_submit_ctl *submit)
-{
-	struct dma_async_tx_descriptor *tx = NULL;
-	struct dma_device *dma = chan->device;
-	enum async_tx_flags flags_orig = submit->flags;
-	dma_async_tx_callback cb_fn_orig = submit->cb_fn;
-	dma_async_tx_callback cb_param_orig = submit->cb_param;
-	int src_cnt = disks - 2;
-	unsigned short pq_src_cnt;
-	dma_addr_t dma_dest[2];
-	int src_off = 0;
-
-	while (src_cnt > 0) {
-		submit->flags = flags_orig;
-		pq_src_cnt = min(src_cnt, dma_maxpq(dma, dma_flags));
-		/* if we are submitting additional pqs, leave the chain open,
-		 * clear the callback parameters, and leave the destination
-		 * buffers mapped
-		 */
-		if (src_cnt > pq_src_cnt) {
-			submit->flags &= ~ASYNC_TX_ACK;
-			submit->flags |= ASYNC_TX_FENCE;
-			submit->cb_fn = NULL;
-			submit->cb_param = NULL;
-		} else {
-			submit->cb_fn = cb_fn_orig;
-			submit->cb_param = cb_param_orig;
-			if (cb_fn_orig)
-				dma_flags |= DMA_PREP_INTERRUPT;
-		}
-		if (submit->flags & ASYNC_TX_FENCE)
-			dma_flags |= DMA_PREP_FENCE;
-
-		/* Drivers force forward progress in case they can not provide
-		 * a descriptor
-		 */
-		for (;;) {
-			dma_dest[0] = unmap->addr[disks - 2];
-			dma_dest[1] = unmap->addr[disks - 1];
-			tx = dma->device_prep_dma_pq(chan, dma_dest,
-						     &unmap->addr[src_off],
-						     pq_src_cnt,
-						     &scfs[src_off], unmap->len,
-						     dma_flags);
-			if (likely(tx))
-				break;
-			async_tx_quiesce(&submit->depend_tx);
-			dma_async_issue_pending(chan);
-		}
-
-		dma_set_unmap(tx, unmap);
-		async_tx_submit(chan, tx, submit);
-		submit->depend_tx = tx;
-
-		/* drop completed sources */
-		src_cnt -= pq_src_cnt;
-		src_off += pq_src_cnt;
-
-		dma_flags |= DMA_PREP_CONTINUE;
-	}
-
-	return tx;
-}
-
-/*
- * do_sync_gen_syndrome - synchronously calculate a raid6 syndrome
- */
-static void
-do_sync_gen_syndrome(struct page **blocks, unsigned int *offsets, int disks,
-		     size_t len, struct async_submit_ctl *submit)
-{
-	void **srcs;
-	int i;
-	int start = -1, stop = disks - 3;
-
-	if (submit->scribble)
-		srcs = submit->scribble;
-	else
-		srcs = (void **) blocks;
-
-	for (i = 0; i < disks; i++) {
-		if (blocks[i] == NULL) {
-			BUG_ON(i > disks - 3); /* P or Q can't be zero */
-			srcs[i] = page_address(ZERO_PAGE(0));
-		} else {
-			srcs[i] = page_address(blocks[i]) + offsets[i];
-
-			if (i < disks - 2) {
-				stop = i;
-				if (start == -1)
-					start = i;
-			}
-		}
-	}
-	if (submit->flags & ASYNC_TX_PQ_XOR_DST) {
-		BUG_ON(!raid6_can_xor_syndrome());
-		if (start >= 0)
-			raid6_xor_syndrome(disks, start, stop, len, srcs);
-	} else
-		raid6_gen_syndrome(disks, len, srcs);
-	async_tx_sync_epilog(submit);
-}
-
-static inline bool
-is_dma_pq_aligned_offs(struct dma_device *dev, unsigned int *offs,
-				     int src_cnt, size_t len)
-{
-	int i;
-
-	for (i = 0; i < src_cnt; i++) {
-		if (!is_dma_pq_aligned(dev, offs[i], 0, len))
-			return false;
-	}
-	return true;
-}
-
-/**
- * async_gen_syndrome - asynchronously calculate a raid6 syndrome
- * @blocks: source blocks from idx 0..disks-3, P @ disks-2 and Q @ disks-1
- * @offsets: offset array into each block (src and dest) to start transaction
- * @disks: number of blocks (including missing P or Q, see below)
- * @len: length of operation in bytes
- * @submit: submission/completion modifiers
- *
- * General note: This routine assumes a field of GF(2^8) with a
- * primitive polynomial of 0x11d and a generator of {02}.
- *
- * 'disks' note: callers can optionally omit either P or Q (but not
- * both) from the calculation by setting blocks[disks-2] or
- * blocks[disks-1] to NULL.  When P or Q is omitted 'len' must be <=
- * PAGE_SIZE as a temporary buffer of this size is used in the
- * synchronous path.  'disks' always accounts for both destination
- * buffers.  If any source buffers (blocks[i] where i < disks - 2) are
- * set to NULL those buffers will be replaced with the raid6_zero_page
- * in the synchronous path and omitted in the hardware-asynchronous
- * path.
- */
-struct dma_async_tx_descriptor *
-async_gen_syndrome(struct page **blocks, unsigned int *offsets, int disks,
-		   size_t len, struct async_submit_ctl *submit)
-{
-	int src_cnt = disks - 2;
-	struct dma_chan *chan = async_tx_find_channel(submit, DMA_PQ,
-						      &P(blocks, disks), 2,
-						      blocks, src_cnt, len);
-	struct dma_device *device = chan ? chan->device : NULL;
-	struct dmaengine_unmap_data *unmap = NULL;
-
-	BUG_ON(disks > MAX_DISKS || !(P(blocks, disks) || Q(blocks, disks)));
-
-	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOWAIT);
-
-	/* XORing P/Q is only implemented in software */
-	if (unmap && !(submit->flags & ASYNC_TX_PQ_XOR_DST) &&
-	    (src_cnt <= dma_maxpq(device, 0) ||
-	     dma_maxpq(device, DMA_PREP_CONTINUE) > 0) &&
-	    is_dma_pq_aligned_offs(device, offsets, disks, len)) {
-		struct dma_async_tx_descriptor *tx;
-		enum dma_ctrl_flags dma_flags = 0;
-		unsigned char coefs[MAX_DISKS];
-		int i, j;
-
-		/* run the p+q asynchronously */
-		pr_debug("%s: (async) disks: %d len: %zu\n",
-			 __func__, disks, len);
-
-		/* convert source addresses being careful to collapse 'empty'
-		 * sources and update the coefficients accordingly
-		 */
-		unmap->len = len;
-		for (i = 0, j = 0; i < src_cnt; i++) {
-			if (blocks[i] == NULL)
-				continue;
-			unmap->addr[j] = dma_map_page(device->dev, blocks[i],
-						offsets[i], len, DMA_TO_DEVICE);
-			coefs[j] = raid6_gfexp[i];
-			unmap->to_cnt++;
-			j++;
-		}
-
-		/*
-		 * DMAs use destinations as sources,
-		 * so use BIDIRECTIONAL mapping
-		 */
-		unmap->bidi_cnt++;
-		if (P(blocks, disks))
-			unmap->addr[j++] = dma_map_page(device->dev, P(blocks, disks),
-							P(offsets, disks),
-							len, DMA_BIDIRECTIONAL);
-		else {
-			unmap->addr[j++] = 0;
-			dma_flags |= DMA_PREP_PQ_DISABLE_P;
-		}
-
-		unmap->bidi_cnt++;
-		if (Q(blocks, disks))
-			unmap->addr[j++] = dma_map_page(device->dev, Q(blocks, disks),
-							Q(offsets, disks),
-							len, DMA_BIDIRECTIONAL);
-		else {
-			unmap->addr[j++] = 0;
-			dma_flags |= DMA_PREP_PQ_DISABLE_Q;
-		}
-
-		tx = do_async_gen_syndrome(chan, coefs, j, unmap, dma_flags, submit);
-		dmaengine_unmap_put(unmap);
-		return tx;
-	}
-
-	dmaengine_unmap_put(unmap);
-
-	/* run the pq synchronously */
-	pr_debug("%s: (sync) disks: %d len: %zu\n", __func__, disks, len);
-
-	/* wait for any prerequisite operations */
-	async_tx_quiesce(&submit->depend_tx);
-
-	if (!P(blocks, disks)) {
-		P(blocks, disks) = pq_scribble_page;
-		P(offsets, disks) = 0;
-	}
-	if (!Q(blocks, disks)) {
-		Q(blocks, disks) = pq_scribble_page;
-		Q(offsets, disks) = 0;
-	}
-	do_sync_gen_syndrome(blocks, offsets, disks, len, submit);
-
-	return NULL;
-}
-EXPORT_SYMBOL_GPL(async_gen_syndrome);
-
-static inline struct dma_chan *
-pq_val_chan(struct async_submit_ctl *submit, struct page **blocks, int disks, size_t len)
-{
-	#ifdef CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA
-	return NULL;
-	#endif
-	return async_tx_find_channel(submit, DMA_PQ_VAL, NULL, 0,  blocks,
-				     disks, len);
-}
-
-/**
- * async_syndrome_val - asynchronously validate a raid6 syndrome
- * @blocks: source blocks from idx 0..disks-3, P @ disks-2 and Q @ disks-1
- * @offsets: common offset into each block (src and dest) to start transaction
- * @disks: number of blocks (including missing P or Q, see below)
- * @len: length of operation in bytes
- * @pqres: on val failure SUM_CHECK_P_RESULT and/or SUM_CHECK_Q_RESULT are set
- * @spare: temporary result buffer for the synchronous case
- * @s_off: spare buffer page offset
- * @submit: submission / completion modifiers
- *
- * The same notes from async_gen_syndrome apply to the 'blocks',
- * and 'disks' parameters of this routine.  The synchronous path
- * requires a temporary result buffer and submit->scribble to be
- * specified.
- */
-struct dma_async_tx_descriptor *
-async_syndrome_val(struct page **blocks, unsigned int *offsets, int disks,
-		   size_t len, enum sum_check_flags *pqres, struct page *spare,
-		   unsigned int s_off, struct async_submit_ctl *submit)
-{
-	struct dma_chan *chan = pq_val_chan(submit, blocks, disks, len);
-	struct dma_device *device = chan ? chan->device : NULL;
-	struct dma_async_tx_descriptor *tx;
-	unsigned char coefs[MAX_DISKS];
-	enum dma_ctrl_flags dma_flags = submit->cb_fn ? DMA_PREP_INTERRUPT : 0;
-	struct dmaengine_unmap_data *unmap = NULL;
-
-	BUG_ON(disks < 4 || disks > MAX_DISKS);
-
-	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOWAIT);
-
-	if (unmap && disks <= dma_maxpq(device, 0) &&
-	    is_dma_pq_aligned_offs(device, offsets, disks, len)) {
-		struct device *dev = device->dev;
-		dma_addr_t pq[2];
-		int i, j = 0, src_cnt = 0;
-
-		pr_debug("%s: (async) disks: %d len: %zu\n",
-			 __func__, disks, len);
-
-		unmap->len = len;
-		for (i = 0; i < disks-2; i++)
-			if (likely(blocks[i])) {
-				unmap->addr[j] = dma_map_page(dev, blocks[i],
-							      offsets[i], len,
-							      DMA_TO_DEVICE);
-				coefs[j] = raid6_gfexp[i];
-				unmap->to_cnt++;
-				src_cnt++;
-				j++;
-			}
-
-		if (!P(blocks, disks)) {
-			pq[0] = 0;
-			dma_flags |= DMA_PREP_PQ_DISABLE_P;
-		} else {
-			pq[0] = dma_map_page(dev, P(blocks, disks),
-					     P(offsets, disks), len,
-					     DMA_TO_DEVICE);
-			unmap->addr[j++] = pq[0];
-			unmap->to_cnt++;
-		}
-		if (!Q(blocks, disks)) {
-			pq[1] = 0;
-			dma_flags |= DMA_PREP_PQ_DISABLE_Q;
-		} else {
-			pq[1] = dma_map_page(dev, Q(blocks, disks),
-					     Q(offsets, disks), len,
-					     DMA_TO_DEVICE);
-			unmap->addr[j++] = pq[1];
-			unmap->to_cnt++;
-		}
-
-		if (submit->flags & ASYNC_TX_FENCE)
-			dma_flags |= DMA_PREP_FENCE;
-		for (;;) {
-			tx = device->device_prep_dma_pq_val(chan, pq,
-							    unmap->addr,
-							    src_cnt,
-							    coefs,
-							    len, pqres,
-							    dma_flags);
-			if (likely(tx))
-				break;
-			async_tx_quiesce(&submit->depend_tx);
-			dma_async_issue_pending(chan);
-		}
-
-		dma_set_unmap(tx, unmap);
-		async_tx_submit(chan, tx, submit);
-	} else {
-		struct page *p_src = P(blocks, disks);
-		unsigned int p_off = P(offsets, disks);
-		struct page *q_src = Q(blocks, disks);
-		unsigned int q_off = Q(offsets, disks);
-		enum async_tx_flags flags_orig = submit->flags;
-		dma_async_tx_callback cb_fn_orig = submit->cb_fn;
-		void *scribble = submit->scribble;
-		void *cb_param_orig = submit->cb_param;
-		void *p, *q, *s;
-
-		pr_debug("%s: (sync) disks: %d len: %zu\n",
-			 __func__, disks, len);
-
-		/* caller must provide a temporary result buffer and
-		 * allow the input parameters to be preserved
-		 */
-		BUG_ON(!spare || !scribble);
-
-		/* wait for any prerequisite operations */
-		async_tx_quiesce(&submit->depend_tx);
-
-		/* recompute p and/or q into the temporary buffer and then
-		 * check to see the result matches the current value
-		 */
-		tx = NULL;
-		*pqres = 0;
-		if (p_src) {
-			init_async_submit(submit, ASYNC_TX_XOR_ZERO_DST, NULL,
-					  NULL, NULL, scribble);
-			tx = async_xor_offs(spare, s_off,
-					blocks, offsets, disks-2, len, submit);
-			async_tx_quiesce(&tx);
-			p = page_address(p_src) + p_off;
-			s = page_address(spare) + s_off;
-			*pqres |= !!memcmp(p, s, len) << SUM_CHECK_P;
-		}
-
-		if (q_src) {
-			P(blocks, disks) = NULL;
-			Q(blocks, disks) = spare;
-			Q(offsets, disks) = s_off;
-			init_async_submit(submit, 0, NULL, NULL, NULL, scribble);
-			tx = async_gen_syndrome(blocks, offsets, disks,
-					len, submit);
-			async_tx_quiesce(&tx);
-			q = page_address(q_src) + q_off;
-			s = page_address(spare) + s_off;
-			*pqres |= !!memcmp(q, s, len) << SUM_CHECK_Q;
-		}
-
-		/* restore P, Q and submit */
-		P(blocks, disks) = p_src;
-		P(offsets, disks) = p_off;
-		Q(blocks, disks) = q_src;
-		Q(offsets, disks) = q_off;
-
-		submit->cb_fn = cb_fn_orig;
-		submit->cb_param = cb_param_orig;
-		submit->flags = flags_orig;
-		async_tx_sync_epilog(submit);
-		tx = NULL;
-	}
-	dmaengine_unmap_put(unmap);
-
-	return tx;
-}
-EXPORT_SYMBOL_GPL(async_syndrome_val);
-
-static int __init async_pq_init(void)
-{
-	pq_scribble_page = alloc_page(GFP_KERNEL);
-
-	if (pq_scribble_page)
-		return 0;
-
-	pr_err("%s: failed to allocate required spare page\n", __func__);
-
-	return -ENOMEM;
-}
-
-static void __exit async_pq_exit(void)
-{
-	__free_page(pq_scribble_page);
-}
-
-module_init(async_pq_init);
-module_exit(async_pq_exit);
-
-MODULE_DESCRIPTION("asynchronous raid6 syndrome generation/validation");
-MODULE_LICENSE("GPL");
diff --git a/crypto/async_tx/async_raid6_recov.c b/crypto/async_tx/async_raid6_recov.c
deleted file mode 100644
index e53870d84bc55..0000000000000
--- a/crypto/async_tx/async_raid6_recov.c
+++ /dev/null
@@ -1,595 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Asynchronous RAID-6 recovery calculations ASYNC_TX API.
- * Copyright(c) 2009 Intel Corporation
- *
- * based on raid6recov.c:
- *   Copyright 2002 H. Peter Anvin
- */
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/dma-mapping.h>
-#include <linux/raid/pq.h>
-#include <linux/raid/pq_tables.h>
-#include <linux/async_tx.h>
-#include <linux/dmaengine.h>
-
-static struct dma_async_tx_descriptor *
-async_sum_product(struct page *dest, unsigned int d_off,
-		struct page **srcs, unsigned int *src_offs, unsigned char *coef,
-		size_t len, struct async_submit_ctl *submit)
-{
-	struct dma_chan *chan = async_tx_find_channel(submit, DMA_PQ,
-						      &dest, 1, srcs, 2, len);
-	struct dma_device *dma = chan ? chan->device : NULL;
-	struct dmaengine_unmap_data *unmap = NULL;
-	const u8 *amul, *bmul;
-	u8 ax, bx;
-	u8 *a, *b, *c;
-
-	if (dma)
-		unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOWAIT);
-
-	if (unmap) {
-		struct device *dev = dma->dev;
-		dma_addr_t pq[2];
-		struct dma_async_tx_descriptor *tx;
-		enum dma_ctrl_flags dma_flags = DMA_PREP_PQ_DISABLE_P;
-
-		if (submit->flags & ASYNC_TX_FENCE)
-			dma_flags |= DMA_PREP_FENCE;
-		unmap->addr[0] = dma_map_page(dev, srcs[0], src_offs[0],
-						len, DMA_TO_DEVICE);
-		unmap->addr[1] = dma_map_page(dev, srcs[1], src_offs[1],
-						len, DMA_TO_DEVICE);
-		unmap->to_cnt = 2;
-
-		unmap->addr[2] = dma_map_page(dev, dest, d_off,
-						len, DMA_BIDIRECTIONAL);
-		unmap->bidi_cnt = 1;
-		/* engine only looks at Q, but expects it to follow P */
-		pq[1] = unmap->addr[2];
-
-		unmap->len = len;
-		tx = dma->device_prep_dma_pq(chan, pq, unmap->addr, 2, coef,
-					     len, dma_flags);
-		if (tx) {
-			dma_set_unmap(tx, unmap);
-			async_tx_submit(chan, tx, submit);
-			dmaengine_unmap_put(unmap);
-			return tx;
-		}
-
-		/* could not get a descriptor, unmap and fall through to
-		 * the synchronous path
-		 */
-		dmaengine_unmap_put(unmap);
-	}
-
-	/* run the operation synchronously */
-	async_tx_quiesce(&submit->depend_tx);
-	amul = raid6_gfmul[coef[0]];
-	bmul = raid6_gfmul[coef[1]];
-	a = page_address(srcs[0]) + src_offs[0];
-	b = page_address(srcs[1]) + src_offs[1];
-	c = page_address(dest) + d_off;
-
-	while (len--) {
-		ax    = amul[*a++];
-		bx    = bmul[*b++];
-		*c++ = ax ^ bx;
-	}
-
-	return NULL;
-}
-
-static struct dma_async_tx_descriptor *
-async_mult(struct page *dest, unsigned int d_off, struct page *src,
-		unsigned int s_off, u8 coef, size_t len,
-		struct async_submit_ctl *submit)
-{
-	struct dma_chan *chan = async_tx_find_channel(submit, DMA_PQ,
-						      &dest, 1, &src, 1, len);
-	struct dma_device *dma = chan ? chan->device : NULL;
-	struct dmaengine_unmap_data *unmap = NULL;
-	const u8 *qmul; /* Q multiplier table */
-	u8 *d, *s;
-
-	if (dma)
-		unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOWAIT);
-
-	if (unmap) {
-		dma_addr_t dma_dest[2];
-		struct device *dev = dma->dev;
-		struct dma_async_tx_descriptor *tx;
-		enum dma_ctrl_flags dma_flags = DMA_PREP_PQ_DISABLE_P;
-
-		if (submit->flags & ASYNC_TX_FENCE)
-			dma_flags |= DMA_PREP_FENCE;
-		unmap->addr[0] = dma_map_page(dev, src, s_off,
-						len, DMA_TO_DEVICE);
-		unmap->to_cnt++;
-		unmap->addr[1] = dma_map_page(dev, dest, d_off,
-						len, DMA_BIDIRECTIONAL);
-		dma_dest[1] = unmap->addr[1];
-		unmap->bidi_cnt++;
-		unmap->len = len;
-
-		/* this looks funny, but the engine looks for Q at
-		 * dma_dest[1] and ignores dma_dest[0] as a dest
-		 * due to DMA_PREP_PQ_DISABLE_P
-		 */
-		tx = dma->device_prep_dma_pq(chan, dma_dest, unmap->addr,
-					     1, &coef, len, dma_flags);
-
-		if (tx) {
-			dma_set_unmap(tx, unmap);
-			dmaengine_unmap_put(unmap);
-			async_tx_submit(chan, tx, submit);
-			return tx;
-		}
-
-		/* could not get a descriptor, unmap and fall through to
-		 * the synchronous path
-		 */
-		dmaengine_unmap_put(unmap);
-	}
-
-	/* no channel available, or failed to allocate a descriptor, so
-	 * perform the operation synchronously
-	 */
-	async_tx_quiesce(&submit->depend_tx);
-	qmul  = raid6_gfmul[coef];
-	d = page_address(dest) + d_off;
-	s = page_address(src) + s_off;
-
-	while (len--)
-		*d++ = qmul[*s++];
-
-	return NULL;
-}
-
-static struct dma_async_tx_descriptor *
-__2data_recov_4(int disks, size_t bytes, int faila, int failb,
-		struct page **blocks, unsigned int *offs,
-		struct async_submit_ctl *submit)
-{
-	struct dma_async_tx_descriptor *tx = NULL;
-	struct page *p, *q, *a, *b;
-	unsigned int p_off, q_off, a_off, b_off;
-	struct page *srcs[2];
-	unsigned int src_offs[2];
-	unsigned char coef[2];
-	enum async_tx_flags flags = submit->flags;
-	dma_async_tx_callback cb_fn = submit->cb_fn;
-	void *cb_param = submit->cb_param;
-	void *scribble = submit->scribble;
-
-	p = blocks[disks-2];
-	p_off = offs[disks-2];
-	q = blocks[disks-1];
-	q_off = offs[disks-1];
-
-	a = blocks[faila];
-	a_off = offs[faila];
-	b = blocks[failb];
-	b_off = offs[failb];
-
-	/* in the 4 disk case P + Pxy == P and Q + Qxy == Q */
-	/* Dx = A*(P+Pxy) + B*(Q+Qxy) */
-	srcs[0] = p;
-	src_offs[0] = p_off;
-	srcs[1] = q;
-	src_offs[1] = q_off;
-	coef[0] = raid6_gfexi[failb-faila];
-	coef[1] = raid6_gfinv[raid6_gfexp[faila]^raid6_gfexp[failb]];
-	init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble);
-	tx = async_sum_product(b, b_off, srcs, src_offs, coef, bytes, submit);
-
-	/* Dy = P+Pxy+Dx */
-	srcs[0] = p;
-	src_offs[0] = p_off;
-	srcs[1] = b;
-	src_offs[1] = b_off;
-	init_async_submit(submit, flags | ASYNC_TX_XOR_ZERO_DST, tx, cb_fn,
-			  cb_param, scribble);
-	tx = async_xor_offs(a, a_off, srcs, src_offs, 2, bytes, submit);
-
-	return tx;
-
-}
-
-static struct dma_async_tx_descriptor *
-__2data_recov_5(int disks, size_t bytes, int faila, int failb,
-		struct page **blocks, unsigned int *offs,
-		struct async_submit_ctl *submit)
-{
-	struct dma_async_tx_descriptor *tx = NULL;
-	struct page *p, *q, *g, *dp, *dq;
-	unsigned int p_off, q_off, g_off, dp_off, dq_off;
-	struct page *srcs[2];
-	unsigned int src_offs[2];
-	unsigned char coef[2];
-	enum async_tx_flags flags = submit->flags;
-	dma_async_tx_callback cb_fn = submit->cb_fn;
-	void *cb_param = submit->cb_param;
-	void *scribble = submit->scribble;
-	int good_srcs, good, i;
-
-	good_srcs = 0;
-	good = -1;
-	for (i = 0; i < disks-2; i++) {
-		if (blocks[i] == NULL)
-			continue;
-		if (i == faila || i == failb)
-			continue;
-		good = i;
-		good_srcs++;
-	}
-	BUG_ON(good_srcs > 1);
-
-	p = blocks[disks-2];
-	p_off = offs[disks-2];
-	q = blocks[disks-1];
-	q_off = offs[disks-1];
-	g = blocks[good];
-	g_off = offs[good];
-
-	/* Compute syndrome with zero for the missing data pages
-	 * Use the dead data pages as temporary storage for delta p and
-	 * delta q
-	 */
-	dp = blocks[faila];
-	dp_off = offs[faila];
-	dq = blocks[failb];
-	dq_off = offs[failb];
-
-	init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble);
-	tx = async_memcpy(dp, g, dp_off, g_off, bytes, submit);
-	init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble);
-	tx = async_mult(dq, dq_off, g, g_off,
-			raid6_gfexp[good], bytes, submit);
-
-	/* compute P + Pxy */
-	srcs[0] = dp;
-	src_offs[0] = dp_off;
-	srcs[1] = p;
-	src_offs[1] = p_off;
-	init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx,
-			  NULL, NULL, scribble);
-	tx = async_xor_offs(dp, dp_off, srcs, src_offs, 2, bytes, submit);
-
-	/* compute Q + Qxy */
-	srcs[0] = dq;
-	src_offs[0] = dq_off;
-	srcs[1] = q;
-	src_offs[1] = q_off;
-	init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx,
-			  NULL, NULL, scribble);
-	tx = async_xor_offs(dq, dq_off, srcs, src_offs, 2, bytes, submit);
-
-	/* Dx = A*(P+Pxy) + B*(Q+Qxy) */
-	srcs[0] = dp;
-	src_offs[0] = dp_off;
-	srcs[1] = dq;
-	src_offs[1] = dq_off;
-	coef[0] = raid6_gfexi[failb-faila];
-	coef[1] = raid6_gfinv[raid6_gfexp[faila]^raid6_gfexp[failb]];
-	init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble);
-	tx = async_sum_product(dq, dq_off, srcs, src_offs, coef, bytes, submit);
-
-	/* Dy = P+Pxy+Dx */
-	srcs[0] = dp;
-	src_offs[0] = dp_off;
-	srcs[1] = dq;
-	src_offs[1] = dq_off;
-	init_async_submit(submit, flags | ASYNC_TX_XOR_DROP_DST, tx, cb_fn,
-			  cb_param, scribble);
-	tx = async_xor_offs(dp, dp_off, srcs, src_offs, 2, bytes, submit);
-
-	return tx;
-}
-
-static struct dma_async_tx_descriptor *
-__2data_recov_n(int disks, size_t bytes, int faila, int failb,
-	      struct page **blocks, unsigned int *offs,
-		  struct async_submit_ctl *submit)
-{
-	struct dma_async_tx_descriptor *tx = NULL;
-	struct page *p, *q, *dp, *dq;
-	unsigned int p_off, q_off, dp_off, dq_off;
-	struct page *srcs[2];
-	unsigned int src_offs[2];
-	unsigned char coef[2];
-	enum async_tx_flags flags = submit->flags;
-	dma_async_tx_callback cb_fn = submit->cb_fn;
-	void *cb_param = submit->cb_param;
-	void *scribble = submit->scribble;
-
-	p = blocks[disks-2];
-	p_off = offs[disks-2];
-	q = blocks[disks-1];
-	q_off = offs[disks-1];
-
-	/* Compute syndrome with zero for the missing data pages
-	 * Use the dead data pages as temporary storage for
-	 * delta p and delta q
-	 */
-	dp = blocks[faila];
-	dp_off = offs[faila];
-	blocks[faila] = NULL;
-	blocks[disks-2] = dp;
-	offs[disks-2] = dp_off;
-	dq = blocks[failb];
-	dq_off = offs[failb];
-	blocks[failb] = NULL;
-	blocks[disks-1] = dq;
-	offs[disks-1] = dq_off;
-
-	init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble);
-	tx = async_gen_syndrome(blocks, offs, disks, bytes, submit);
-
-	/* Restore pointer table */
-	blocks[faila]   = dp;
-	offs[faila] = dp_off;
-	blocks[failb]   = dq;
-	offs[failb] = dq_off;
-	blocks[disks-2] = p;
-	offs[disks-2] = p_off;
-	blocks[disks-1] = q;
-	offs[disks-1] = q_off;
-
-	/* compute P + Pxy */
-	srcs[0] = dp;
-	src_offs[0] = dp_off;
-	srcs[1] = p;
-	src_offs[1] = p_off;
-	init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx,
-			  NULL, NULL, scribble);
-	tx = async_xor_offs(dp, dp_off, srcs, src_offs, 2, bytes, submit);
-
-	/* compute Q + Qxy */
-	srcs[0] = dq;
-	src_offs[0] = dq_off;
-	srcs[1] = q;
-	src_offs[1] = q_off;
-	init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx,
-			  NULL, NULL, scribble);
-	tx = async_xor_offs(dq, dq_off, srcs, src_offs, 2, bytes, submit);
-
-	/* Dx = A*(P+Pxy) + B*(Q+Qxy) */
-	srcs[0] = dp;
-	src_offs[0] = dp_off;
-	srcs[1] = dq;
-	src_offs[1] = dq_off;
-	coef[0] = raid6_gfexi[failb-faila];
-	coef[1] = raid6_gfinv[raid6_gfexp[faila]^raid6_gfexp[failb]];
-	init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble);
-	tx = async_sum_product(dq, dq_off, srcs, src_offs, coef, bytes, submit);
-
-	/* Dy = P+Pxy+Dx */
-	srcs[0] = dp;
-	src_offs[0] = dp_off;
-	srcs[1] = dq;
-	src_offs[1] = dq_off;
-	init_async_submit(submit, flags | ASYNC_TX_XOR_DROP_DST, tx, cb_fn,
-			  cb_param, scribble);
-	tx = async_xor_offs(dp, dp_off, srcs, src_offs, 2, bytes, submit);
-
-	return tx;
-}
-
-/**
- * async_raid6_2data_recov - asynchronously calculate two missing data blocks
- * @disks: number of disks in the RAID-6 array
- * @bytes: block size
- * @faila: first failed drive index
- * @failb: second failed drive index
- * @blocks: array of source pointers where the last two entries are p and q
- * @offs: array of offset for pages in blocks
- * @submit: submission/completion modifiers
- */
-struct dma_async_tx_descriptor *
-async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
-			struct page **blocks, unsigned int *offs,
-			struct async_submit_ctl *submit)
-{
-	void *scribble = submit->scribble;
-	int non_zero_srcs, i;
-
-	BUG_ON(faila == failb);
-	if (failb < faila)
-		swap(faila, failb);
-
-	pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes);
-
-	/* if a dma resource is not available or a scribble buffer is not
-	 * available punt to the synchronous path.  In the 'dma not
-	 * available' case be sure to use the scribble buffer to
-	 * preserve the content of 'blocks' as the caller intended.
-	 */
-	if (!async_dma_find_channel(DMA_PQ) || !scribble) {
-		void **ptrs = scribble ? scribble : (void **) blocks;
-
-		async_tx_quiesce(&submit->depend_tx);
-		for (i = 0; i < disks; i++)
-			if (blocks[i] == NULL)
-				ptrs[i] = page_address(ZERO_PAGE(0));
-			else
-				ptrs[i] = page_address(blocks[i]) + offs[i];
-
-		raid6_recov_2data(disks, bytes, faila, failb, ptrs);
-
-		async_tx_sync_epilog(submit);
-
-		return NULL;
-	}
-
-	non_zero_srcs = 0;
-	for (i = 0; i < disks-2 && non_zero_srcs < 4; i++)
-		if (blocks[i])
-			non_zero_srcs++;
-	switch (non_zero_srcs) {
-	case 0:
-	case 1:
-		/* There must be at least 2 sources - the failed devices. */
-		BUG();
-
-	case 2:
-		/* dma devices do not uniformly understand a zero source pq
-		 * operation (in contrast to the synchronous case), so
-		 * explicitly handle the special case of a 4 disk array with
-		 * both data disks missing.
-		 */
-		return __2data_recov_4(disks, bytes, faila, failb,
-				blocks, offs, submit);
-	case 3:
-		/* dma devices do not uniformly understand a single
-		 * source pq operation (in contrast to the synchronous
-		 * case), so explicitly handle the special case of a 5 disk
-		 * array with 2 of 3 data disks missing.
-		 */
-		return __2data_recov_5(disks, bytes, faila, failb,
-				blocks, offs, submit);
-	default:
-		return __2data_recov_n(disks, bytes, faila, failb,
-				blocks, offs, submit);
-	}
-}
-EXPORT_SYMBOL_GPL(async_raid6_2data_recov);
-
-/**
- * async_raid6_datap_recov - asynchronously calculate a data and the 'p' block
- * @disks: number of disks in the RAID-6 array
- * @bytes: block size
- * @faila: failed drive index
- * @blocks: array of source pointers where the last two entries are p and q
- * @offs: array of offset for pages in blocks
- * @submit: submission/completion modifiers
- */
-struct dma_async_tx_descriptor *
-async_raid6_datap_recov(int disks, size_t bytes, int faila,
-			struct page **blocks, unsigned int *offs,
-			struct async_submit_ctl *submit)
-{
-	struct dma_async_tx_descriptor *tx = NULL;
-	struct page *p, *q, *dq;
-	unsigned int p_off, q_off, dq_off;
-	u8 coef;
-	enum async_tx_flags flags = submit->flags;
-	dma_async_tx_callback cb_fn = submit->cb_fn;
-	void *cb_param = submit->cb_param;
-	void *scribble = submit->scribble;
-	int good_srcs, good, i;
-	struct page *srcs[2];
-	unsigned int src_offs[2];
-
-	pr_debug("%s: disks: %d len: %zu\n", __func__, disks, bytes);
-
-	/* if a dma resource is not available or a scribble buffer is not
-	 * available punt to the synchronous path.  In the 'dma not
-	 * available' case be sure to use the scribble buffer to
-	 * preserve the content of 'blocks' as the caller intended.
-	 */
-	if (!async_dma_find_channel(DMA_PQ) || !scribble) {
-		void **ptrs = scribble ? scribble : (void **) blocks;
-
-		async_tx_quiesce(&submit->depend_tx);
-		for (i = 0; i < disks; i++)
-			if (blocks[i] == NULL)
-				ptrs[i] = page_address(ZERO_PAGE(0));
-			else
-				ptrs[i] = page_address(blocks[i]) + offs[i];
-
-		raid6_recov_datap(disks, bytes, faila, ptrs);
-
-		async_tx_sync_epilog(submit);
-
-		return NULL;
-	}
-
-	good_srcs = 0;
-	good = -1;
-	for (i = 0; i < disks-2; i++) {
-		if (i == faila)
-			continue;
-		if (blocks[i]) {
-			good = i;
-			good_srcs++;
-			if (good_srcs > 1)
-				break;
-		}
-	}
-	BUG_ON(good_srcs == 0);
-
-	p = blocks[disks-2];
-	p_off = offs[disks-2];
-	q = blocks[disks-1];
-	q_off = offs[disks-1];
-
-	/* Compute syndrome with zero for the missing data page
-	 * Use the dead data page as temporary storage for delta q
-	 */
-	dq = blocks[faila];
-	dq_off = offs[faila];
-	blocks[faila] = NULL;
-	blocks[disks-1] = dq;
-	offs[disks-1] = dq_off;
-
-	/* in the 4-disk case we only need to perform a single source
-	 * multiplication with the one good data block.
-	 */
-	if (good_srcs == 1) {
-		struct page *g = blocks[good];
-		unsigned int g_off = offs[good];
-
-		init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL,
-				  scribble);
-		tx = async_memcpy(p, g, p_off, g_off, bytes, submit);
-
-		init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL,
-				  scribble);
-		tx = async_mult(dq, dq_off, g, g_off,
-				raid6_gfexp[good], bytes, submit);
-	} else {
-		init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL,
-				  scribble);
-		tx = async_gen_syndrome(blocks, offs, disks, bytes, submit);
-	}
-
-	/* Restore pointer table */
-	blocks[faila]   = dq;
-	offs[faila] = dq_off;
-	blocks[disks-1] = q;
-	offs[disks-1] = q_off;
-
-	/* calculate g^{-faila} */
-	coef = raid6_gfinv[raid6_gfexp[faila]];
-
-	srcs[0] = dq;
-	src_offs[0] = dq_off;
-	srcs[1] = q;
-	src_offs[1] = q_off;
-	init_async_submit(submit, ASYNC_TX_FENCE|ASYNC_TX_XOR_DROP_DST, tx,
-			  NULL, NULL, scribble);
-	tx = async_xor_offs(dq, dq_off, srcs, src_offs, 2, bytes, submit);
-
-	init_async_submit(submit, ASYNC_TX_FENCE, tx, NULL, NULL, scribble);
-	tx = async_mult(dq, dq_off, dq, dq_off, coef, bytes, submit);
-
-	srcs[0] = p;
-	src_offs[0] = p_off;
-	srcs[1] = dq;
-	src_offs[1] = dq_off;
-	init_async_submit(submit, flags | ASYNC_TX_XOR_DROP_DST, tx, cb_fn,
-			  cb_param, scribble);
-	tx = async_xor_offs(p, p_off, srcs, src_offs, 2, bytes, submit);
-
-	return tx;
-}
-EXPORT_SYMBOL_GPL(async_raid6_datap_recov);
-
-MODULE_AUTHOR("Dan Williams <dan.j.williams@intel.com>");
-MODULE_DESCRIPTION("asynchronous RAID-6 recovery api");
-MODULE_LICENSE("GPL");
diff --git a/crypto/async_tx/async_tx.c b/crypto/async_tx/async_tx.c
deleted file mode 100644
index 7d3009c5c3605..0000000000000
--- a/crypto/async_tx/async_tx.c
+++ /dev/null
@@ -1,299 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * core routines for the asynchronous memory transfer/transform api
- *
- * Copyright © 2006, Intel Corporation.
- *
- *	Dan Williams <dan.j.williams@intel.com>
- *
- *	with architecture considerations by:
- *	Neil Brown <neilb@suse.de>
- *	Jeff Garzik <jeff@garzik.org>
- */
-#include <linux/rculist.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/async_tx.h>
-#include "../../drivers/dma/dmaengine.h"
-
-#ifdef CONFIG_DMA_ENGINE
-static int __init async_tx_init(void)
-{
-	async_dmaengine_get();
-
-	printk(KERN_INFO "async_tx: api initialized (async)\n");
-
-	return 0;
-}
-
-static void __exit async_tx_exit(void)
-{
-	async_dmaengine_put();
-}
-
-module_init(async_tx_init);
-module_exit(async_tx_exit);
-
-/**
- * __async_tx_find_channel - find a channel to carry out the operation or let
- *	the transaction execute synchronously
- * @submit: transaction dependency and submission modifiers
- * @tx_type: transaction type
- */
-struct dma_chan *
-__async_tx_find_channel(struct async_submit_ctl *submit,
-			enum dma_transaction_type tx_type)
-{
-	struct dma_async_tx_descriptor *depend_tx = submit->depend_tx;
-
-	/* see if we can keep the chain on one channel */
-	if (depend_tx &&
-	    dma_has_cap(tx_type, depend_tx->chan->device->cap_mask))
-		return depend_tx->chan;
-	return async_dma_find_channel(tx_type);
-}
-EXPORT_SYMBOL_GPL(__async_tx_find_channel);
-#endif
-
-
-/**
- * async_tx_channel_switch - queue an interrupt descriptor with a dependency
- * 	pre-attached.
- * @depend_tx: the operation that must finish before the new operation runs
- * @tx: the new operation
- */
-static void
-async_tx_channel_switch(struct dma_async_tx_descriptor *depend_tx,
-			struct dma_async_tx_descriptor *tx)
-{
-	struct dma_chan *chan = depend_tx->chan;
-	struct dma_device *device = chan->device;
-	struct dma_async_tx_descriptor *intr_tx = (void *) ~0;
-
-	/* first check to see if we can still append to depend_tx */
-	txd_lock(depend_tx);
-	if (txd_parent(depend_tx) && depend_tx->chan == tx->chan) {
-		txd_chain(depend_tx, tx);
-		intr_tx = NULL;
-	}
-	txd_unlock(depend_tx);
-
-	/* attached dependency, flush the parent channel */
-	if (!intr_tx) {
-		device->device_issue_pending(chan);
-		return;
-	}
-
-	/* see if we can schedule an interrupt
-	 * otherwise poll for completion
-	 */
-	if (dma_has_cap(DMA_INTERRUPT, device->cap_mask))
-		intr_tx = device->device_prep_dma_interrupt(chan, 0);
-	else
-		intr_tx = NULL;
-
-	if (intr_tx) {
-		dmaengine_desc_set_callback(intr_tx, NULL, NULL, NULL);
-		/* safe to chain outside the lock since we know we are
-		 * not submitted yet
-		 */
-		txd_chain(intr_tx, tx);
-
-		/* check if we need to append */
-		txd_lock(depend_tx);
-		if (txd_parent(depend_tx)) {
-			txd_chain(depend_tx, intr_tx);
-			async_tx_ack(intr_tx);
-			intr_tx = NULL;
-		}
-		txd_unlock(depend_tx);
-
-		if (intr_tx) {
-			txd_clear_parent(intr_tx);
-			intr_tx->tx_submit(intr_tx);
-			async_tx_ack(intr_tx);
-		}
-		device->device_issue_pending(chan);
-	} else {
-		if (dma_wait_for_async_tx(depend_tx) != DMA_COMPLETE)
-			panic("%s: DMA error waiting for depend_tx\n",
-			      __func__);
-		tx->tx_submit(tx);
-	}
-}
-
-
-/**
- * enum submit_disposition - flags for routing an incoming operation
- * @ASYNC_TX_SUBMITTED: we were able to append the new operation under the lock
- * @ASYNC_TX_CHANNEL_SWITCH: when the lock is dropped schedule a channel switch
- * @ASYNC_TX_DIRECT_SUBMIT: when the lock is dropped submit directly
- *
- * while holding depend_tx->lock we must avoid submitting new operations
- * to prevent a circular locking dependency with drivers that already
- * hold a channel lock when calling async_tx_run_dependencies.
- */
-enum submit_disposition {
-	ASYNC_TX_SUBMITTED,
-	ASYNC_TX_CHANNEL_SWITCH,
-	ASYNC_TX_DIRECT_SUBMIT,
-};
-
-void
-async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx,
-		struct async_submit_ctl *submit)
-{
-	struct dma_async_tx_descriptor *depend_tx = submit->depend_tx;
-
-	dmaengine_desc_set_callback(tx, submit->cb_fn, NULL, submit->cb_param);
-
-	if (depend_tx) {
-		enum submit_disposition s;
-
-		/* sanity check the dependency chain:
-		 * 1/ if ack is already set then we cannot be sure
-		 * we are referring to the correct operation
-		 * 2/ dependencies are 1:1 i.e. two transactions can
-		 * not depend on the same parent
-		 */
-		BUG_ON(async_tx_test_ack(depend_tx) || txd_next(depend_tx) ||
-		       txd_parent(tx));
-
-		/* the lock prevents async_tx_run_dependencies from missing
-		 * the setting of ->next when ->parent != NULL
-		 */
-		txd_lock(depend_tx);
-		if (txd_parent(depend_tx)) {
-			/* we have a parent so we can not submit directly
-			 * if we are staying on the same channel: append
-			 * else: channel switch
-			 */
-			if (depend_tx->chan == chan) {
-				txd_chain(depend_tx, tx);
-				s = ASYNC_TX_SUBMITTED;
-			} else
-				s = ASYNC_TX_CHANNEL_SWITCH;
-		} else {
-			/* we do not have a parent so we may be able to submit
-			 * directly if we are staying on the same channel
-			 */
-			if (depend_tx->chan == chan)
-				s = ASYNC_TX_DIRECT_SUBMIT;
-			else
-				s = ASYNC_TX_CHANNEL_SWITCH;
-		}
-		txd_unlock(depend_tx);
-
-		switch (s) {
-		case ASYNC_TX_SUBMITTED:
-			break;
-		case ASYNC_TX_CHANNEL_SWITCH:
-			async_tx_channel_switch(depend_tx, tx);
-			break;
-		case ASYNC_TX_DIRECT_SUBMIT:
-			txd_clear_parent(tx);
-			tx->tx_submit(tx);
-			break;
-		}
-	} else {
-		txd_clear_parent(tx);
-		tx->tx_submit(tx);
-	}
-
-	if (submit->flags & ASYNC_TX_ACK)
-		async_tx_ack(tx);
-
-	if (depend_tx)
-		async_tx_ack(depend_tx);
-}
-EXPORT_SYMBOL_GPL(async_tx_submit);
-
-/**
- * async_tx_issue_pending - send pending descriptor to the hardware channel
- * @tx: descriptor handle to retrieve hardware context
- *
- * Note: any dependent operations will have already been issued by
- * async_tx_channel_switch, or (in the case of no channel switch) will
- * be already pending on this channel.
- */
-void async_tx_issue_pending(struct dma_async_tx_descriptor *tx)
-{
-	if (likely(tx)) {
-		struct dma_chan *chan = tx->chan;
-		struct dma_device *dma = chan->device;
-
-		dma->device_issue_pending(chan);
-	}
-}
-EXPORT_SYMBOL_GPL(async_tx_issue_pending);
-
-/**
- * async_trigger_callback - schedules the callback function to be run
- * @submit: submission and completion parameters
- *
- * honored flags: ASYNC_TX_ACK
- *
- * The callback is run after any dependent operations have completed.
- */
-struct dma_async_tx_descriptor *
-async_trigger_callback(struct async_submit_ctl *submit)
-{
-	struct dma_chan *chan;
-	struct dma_device *device;
-	struct dma_async_tx_descriptor *tx;
-	struct dma_async_tx_descriptor *depend_tx = submit->depend_tx;
-
-	if (depend_tx) {
-		chan = depend_tx->chan;
-		device = chan->device;
-
-		/* see if we can schedule an interrupt
-		 * otherwise poll for completion
-		 */
-		if (device && !dma_has_cap(DMA_INTERRUPT, device->cap_mask))
-			device = NULL;
-
-		tx = device ? device->device_prep_dma_interrupt(chan, 0) : NULL;
-	} else
-		tx = NULL;
-
-	if (tx) {
-		pr_debug("%s: (async)\n", __func__);
-
-		async_tx_submit(chan, tx, submit);
-	} else {
-		pr_debug("%s: (sync)\n", __func__);
-
-		/* wait for any prerequisite operations */
-		async_tx_quiesce(&submit->depend_tx);
-
-		async_tx_sync_epilog(submit);
-	}
-
-	return tx;
-}
-EXPORT_SYMBOL_GPL(async_trigger_callback);
-
-/**
- * async_tx_quiesce - ensure tx is complete and freeable upon return
- * @tx: transaction to quiesce
- */
-void async_tx_quiesce(struct dma_async_tx_descriptor **tx)
-{
-	if (*tx) {
-		/* if ack is already set then we cannot be sure
-		 * we are referring to the correct operation
-		 */
-		BUG_ON(async_tx_test_ack(*tx));
-		if (dma_wait_for_async_tx(*tx) != DMA_COMPLETE)
-			panic("%s: DMA error waiting for transaction\n",
-			      __func__);
-		async_tx_ack(*tx);
-		*tx = NULL;
-	}
-}
-EXPORT_SYMBOL_GPL(async_tx_quiesce);
-
-MODULE_AUTHOR("Intel Corporation");
-MODULE_DESCRIPTION("Asynchronous Bulk Memory Transactions API");
-MODULE_LICENSE("GPL");
diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c
deleted file mode 100644
index 84458375b202b..0000000000000
--- a/crypto/async_tx/async_xor.c
+++ /dev/null
@@ -1,380 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * xor offload engine api
- *
- * Copyright © 2006, Intel Corporation.
- *
- *      Dan Williams <dan.j.williams@intel.com>
- *
- *      with architecture considerations by:
- *      Neil Brown <neilb@suse.de>
- *      Jeff Garzik <jeff@garzik.org>
- */
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/dma-mapping.h>
-#include <linux/raid/xor.h>
-#include <linux/async_tx.h>
-
-/* do_async_xor - dma map the pages and perform the xor with an engine */
-static __async_inline struct dma_async_tx_descriptor *
-do_async_xor(struct dma_chan *chan, struct dmaengine_unmap_data *unmap,
-	     struct async_submit_ctl *submit)
-{
-	struct dma_device *dma = chan->device;
-	struct dma_async_tx_descriptor *tx = NULL;
-	dma_async_tx_callback cb_fn_orig = submit->cb_fn;
-	void *cb_param_orig = submit->cb_param;
-	enum async_tx_flags flags_orig = submit->flags;
-	enum dma_ctrl_flags dma_flags = 0;
-	int src_cnt = unmap->to_cnt;
-	int xor_src_cnt;
-	dma_addr_t dma_dest = unmap->addr[unmap->to_cnt];
-	dma_addr_t *src_list = unmap->addr;
-
-	while (src_cnt) {
-		dma_addr_t tmp;
-
-		submit->flags = flags_orig;
-		xor_src_cnt = min(src_cnt, (int)dma->max_xor);
-		/* if we are submitting additional xors, leave the chain open
-		 * and clear the callback parameters
-		 */
-		if (src_cnt > xor_src_cnt) {
-			submit->flags &= ~ASYNC_TX_ACK;
-			submit->flags |= ASYNC_TX_FENCE;
-			submit->cb_fn = NULL;
-			submit->cb_param = NULL;
-		} else {
-			submit->cb_fn = cb_fn_orig;
-			submit->cb_param = cb_param_orig;
-		}
-		if (submit->cb_fn)
-			dma_flags |= DMA_PREP_INTERRUPT;
-		if (submit->flags & ASYNC_TX_FENCE)
-			dma_flags |= DMA_PREP_FENCE;
-
-		/* Drivers force forward progress in case they can not provide a
-		 * descriptor
-		 */
-		tmp = src_list[0];
-		if (src_list > unmap->addr)
-			src_list[0] = dma_dest;
-		tx = dma->device_prep_dma_xor(chan, dma_dest, src_list,
-					      xor_src_cnt, unmap->len,
-					      dma_flags);
-
-		if (unlikely(!tx))
-			async_tx_quiesce(&submit->depend_tx);
-
-		/* spin wait for the preceding transactions to complete */
-		while (unlikely(!tx)) {
-			dma_async_issue_pending(chan);
-			tx = dma->device_prep_dma_xor(chan, dma_dest,
-						      src_list,
-						      xor_src_cnt, unmap->len,
-						      dma_flags);
-		}
-		src_list[0] = tmp;
-
-		dma_set_unmap(tx, unmap);
-		async_tx_submit(chan, tx, submit);
-		submit->depend_tx = tx;
-
-		if (src_cnt > xor_src_cnt) {
-			/* drop completed sources */
-			src_cnt -= xor_src_cnt;
-			/* use the intermediate result a source */
-			src_cnt++;
-			src_list += xor_src_cnt - 1;
-		} else
-			break;
-	}
-
-	return tx;
-}
-
-static void
-do_sync_xor_offs(struct page *dest, unsigned int offset,
-		struct page **src_list, unsigned int *src_offs,
-	    int src_cnt, size_t len, struct async_submit_ctl *submit)
-{
-	int i;
-	int xor_src_cnt = 0;
-	void *dest_buf;
-	void **srcs;
-
-	if (submit->scribble)
-		srcs = submit->scribble;
-	else
-		srcs = (void **) src_list;
-
-	/* convert to buffer pointers */
-	for (i = 0; i < src_cnt; i++)
-		if (src_list[i])
-			srcs[xor_src_cnt++] = page_address(src_list[i]) +
-				(src_offs ? src_offs[i] : offset);
-
-	/* set destination address */
-	dest_buf = page_address(dest) + offset;
-	if (submit->flags & ASYNC_TX_XOR_ZERO_DST)
-		memset(dest_buf, 0, len);
-	xor_gen(dest_buf, srcs, xor_src_cnt, len);
-	async_tx_sync_epilog(submit);
-}
-
-static inline bool
-dma_xor_aligned_offsets(struct dma_device *device, unsigned int offset,
-		unsigned int *src_offs, int src_cnt, int len)
-{
-	int i;
-
-	if (!is_dma_xor_aligned(device, offset, 0, len))
-		return false;
-
-	if (!src_offs)
-		return true;
-
-	for (i = 0; i < src_cnt; i++) {
-		if (!is_dma_xor_aligned(device, src_offs[i], 0, len))
-			return false;
-	}
-	return true;
-}
-
-/**
- * async_xor_offs - attempt to xor a set of blocks with a dma engine.
- * @dest: destination page
- * @offset: dst offset to start transaction
- * @src_list: array of source pages
- * @src_offs: array of source pages offset, NULL means common src/dst offset
- * @src_cnt: number of source pages
- * @len: length in bytes
- * @submit: submission / completion modifiers
- *
- * honored flags: ASYNC_TX_ACK, ASYNC_TX_XOR_ZERO_DST, ASYNC_TX_XOR_DROP_DST
- *
- * xor_gen always uses the dest as a source so the ASYNC_TX_XOR_ZERO_DST flag
- * must be set to not include dest data in the calculation.  The assumption with
- * dma engines is that they only use the destination buffer as a source when it
- * is explicitly specified in the source list.
- *
- * src_list note: if the dest is also a source it must be at index zero.
- * The contents of this array will be overwritten if a scribble region
- * is not specified.
- */
-struct dma_async_tx_descriptor *
-async_xor_offs(struct page *dest, unsigned int offset,
-		struct page **src_list, unsigned int *src_offs,
-		int src_cnt, size_t len, struct async_submit_ctl *submit)
-{
-	struct dma_chan *chan = async_tx_find_channel(submit, DMA_XOR,
-						      &dest, 1, src_list,
-						      src_cnt, len);
-	struct dma_device *device = chan ? chan->device : NULL;
-	struct dmaengine_unmap_data *unmap = NULL;
-
-	BUG_ON(src_cnt <= 1);
-
-	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, src_cnt+1, GFP_NOWAIT);
-
-	if (unmap && dma_xor_aligned_offsets(device, offset,
-				src_offs, src_cnt, len)) {
-		struct dma_async_tx_descriptor *tx;
-		int i, j;
-
-		/* run the xor asynchronously */
-		pr_debug("%s (async): len: %zu\n", __func__, len);
-
-		unmap->len = len;
-		for (i = 0, j = 0; i < src_cnt; i++) {
-			if (!src_list[i])
-				continue;
-			unmap->to_cnt++;
-			unmap->addr[j++] = dma_map_page(device->dev, src_list[i],
-					src_offs ? src_offs[i] : offset,
-					len, DMA_TO_DEVICE);
-		}
-
-		/* map it bidirectional as it may be re-used as a source */
-		unmap->addr[j] = dma_map_page(device->dev, dest, offset, len,
-					      DMA_BIDIRECTIONAL);
-		unmap->bidi_cnt = 1;
-
-		tx = do_async_xor(chan, unmap, submit);
-		dmaengine_unmap_put(unmap);
-		return tx;
-	} else {
-		dmaengine_unmap_put(unmap);
-		/* run the xor synchronously */
-		pr_debug("%s (sync): len: %zu\n", __func__, len);
-		WARN_ONCE(chan, "%s: no space for dma address conversion\n",
-			  __func__);
-
-		/* in the sync case the dest is an implied source
-		 * (assumes the dest is the first source)
-		 */
-		if (submit->flags & ASYNC_TX_XOR_DROP_DST) {
-			src_cnt--;
-			src_list++;
-			if (src_offs)
-				src_offs++;
-		}
-
-		/* wait for any prerequisite operations */
-		async_tx_quiesce(&submit->depend_tx);
-
-		do_sync_xor_offs(dest, offset, src_list, src_offs,
-				src_cnt, len, submit);
-
-		return NULL;
-	}
-}
-EXPORT_SYMBOL_GPL(async_xor_offs);
-
-/**
- * async_xor - attempt to xor a set of blocks with a dma engine.
- * @dest: destination page
- * @src_list: array of source pages
- * @offset: common src/dst offset to start transaction
- * @src_cnt: number of source pages
- * @len: length in bytes
- * @submit: submission / completion modifiers
- *
- * honored flags: ASYNC_TX_ACK, ASYNC_TX_XOR_ZERO_DST, ASYNC_TX_XOR_DROP_DST
- *
- * xor_gen always uses the dest as a source so the ASYNC_TX_XOR_ZERO_DST flag
- * must be set to not include dest data in the calculation.  The assumption with
- * dma engines is that they only use the destination buffer as a source when it
- * is explicitly specified in the source list.
- *
- * src_list note: if the dest is also a source it must be at index zero.
- * The contents of this array will be overwritten if a scribble region
- * is not specified.
- */
-struct dma_async_tx_descriptor *
-async_xor(struct page *dest, struct page **src_list, unsigned int offset,
-	  int src_cnt, size_t len, struct async_submit_ctl *submit)
-{
-	return async_xor_offs(dest, offset, src_list, NULL,
-			src_cnt, len, submit);
-}
-EXPORT_SYMBOL_GPL(async_xor);
-
-static int page_is_zero(struct page *p, unsigned int offset, size_t len)
-{
-	return !memchr_inv(page_address(p) + offset, 0, len);
-}
-
-static inline struct dma_chan *
-xor_val_chan(struct async_submit_ctl *submit, struct page *dest,
-		 struct page **src_list, int src_cnt, size_t len)
-{
-	#ifdef CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA
-	return NULL;
-	#endif
-	return async_tx_find_channel(submit, DMA_XOR_VAL, &dest, 1, src_list,
-				     src_cnt, len);
-}
-
-/**
- * async_xor_val_offs - attempt a xor parity check with a dma engine.
- * @dest: destination page used if the xor is performed synchronously
- * @offset: des offset in pages to start transaction
- * @src_list: array of source pages
- * @src_offs: array of source pages offset, NULL means common src/det offset
- * @src_cnt: number of source pages
- * @len: length in bytes
- * @result: 0 if sum == 0 else non-zero
- * @submit: submission / completion modifiers
- *
- * honored flags: ASYNC_TX_ACK
- *
- * src_list note: if the dest is also a source it must be at index zero.
- * The contents of this array will be overwritten if a scribble region
- * is not specified.
- */
-struct dma_async_tx_descriptor *
-async_xor_val_offs(struct page *dest, unsigned int offset,
-		struct page **src_list, unsigned int *src_offs,
-		int src_cnt, size_t len, enum sum_check_flags *result,
-		struct async_submit_ctl *submit)
-{
-	struct dma_chan *chan = xor_val_chan(submit, dest, src_list, src_cnt, len);
-	struct dma_device *device = chan ? chan->device : NULL;
-	struct dma_async_tx_descriptor *tx = NULL;
-	struct dmaengine_unmap_data *unmap = NULL;
-
-	BUG_ON(src_cnt <= 1);
-
-	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, src_cnt, GFP_NOWAIT);
-
-	if (unmap && src_cnt <= device->max_xor &&
-	    dma_xor_aligned_offsets(device, offset, src_offs, src_cnt, len)) {
-		unsigned long dma_prep_flags = 0;
-		int i;
-
-		pr_debug("%s: (async) len: %zu\n", __func__, len);
-
-		if (submit->cb_fn)
-			dma_prep_flags |= DMA_PREP_INTERRUPT;
-		if (submit->flags & ASYNC_TX_FENCE)
-			dma_prep_flags |= DMA_PREP_FENCE;
-
-		for (i = 0; i < src_cnt; i++) {
-			unmap->addr[i] = dma_map_page(device->dev, src_list[i],
-					src_offs ? src_offs[i] : offset,
-					len, DMA_TO_DEVICE);
-			unmap->to_cnt++;
-		}
-		unmap->len = len;
-
-		tx = device->device_prep_dma_xor_val(chan, unmap->addr, src_cnt,
-						     len, result,
-						     dma_prep_flags);
-		if (unlikely(!tx)) {
-			async_tx_quiesce(&submit->depend_tx);
-
-			while (!tx) {
-				dma_async_issue_pending(chan);
-				tx = device->device_prep_dma_xor_val(chan,
-					unmap->addr, src_cnt, len, result,
-					dma_prep_flags);
-			}
-		}
-		dma_set_unmap(tx, unmap);
-		async_tx_submit(chan, tx, submit);
-	} else {
-		enum async_tx_flags flags_orig = submit->flags;
-
-		pr_debug("%s: (sync) len: %zu\n", __func__, len);
-		WARN_ONCE(device && src_cnt <= device->max_xor,
-			  "%s: no space for dma address conversion\n",
-			  __func__);
-
-		submit->flags |= ASYNC_TX_XOR_DROP_DST;
-		submit->flags &= ~ASYNC_TX_ACK;
-
-		tx = async_xor_offs(dest, offset, src_list, src_offs,
-				src_cnt, len, submit);
-
-		async_tx_quiesce(&tx);
-
-		*result = !page_is_zero(dest, offset, len) << SUM_CHECK_P;
-
-		async_tx_sync_epilog(submit);
-		submit->flags = flags_orig;
-	}
-	dmaengine_unmap_put(unmap);
-
-	return tx;
-}
-EXPORT_SYMBOL_GPL(async_xor_val_offs);
-
-MODULE_AUTHOR("Intel Corporation");
-MODULE_DESCRIPTION("asynchronous xor/xor-zero-sum api");
-MODULE_LICENSE("GPL");
diff --git a/crypto/async_tx/raid6test.c b/crypto/async_tx/raid6test.c
deleted file mode 100644
index d3fbee1e03e55..0000000000000
--- a/crypto/async_tx/raid6test.c
+++ /dev/null
@@ -1,250 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * asynchronous raid6 recovery self test
- * Copyright (c) 2009, Intel Corporation.
- *
- * based on drivers/md/raid6test/test.c:
- * 	Copyright 2002-2007 H. Peter Anvin
- */
-#include <linux/async_tx.h>
-#include <linux/gfp.h>
-#include <linux/mm.h>
-#include <linux/random.h>
-#include <linux/module.h>
-
-#undef pr
-#define pr(fmt, args...) pr_info("raid6test: " fmt, ##args)
-
-#define NDISKS 64 /* Including P and Q */
-
-static struct page *dataptrs[NDISKS];
-unsigned int dataoffs[NDISKS];
-static addr_conv_t addr_conv[NDISKS];
-static struct page *data[NDISKS+3];
-static struct page *spare;
-static struct page *recovi;
-static struct page *recovj;
-
-static void callback(void *param)
-{
-	struct completion *cmp = param;
-
-	complete(cmp);
-}
-
-static void makedata(int disks)
-{
-	int i;
-
-	for (i = 0; i < disks; i++) {
-		get_random_bytes(page_address(data[i]), PAGE_SIZE);
-		dataptrs[i] = data[i];
-		dataoffs[i] = 0;
-	}
-}
-
-static char disk_type(int d, int disks)
-{
-	if (d == disks - 2)
-		return 'P';
-	else if (d == disks - 1)
-		return 'Q';
-	else
-		return 'D';
-}
-
-/* Recover two failed blocks. */
-static void raid6_dual_recov(int disks, size_t bytes, int faila, int failb,
-		struct page **ptrs, unsigned int *offs)
-{
-	struct async_submit_ctl submit;
-	struct completion cmp;
-	struct dma_async_tx_descriptor *tx = NULL;
-	enum sum_check_flags result = ~0;
-
-	if (faila > failb)
-		swap(faila, failb);
-
-	if (failb == disks-1) {
-		if (faila == disks-2) {
-			/* P+Q failure.  Just rebuild the syndrome. */
-			init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv);
-			tx = async_gen_syndrome(ptrs, offs,
-					disks, bytes, &submit);
-		} else {
-			struct page *blocks[NDISKS];
-			struct page *dest;
-			int count = 0;
-			int i;
-
-			BUG_ON(disks > NDISKS);
-
-			/* data+Q failure.  Reconstruct data from P,
-			 * then rebuild syndrome
-			 */
-			for (i = disks; i-- ; ) {
-				if (i == faila || i == failb)
-					continue;
-				blocks[count++] = ptrs[i];
-			}
-			dest = ptrs[faila];
-			init_async_submit(&submit, ASYNC_TX_XOR_ZERO_DST, NULL,
-					  NULL, NULL, addr_conv);
-			tx = async_xor(dest, blocks, 0, count, bytes, &submit);
-
-			init_async_submit(&submit, 0, tx, NULL, NULL, addr_conv);
-			tx = async_gen_syndrome(ptrs, offs,
-					disks, bytes, &submit);
-		}
-	} else {
-		if (failb == disks-2) {
-			/* data+P failure. */
-			init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv);
-			tx = async_raid6_datap_recov(disks, bytes,
-					faila, ptrs, offs, &submit);
-		} else {
-			/* data+data failure. */
-			init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv);
-			tx = async_raid6_2data_recov(disks, bytes,
-					faila, failb, ptrs, offs, &submit);
-		}
-	}
-	init_completion(&cmp);
-	init_async_submit(&submit, ASYNC_TX_ACK, tx, callback, &cmp, addr_conv);
-	tx = async_syndrome_val(ptrs, offs,
-			disks, bytes, &result, spare, 0, &submit);
-	async_tx_issue_pending(tx);
-
-	if (wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)) == 0)
-		pr("%s: timeout! (faila: %d failb: %d disks: %d)\n",
-		   __func__, faila, failb, disks);
-
-	if (result != 0)
-		pr("%s: validation failure! faila: %d failb: %d sum_check_flags: %x\n",
-		   __func__, faila, failb, result);
-}
-
-static int test_disks(int i, int j, int disks)
-{
-	int erra, errb;
-
-	memset(page_address(recovi), 0xf0, PAGE_SIZE);
-	memset(page_address(recovj), 0xba, PAGE_SIZE);
-
-	dataptrs[i] = recovi;
-	dataptrs[j] = recovj;
-
-	raid6_dual_recov(disks, PAGE_SIZE, i, j, dataptrs, dataoffs);
-
-	erra = memcmp(page_address(data[i]), page_address(recovi), PAGE_SIZE);
-	errb = memcmp(page_address(data[j]), page_address(recovj), PAGE_SIZE);
-
-	pr("%s(%d, %d): faila=%3d(%c)  failb=%3d(%c)  %s\n",
-	   __func__, i, j, i, disk_type(i, disks), j, disk_type(j, disks),
-	   (!erra && !errb) ? "OK" : !erra ? "ERRB" : !errb ? "ERRA" : "ERRAB");
-
-	dataptrs[i] = data[i];
-	dataptrs[j] = data[j];
-
-	return erra || errb;
-}
-
-static int test(int disks, int *tests)
-{
-	struct dma_async_tx_descriptor *tx;
-	struct async_submit_ctl submit;
-	struct completion cmp;
-	int err = 0;
-	int i, j;
-
-	recovi = data[disks];
-	recovj = data[disks+1];
-	spare  = data[disks+2];
-
-	makedata(disks);
-
-	/* Nuke syndromes */
-	memset(page_address(data[disks-2]), 0xee, PAGE_SIZE);
-	memset(page_address(data[disks-1]), 0xee, PAGE_SIZE);
-
-	/* Generate assumed good syndrome */
-	init_completion(&cmp);
-	init_async_submit(&submit, ASYNC_TX_ACK, NULL, callback, &cmp, addr_conv);
-	tx = async_gen_syndrome(dataptrs, dataoffs, disks, PAGE_SIZE, &submit);
-	async_tx_issue_pending(tx);
-
-	if (wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)) == 0) {
-		pr("error: initial gen_syndrome(%d) timed out\n", disks);
-		return 1;
-	}
-
-	pr("testing the %d-disk case...\n", disks);
-	for (i = 0; i < disks-1; i++)
-		for (j = i+1; j < disks; j++) {
-			(*tests)++;
-			err += test_disks(i, j, disks);
-		}
-
-	return err;
-}
-
-
-static int __init raid6_test(void)
-{
-	int err = 0;
-	int tests = 0;
-	int i;
-
-	for (i = 0; i < NDISKS+3; i++) {
-		data[i] = alloc_page(GFP_KERNEL);
-		if (!data[i]) {
-			while (i--)
-				put_page(data[i]);
-			return -ENOMEM;
-		}
-	}
-
-	/* the 4-disk and 5-disk cases are special for the recovery code */
-	if (NDISKS > 4)
-		err += test(4, &tests);
-	if (NDISKS > 5)
-		err += test(5, &tests);
-	/* the 11 and 12 disk cases are special for ioatdma (p-disabled
-	 * q-continuation without extended descriptor)
-	 */
-	if (NDISKS > 12) {
-		err += test(11, &tests);
-		err += test(12, &tests);
-	}
-
-	/* the 24 disk case is special for ioatdma as it is the boundary point
-	 * at which it needs to switch from 8-source ops to 16-source
-	 * ops for continuation (assumes DMA_HAS_PQ_CONTINUE is not set)
-	 */
-	if (NDISKS > 24)
-		err += test(24, &tests);
-
-	err += test(NDISKS, &tests);
-
-	pr("\n");
-	pr("complete (%d tests, %d failure%s)\n",
-	   tests, err, err == 1 ? "" : "s");
-
-	for (i = 0; i < NDISKS+3; i++)
-		put_page(data[i]);
-
-	return 0;
-}
-
-static void __exit raid6_test_exit(void)
-{
-}
-
-/* when compiled-in wait for drivers to load first (assumes dma drivers
- * are also compiled-in)
- */
-late_initcall(raid6_test);
-module_exit(raid6_test_exit);
-MODULE_AUTHOR("Dan Williams <dan.j.williams@intel.com>");
-MODULE_DESCRIPTION("asynchronous RAID-6 recovery self tests");
-MODULE_LICENSE("GPL");
diff --git a/include/linux/async_tx.h b/include/linux/async_tx.h
deleted file mode 100644
index d49540570ba09..0000000000000
--- a/include/linux/async_tx.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * Copyright © 2006, Intel Corporation.
- */
-#ifndef _ASYNC_TX_H_
-#define _ASYNC_TX_H_
-#include <linux/dmaengine.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-
-/* on architectures without dma-mapping capabilities we need to ensure
- * that the asynchronous path compiles away
- */
-#ifdef CONFIG_HAS_DMA
-#define __async_inline
-#else
-#define __async_inline __always_inline
-#endif
-
-/**
- * dma_chan_ref - object used to manage dma channels received from the
- *   dmaengine core.
- * @chan - the channel being tracked
- * @node - node for the channel to be placed on async_tx_master_list
- * @rcu - for list_del_rcu
- * @count - number of times this channel is listed in the pool
- *	(for channels with multiple capabiities)
- */
-struct dma_chan_ref {
-	struct dma_chan *chan;
-	struct list_head node;
-	struct rcu_head rcu;
-	atomic_t count;
-};
-
-/**
- * async_tx_flags - modifiers for the async_* calls
- * @ASYNC_TX_XOR_ZERO_DST: this flag must be used for xor operations where the
- * destination address is not a source.  The asynchronous case handles this
- * implicitly, the synchronous case needs to zero the destination block.
- * @ASYNC_TX_XOR_DROP_DST: this flag must be used if the destination address is
- * also one of the source addresses.  In the synchronous case the destination
- * address is an implied source, whereas the asynchronous case it must be listed
- * as a source.  The destination address must be the first address in the source
- * array.
- * @ASYNC_TX_ACK: immediately ack the descriptor, precludes setting up a
- * dependency chain
- * @ASYNC_TX_FENCE: specify that the next operation in the dependency
- * chain uses this operation's result as an input
- * @ASYNC_TX_PQ_XOR_DST: do not overwrite the syndrome but XOR it with the
- * input data. Required for rmw case.
- */
-enum async_tx_flags {
-	ASYNC_TX_XOR_ZERO_DST	 = (1 << 0),
-	ASYNC_TX_XOR_DROP_DST	 = (1 << 1),
-	ASYNC_TX_ACK		 = (1 << 2),
-	ASYNC_TX_FENCE		 = (1 << 3),
-	ASYNC_TX_PQ_XOR_DST	 = (1 << 4),
-};
-
-/**
- * struct async_submit_ctl - async_tx submission/completion modifiers
- * @flags: submission modifiers
- * @depend_tx: parent dependency of the current operation being submitted
- * @cb_fn: callback routine to run at operation completion
- * @cb_param: parameter for the callback routine
- * @scribble: caller provided space for dma/page address conversions
- */
-struct async_submit_ctl {
-	enum async_tx_flags flags;
-	struct dma_async_tx_descriptor *depend_tx;
-	dma_async_tx_callback cb_fn;
-	void *cb_param;
-	void *scribble;
-};
-
-#if defined(CONFIG_DMA_ENGINE) && !defined(CONFIG_ASYNC_TX_CHANNEL_SWITCH)
-#define async_tx_issue_pending_all dma_issue_pending_all
-
-void async_tx_issue_pending(struct dma_async_tx_descriptor *tx);
-
-#ifdef CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL
-#include <asm/async_tx.h>
-#else
-#define async_tx_find_channel(dep, type, dst, dst_count, src, src_count, len) \
-	 __async_tx_find_channel(dep, type)
-struct dma_chan *
-__async_tx_find_channel(struct async_submit_ctl *submit,
-			enum dma_transaction_type tx_type);
-#endif /* CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL */
-#else
-static inline void async_tx_issue_pending_all(void)
-{
-	do { } while (0);
-}
-
-static inline void async_tx_issue_pending(struct dma_async_tx_descriptor *tx)
-{
-}
-
-static inline struct dma_chan *
-async_tx_find_channel(struct async_submit_ctl *submit,
-		      enum dma_transaction_type tx_type, struct page **dst,
-		      int dst_count, struct page **src, int src_count,
-		      size_t len)
-{
-	return NULL;
-}
-#endif
-
-/**
- * async_tx_sync_epilog - actions to take if an operation is run synchronously
- * @cb_fn: function to call when the transaction completes
- * @cb_fn_param: parameter to pass to the callback routine
- */
-static inline void
-async_tx_sync_epilog(struct async_submit_ctl *submit)
-{
-	if (submit->cb_fn)
-		submit->cb_fn(submit->cb_param);
-}
-
-typedef union {
-	unsigned long addr;
-	struct page *page;
-	dma_addr_t dma;
-} addr_conv_t;
-
-static inline void
-init_async_submit(struct async_submit_ctl *args, enum async_tx_flags flags,
-		  struct dma_async_tx_descriptor *tx,
-		  dma_async_tx_callback cb_fn, void *cb_param,
-		  addr_conv_t *scribble)
-{
-	args->flags = flags;
-	args->depend_tx = tx;
-	args->cb_fn = cb_fn;
-	args->cb_param = cb_param;
-	args->scribble = scribble;
-}
-
-void async_tx_submit(struct dma_chan *chan, struct dma_async_tx_descriptor *tx,
-		     struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_xor(struct page *dest, struct page **src_list, unsigned int offset,
-	  int src_cnt, size_t len, struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_xor_offs(struct page *dest, unsigned int offset,
-		struct page **src_list, unsigned int *src_offset,
-		int src_cnt, size_t len, struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_xor_val_offs(struct page *dest, unsigned int offset,
-		struct page **src_list, unsigned int *src_offset,
-		int src_cnt, size_t len, enum sum_check_flags *result,
-		struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
-	     unsigned int src_offset, size_t len,
-	     struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *async_trigger_callback(struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_gen_syndrome(struct page **blocks, unsigned int *offsets, int src_cnt,
-		   size_t len, struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_syndrome_val(struct page **blocks, unsigned int *offsets, int src_cnt,
-		   size_t len, enum sum_check_flags *pqres, struct page *spare,
-		   unsigned int s_off, struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_raid6_2data_recov(int src_num, size_t bytes, int faila, int failb,
-			struct page **ptrs, unsigned int *offs,
-			struct async_submit_ctl *submit);
-
-struct dma_async_tx_descriptor *
-async_raid6_datap_recov(int src_num, size_t bytes, int faila,
-			struct page **ptrs, unsigned int *offs,
-			struct async_submit_ctl *submit);
-
-void async_tx_quiesce(struct dma_async_tx_descriptor **tx);
-#endif /* _ASYNC_TX_H_ */

-- 
2.43.0


  parent reply	other threads:[~2026-10-15 19:23 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-15 19:22 [PATCH RFC 0/4] async_tx/md: Remove " Frank.Li
2026-10-15 19:22 ` [PATCH RFC 1/4] md/dm-integrity: replace async_tx with synchronous xor for journal Frank.Li
2026-10-15 19:22 ` [PATCH RFC 2/4] md/raid5-ppl: replace async_tx with synchronous xor Frank.Li
2026-10-15 19:22 ` [PATCH RFC 3/4] md/raid5: replace async_tx with synchronous xor/pq operations Frank.Li
2026-10-15 19:22 ` Frank.Li [this message]
2026-10-15 19:51 ` [PATCH RFC 0/4] async_tx/md: Remove async_tx framework Eric Biggers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261015-asycn_tx_remove-v1-4-056a7085e0a1@nxp.com \
    --to=frank.li@oss.nxp.com \
    --cc=Frank.Li@nxp.com \
    --cc=agk@redhat.com \
    --cc=agust@denx.de \
    --cc=anup.patel@broadcom.com \
    --cc=bmarzins@redhat.com \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=djbw@kernel.org \
    --cc=dm-devel@lists.linux.dev \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-raid@vger.kernel.org \
    --cc=magiclinan@didiglobal.com \
    --cc=mpatocka@redhat.com \
    --cc=rdunlap@infradead.org \
    --cc=rsahu@apm.com \
    --cc=saeed@marvell.com \
    --cc=skhan@linuxfoundation.org \
    --cc=snitzer@kernel.org \
    --cc=song@kernel.org \
    --cc=thomas.petazzoni@free-electrons.com \
    --cc=xiao@kernel.org \
    --cc=yukuai@fygo.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®