diff --git a/Documentation/crypto/crypto_engine.rst b/Documentation/crypto/crypto_engine.rstnew file mode 100644index 000000000000..b0ed37f9fb0c--- /dev/null+++ b/Documentation/crypto/crypto_engine.rst@@ -0,0 +1,46 @@+=============+CRYPTO ENGINE+=============++Overview+--------+The crypto engine API (CE), is a crypto queue manager.++Requirement+-----------+You have to put at start of your tfm_ctx the struct crypto_engine_reqctx+struct your_tfm_ctx {+ struct crypto_engine_reqctx enginectx;+ ...+};+Why: Since CE manage only crypto_async_request, it cannot know the underlying+request_type and so have access only on the TFM.+So using container_of for accessing __ctx is impossible.+Furthermore, the crypto engine cannot know the "struct your_tfm_ctx",+so it must assume that crypto_engine_reqctx is at start of it.++Order of operations+-------------------+You have to obtain a struct crypto_engine via crypto_engine_alloc_init().+And start it via crypto_engine_start().++Before transferring any request, you have to fill the enginectx.+- prepare_request: (taking a function pointer) If you need to do some processing before doing the request+- unprepare_request: (taking a function pointer) Undoing what's done in prepare_request+- do_one_request: (taking a function pointer) Do encryption for current request++Note: that those three functions get the crypto_async_request associated with the received request.+So your need to get the original request via container_of(areq, struct yourrequesttype_request, base);++When your driver receive a crypto_request, you have to transfer it to+the cryptoengine via one of:+- crypto_transfer_cipher_request_to_engine()+- crypto_transfer_skcipher_request_to_engine()+- crypto_transfer_akcipher_request_to_engine()+- crypto_transfer_hash_request_to_engine()++At the end of the request process, a call to one of the following function is needed:+- crypto_finalize_cipher_request+- crypto_finalize_skcipher_request+- crypto_finalize_akcipher_request+- crypto_finalize_hash_request-- 2.13.6