Commit f115bf08 authored by Gary R Hook's avatar Gary R Hook Committed by Greg Kroah-Hartman

crypto: ccp - Assign DMA commands to the channel's CCP

commit 7c468447 upstream.

The CCP driver generally uses a round-robin approach when
assigning operations to available CCPs. For the DMA engine,
however, the DMA mappings of the SGs are associated with a
specific CCP. When an IOMMU is enabled, the IOMMU is
programmed based on this specific device.

If the DMA operations are not performed by that specific
CCP then addressing errors and I/O page faults will occur.

Update the CCP driver to allow a specific CCP device to be
requested for an operation and use this in the DMA engine
support.
Signed-off-by: default avatarGary R Hook <gary.hook@amd.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c62625b6
...@@ -283,11 +283,14 @@ EXPORT_SYMBOL_GPL(ccp_version); ...@@ -283,11 +283,14 @@ EXPORT_SYMBOL_GPL(ccp_version);
*/ */
int ccp_enqueue_cmd(struct ccp_cmd *cmd) int ccp_enqueue_cmd(struct ccp_cmd *cmd)
{ {
struct ccp_device *ccp = ccp_get_device(); struct ccp_device *ccp;
unsigned long flags; unsigned long flags;
unsigned int i; unsigned int i;
int ret; int ret;
/* Some commands might need to be sent to a specific device */
ccp = cmd->ccp ? cmd->ccp : ccp_get_device();
if (!ccp) if (!ccp)
return -ENODEV; return -ENODEV;
......
...@@ -390,6 +390,7 @@ static struct ccp_dma_desc *ccp_create_desc(struct dma_chan *dma_chan, ...@@ -390,6 +390,7 @@ static struct ccp_dma_desc *ccp_create_desc(struct dma_chan *dma_chan,
goto err; goto err;
ccp_cmd = &cmd->ccp_cmd; ccp_cmd = &cmd->ccp_cmd;
ccp_cmd->ccp = chan->ccp;
ccp_pt = &ccp_cmd->u.passthru_nomap; ccp_pt = &ccp_cmd->u.passthru_nomap;
ccp_cmd->flags = CCP_CMD_MAY_BACKLOG; ccp_cmd->flags = CCP_CMD_MAY_BACKLOG;
ccp_cmd->flags |= CCP_CMD_PASSTHRU_NO_DMA_MAP; ccp_cmd->flags |= CCP_CMD_PASSTHRU_NO_DMA_MAP;
......
...@@ -556,7 +556,7 @@ enum ccp_engine { ...@@ -556,7 +556,7 @@ enum ccp_engine {
* struct ccp_cmd - CCP operation request * struct ccp_cmd - CCP operation request
* @entry: list element (ccp driver use only) * @entry: list element (ccp driver use only)
* @work: work element used for callbacks (ccp driver use only) * @work: work element used for callbacks (ccp driver use only)
* @ccp: CCP device to be run on (ccp driver use only) * @ccp: CCP device to be run on
* @ret: operation return code (ccp driver use only) * @ret: operation return code (ccp driver use only)
* @flags: cmd processing flags * @flags: cmd processing flags
* @engine: CCP operation to perform * @engine: CCP operation to perform
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment