On Tue, Aug 16, 2022 at 04:00:43PM +0200, Linus Walleij wrote: > > -static int ahash_noimport(struct ahash_request *req, const void *in) > +static int ahash_import(struct ahash_request *req, const void *in) > { > - return -ENOSYS; > + struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); > + struct hash_ctx *ctx = crypto_ahash_ctx(tfm); > + struct hash_device_data *device_data = ctx->device; > + struct hash_req_ctx *req_ctx = ahash_request_ctx(req); > + const struct hash_state *hstate = in; > + int hash_mode = HASH_OPER_MODE_HASH; > + u32 cr; > + s32 count; > + > + /* Restore software state */ > + req_ctx->length = hstate->length; > + req_ctx->index = hstate->index; > + req_ctx->dma_mode = hstate->dma_mode; > + req_ctx->hw_initialized = hstate->hw_initialized; > + memcpy(req_ctx->buffer, hstate->buffer, HASH_BLOCK_SIZE); > + > + /* > + * Restore hardware state > + * INIT bit. Set this bit to 0b1 to reset the HASH processor core and > + * prepare the initialize the HASH accelerator to compute the message > + * digest of a new message. > + */ > + HASH_INITIALIZE; > + > + cr = hstate->temp_cr; > + writel_relaxed(cr & HASH_CR_RESUME_MASK, &device_data->base->cr); > + > + if (readl(&device_data->base->cr) & HASH_CR_MODE_MASK) > + hash_mode = HASH_OPER_MODE_HMAC; > + else > + hash_mode = HASH_OPER_MODE_HASH; > + > + for (count = 0; count < HASH_CSR_COUNT; count++) { > + if ((count >= 36) && (hash_mode == HASH_OPER_MODE_HASH)) > + break; > + writel_relaxed(hstate->csr[count], > + &device_data->base->csrx[count]); > + } > + > + writel_relaxed(hstate->csfull, &device_data->base->csfull); > + writel_relaxed(hstate->csdatain, &device_data->base->csdatain); > + writel_relaxed(hstate->str_reg, &device_data->base->str); > + writel_relaxed(cr, &device_data->base->cr); > + > + return 0; > } At any time we may have multiple requests outstanding for a given tfm/device, so I'm a bit worried with the direct writes to hardware in the import function. Normally import just transfers data from the caller into the request object as a "soft" state, while the actual update/final functions will then move them into the hardware state as needed. Thanks, -- Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt