crypto: qat - add support for relative FW ucode loading
authorJack Xu <jack.xu@intel.com>
Fri, 6 Nov 2020 11:27:46 +0000 (19:27 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 13 Nov 2020 09:38:49 +0000 (20:38 +1100)
Improve the way micro instructions (FW code) are uploaded to Accelerator
Engines (AEs). If code starts at PC zero (absolute addressing), read
uwords with no relative address. Otherwise, use relative addressing to
the page region.

Signed-off-by: Jack Xu <jack.xu@intel.com>
Co-developed-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Signed-off-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/qat/qat_common/qat_uclo.c

index dc2f2dcf21b8185f34bc0fc321673d01ace600ec..1c03205c71663b192ab1032319081be57cd3506f 100644 (file)
@@ -1735,21 +1735,22 @@ static void qat_uclo_fill_uwords(struct icp_qat_uclo_objhandle *obj_handle,
                                 u64 *uword, unsigned int addr_p,
                                 unsigned int raddr, u64 fill)
 {
+       unsigned int i, addr;
        u64 uwrd = 0;
-       unsigned int i;
 
        if (!encap_page) {
                *uword = fill;
                return;
        }
+       addr = (encap_page->page_region) ? raddr : addr_p;
        for (i = 0; i < encap_page->uwblock_num; i++) {
-               if (raddr >= encap_page->uwblock[i].start_addr &&
-                   raddr <= encap_page->uwblock[i].start_addr +
+               if (addr >= encap_page->uwblock[i].start_addr &&
+                   addr <= encap_page->uwblock[i].start_addr +
                    encap_page->uwblock[i].words_num - 1) {
-                       raddr -= encap_page->uwblock[i].start_addr;
-                       raddr *= obj_handle->uword_in_bytes;
+                       addr -= encap_page->uwblock[i].start_addr;
+                       addr *= obj_handle->uword_in_bytes;
                        memcpy(&uwrd, (void *)(((uintptr_t)
-                              encap_page->uwblock[i].micro_words) + raddr),
+                              encap_page->uwblock[i].micro_words) + addr),
                               obj_handle->uword_in_bytes);
                        uwrd = uwrd & 0xbffffffffffull;
                }