| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1 | /* Qualcomm Crypto Engine driver. | 
|  | 2 | * | 
| Duy Truong | e833aca | 2013-02-12 13:35:08 -0800 | [diff] [blame] | 3 | * Copyright (c) 2011 - 2012, The Linux Foundation. All rights reserved. | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 4 | * | 
|  | 5 | * This program is free software; you can redistribute it and/or modify | 
|  | 6 | * it under the terms of the GNU General Public License version 2 and | 
|  | 7 | * only version 2 as published by the Free Software Foundation. | 
|  | 8 | * | 
|  | 9 | * This program is distributed in the hope that it will be useful, | 
|  | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 12 | * GNU General Public License for more details. | 
|  | 13 | */ | 
|  | 14 | #include <linux/types.h> | 
|  | 15 | #include <linux/kernel.h> | 
|  | 16 | #include <linux/module.h> | 
|  | 17 | #include <linux/mod_devicetable.h> | 
|  | 18 | #include <linux/device.h> | 
|  | 19 | #include <linux/clk.h> | 
|  | 20 | #include <linux/err.h> | 
|  | 21 | #include <linux/dma-mapping.h> | 
|  | 22 | #include <linux/io.h> | 
|  | 23 | #include <linux/platform_device.h> | 
|  | 24 | #include <linux/spinlock.h> | 
|  | 25 | #include <linux/delay.h> | 
|  | 26 | #include <linux/crypto.h> | 
| Mona Hossain | 5c8ea1f | 2011-07-28 15:11:29 -0700 | [diff] [blame] | 27 | #include <linux/qcedev.h> | 
| Ramesh Masavarapu | 7207720 | 2011-11-02 10:34:26 -0700 | [diff] [blame] | 28 | #include <linux/bitops.h> | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 29 | #include <crypto/hash.h> | 
|  | 30 | #include <crypto/sha.h> | 
|  | 31 | #include <mach/dma.h> | 
|  | 32 | #include <mach/clk.h> | 
| Ramesh Masavarapu | fa679d9 | 2011-10-13 23:42:59 -0700 | [diff] [blame] | 33 | #include <mach/socinfo.h> | 
| Mona Hossain | 5c8ea1f | 2011-07-28 15:11:29 -0700 | [diff] [blame] | 34 |  | 
|  | 35 | #include "qce.h" | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 36 | #include "qce40.h" | 
| Mona Hossain | 5c8ea1f | 2011-07-28 15:11:29 -0700 | [diff] [blame] | 37 | #include "qcryptohw_40.h" | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 38 |  | 
|  | 39 | /* ADM definitions */ | 
|  | 40 | #define LI_SG_CMD  (1 << 31)    /* last index in the scatter gather cmd */ | 
|  | 41 | #define SRC_INDEX_SG_CMD(index) ((index & 0x3fff) << 16) | 
|  | 42 | #define DST_INDEX_SG_CMD(index) (index & 0x3fff) | 
|  | 43 | #define ADM_DESC_LAST  (1 << 31) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 44 | #define QCE_FIFO_SIZE  0x8000 | 
| Ramesh Masavarapu | 9e1c0a0 | 2012-02-07 08:56:40 -0800 | [diff] [blame] | 45 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 46 | /* | 
|  | 47 | * CE HW device structure. | 
|  | 48 | * Each engine has an instance of the structure. | 
|  | 49 | * Each engine can only handle one crypto operation at one time. It is up to | 
|  | 50 | * the sw above to ensure single threading of operation on an engine. | 
|  | 51 | */ | 
|  | 52 | struct qce_device { | 
|  | 53 | struct device *pdev;        /* Handle to platform_device structure */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 54 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 55 | unsigned char *coh_vmem;    /* Allocated coherent virtual memory */ | 
|  | 56 | dma_addr_t coh_pmem;	    /* Allocated coherent physical memory */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 57 | int memsize;				/* Memory allocated */ | 
|  | 58 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 59 | void __iomem *iobase;	    /* Virtual io base of CE HW  */ | 
|  | 60 | unsigned int phy_iobase;    /* Physical io base of CE HW    */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 61 |  | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 62 | struct clk *ce_core_src_clk;	/* Handle to CE src clk*/ | 
|  | 63 | struct clk *ce_core_clk;	/* Handle to CE clk */ | 
|  | 64 | struct clk *ce_clk;		/* Handle to CE clk */ | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 65 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 66 | qce_comp_func_ptr_t qce_cb;	/* qce callback function pointer */ | 
|  | 67 |  | 
|  | 68 | int assoc_nents; | 
|  | 69 | int ivsize; | 
|  | 70 | int authsize; | 
|  | 71 | int src_nents; | 
|  | 72 | int dst_nents; | 
|  | 73 |  | 
|  | 74 | void *areq; | 
|  | 75 | enum qce_cipher_mode_enum mode; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 76 | struct ce_dm_data ce_dm; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 77 | }; | 
|  | 78 |  | 
|  | 79 | /* Standard initialization vector for SHA-1, source: FIPS 180-2 */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 80 | static uint8_t  _std_init_vector_sha1_uint8[] =   { | 
|  | 81 | 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, 0x89, | 
|  | 82 | 0x98, 0xBA, 0xDC, 0xFE, 0x10, 0x32, 0x54, 0x76, | 
|  | 83 | 0xC3, 0xD2, 0xE1, 0xF0 | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 84 | }; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 85 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 86 | /* Standard initialization vector for SHA-256, source: FIPS 180-2 */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 87 | static uint8_t _std_init_vector_sha256_uint8[] = { | 
|  | 88 | 0x6A, 0x09, 0xE6, 0x67, 0xBB, 0x67, 0xAE, 0x85, | 
|  | 89 | 0x3C, 0x6E, 0xF3, 0x72, 0xA5, 0x4F, 0xF5, 0x3A, | 
|  | 90 | 0x51, 0x0E, 0x52, 0x7F, 0x9B, 0x05, 0x68, 0x8C, | 
|  | 91 | 0x1F, 0x83, 0xD9, 0xAB, 0x5B, 0xE0, 0xCD, 0x19 | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 92 | }; | 
|  | 93 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 94 | static void _byte_stream_swap_to_net_words(uint32_t *iv, unsigned char *b, | 
|  | 95 | unsigned int len) | 
|  | 96 | { | 
|  | 97 | unsigned i, j; | 
|  | 98 | unsigned char swap_iv[AES_IV_LENGTH]; | 
|  | 99 |  | 
|  | 100 | memset(swap_iv, 0, AES_IV_LENGTH); | 
|  | 101 | for (i = (AES_IV_LENGTH-len), j = len-1;  i < AES_IV_LENGTH; i++, j--) | 
|  | 102 | swap_iv[i] = b[j]; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 103 | memcpy(iv, swap_iv, AES_IV_LENGTH); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 104 | } | 
|  | 105 |  | 
|  | 106 | static int count_sg(struct scatterlist *sg, int nbytes) | 
|  | 107 | { | 
|  | 108 | int i; | 
|  | 109 |  | 
|  | 110 | for (i = 0; nbytes > 0; i++, sg = sg_next(sg)) | 
|  | 111 | nbytes -= sg->length; | 
|  | 112 | return i; | 
|  | 113 | } | 
|  | 114 |  | 
|  | 115 | static int dma_map_pmem_sg(struct buf_info *pmem, unsigned entries, | 
|  | 116 | struct scatterlist *sg) | 
|  | 117 | { | 
|  | 118 | int i; | 
|  | 119 | for (i = 0; i < entries; i++) { | 
|  | 120 |  | 
|  | 121 | sg->dma_address = (dma_addr_t)pmem->offset; | 
|  | 122 | sg++; | 
|  | 123 | pmem++; | 
|  | 124 | } | 
|  | 125 | return 0; | 
|  | 126 | } | 
|  | 127 |  | 
|  | 128 | static int _probe_ce_engine(struct qce_device *pce_dev) | 
|  | 129 | { | 
|  | 130 | unsigned int val; | 
|  | 131 | unsigned int rev; | 
| Ramesh Masavarapu | 9e1c0a0 | 2012-02-07 08:56:40 -0800 | [diff] [blame] | 132 | unsigned int ret; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 133 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 134 | val = (uint32_t)(*((uint32_t *)pce_dev->ce_dm.buffer.version)); | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 135 | if (((val & 0xfffffff) != 0x0000043) && | 
|  | 136 | ((val & 0xfffffff) != 0x0000042) && | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 137 | ((val & 0xfffffff) != 0x0000040)) { | 
|  | 138 | dev_err(pce_dev->pdev, | 
|  | 139 | "Unknown Qualcomm crypto device at 0x%x 0x%x\n", | 
|  | 140 | pce_dev->phy_iobase, val); | 
|  | 141 | return -EIO; | 
|  | 142 | }; | 
|  | 143 | rev = (val & CRYPTO_CORE_REV_MASK); | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 144 | if (rev >= 0x42) { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 145 | dev_info(pce_dev->pdev, | 
|  | 146 | "Qualcomm Crypto 4.2 device found at 0x%x\n", | 
|  | 147 | pce_dev->phy_iobase); | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 148 | pce_dev->ce_dm.ce_block_size = 64; | 
| Ramesh Masavarapu | 9e1c0a0 | 2012-02-07 08:56:40 -0800 | [diff] [blame] | 149 |  | 
|  | 150 | /* Configure the crypto register to support 64byte CRCI if it | 
|  | 151 | * is not XPU protected and the HW version of device is greater | 
|  | 152 | * than 0x42. | 
|  | 153 | * Crypto config register returns a 0 when it is XPU protected. | 
|  | 154 | */ | 
|  | 155 |  | 
|  | 156 | ret = readl_relaxed(pce_dev->iobase + CRYPTO_CONFIG_REG); | 
|  | 157 | if (ret) { | 
| Mona Hossain | e758529 | 2012-02-22 17:14:26 -0800 | [diff] [blame] | 158 | val = BIT(CRYPTO_MASK_DOUT_INTR) | | 
|  | 159 | BIT(CRYPTO_MASK_DIN_INTR) | | 
|  | 160 | BIT(CRYPTO_MASK_OP_DONE_INTR) | | 
|  | 161 | BIT(CRYPTO_MASK_ERR_INTR) | | 
|  | 162 | (CRYPTO_REQ_SIZE_ENUM_64_BYTES << | 
|  | 163 | CRYPTO_REQ_SIZE) | | 
|  | 164 | (CRYPTO_FIFO_ENUM_64_BYTES << | 
|  | 165 | CRYPTO_FIFO_THRESHOLD); | 
| Ramesh Masavarapu | 9e1c0a0 | 2012-02-07 08:56:40 -0800 | [diff] [blame] | 166 |  | 
|  | 167 | writel_relaxed(val, pce_dev->iobase + | 
|  | 168 | CRYPTO_CONFIG_REG); | 
|  | 169 | } /* end of if (ret) */ | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 170 | } else { | 
|  | 171 | if (rev == 0x40) { | 
|  | 172 | dev_info(pce_dev->pdev, | 
|  | 173 | "Qualcomm Crypto 4.0 device found at 0x%x\n", | 
|  | 174 | pce_dev->phy_iobase); | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 175 | pce_dev->ce_dm.ce_block_size = 16; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 176 | } | 
|  | 177 | } | 
|  | 178 |  | 
|  | 179 | dev_info(pce_dev->pdev, | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 180 | "IO base 0x%x\n, ce_in channel %d     , " | 
|  | 181 | "ce_out channel %d\n, " | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 182 | "crci_in %d, crci_out %d\n", | 
|  | 183 | (unsigned int) pce_dev->iobase, | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 184 | pce_dev->ce_dm.chan_ce_in, pce_dev->ce_dm.chan_ce_out, | 
|  | 185 | pce_dev->ce_dm.crci_in, pce_dev->ce_dm.crci_out); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 186 |  | 
|  | 187 | return 0; | 
|  | 188 | }; | 
|  | 189 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 190 |  | 
|  | 191 | static void _check_probe_done_call_back(struct msm_dmov_cmd *cmd_ptr, | 
|  | 192 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 193 | { | 
|  | 194 | struct qce_device *pce_dev; | 
|  | 195 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
|  | 196 |  | 
|  | 197 | if (result != ADM_STATUS_OK) { | 
|  | 198 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 199 | result); | 
|  | 200 | pce_dev->ce_dm.chan_ce_in_status = -1; | 
|  | 201 | } else { | 
|  | 202 | _probe_ce_engine(pce_dev); | 
|  | 203 | pce_dev->ce_dm.chan_ce_in_status = 0; | 
|  | 204 | } | 
|  | 205 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 206 | }; | 
|  | 207 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 208 | static int _init_ce_engine(struct qce_device *pce_dev) | 
|  | 209 | { | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 210 | int status; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 211 | /* Reset ce */ | 
|  | 212 | clk_reset(pce_dev->ce_core_clk, CLK_RESET_ASSERT); | 
|  | 213 | clk_reset(pce_dev->ce_core_clk, CLK_RESET_DEASSERT); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 214 |  | 
| Ramesh Masavarapu | fa679d9 | 2011-10-13 23:42:59 -0700 | [diff] [blame] | 215 | /* | 
|  | 216 | * Ensure previous instruction (any writes to CLK registers) | 
|  | 217 | * to toggle the CLK reset lines was completed before configuring | 
|  | 218 | * ce engine. The ce engine configuration settings should not be lost | 
|  | 219 | * becasue of clk reset. | 
|  | 220 | */ | 
|  | 221 | mb(); | 
|  | 222 |  | 
| Ramesh Masavarapu | fa679d9 | 2011-10-13 23:42:59 -0700 | [diff] [blame] | 223 | /* | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 224 | * Clear ACCESS_VIOL bit in CRYPTO_STATUS REGISTER | 
|  | 225 | */ | 
|  | 226 | status = readl_relaxed(pce_dev->iobase + CRYPTO_STATUS_REG); | 
|  | 227 | *((uint32_t *)(pce_dev->ce_dm.buffer.status)) = status & (~0x40000); | 
|  | 228 | /* | 
| Ramesh Masavarapu | fa679d9 | 2011-10-13 23:42:59 -0700 | [diff] [blame] | 229 | * Ensure ce configuration is completed. | 
|  | 230 | */ | 
|  | 231 | mb(); | 
|  | 232 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 233 | pce_dev->ce_dm.chan_ce_in_cmd->complete_func = | 
|  | 234 | _check_probe_done_call_back; | 
|  | 235 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 236 | pce_dev->ce_dm.cmdptrlist.probe_ce_hw; | 
|  | 237 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IN_PROG; | 
|  | 238 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_COMP; | 
|  | 239 | msm_dmov_enqueue_cmd(pce_dev->ce_dm.chan_ce_in, | 
|  | 240 | pce_dev->ce_dm.chan_ce_in_cmd); | 
|  | 241 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 242 | return 0; | 
|  | 243 | }; | 
|  | 244 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 245 | static int _ce_setup_hash_cmdrptrlist(struct qce_device *pce_dev, | 
|  | 246 | struct qce_sha_req *sreq) | 
|  | 247 | { | 
|  | 248 | struct ce_cmdptrlists_ops *cmdptrlist = &pce_dev->ce_dm.cmdptrlist; | 
|  | 249 |  | 
|  | 250 | switch (sreq->alg) { | 
|  | 251 | case QCE_HASH_SHA1: | 
|  | 252 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = cmdptrlist->auth_sha1; | 
|  | 253 | break; | 
|  | 254 |  | 
|  | 255 | case QCE_HASH_SHA256: | 
|  | 256 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = cmdptrlist->auth_sha256; | 
|  | 257 | break; | 
|  | 258 | case QCE_HASH_SHA1_HMAC: | 
|  | 259 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 260 | cmdptrlist->auth_sha1_hmac; | 
|  | 261 | break; | 
|  | 262 |  | 
|  | 263 | case QCE_HASH_SHA256_HMAC: | 
|  | 264 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 265 | cmdptrlist->auth_sha256_hmac; | 
|  | 266 | break; | 
|  | 267 | case QCE_HASH_AES_CMAC: | 
|  | 268 | if (sreq->authklen == AES128_KEY_SIZE) | 
|  | 269 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 270 | cmdptrlist->auth_aes_128_cmac; | 
|  | 271 | else | 
|  | 272 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 273 | cmdptrlist->auth_aes_256_cmac; | 
|  | 274 | break; | 
|  | 275 |  | 
|  | 276 | default: | 
|  | 277 | break; | 
|  | 278 | } | 
|  | 279 |  | 
|  | 280 | return 0; | 
|  | 281 | } | 
|  | 282 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 283 | static int _ce_setup_hash(struct qce_device *pce_dev, struct qce_sha_req *sreq) | 
|  | 284 | { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 285 | uint32_t diglen; | 
|  | 286 | int i; | 
|  | 287 | uint32_t auth_cfg = 0; | 
|  | 288 | bool sha1 = false; | 
|  | 289 |  | 
|  | 290 | if (sreq->alg ==  QCE_HASH_AES_CMAC) { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 291 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 292 | memcpy(pce_dev->ce_dm.buffer.auth_key, sreq->authkey, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 293 | sreq->authklen); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 294 | auth_cfg |= (1 << CRYPTO_LAST); | 
|  | 295 | auth_cfg |= (CRYPTO_AUTH_MODE_CMAC << CRYPTO_AUTH_MODE); | 
|  | 296 | auth_cfg |= (CRYPTO_AUTH_SIZE_ENUM_16_BYTES << | 
|  | 297 | CRYPTO_AUTH_SIZE); | 
|  | 298 | auth_cfg |= CRYPTO_AUTH_ALG_AES << CRYPTO_AUTH_ALG; | 
|  | 299 |  | 
|  | 300 | switch (sreq->authklen) { | 
|  | 301 | case AES128_KEY_SIZE: | 
|  | 302 | auth_cfg |= (CRYPTO_AUTH_KEY_SZ_AES128 << | 
|  | 303 | CRYPTO_AUTH_KEY_SIZE); | 
|  | 304 | break; | 
|  | 305 | case AES256_KEY_SIZE: | 
|  | 306 | auth_cfg |= (CRYPTO_AUTH_KEY_SZ_AES256 << | 
|  | 307 | CRYPTO_AUTH_KEY_SIZE); | 
|  | 308 | break; | 
|  | 309 | default: | 
|  | 310 | break; | 
|  | 311 | } | 
|  | 312 |  | 
|  | 313 | goto go_proc; | 
|  | 314 | } | 
|  | 315 |  | 
|  | 316 | /* if not the last, the size has to be on the block boundary */ | 
|  | 317 | if (sreq->last_blk == 0 && (sreq->size % SHA256_BLOCK_SIZE)) | 
|  | 318 | return -EIO; | 
|  | 319 |  | 
|  | 320 | switch (sreq->alg) { | 
|  | 321 | case QCE_HASH_SHA1: | 
|  | 322 | case QCE_HASH_SHA1_HMAC: | 
|  | 323 | diglen = SHA1_DIGEST_SIZE; | 
|  | 324 | sha1 = true; | 
|  | 325 | break; | 
|  | 326 | case QCE_HASH_SHA256: | 
|  | 327 | case QCE_HASH_SHA256_HMAC: | 
|  | 328 | diglen = SHA256_DIGEST_SIZE; | 
|  | 329 | break; | 
|  | 330 | default: | 
|  | 331 | return -EINVAL; | 
|  | 332 | } | 
|  | 333 |  | 
|  | 334 | if ((sreq->alg == QCE_HASH_SHA1_HMAC) || | 
|  | 335 | (sreq->alg == QCE_HASH_SHA256_HMAC)) { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 336 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 337 | memcpy(pce_dev->ce_dm.buffer.auth_key, sreq->authkey, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 338 | sreq->authklen); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 339 | auth_cfg |= (CRYPTO_AUTH_MODE_HMAC << CRYPTO_AUTH_MODE); | 
|  | 340 | } else { | 
|  | 341 | auth_cfg |= (CRYPTO_AUTH_MODE_HASH << CRYPTO_AUTH_MODE); | 
|  | 342 | } | 
|  | 343 |  | 
|  | 344 | /* write 20/32 bytes, 5/8 words into auth_iv for SHA1/SHA256 */ | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 345 | if (sreq->first_blk) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 346 | if (sha1) | 
|  | 347 | memcpy(pce_dev->ce_dm.buffer.auth_iv, | 
|  | 348 | _std_init_vector_sha1_uint8, diglen); | 
|  | 349 | else | 
|  | 350 | memcpy(pce_dev->ce_dm.buffer.auth_iv, | 
|  | 351 | _std_init_vector_sha256_uint8, diglen); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 352 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 353 | memcpy(pce_dev->ce_dm.buffer.auth_iv, sreq->digest, | 
|  | 354 | diglen); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 355 | } | 
|  | 356 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 357 | /* write auth_bytecnt 0/1/2/3, start with 0 */ | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 358 | for (i = 0; i < 4; i++) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 359 | *(((uint32_t *)(pce_dev->ce_dm.buffer.auth_byte_count) + i)) = | 
|  | 360 | sreq->auth_data[i]; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 361 |  | 
|  | 362 | /* write seg_cfg */ | 
|  | 363 | if (sha1) | 
|  | 364 | auth_cfg |= (CRYPTO_AUTH_SIZE_SHA1 << CRYPTO_AUTH_SIZE); | 
|  | 365 | else | 
|  | 366 | auth_cfg |= (CRYPTO_AUTH_SIZE_SHA256 << CRYPTO_AUTH_SIZE); | 
|  | 367 |  | 
|  | 368 | if (sreq->last_blk) | 
|  | 369 | auth_cfg |= 1 << CRYPTO_LAST; | 
|  | 370 |  | 
|  | 371 | auth_cfg |= CRYPTO_AUTH_ALG_SHA << CRYPTO_AUTH_ALG; | 
|  | 372 |  | 
|  | 373 | go_proc: | 
|  | 374 | auth_cfg |= (CRYPTO_AUTH_POS_BEFORE << CRYPTO_AUTH_POS); | 
|  | 375 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 376 | /* write auth seg cfg */ | 
|  | 377 | *((uint32_t *)(pce_dev->ce_dm.buffer.auth_seg_cfg_size_start)) = | 
|  | 378 | auth_cfg; | 
|  | 379 | /* write auth seg size */ | 
|  | 380 | *((uint32_t *)(pce_dev->ce_dm.buffer.auth_seg_cfg_size_start) + 1) = | 
|  | 381 | sreq->size; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 382 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 383 | /* write auth seg size start*/ | 
|  | 384 | *((uint32_t *)(pce_dev->ce_dm.buffer.auth_seg_cfg_size_start)+2) = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 385 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 386 | /* write seg size */ | 
|  | 387 | *((uint32_t *)(pce_dev->ce_dm.buffer.seg_size)) = sreq->size; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 388 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 389 | _ce_setup_hash_cmdrptrlist(pce_dev, sreq); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 390 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 391 | return 0; | 
|  | 392 | } | 
|  | 393 |  | 
|  | 394 | static int _ce_setup_cipher_cmdrptrlist(struct qce_device *pce_dev, | 
|  | 395 | struct qce_req *creq) | 
|  | 396 | { | 
|  | 397 | struct ce_cmdptrlists_ops *cmdptrlist = | 
|  | 398 | &pce_dev->ce_dm.cmdptrlist; | 
|  | 399 |  | 
|  | 400 | if (creq->alg != CIPHER_ALG_AES) { | 
|  | 401 | switch (creq->alg) { | 
|  | 402 | case CIPHER_ALG_DES: | 
|  | 403 | if (creq->mode ==  QCE_MODE_ECB) { | 
|  | 404 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 405 | cmdptrlist->cipher_des_ecb; | 
|  | 406 | } else { | 
|  | 407 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 408 | cmdptrlist->cipher_des_cbc; | 
|  | 409 | } | 
|  | 410 | break; | 
|  | 411 |  | 
|  | 412 | case CIPHER_ALG_3DES: | 
|  | 413 | if (creq->mode ==  QCE_MODE_ECB) { | 
|  | 414 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 415 | cmdptrlist->cipher_3des_ecb; | 
|  | 416 | } else { | 
|  | 417 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 418 | cmdptrlist->cipher_3des_cbc; | 
|  | 419 | } | 
|  | 420 | break; | 
|  | 421 | default: | 
|  | 422 | break; | 
|  | 423 | } | 
|  | 424 | } else { | 
|  | 425 | switch (creq->mode) { | 
|  | 426 | case QCE_MODE_ECB: | 
|  | 427 | if (creq->encklen ==  AES128_KEY_SIZE) { | 
|  | 428 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 429 | cmdptrlist->cipher_aes_128_ecb; | 
|  | 430 | } else { | 
|  | 431 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 432 | cmdptrlist->cipher_aes_256_ecb; | 
|  | 433 | } | 
|  | 434 | break; | 
|  | 435 |  | 
|  | 436 | case QCE_MODE_CBC: | 
|  | 437 | if (creq->encklen ==  AES128_KEY_SIZE) { | 
|  | 438 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 439 | cmdptrlist->cipher_aes_128_cbc_ctr; | 
|  | 440 | } else { | 
|  | 441 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 442 | cmdptrlist->cipher_aes_256_cbc_ctr; | 
|  | 443 | } | 
|  | 444 | break; | 
|  | 445 |  | 
|  | 446 | case QCE_MODE_CTR: | 
|  | 447 | if (creq->encklen ==  AES128_KEY_SIZE) { | 
|  | 448 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 449 | cmdptrlist->cipher_aes_128_cbc_ctr; | 
|  | 450 | } else { | 
|  | 451 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 452 | cmdptrlist->cipher_aes_256_cbc_ctr; | 
|  | 453 | } | 
|  | 454 | break; | 
|  | 455 |  | 
|  | 456 | case QCE_MODE_XTS: | 
|  | 457 | if (creq->encklen ==  AES128_KEY_SIZE) { | 
|  | 458 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 459 | cmdptrlist->cipher_aes_128_xts; | 
|  | 460 | } else { | 
|  | 461 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 462 | cmdptrlist->cipher_aes_256_xts; | 
|  | 463 | } | 
|  | 464 | break; | 
|  | 465 | case QCE_MODE_CCM: | 
|  | 466 | if (creq->encklen ==  AES128_KEY_SIZE) { | 
|  | 467 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 468 | cmdptrlist->aead_aes_128_ccm; | 
|  | 469 | } else { | 
|  | 470 | pce_dev->ce_dm.chan_ce_in_cmd->cmdptr = | 
|  | 471 | cmdptrlist->aead_aes_256_ccm; | 
|  | 472 | } | 
|  | 473 | break; | 
|  | 474 | default: | 
|  | 475 | break; | 
|  | 476 | } | 
|  | 477 | } | 
|  | 478 |  | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 479 | switch (creq->mode) { | 
|  | 480 | case QCE_MODE_CCM: | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 481 | pce_dev->ce_dm.chan_ce_out_cmd->cmdptr = | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 482 | cmdptrlist->aead_ce_out; | 
|  | 483 | break; | 
|  | 484 | case QCE_MODE_ECB: | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 485 | pce_dev->ce_dm.chan_ce_out_cmd->cmdptr = | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 486 | cmdptrlist->cipher_ce_out; | 
|  | 487 | break; | 
|  | 488 | default: | 
|  | 489 | pce_dev->ce_dm.chan_ce_out_cmd->cmdptr = | 
|  | 490 | cmdptrlist->cipher_ce_out_get_iv; | 
|  | 491 | break; | 
|  | 492 | } | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 493 |  | 
|  | 494 | return 0; | 
|  | 495 | } | 
|  | 496 |  | 
|  | 497 | static int _ce_setup_cipher(struct qce_device *pce_dev, struct qce_req *creq, | 
|  | 498 | uint32_t totallen_in, uint32_t coffset) | 
|  | 499 | { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 500 | uint32_t enck_size_in_word = creq->encklen / sizeof(uint32_t); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 501 | uint32_t encr_cfg = 0; | 
|  | 502 | uint32_t ivsize = creq->ivsize; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 503 | struct ce_reg_buffer_addr *buffer = &pce_dev->ce_dm.buffer; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 504 |  | 
|  | 505 | if (creq->mode ==  QCE_MODE_XTS) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 506 | memcpy(buffer->encr_key, creq->enckey, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 507 | creq->encklen/2); | 
|  | 508 | else | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 509 | memcpy(buffer->encr_key, creq->enckey, creq->encklen); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 510 |  | 
|  | 511 | if ((creq->op == QCE_REQ_AEAD) && (creq->mode == QCE_MODE_CCM)) { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 512 | uint32_t noncelen32 = MAX_NONCE/sizeof(uint32_t); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 513 | uint32_t auth_cfg = 0; | 
|  | 514 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 515 | /* write nonce */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 516 | memcpy(buffer->auth_nonce_info, creq->nonce, MAX_NONCE); | 
|  | 517 | memcpy(buffer->auth_key, creq->enckey, creq->encklen); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 518 |  | 
|  | 519 | auth_cfg |= (noncelen32 << CRYPTO_AUTH_NONCE_NUM_WORDS); | 
|  | 520 | auth_cfg &= ~(1 << CRYPTO_USE_HW_KEY_AUTH); | 
|  | 521 | auth_cfg |= (1 << CRYPTO_LAST); | 
|  | 522 | if (creq->dir == QCE_ENCRYPT) | 
|  | 523 | auth_cfg |= (CRYPTO_AUTH_POS_BEFORE << CRYPTO_AUTH_POS); | 
|  | 524 | else | 
|  | 525 | auth_cfg |= (CRYPTO_AUTH_POS_AFTER << CRYPTO_AUTH_POS); | 
|  | 526 | auth_cfg |= (((creq->authsize >> 1) - 2) << CRYPTO_AUTH_SIZE); | 
|  | 527 | auth_cfg |= (CRYPTO_AUTH_MODE_CCM << CRYPTO_AUTH_MODE); | 
|  | 528 | if (creq->authklen ==  AES128_KEY_SIZE) | 
|  | 529 | auth_cfg |= (CRYPTO_AUTH_KEY_SZ_AES128 << | 
|  | 530 | CRYPTO_AUTH_KEY_SIZE); | 
|  | 531 | else { | 
|  | 532 | if (creq->authklen ==  AES256_KEY_SIZE) | 
|  | 533 | auth_cfg |= (CRYPTO_AUTH_KEY_SZ_AES256 << | 
|  | 534 | CRYPTO_AUTH_KEY_SIZE); | 
|  | 535 | } | 
|  | 536 | auth_cfg |= (CRYPTO_AUTH_ALG_AES << CRYPTO_AUTH_ALG); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 537 | *((uint32_t *)(buffer->auth_seg_cfg_size_start)) = auth_cfg; | 
|  | 538 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 539 | if (creq->dir == QCE_ENCRYPT) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 540 | *((uint32_t *)(buffer->auth_seg_cfg_size_start) + 1) = | 
|  | 541 | totallen_in; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 542 | else | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 543 | *((uint32_t *)(buffer->auth_seg_cfg_size_start) + 1) = | 
|  | 544 | (totallen_in - creq->authsize); | 
|  | 545 | *((uint32_t *)(buffer->auth_seg_cfg_size_start) + 2) = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 546 | } | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 547 |  | 
|  | 548 | *((uint32_t *)(buffer->auth_seg_cfg_size_start) + 2) = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 549 |  | 
|  | 550 | switch (creq->mode) { | 
|  | 551 | case QCE_MODE_ECB: | 
|  | 552 | encr_cfg |= (CRYPTO_ENCR_MODE_ECB << CRYPTO_ENCR_MODE); | 
|  | 553 | break; | 
|  | 554 |  | 
|  | 555 | case QCE_MODE_CBC: | 
|  | 556 | encr_cfg |= (CRYPTO_ENCR_MODE_CBC << CRYPTO_ENCR_MODE); | 
|  | 557 | break; | 
|  | 558 |  | 
|  | 559 | case QCE_MODE_XTS: | 
|  | 560 | encr_cfg |= (CRYPTO_ENCR_MODE_XTS << CRYPTO_ENCR_MODE); | 
|  | 561 | break; | 
|  | 562 |  | 
|  | 563 | case QCE_MODE_CCM: | 
|  | 564 | encr_cfg |= (CRYPTO_ENCR_MODE_CCM << CRYPTO_ENCR_MODE); | 
|  | 565 | break; | 
|  | 566 |  | 
|  | 567 | case QCE_MODE_CTR: | 
|  | 568 | default: | 
|  | 569 | encr_cfg |= (CRYPTO_ENCR_MODE_CTR << CRYPTO_ENCR_MODE); | 
|  | 570 | break; | 
|  | 571 | } | 
|  | 572 | pce_dev->mode = creq->mode; | 
|  | 573 |  | 
|  | 574 | switch (creq->alg) { | 
|  | 575 | case CIPHER_ALG_DES: | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 576 | if (creq->mode !=  QCE_MODE_ECB) | 
|  | 577 | memcpy(buffer->encr_cntr_iv, creq->iv, ivsize); | 
|  | 578 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 579 | encr_cfg |= ((CRYPTO_ENCR_KEY_SZ_DES << CRYPTO_ENCR_KEY_SZ)  | | 
|  | 580 | (CRYPTO_ENCR_ALG_DES << CRYPTO_ENCR_ALG)); | 
|  | 581 | break; | 
|  | 582 |  | 
|  | 583 | case CIPHER_ALG_3DES: | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 584 | if (creq->mode !=  QCE_MODE_ECB) | 
|  | 585 | memcpy(buffer->encr_cntr_iv, creq->iv, ivsize); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 586 |  | 
|  | 587 | encr_cfg |= ((CRYPTO_ENCR_KEY_SZ_3DES << CRYPTO_ENCR_KEY_SZ)  | | 
|  | 588 | (CRYPTO_ENCR_ALG_DES << CRYPTO_ENCR_ALG)); | 
|  | 589 | break; | 
|  | 590 |  | 
|  | 591 | case CIPHER_ALG_AES: | 
|  | 592 | default: | 
|  | 593 | if (creq->mode ==  QCE_MODE_XTS) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 594 | memcpy(buffer->encr_xts_key, (creq->enckey + | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 595 | creq->encklen/2), creq->encklen/2); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 596 | *((uint32_t *)(buffer->encr_xts_du_size)) = | 
|  | 597 | creq->cryptlen; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 598 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 599 | } | 
|  | 600 | if (creq->mode !=  QCE_MODE_ECB) { | 
|  | 601 | if (creq->mode ==  QCE_MODE_XTS) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 602 | _byte_stream_swap_to_net_words( | 
|  | 603 | (uint32_t *)(buffer->encr_cntr_iv), | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 604 | creq->iv, ivsize); | 
|  | 605 | else | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 606 | memcpy(buffer->encr_cntr_iv, creq->iv, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 607 | ivsize); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 608 | } | 
|  | 609 | /* set number of counter bits */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 610 | *((uint32_t *)(buffer->encr_mask)) = (uint32_t)0xffffffff; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 611 |  | 
|  | 612 | if (creq->op == QCE_REQ_ABLK_CIPHER_NO_KEY) { | 
|  | 613 | encr_cfg |= (CRYPTO_ENCR_KEY_SZ_AES128 << | 
|  | 614 | CRYPTO_ENCR_KEY_SZ); | 
|  | 615 | encr_cfg |= CRYPTO_ENCR_ALG_AES << CRYPTO_ENCR_ALG; | 
|  | 616 | } else { | 
|  | 617 | uint32_t key_size; | 
|  | 618 |  | 
|  | 619 | if (creq->mode == QCE_MODE_XTS) { | 
|  | 620 | key_size = creq->encklen/2; | 
|  | 621 | enck_size_in_word = key_size/sizeof(uint32_t); | 
|  | 622 | } else { | 
|  | 623 | key_size = creq->encklen; | 
|  | 624 | } | 
|  | 625 |  | 
|  | 626 | switch (key_size) { | 
|  | 627 | case AES128_KEY_SIZE: | 
|  | 628 | encr_cfg |= (CRYPTO_ENCR_KEY_SZ_AES128 << | 
|  | 629 | CRYPTO_ENCR_KEY_SZ); | 
|  | 630 | break; | 
|  | 631 | case AES256_KEY_SIZE: | 
|  | 632 | default: | 
|  | 633 | encr_cfg |= (CRYPTO_ENCR_KEY_SZ_AES256 << | 
|  | 634 | CRYPTO_ENCR_KEY_SZ); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 635 | break; | 
|  | 636 | } /* end of switch (creq->encklen) */ | 
|  | 637 |  | 
|  | 638 | encr_cfg |= CRYPTO_ENCR_ALG_AES << CRYPTO_ENCR_ALG; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 639 | } /* else of if (creq->op == QCE_REQ_ABLK_CIPHER_NO_KEY) */ | 
|  | 640 | break; | 
|  | 641 | } /* end of switch (creq->mode)  */ | 
|  | 642 |  | 
|  | 643 | /* write encr seg cfg */ | 
|  | 644 | encr_cfg |= ((creq->dir == QCE_ENCRYPT) ? 1 : 0) << CRYPTO_ENCODE; | 
|  | 645 |  | 
|  | 646 | /* write encr seg cfg */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 647 | *((uint32_t *)(buffer->encr_seg_cfg_size_start)) = encr_cfg; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 648 | /* write encr seg size */ | 
|  | 649 | if ((creq->mode == QCE_MODE_CCM) && (creq->dir == QCE_DECRYPT)) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 650 | *((uint32_t *)(buffer->encr_seg_cfg_size_start) + 1) = | 
|  | 651 | (creq->cryptlen + creq->authsize); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 652 | else | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 653 | *((uint32_t *)(buffer->encr_seg_cfg_size_start) + 1) = | 
|  | 654 | creq->cryptlen; | 
|  | 655 |  | 
|  | 656 |  | 
|  | 657 | *((uint32_t *)(buffer->encr_seg_cfg_size_start) + 2) = | 
|  | 658 | (coffset & 0xffff); | 
|  | 659 |  | 
|  | 660 | *((uint32_t *)(buffer->seg_size)) = totallen_in; | 
|  | 661 |  | 
|  | 662 | _ce_setup_cipher_cmdrptrlist(pce_dev, creq); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 663 | return 0; | 
|  | 664 | }; | 
|  | 665 |  | 
|  | 666 | static int _aead_complete(struct qce_device *pce_dev) | 
|  | 667 | { | 
|  | 668 | struct aead_request *areq; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 669 |  | 
|  | 670 | areq = (struct aead_request *) pce_dev->areq; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 671 |  | 
|  | 672 | if (areq->src != areq->dst) { | 
|  | 673 | dma_unmap_sg(pce_dev->pdev, areq->dst, pce_dev->dst_nents, | 
|  | 674 | DMA_FROM_DEVICE); | 
|  | 675 | } | 
|  | 676 | dma_unmap_sg(pce_dev->pdev, areq->src, pce_dev->src_nents, | 
|  | 677 | (areq->src == areq->dst) ? DMA_BIDIRECTIONAL : | 
|  | 678 | DMA_TO_DEVICE); | 
|  | 679 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 680 | dma_unmap_sg(pce_dev->pdev, areq->assoc, pce_dev->assoc_nents, | 
|  | 681 | DMA_TO_DEVICE); | 
|  | 682 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 683 | /* check MAC */ | 
|  | 684 | if (pce_dev->mode == QCE_MODE_CCM) { | 
|  | 685 | uint32_t result; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 686 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 687 | result = | 
|  | 688 | (uint32_t)(*((uint32_t *)pce_dev->ce_dm.buffer.status)); | 
|  | 689 | result &= (1 << CRYPTO_MAC_FAILED); | 
|  | 690 | result |= (pce_dev->ce_dm.chan_ce_in_status | | 
|  | 691 | pce_dev->ce_dm.chan_ce_out_status); | 
|  | 692 | pce_dev->qce_cb(areq, pce_dev->ce_dm.buffer.auth_result, NULL, | 
|  | 693 | result); | 
|  | 694 | } | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 695 | return 0; | 
|  | 696 | }; | 
|  | 697 |  | 
|  | 698 | static void _sha_complete(struct qce_device *pce_dev) | 
|  | 699 | { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 700 | struct ahash_request *areq; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 701 |  | 
|  | 702 | areq = (struct ahash_request *) pce_dev->areq; | 
|  | 703 | dma_unmap_sg(pce_dev->pdev, areq->src, pce_dev->src_nents, | 
|  | 704 | DMA_TO_DEVICE); | 
|  | 705 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 706 | pce_dev->qce_cb(areq,  pce_dev->ce_dm.buffer.auth_result, | 
|  | 707 | pce_dev->ce_dm.buffer.auth_byte_count, | 
|  | 708 | pce_dev->ce_dm.chan_ce_in_status); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 709 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 710 | }; | 
|  | 711 |  | 
|  | 712 | static int _ablk_cipher_complete(struct qce_device *pce_dev) | 
|  | 713 | { | 
|  | 714 | struct ablkcipher_request *areq; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 715 |  | 
|  | 716 | areq = (struct ablkcipher_request *) pce_dev->areq; | 
|  | 717 |  | 
|  | 718 | if (areq->src != areq->dst) { | 
|  | 719 | dma_unmap_sg(pce_dev->pdev, areq->dst, | 
|  | 720 | pce_dev->dst_nents, DMA_FROM_DEVICE); | 
|  | 721 | } | 
|  | 722 | dma_unmap_sg(pce_dev->pdev, areq->src, pce_dev->src_nents, | 
|  | 723 | (areq->src == areq->dst) ? DMA_BIDIRECTIONAL : | 
|  | 724 | DMA_TO_DEVICE); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 725 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 726 | if (pce_dev->mode == QCE_MODE_ECB) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 727 | pce_dev->qce_cb(areq, NULL, NULL, | 
|  | 728 | pce_dev->ce_dm.chan_ce_in_status | | 
|  | 729 | pce_dev->ce_dm.chan_ce_out_status); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 730 | } else { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 731 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 732 | pce_dev->qce_cb(areq, NULL, pce_dev->ce_dm.buffer.encr_cntr_iv, | 
|  | 733 | pce_dev->ce_dm.chan_ce_in_status | | 
|  | 734 | pce_dev->ce_dm.chan_ce_out_status); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 735 | } | 
|  | 736 |  | 
|  | 737 | return 0; | 
|  | 738 | }; | 
|  | 739 |  | 
|  | 740 | static int _ablk_cipher_use_pmem_complete(struct qce_device *pce_dev) | 
|  | 741 | { | 
|  | 742 | struct ablkcipher_request *areq; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 743 |  | 
|  | 744 | areq = (struct ablkcipher_request *) pce_dev->areq; | 
|  | 745 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 746 | if (pce_dev->mode == QCE_MODE_ECB) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 747 | pce_dev->qce_cb(areq, NULL, NULL, | 
|  | 748 | pce_dev->ce_dm.chan_ce_in_status | | 
|  | 749 | pce_dev->ce_dm.chan_ce_out_status); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 750 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 751 | pce_dev->qce_cb(areq, NULL, pce_dev->ce_dm.buffer.encr_cntr_iv, | 
|  | 752 | pce_dev->ce_dm.chan_ce_in_status | | 
|  | 753 | pce_dev->ce_dm.chan_ce_out_status); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 754 | } | 
|  | 755 |  | 
|  | 756 | return 0; | 
|  | 757 | }; | 
|  | 758 |  | 
|  | 759 | static int qce_split_and_insert_dm_desc(struct dmov_desc *pdesc, | 
|  | 760 | unsigned int plen, unsigned int paddr, int *index) | 
|  | 761 | { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 762 | while (plen > QCE_FIFO_SIZE) { | 
|  | 763 | pdesc->len = QCE_FIFO_SIZE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 764 | if (paddr > 0) { | 
|  | 765 | pdesc->addr = paddr; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 766 | paddr += QCE_FIFO_SIZE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 767 | } | 
|  | 768 | plen -= pdesc->len; | 
|  | 769 | if (plen > 0) { | 
|  | 770 | *index = (*index) + 1; | 
|  | 771 | if ((*index) >= QCE_MAX_NUM_DESC) | 
|  | 772 | return -ENOMEM; | 
|  | 773 | pdesc++; | 
|  | 774 | } | 
|  | 775 | } | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 776 | if ((plen > 0) && (plen <= QCE_FIFO_SIZE)) { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 777 | pdesc->len = plen; | 
|  | 778 | if (paddr > 0) | 
|  | 779 | pdesc->addr = paddr; | 
|  | 780 | } | 
|  | 781 |  | 
|  | 782 | return 0; | 
|  | 783 | } | 
|  | 784 |  | 
|  | 785 | static int _chain_sg_buffer_in(struct qce_device *pce_dev, | 
|  | 786 | struct scatterlist *sg, unsigned int nbytes) | 
|  | 787 | { | 
|  | 788 | unsigned int len; | 
|  | 789 | unsigned int dlen; | 
|  | 790 | struct dmov_desc *pdesc; | 
|  | 791 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 792 | pdesc = pce_dev->ce_dm.ce_in_src_desc + | 
|  | 793 | pce_dev->ce_dm.ce_in_src_desc_index; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 794 | /* | 
|  | 795 | * Two consective chunks may be handled by the old | 
|  | 796 | * buffer descriptor. | 
|  | 797 | */ | 
|  | 798 | while (nbytes > 0) { | 
|  | 799 | len = min(nbytes, sg_dma_len(sg)); | 
|  | 800 | dlen = pdesc->len & ADM_DESC_LENGTH_MASK; | 
|  | 801 | nbytes -= len; | 
|  | 802 | if (dlen == 0) { | 
|  | 803 | pdesc->addr  = sg_dma_address(sg); | 
|  | 804 | pdesc->len = len; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 805 | if (pdesc->len > QCE_FIFO_SIZE) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 806 | qce_split_and_insert_dm_desc(pdesc, pdesc->len, | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 807 | sg_dma_address(sg), | 
|  | 808 | &pce_dev->ce_dm.ce_in_src_desc_index); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 809 | } else if (sg_dma_address(sg) == (pdesc->addr + dlen)) { | 
|  | 810 | pdesc->len  = dlen + len; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 811 | if (pdesc->len > QCE_FIFO_SIZE) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 812 | qce_split_and_insert_dm_desc(pdesc, pdesc->len, | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 813 | pdesc->addr, | 
|  | 814 | &pce_dev->ce_dm.ce_in_src_desc_index); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 815 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 816 | pce_dev->ce_dm.ce_in_src_desc_index++; | 
|  | 817 | if (pce_dev->ce_dm.ce_in_src_desc_index >= | 
|  | 818 | QCE_MAX_NUM_DESC) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 819 | return -ENOMEM; | 
|  | 820 | pdesc++; | 
|  | 821 | pdesc->len = len; | 
|  | 822 | pdesc->addr = sg_dma_address(sg); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 823 | if (pdesc->len > QCE_FIFO_SIZE) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 824 | qce_split_and_insert_dm_desc(pdesc, pdesc->len, | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 825 | sg_dma_address(sg), | 
|  | 826 | &pce_dev->ce_dm.ce_in_src_desc_index); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 827 | } | 
|  | 828 | if (nbytes > 0) | 
|  | 829 | sg = sg_next(sg); | 
|  | 830 | } | 
|  | 831 | return 0; | 
|  | 832 | } | 
|  | 833 |  | 
|  | 834 | static int _chain_pm_buffer_in(struct qce_device *pce_dev, | 
|  | 835 | unsigned int pmem, unsigned int nbytes) | 
|  | 836 | { | 
|  | 837 | unsigned int dlen; | 
|  | 838 | struct dmov_desc *pdesc; | 
|  | 839 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 840 | pdesc = pce_dev->ce_dm.ce_in_src_desc + | 
|  | 841 | pce_dev->ce_dm.ce_in_src_desc_index; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 842 | dlen = pdesc->len & ADM_DESC_LENGTH_MASK; | 
|  | 843 | if (dlen == 0) { | 
|  | 844 | pdesc->addr  = pmem; | 
|  | 845 | pdesc->len = nbytes; | 
|  | 846 | } else if (pmem == (pdesc->addr + dlen)) { | 
|  | 847 | pdesc->len  = dlen + nbytes; | 
|  | 848 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 849 | pce_dev->ce_dm.ce_in_src_desc_index++; | 
|  | 850 | if (pce_dev->ce_dm.ce_in_src_desc_index >= | 
|  | 851 | QCE_MAX_NUM_DESC) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 852 | return -ENOMEM; | 
|  | 853 | pdesc++; | 
|  | 854 | pdesc->len = nbytes; | 
|  | 855 | pdesc->addr = pmem; | 
|  | 856 | } | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 857 | return 0; | 
|  | 858 | } | 
|  | 859 |  | 
|  | 860 | static void _chain_buffer_in_init(struct qce_device *pce_dev) | 
|  | 861 | { | 
|  | 862 | struct dmov_desc *pdesc; | 
|  | 863 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 864 | pce_dev->ce_dm.ce_in_src_desc_index = 0; | 
|  | 865 | pce_dev->ce_dm.ce_in_dst_desc_index = 0; | 
|  | 866 | pdesc = pce_dev->ce_dm.ce_in_src_desc; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 867 | pdesc->len = 0; | 
|  | 868 | } | 
|  | 869 |  | 
|  | 870 | static void _ce_in_final(struct qce_device *pce_dev, unsigned total) | 
|  | 871 | { | 
|  | 872 | struct dmov_desc *pdesc; | 
|  | 873 | dmov_sg *pcmd; | 
|  | 874 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 875 | pdesc = pce_dev->ce_dm.ce_in_src_desc + | 
|  | 876 | pce_dev->ce_dm.ce_in_src_desc_index; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 877 | pdesc->len |= ADM_DESC_LAST; | 
| Mona Hossain | 2563cbc | 2011-09-14 15:24:08 -0700 | [diff] [blame] | 878 |  | 
|  | 879 | pdesc = pce_dev->ce_dm.ce_in_dst_desc; | 
|  | 880 | if (total > QCE_FIFO_SIZE) { | 
|  | 881 | qce_split_and_insert_dm_desc(pdesc, total, 0, | 
|  | 882 | &pce_dev->ce_dm.ce_in_dst_desc_index); | 
|  | 883 | pdesc = pce_dev->ce_dm.ce_in_dst_desc + | 
|  | 884 | pce_dev->ce_dm.ce_in_dst_desc_index; | 
| Mona Hossain | 390d92e | 2011-09-02 14:15:47 -0700 | [diff] [blame] | 885 | pdesc->len |= ADM_DESC_LAST; | 
| Mona Hossain | 2563cbc | 2011-09-14 15:24:08 -0700 | [diff] [blame] | 886 | } else | 
|  | 887 | pdesc->len = ADM_DESC_LAST | total; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 888 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 889 | pcmd = (dmov_sg *) pce_dev->ce_dm.cmdlist.ce_data_in; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 890 | pcmd->cmd |= CMD_LC; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 891 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 892 | } | 
|  | 893 |  | 
|  | 894 | #ifdef QCE_DEBUG | 
|  | 895 | static void _ce_in_dump(struct qce_device *pce_dev) | 
|  | 896 | { | 
|  | 897 | int i; | 
|  | 898 | struct dmov_desc *pdesc; | 
|  | 899 |  | 
|  | 900 | dev_info(pce_dev->pdev, "_ce_in_dump: src\n"); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 901 | for (i = 0; i <= pce_dev->ce_dm.ce_in_src_desc_index; i++) { | 
|  | 902 | pdesc = pce_dev->ce_dm.ce_in_src_desc + i; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 903 | dev_info(pce_dev->pdev, "%x , %x\n", pdesc->addr, | 
|  | 904 | pdesc->len); | 
|  | 905 | } | 
|  | 906 | dev_info(pce_dev->pdev, "_ce_in_dump: dst\n"); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 907 | for (i = 0; i <= pce_dev->ce_dm.ce_in_dst_desc_index; i++) { | 
|  | 908 | pdesc = pce_dev->ce_dm.ce_in_dst_desc + i; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 909 | dev_info(pce_dev->pdev, "%x , %x\n", pdesc->addr, | 
|  | 910 | pdesc->len); | 
|  | 911 | } | 
|  | 912 | }; | 
|  | 913 |  | 
|  | 914 | static void _ce_out_dump(struct qce_device *pce_dev) | 
|  | 915 | { | 
|  | 916 | int i; | 
|  | 917 | struct dmov_desc *pdesc; | 
|  | 918 |  | 
|  | 919 | dev_info(pce_dev->pdev, "_ce_out_dump: src\n"); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 920 | for (i = 0; i <= pce_dev->ce_dm.ce_out_src_desc_index; i++) { | 
|  | 921 | pdesc = pce_dev->ce_dm.ce_out_src_desc + i; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 922 | dev_info(pce_dev->pdev, "%x , %x\n", pdesc->addr, | 
|  | 923 | pdesc->len); | 
|  | 924 | } | 
|  | 925 |  | 
|  | 926 | dev_info(pce_dev->pdev, "_ce_out_dump: dst\n"); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 927 | for (i = 0; i <= pce_dev->ce_dm.ce_out_dst_desc_index; i++) { | 
|  | 928 | pdesc = pce_dev->ce_dm.ce_out_dst_desc + i; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 929 | dev_info(pce_dev->pdev, "%x , %x\n", pdesc->addr, | 
|  | 930 | pdesc->len); | 
|  | 931 | } | 
|  | 932 | }; | 
|  | 933 |  | 
|  | 934 | #else | 
|  | 935 |  | 
|  | 936 | static void _ce_in_dump(struct qce_device *pce_dev) | 
|  | 937 | { | 
|  | 938 | }; | 
|  | 939 |  | 
|  | 940 | static void _ce_out_dump(struct qce_device *pce_dev) | 
|  | 941 | { | 
|  | 942 | }; | 
|  | 943 |  | 
|  | 944 | #endif | 
|  | 945 |  | 
|  | 946 | static int _chain_sg_buffer_out(struct qce_device *pce_dev, | 
|  | 947 | struct scatterlist *sg, unsigned int nbytes) | 
|  | 948 | { | 
|  | 949 | unsigned int len; | 
|  | 950 | unsigned int dlen; | 
|  | 951 | struct dmov_desc *pdesc; | 
|  | 952 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 953 | pdesc = pce_dev->ce_dm.ce_out_dst_desc + | 
|  | 954 | pce_dev->ce_dm.ce_out_dst_desc_index; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 955 | /* | 
|  | 956 | * Two consective chunks may be handled by the old | 
|  | 957 | * buffer descriptor. | 
|  | 958 | */ | 
|  | 959 | while (nbytes > 0) { | 
|  | 960 | len = min(nbytes, sg_dma_len(sg)); | 
|  | 961 | dlen = pdesc->len & ADM_DESC_LENGTH_MASK; | 
|  | 962 | nbytes -= len; | 
|  | 963 | if (dlen == 0) { | 
|  | 964 | pdesc->addr  = sg_dma_address(sg); | 
|  | 965 | pdesc->len = len; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 966 | if (pdesc->len > QCE_FIFO_SIZE) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 967 | qce_split_and_insert_dm_desc(pdesc, pdesc->len, | 
|  | 968 | sg_dma_address(sg), | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 969 | &pce_dev->ce_dm.ce_out_dst_desc_index); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 970 | } else if (sg_dma_address(sg) == (pdesc->addr + dlen)) { | 
|  | 971 | pdesc->len  = dlen + len; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 972 | if (pdesc->len > QCE_FIFO_SIZE) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 973 | qce_split_and_insert_dm_desc(pdesc, pdesc->len, | 
|  | 974 | pdesc->addr, | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 975 | &pce_dev->ce_dm.ce_out_dst_desc_index); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 976 |  | 
|  | 977 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 978 | pce_dev->ce_dm.ce_out_dst_desc_index++; | 
|  | 979 | if (pce_dev->ce_dm.ce_out_dst_desc_index >= | 
|  | 980 | QCE_MAX_NUM_DESC) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 981 | return -EIO; | 
|  | 982 | pdesc++; | 
|  | 983 | pdesc->len = len; | 
|  | 984 | pdesc->addr = sg_dma_address(sg); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 985 | if (pdesc->len > QCE_FIFO_SIZE) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 986 | qce_split_and_insert_dm_desc(pdesc, pdesc->len, | 
|  | 987 | sg_dma_address(sg), | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 988 | &pce_dev->ce_dm.ce_out_dst_desc_index); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 989 |  | 
|  | 990 | } | 
|  | 991 | if (nbytes > 0) | 
|  | 992 | sg = sg_next(sg); | 
|  | 993 | } | 
|  | 994 | return 0; | 
|  | 995 | } | 
|  | 996 |  | 
|  | 997 | static int _chain_pm_buffer_out(struct qce_device *pce_dev, | 
|  | 998 | unsigned int pmem, unsigned int nbytes) | 
|  | 999 | { | 
|  | 1000 | unsigned int dlen; | 
|  | 1001 | struct dmov_desc *pdesc; | 
|  | 1002 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1003 | pdesc = pce_dev->ce_dm.ce_out_dst_desc + | 
|  | 1004 | pce_dev->ce_dm.ce_out_dst_desc_index; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1005 | dlen = pdesc->len & ADM_DESC_LENGTH_MASK; | 
|  | 1006 |  | 
|  | 1007 | if (dlen == 0) { | 
|  | 1008 | pdesc->addr  = pmem; | 
|  | 1009 | pdesc->len = nbytes; | 
|  | 1010 | } else if (pmem == (pdesc->addr + dlen)) { | 
|  | 1011 | pdesc->len  = dlen + nbytes; | 
|  | 1012 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1013 | pce_dev->ce_dm.ce_out_dst_desc_index++; | 
|  | 1014 | if (pce_dev->ce_dm.ce_out_dst_desc_index >= QCE_MAX_NUM_DESC) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1015 | return -EIO; | 
|  | 1016 | pdesc++; | 
|  | 1017 | pdesc->len = nbytes; | 
|  | 1018 | pdesc->addr = pmem; | 
|  | 1019 | } | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1020 | return 0; | 
|  | 1021 | }; | 
|  | 1022 |  | 
|  | 1023 | static void _chain_buffer_out_init(struct qce_device *pce_dev) | 
|  | 1024 | { | 
|  | 1025 | struct dmov_desc *pdesc; | 
|  | 1026 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1027 | pce_dev->ce_dm.ce_out_dst_desc_index = 0; | 
|  | 1028 | pce_dev->ce_dm.ce_out_src_desc_index = 0; | 
|  | 1029 | pdesc = pce_dev->ce_dm.ce_out_dst_desc; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1030 | pdesc->len = 0; | 
|  | 1031 | }; | 
|  | 1032 |  | 
|  | 1033 | static void _ce_out_final(struct qce_device *pce_dev, unsigned total) | 
|  | 1034 | { | 
|  | 1035 | struct dmov_desc *pdesc; | 
|  | 1036 | dmov_sg *pcmd; | 
|  | 1037 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1038 | pdesc = pce_dev->ce_dm.ce_out_dst_desc + | 
|  | 1039 | pce_dev->ce_dm.ce_out_dst_desc_index; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1040 | pdesc->len |= ADM_DESC_LAST; | 
| Mona Hossain | 2563cbc | 2011-09-14 15:24:08 -0700 | [diff] [blame] | 1041 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1042 | pdesc = pce_dev->ce_dm.ce_out_src_desc + | 
|  | 1043 | pce_dev->ce_dm.ce_out_src_desc_index; | 
| Mona Hossain | 2563cbc | 2011-09-14 15:24:08 -0700 | [diff] [blame] | 1044 | if (total > QCE_FIFO_SIZE) { | 
|  | 1045 | qce_split_and_insert_dm_desc(pdesc, total, 0, | 
|  | 1046 | &pce_dev->ce_dm.ce_out_src_desc_index); | 
|  | 1047 | pdesc = pce_dev->ce_dm.ce_out_src_desc + | 
|  | 1048 | pce_dev->ce_dm.ce_out_src_desc_index; | 
| Mona Hossain | 390d92e | 2011-09-02 14:15:47 -0700 | [diff] [blame] | 1049 | pdesc->len |= ADM_DESC_LAST; | 
| Mona Hossain | 2563cbc | 2011-09-14 15:24:08 -0700 | [diff] [blame] | 1050 | } else | 
|  | 1051 | pdesc->len = ADM_DESC_LAST | total; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1052 |  | 
|  | 1053 | pcmd = (dmov_sg *) pce_dev->ce_dm.cmdlist.ce_data_out; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1054 | pcmd->cmd |= CMD_LC; | 
|  | 1055 | }; | 
|  | 1056 |  | 
|  | 1057 | static void _aead_ce_in_call_back(struct msm_dmov_cmd *cmd_ptr, | 
|  | 1058 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 1059 | { | 
|  | 1060 | struct qce_device *pce_dev; | 
|  | 1061 |  | 
|  | 1062 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
|  | 1063 | if (result != ADM_STATUS_OK) { | 
|  | 1064 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 1065 | result); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1066 | pce_dev->ce_dm.chan_ce_in_status = -1; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1067 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1068 | pce_dev->ce_dm.chan_ce_in_status = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1069 | } | 
|  | 1070 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1071 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_COMP; | 
|  | 1072 | if (pce_dev->ce_dm.chan_ce_out_state == QCE_CHAN_STATE_COMP) { | 
|  | 1073 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 1074 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1075 |  | 
|  | 1076 | /* done */ | 
|  | 1077 | _aead_complete(pce_dev); | 
|  | 1078 | } | 
|  | 1079 | }; | 
|  | 1080 |  | 
|  | 1081 | static void _aead_ce_out_call_back(struct msm_dmov_cmd *cmd_ptr, | 
|  | 1082 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 1083 | { | 
|  | 1084 | struct qce_device *pce_dev; | 
|  | 1085 |  | 
|  | 1086 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
|  | 1087 | if (result != ADM_STATUS_OK) { | 
|  | 1088 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 1089 | result); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1090 | pce_dev->ce_dm.chan_ce_out_status = -1; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1091 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1092 | pce_dev->ce_dm.chan_ce_out_status = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1093 | }; | 
|  | 1094 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1095 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_COMP; | 
|  | 1096 | if (pce_dev->ce_dm.chan_ce_in_state == QCE_CHAN_STATE_COMP) { | 
|  | 1097 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 1098 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1099 |  | 
|  | 1100 | /* done */ | 
|  | 1101 | _aead_complete(pce_dev); | 
|  | 1102 | } | 
|  | 1103 |  | 
|  | 1104 | }; | 
|  | 1105 |  | 
|  | 1106 | static void _sha_ce_in_call_back(struct msm_dmov_cmd *cmd_ptr, | 
|  | 1107 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 1108 | { | 
|  | 1109 | struct qce_device *pce_dev; | 
|  | 1110 |  | 
|  | 1111 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
|  | 1112 | if (result != ADM_STATUS_OK) { | 
|  | 1113 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 1114 | result); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1115 | pce_dev->ce_dm.chan_ce_in_status = -1; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1116 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1117 | pce_dev->ce_dm.chan_ce_in_status = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1118 | } | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1119 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1120 | _sha_complete(pce_dev); | 
|  | 1121 | }; | 
|  | 1122 |  | 
|  | 1123 | static void _ablk_cipher_ce_in_call_back(struct msm_dmov_cmd *cmd_ptr, | 
|  | 1124 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 1125 | { | 
|  | 1126 | struct qce_device *pce_dev; | 
|  | 1127 |  | 
|  | 1128 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
|  | 1129 | if (result != ADM_STATUS_OK) { | 
|  | 1130 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 1131 | result); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1132 | pce_dev->ce_dm.chan_ce_in_status = -1; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1133 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1134 | pce_dev->ce_dm.chan_ce_in_status = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1135 | } | 
|  | 1136 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1137 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_COMP; | 
|  | 1138 | if (pce_dev->ce_dm.chan_ce_out_state == QCE_CHAN_STATE_COMP) { | 
|  | 1139 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 1140 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1141 |  | 
|  | 1142 | /* done */ | 
|  | 1143 | _ablk_cipher_complete(pce_dev); | 
|  | 1144 | } | 
|  | 1145 | }; | 
|  | 1146 |  | 
|  | 1147 | static void _ablk_cipher_ce_out_call_back(struct msm_dmov_cmd *cmd_ptr, | 
|  | 1148 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 1149 | { | 
|  | 1150 | struct qce_device *pce_dev; | 
|  | 1151 |  | 
|  | 1152 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1153 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1154 | if (result != ADM_STATUS_OK) { | 
|  | 1155 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 1156 | result); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1157 | pce_dev->ce_dm.chan_ce_out_status = -1; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1158 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1159 | pce_dev->ce_dm.chan_ce_out_status = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1160 | }; | 
|  | 1161 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1162 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_COMP; | 
|  | 1163 | if (pce_dev->ce_dm.chan_ce_in_state == QCE_CHAN_STATE_COMP) { | 
|  | 1164 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 1165 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1166 |  | 
|  | 1167 | /* done */ | 
|  | 1168 | _ablk_cipher_complete(pce_dev); | 
|  | 1169 | } | 
|  | 1170 | }; | 
|  | 1171 |  | 
|  | 1172 |  | 
|  | 1173 | static void _ablk_cipher_ce_in_call_back_pmem(struct msm_dmov_cmd *cmd_ptr, | 
|  | 1174 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 1175 | { | 
|  | 1176 | struct qce_device *pce_dev; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1177 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
|  | 1178 | if (result != ADM_STATUS_OK) { | 
|  | 1179 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 1180 | result); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1181 | pce_dev->ce_dm.chan_ce_in_status = -1; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1182 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1183 | pce_dev->ce_dm.chan_ce_in_status = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1184 | } | 
|  | 1185 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1186 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_COMP; | 
|  | 1187 | if (pce_dev->ce_dm.chan_ce_out_state == QCE_CHAN_STATE_COMP) { | 
|  | 1188 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 1189 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1190 |  | 
|  | 1191 | /* done */ | 
|  | 1192 | _ablk_cipher_use_pmem_complete(pce_dev); | 
|  | 1193 | } | 
|  | 1194 | }; | 
|  | 1195 |  | 
|  | 1196 | static void _ablk_cipher_ce_out_call_back_pmem(struct msm_dmov_cmd *cmd_ptr, | 
|  | 1197 | unsigned int result, struct msm_dmov_errdata *err) | 
|  | 1198 | { | 
|  | 1199 | struct qce_device *pce_dev; | 
|  | 1200 |  | 
|  | 1201 | pce_dev = (struct qce_device *) cmd_ptr->user; | 
|  | 1202 | if (result != ADM_STATUS_OK) { | 
|  | 1203 | dev_err(pce_dev->pdev, "Qualcomm ADM status error %x\n", | 
|  | 1204 | result); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1205 | pce_dev->ce_dm.chan_ce_out_status = -1; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1206 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1207 | pce_dev->ce_dm.chan_ce_out_status = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1208 | }; | 
|  | 1209 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1210 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_COMP; | 
|  | 1211 | if (pce_dev->ce_dm.chan_ce_in_state == QCE_CHAN_STATE_COMP) { | 
|  | 1212 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 1213 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1214 |  | 
|  | 1215 | /* done */ | 
|  | 1216 | _ablk_cipher_use_pmem_complete(pce_dev); | 
|  | 1217 | } | 
|  | 1218 | }; | 
|  | 1219 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1220 | static int qce_setup_cmd_buffers(struct qce_device *pce_dev, | 
|  | 1221 | unsigned char **pvaddr) | 
|  | 1222 | { | 
|  | 1223 | struct ce_reg_buffers *addr = (struct ce_reg_buffers *)(*pvaddr); | 
|  | 1224 | struct ce_reg_buffer_addr *buffer = &pce_dev->ce_dm.buffer; | 
|  | 1225 |  | 
|  | 1226 | /* | 
|  | 1227 | * Designate chunks of the allocated memory to various | 
|  | 1228 | * buffer pointers | 
|  | 1229 | */ | 
|  | 1230 | buffer->reset_buf_64 = addr->reset_buf_64; | 
|  | 1231 | buffer->version = addr->version; | 
|  | 1232 | buffer->encr_seg_cfg_size_start = addr->encr_seg_cfg_size_start; | 
|  | 1233 | buffer->encr_key = addr->encr_key; | 
|  | 1234 | buffer->encr_xts_key = addr->encr_xts_key; | 
|  | 1235 | buffer->encr_xts_du_size = addr->encr_xts_du_size; | 
|  | 1236 | buffer->encr_cntr_iv = addr->encr_cntr_iv; | 
|  | 1237 | buffer->encr_mask = addr->encr_mask; | 
|  | 1238 | buffer->auth_seg_cfg_size_start = addr->auth_seg_cfg_size_start; | 
|  | 1239 | buffer->auth_key = addr->auth_key; | 
|  | 1240 | buffer->auth_iv = addr->auth_iv; | 
|  | 1241 | buffer->auth_result = addr->auth_result; | 
|  | 1242 | buffer->auth_nonce_info = addr->auth_nonce_info; | 
|  | 1243 | buffer->auth_byte_count = addr->auth_byte_count; | 
|  | 1244 | buffer->seg_size = addr->seg_size; | 
|  | 1245 | buffer->go_proc = addr->go_proc; | 
|  | 1246 | buffer->status = addr->status; | 
|  | 1247 | buffer->pad = addr->pad; | 
|  | 1248 |  | 
|  | 1249 | memset(buffer->reset_buf_64, 0, 64); | 
|  | 1250 | *((uint32_t *)buffer->encr_mask) = (uint32_t)(0xffffffff); | 
|  | 1251 | *((uint32_t *)buffer->go_proc) = (uint32_t)(1 << CRYPTO_GO); | 
|  | 1252 |  | 
|  | 1253 | *pvaddr += sizeof(struct ce_reg_buffers); | 
|  | 1254 |  | 
|  | 1255 | return 0; | 
|  | 1256 |  | 
|  | 1257 | } | 
|  | 1258 |  | 
|  | 1259 | static int _setup_cipher_cmdlists(struct qce_device *pce_dev, | 
|  | 1260 | unsigned char **pvaddr) | 
|  | 1261 | { | 
|  | 1262 | dmov_s  *pscmd = (dmov_s  *)(*pvaddr); | 
|  | 1263 |  | 
|  | 1264 | /* | 
|  | 1265 | * Designate chunks of the allocated memory to various | 
|  | 1266 | * command list pointers related to cipher operation | 
|  | 1267 | */ | 
|  | 1268 | pce_dev->ce_dm.cmdlist.set_cipher_cfg = pscmd; | 
|  | 1269 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1270 | pscmd->dst = (unsigned) (CRYPTO_ENCR_SEG_CFG_REG + | 
|  | 1271 | pce_dev->phy_iobase); | 
|  | 1272 | pscmd->len = CRYPTO_REG_SIZE * 3; | 
|  | 1273 | pscmd->src = | 
|  | 1274 | GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_seg_cfg_size_start); | 
|  | 1275 | pscmd++; | 
|  | 1276 |  | 
|  | 1277 | pce_dev->ce_dm.cmdlist.set_cipher_aes_128_key = pscmd; | 
|  | 1278 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1279 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1280 | pscmd->dst = (unsigned) (CRYPTO_ENCR_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1281 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1282 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_key); | 
|  | 1283 | pscmd++; | 
|  | 1284 |  | 
|  | 1285 | pce_dev->ce_dm.cmdlist.set_cipher_aes_256_key = pscmd; | 
|  | 1286 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1287 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1288 | pscmd->dst = (unsigned) (CRYPTO_ENCR_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1289 | pscmd->len = CRYPTO_REG_SIZE * 8; | 
|  | 1290 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_key); | 
|  | 1291 | pscmd++; | 
|  | 1292 |  | 
|  | 1293 | pce_dev->ce_dm.cmdlist.set_cipher_des_key = pscmd; | 
|  | 1294 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1295 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1296 | pscmd->dst = (unsigned) (CRYPTO_ENCR_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1297 | pscmd->len = CRYPTO_REG_SIZE * 2; | 
|  | 1298 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_key); | 
|  | 1299 | pscmd++; | 
|  | 1300 |  | 
|  | 1301 | pce_dev->ce_dm.cmdlist.set_cipher_3des_key = pscmd; | 
|  | 1302 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1303 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1304 | pscmd->dst = (unsigned) (CRYPTO_ENCR_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1305 | pscmd->len = CRYPTO_REG_SIZE * 6; | 
|  | 1306 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_key); | 
|  | 1307 | pscmd++; | 
|  | 1308 |  | 
|  | 1309 | pce_dev->ce_dm.cmdlist.set_cipher_aes_128_xts_key = pscmd; | 
|  | 1310 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1311 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1312 | pscmd->dst = (unsigned) (CRYPTO_ENCR_XTS_KEY0_REG + | 
|  | 1313 | pce_dev->phy_iobase); | 
|  | 1314 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1315 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_xts_key); | 
|  | 1316 | pscmd++; | 
|  | 1317 |  | 
|  | 1318 | pce_dev->ce_dm.cmdlist.set_cipher_aes_256_xts_key = pscmd; | 
|  | 1319 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1320 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1321 | pscmd->dst = (unsigned) (CRYPTO_ENCR_XTS_KEY0_REG + | 
|  | 1322 | pce_dev->phy_iobase); | 
|  | 1323 | pscmd->len = CRYPTO_REG_SIZE * 8; | 
|  | 1324 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_xts_key); | 
|  | 1325 | pscmd++; | 
|  | 1326 |  | 
|  | 1327 | pce_dev->ce_dm.cmdlist.set_cipher_xts_du_size = pscmd; | 
|  | 1328 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1329 | pscmd->dst = (unsigned) (CRYPTO_ENCR_XTS_DU_SIZE_REG + | 
|  | 1330 | pce_dev->phy_iobase); | 
|  | 1331 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1332 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_xts_du_size); | 
|  | 1333 | pscmd++; | 
|  | 1334 |  | 
|  | 1335 | pce_dev->ce_dm.cmdlist.set_cipher_aes_iv = pscmd; | 
|  | 1336 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1337 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1338 | pscmd->dst = (unsigned) (CRYPTO_CNTR0_IV0_REG + pce_dev->phy_iobase); | 
|  | 1339 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1340 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_cntr_iv); | 
|  | 1341 | pscmd++; | 
|  | 1342 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1343 | pce_dev->ce_dm.cmdlist.set_cipher_des_iv = pscmd; | 
|  | 1344 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1345 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1346 | pscmd->dst = (unsigned) (CRYPTO_CNTR0_IV0_REG + pce_dev->phy_iobase); | 
|  | 1347 | pscmd->len = CRYPTO_REG_SIZE * 2; | 
|  | 1348 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_cntr_iv); | 
|  | 1349 | pscmd++; | 
|  | 1350 |  | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1351 | pce_dev->ce_dm.cmdlist.get_cipher_iv = pscmd; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1352 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1353 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1354 | pscmd->src = (unsigned) (CRYPTO_CNTR0_IV0_REG + pce_dev->phy_iobase); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1355 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1356 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_cntr_iv); | 
|  | 1357 | pscmd++; | 
|  | 1358 |  | 
|  | 1359 | pce_dev->ce_dm.cmdlist.set_cipher_mask = pscmd; | 
|  | 1360 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1361 | pscmd->dst = (unsigned) (CRYPTO_CNTR_MASK_REG + pce_dev->phy_iobase); | 
|  | 1362 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1363 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.encr_mask); | 
|  | 1364 | pscmd++; | 
|  | 1365 |  | 
|  | 1366 | /* RESET CIPHER AND AUTH REGISTERS COMMAND LISTS*/ | 
|  | 1367 |  | 
|  | 1368 | pce_dev->ce_dm.cmdlist.reset_cipher_key  = pscmd; | 
|  | 1369 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1370 | pscmd->dst = (unsigned) (CRYPTO_ENCR_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1371 | pscmd->len = CRYPTO_REG_SIZE * 8; | 
|  | 1372 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1373 | pscmd++; | 
|  | 1374 |  | 
|  | 1375 | pce_dev->ce_dm.cmdlist.reset_cipher_xts_key  = pscmd; | 
|  | 1376 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1377 | pscmd->dst = (unsigned) (CRYPTO_ENCR_XTS_KEY0_REG + | 
|  | 1378 | pce_dev->phy_iobase); | 
|  | 1379 | pscmd->len = CRYPTO_REG_SIZE * 8; | 
|  | 1380 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1381 | pscmd++; | 
|  | 1382 |  | 
|  | 1383 | pce_dev->ce_dm.cmdlist.reset_cipher_iv  = pscmd; | 
|  | 1384 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1385 | pscmd->dst = (unsigned) (CRYPTO_CNTR0_IV0_REG + pce_dev->phy_iobase); | 
|  | 1386 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1387 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1388 | pscmd++; | 
|  | 1389 |  | 
|  | 1390 | pce_dev->ce_dm.cmdlist.reset_cipher_cfg  = pscmd; | 
|  | 1391 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1392 | pscmd->dst = (unsigned) (CRYPTO_ENCR_SEG_CFG_REG + pce_dev->phy_iobase); | 
|  | 1393 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1394 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1395 | pscmd++; | 
|  | 1396 |  | 
|  | 1397 | *pvaddr = (unsigned char *) pscmd; | 
|  | 1398 |  | 
|  | 1399 | return 0; | 
|  | 1400 | } | 
|  | 1401 |  | 
|  | 1402 | static int _setup_auth_cmdlists(struct qce_device *pce_dev, | 
|  | 1403 | unsigned char **pvaddr) | 
|  | 1404 | { | 
|  | 1405 | dmov_s  *pscmd = (dmov_s  *)(*pvaddr); | 
|  | 1406 |  | 
|  | 1407 | /* | 
|  | 1408 | * Designate chunks of the allocated memory to various | 
|  | 1409 | * command list pointers related to authentication operation | 
|  | 1410 | */ | 
|  | 1411 | pce_dev->ce_dm.cmdlist.set_auth_cfg = pscmd; | 
|  | 1412 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1413 | pscmd->dst = (unsigned) (CRYPTO_AUTH_SEG_CFG_REG + pce_dev->phy_iobase); | 
|  | 1414 | pscmd->len = CRYPTO_REG_SIZE * 3; | 
|  | 1415 | pscmd->src = | 
|  | 1416 | GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_seg_cfg_size_start); | 
|  | 1417 | pscmd++; | 
|  | 1418 |  | 
|  | 1419 | pce_dev->ce_dm.cmdlist.set_auth_key_128 = pscmd; | 
|  | 1420 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1421 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1422 | pscmd->dst = (unsigned) (CRYPTO_AUTH_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1423 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1424 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_key); | 
|  | 1425 | pscmd++; | 
|  | 1426 |  | 
|  | 1427 | pce_dev->ce_dm.cmdlist.set_auth_key_256 = pscmd; | 
|  | 1428 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1429 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1430 | pscmd->dst = (unsigned) (CRYPTO_AUTH_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1431 | pscmd->len = CRYPTO_REG_SIZE * 8; | 
|  | 1432 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_key); | 
|  | 1433 | pscmd++; | 
|  | 1434 |  | 
|  | 1435 | pce_dev->ce_dm.cmdlist.set_auth_key_512 = pscmd; | 
|  | 1436 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1437 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1438 | pscmd->dst = (unsigned) (CRYPTO_AUTH_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1439 | pscmd->len = CRYPTO_REG_SIZE * 16; | 
|  | 1440 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_key); | 
|  | 1441 | pscmd++; | 
|  | 1442 |  | 
|  | 1443 | pce_dev->ce_dm.cmdlist.set_auth_iv_16 = pscmd; | 
|  | 1444 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1445 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1446 | pscmd->dst = (unsigned) (CRYPTO_AUTH_IV0_REG + pce_dev->phy_iobase); | 
|  | 1447 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1448 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_iv); | 
|  | 1449 | pscmd++; | 
|  | 1450 |  | 
|  | 1451 | pce_dev->ce_dm.cmdlist.get_auth_result_16 = pscmd; | 
|  | 1452 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1453 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1454 | pscmd->src = (unsigned) (CRYPTO_AUTH_IV0_REG + pce_dev->phy_iobase); | 
|  | 1455 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1456 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_result); | 
|  | 1457 | pscmd++; | 
|  | 1458 |  | 
|  | 1459 | pce_dev->ce_dm.cmdlist.set_auth_iv_20 = pscmd; | 
|  | 1460 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1461 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1462 | pscmd->dst = (unsigned) (CRYPTO_AUTH_IV0_REG + pce_dev->phy_iobase); | 
|  | 1463 | pscmd->len = CRYPTO_REG_SIZE * 5; | 
|  | 1464 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_iv); | 
|  | 1465 | pscmd++; | 
|  | 1466 |  | 
|  | 1467 | pce_dev->ce_dm.cmdlist.get_auth_result_20 = pscmd; | 
|  | 1468 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1469 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1470 | pscmd->src = (unsigned) (CRYPTO_AUTH_IV0_REG + pce_dev->phy_iobase); | 
|  | 1471 | pscmd->len = CRYPTO_REG_SIZE * 5; | 
|  | 1472 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_result); | 
|  | 1473 | pscmd++; | 
|  | 1474 |  | 
|  | 1475 | pce_dev->ce_dm.cmdlist.set_auth_iv_32 = pscmd; | 
|  | 1476 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1477 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1478 | pscmd->dst = (unsigned) (CRYPTO_AUTH_IV0_REG + pce_dev->phy_iobase); | 
|  | 1479 | pscmd->len = CRYPTO_REG_SIZE * 8; | 
|  | 1480 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_iv); | 
|  | 1481 | pscmd++; | 
|  | 1482 |  | 
|  | 1483 |  | 
|  | 1484 | pce_dev->ce_dm.cmdlist.get_auth_result_32 = pscmd; | 
|  | 1485 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1486 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1487 | pscmd->src = (unsigned) (CRYPTO_AUTH_IV0_REG + pce_dev->phy_iobase); | 
|  | 1488 | pscmd->len = CRYPTO_REG_SIZE * 8; | 
|  | 1489 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_result); | 
|  | 1490 | pscmd++; | 
|  | 1491 |  | 
|  | 1492 | pce_dev->ce_dm.cmdlist.set_auth_byte_count = pscmd; | 
|  | 1493 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1494 | pscmd->dst = (unsigned) (CRYPTO_AUTH_BYTECNT0_REG + | 
|  | 1495 | pce_dev->phy_iobase); | 
|  | 1496 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1497 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_byte_count); | 
|  | 1498 | pscmd++; | 
|  | 1499 |  | 
|  | 1500 | pce_dev->ce_dm.cmdlist.get_auth_byte_count = pscmd; | 
|  | 1501 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1502 | pscmd->src = (unsigned) (CRYPTO_AUTH_BYTECNT0_REG + | 
|  | 1503 | pce_dev->phy_iobase); | 
|  | 1504 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1505 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_byte_count); | 
|  | 1506 | pscmd++; | 
|  | 1507 |  | 
|  | 1508 | pce_dev->ce_dm.cmdlist.set_auth_nonce_info = pscmd; | 
|  | 1509 | pscmd->cmd = CMD_LC | CMD_SRC_SWAP_BYTES | | 
|  | 1510 | CMD_SRC_SWAP_SHORTS | CMD_MODE_SINGLE; | 
|  | 1511 | pscmd->dst = (unsigned) (CRYPTO_AUTH_INFO_NONCE0_REG + | 
|  | 1512 | pce_dev->phy_iobase); | 
|  | 1513 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1514 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.auth_nonce_info); | 
|  | 1515 | pscmd++; | 
|  | 1516 |  | 
|  | 1517 | /* RESET CIPHER AND AUTH REGISTERS COMMAND LISTS*/ | 
|  | 1518 |  | 
|  | 1519 | pce_dev->ce_dm.cmdlist.reset_auth_key = pscmd; | 
|  | 1520 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1521 | pscmd->dst = (unsigned) (CRYPTO_AUTH_KEY0_REG + pce_dev->phy_iobase); | 
|  | 1522 | pscmd->len = CRYPTO_REG_SIZE * 16; | 
|  | 1523 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1524 | pscmd++; | 
|  | 1525 |  | 
|  | 1526 | pce_dev->ce_dm.cmdlist.reset_auth_iv = pscmd; | 
|  | 1527 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1528 | pscmd->dst = (unsigned) (CRYPTO_AUTH_IV0_REG + pce_dev->phy_iobase); | 
|  | 1529 | pscmd->len = CRYPTO_REG_SIZE * 16; | 
|  | 1530 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1531 | pscmd++; | 
|  | 1532 |  | 
|  | 1533 | pce_dev->ce_dm.cmdlist.reset_auth_cfg = pscmd; | 
|  | 1534 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1535 | pscmd->dst = (unsigned) (CRYPTO_AUTH_SEG_CFG_REG + pce_dev->phy_iobase); | 
|  | 1536 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1537 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1538 | pscmd++; | 
|  | 1539 |  | 
|  | 1540 |  | 
|  | 1541 | pce_dev->ce_dm.cmdlist.reset_auth_byte_count = pscmd; | 
|  | 1542 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1543 | pscmd->dst = (unsigned) (CRYPTO_AUTH_BYTECNT0_REG + | 
|  | 1544 | pce_dev->phy_iobase); | 
|  | 1545 | pscmd->len = CRYPTO_REG_SIZE * 4; | 
|  | 1546 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.reset_buf_64); | 
|  | 1547 | pscmd++; | 
|  | 1548 |  | 
|  | 1549 | /* WAIT UNTIL MAC OP IS DONE*/ | 
|  | 1550 |  | 
|  | 1551 | pce_dev->ce_dm.cmdlist.get_status_wait = pscmd; | 
|  | 1552 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1553 | pscmd->src = (unsigned) (CRYPTO_STATUS_REG + pce_dev->phy_iobase); | 
|  | 1554 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1555 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.status); | 
|  | 1556 | pscmd++; | 
|  | 1557 |  | 
|  | 1558 | *pvaddr = (unsigned char *) pscmd; | 
|  | 1559 |  | 
|  | 1560 | return 0; | 
|  | 1561 | } | 
|  | 1562 |  | 
|  | 1563 | static int qce_setup_cmdlists(struct qce_device *pce_dev, | 
|  | 1564 | unsigned char **pvaddr) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1565 | { | 
|  | 1566 | dmov_sg *pcmd; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1567 | dmov_s  *pscmd; | 
|  | 1568 | unsigned char *vaddr = *pvaddr; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1569 | struct dmov_desc *pdesc; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1570 | int i = 0; | 
|  | 1571 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1572 | /* | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1573 | * Designate chunks of the allocated memory to various | 
|  | 1574 | * command list pointers related to operation define | 
|  | 1575 | * in ce_cmdlists structure. | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1576 | */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1577 | vaddr = (unsigned char *) ALIGN(((unsigned int)vaddr), 16); | 
|  | 1578 | *pvaddr = (unsigned char *) vaddr; | 
|  | 1579 |  | 
|  | 1580 | _setup_cipher_cmdlists(pce_dev, pvaddr); | 
|  | 1581 | _setup_auth_cmdlists(pce_dev, pvaddr); | 
|  | 1582 |  | 
|  | 1583 | pscmd = (dmov_s  *)(*pvaddr); | 
|  | 1584 |  | 
|  | 1585 | /* GET HW VERSION COMMAND LIST */ | 
|  | 1586 | pce_dev->ce_dm.cmdlist.get_hw_version = pscmd; | 
|  | 1587 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE | CMD_OCB; | 
|  | 1588 | pscmd->src = (unsigned) (CRYPTO_VERSION_REG + pce_dev->phy_iobase); | 
|  | 1589 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1590 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.version); | 
|  | 1591 | pscmd++; | 
|  | 1592 |  | 
|  | 1593 |  | 
|  | 1594 | /* SET SEG SIZE REGISTER and OCB COMMAND LIST */ | 
|  | 1595 | pce_dev->ce_dm.cmdlist.set_seg_size_ocb = pscmd; | 
|  | 1596 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE | CMD_OCB; | 
|  | 1597 | pscmd->dst = (unsigned) (CRYPTO_SEG_SIZE_REG + pce_dev->phy_iobase); | 
|  | 1598 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1599 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.seg_size); | 
|  | 1600 | pscmd++; | 
|  | 1601 |  | 
|  | 1602 |  | 
|  | 1603 | /* OCU COMMAND LIST */ | 
|  | 1604 | pce_dev->ce_dm.cmdlist.get_status_ocu = pscmd; | 
|  | 1605 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE | CMD_OCU; | 
|  | 1606 | pscmd->src = (unsigned) (CRYPTO_STATUS_REG + pce_dev->phy_iobase); | 
|  | 1607 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1608 | pscmd->dst = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.status); | 
|  | 1609 | pscmd++; | 
|  | 1610 |  | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1611 | /* CLEAR STATUS COMMAND LIST */ | 
|  | 1612 | pce_dev->ce_dm.cmdlist.clear_status = pscmd; | 
|  | 1613 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE | CMD_OCU; | 
|  | 1614 | pscmd->dst = (unsigned) (CRYPTO_STATUS_REG + pce_dev->phy_iobase); | 
|  | 1615 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1616 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.status); | 
|  | 1617 | pscmd++; | 
|  | 1618 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1619 | /* SET GO_PROC REGISTERS COMMAND LIST */ | 
|  | 1620 | pce_dev->ce_dm.cmdlist.set_go_proc = pscmd; | 
|  | 1621 | pscmd->cmd = CMD_LC | CMD_MODE_SINGLE; | 
|  | 1622 | pscmd->dst = (unsigned) (CRYPTO_GOPROC_REG + pce_dev->phy_iobase); | 
|  | 1623 | pscmd->len = CRYPTO_REG_SIZE; | 
|  | 1624 | pscmd->src = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.go_proc); | 
|  | 1625 | pscmd++; | 
|  | 1626 |  | 
|  | 1627 | pcmd = (dmov_sg  *)pscmd; | 
|  | 1628 | pce_dev->ce_dm.cmdlist.ce_data_in = pcmd; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1629 | /* swap byte and half word , dst crci ,  scatter gather */ | 
|  | 1630 | pcmd->cmd = CMD_DST_SWAP_BYTES | CMD_DST_SWAP_SHORTS | | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1631 | CMD_DST_CRCI(pce_dev->ce_dm.crci_in) | CMD_MODE_SG; | 
|  | 1632 |  | 
|  | 1633 | pdesc = pce_dev->ce_dm.ce_in_src_desc; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1634 | pdesc->addr = 0;	/* to be filled in each operation */ | 
|  | 1635 | pdesc->len = 0;		/* to be filled in each operation */ | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1636 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1637 | pdesc = pce_dev->ce_dm.ce_in_dst_desc; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1638 | for (i = 0; i < QCE_MAX_NUM_DESC; i++) { | 
|  | 1639 | pdesc->addr = (CRYPTO_DATA_SHADOW0 + pce_dev->phy_iobase); | 
|  | 1640 | pdesc->len = 0; /* to be filled in each operation */ | 
|  | 1641 | pdesc++; | 
|  | 1642 | } | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1643 | pcmd->src_dscr = GET_PHYS_ADDR(pce_dev->ce_dm.ce_in_src_desc); | 
|  | 1644 | pcmd->dst_dscr = GET_PHYS_ADDR(pce_dev->ce_dm.ce_in_dst_desc); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1645 | pcmd->_reserved = LI_SG_CMD | SRC_INDEX_SG_CMD(0) | | 
|  | 1646 | DST_INDEX_SG_CMD(0); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1647 |  | 
|  | 1648 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1649 | pcmd++; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1650 | pce_dev->ce_dm.cmdlist.ce_data_out = pcmd; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1651 | /* swap byte, half word, source crci, scatter gather */ | 
|  | 1652 | pcmd->cmd =   CMD_SRC_SWAP_BYTES | CMD_SRC_SWAP_SHORTS | | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1653 | CMD_SRC_CRCI(pce_dev->ce_dm.crci_out) | CMD_MODE_SG; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1654 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1655 | pdesc = pce_dev->ce_dm.ce_out_src_desc; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1656 | for (i = 0; i < QCE_MAX_NUM_DESC; i++) { | 
|  | 1657 | pdesc->addr = (CRYPTO_DATA_SHADOW0 + pce_dev->phy_iobase); | 
|  | 1658 | pdesc->len = 0;  /* to be filled in each operation */ | 
|  | 1659 | pdesc++; | 
|  | 1660 | } | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1661 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1662 | pdesc = pce_dev->ce_dm.ce_out_dst_desc; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1663 | pdesc->addr = 0;  /* to be filled in each operation */ | 
|  | 1664 | pdesc->len = 0;   /* to be filled in each operation */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1665 |  | 
|  | 1666 | pcmd->src_dscr = GET_PHYS_ADDR(pce_dev->ce_dm.ce_out_src_desc); | 
|  | 1667 | pcmd->dst_dscr = GET_PHYS_ADDR(pce_dev->ce_dm.ce_out_dst_desc); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1668 | pcmd->_reserved = LI_SG_CMD | SRC_INDEX_SG_CMD(0) | | 
|  | 1669 | DST_INDEX_SG_CMD(0); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1670 | pcmd++; | 
|  | 1671 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1672 | *pvaddr = (unsigned char *) pcmd; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1673 |  | 
|  | 1674 | return 0; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1675 | } | 
|  | 1676 |  | 
|  | 1677 | static int _setup_cipher_cmdptrlists(struct qce_device *pce_dev, | 
|  | 1678 | unsigned char **pvaddr) | 
|  | 1679 | { | 
|  | 1680 | uint32_t * cmd_ptr_vaddr = (uint32_t *)(*pvaddr); | 
|  | 1681 | struct ce_cmdlists *cmdlist = &pce_dev->ce_dm.cmdlist; | 
|  | 1682 | struct ce_cmdptrlists_ops *cmdptrlist = &pce_dev->ce_dm.cmdptrlist; | 
|  | 1683 |  | 
|  | 1684 | /* | 
|  | 1685 | * Designate chunks of the allocated memory to various | 
|  | 1686 | * command list pointers related to cipher operations defined | 
|  | 1687 | * in ce_cmdptrlists_ops structure. | 
|  | 1688 | */ | 
|  | 1689 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1690 | cmdptrlist->cipher_aes_128_cbc_ctr = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1691 |  | 
|  | 1692 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1693 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1694 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_128_key); | 
|  | 1695 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_iv); | 
|  | 1696 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1697 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1698 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1699 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1700 |  | 
|  | 1701 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1702 | cmdptrlist->cipher_aes_256_cbc_ctr = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1703 |  | 
|  | 1704 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1705 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1706 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_256_key); | 
|  | 1707 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_iv); | 
|  | 1708 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1709 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1710 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1711 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1712 |  | 
|  | 1713 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1714 | cmdptrlist->cipher_aes_128_ecb = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1715 |  | 
|  | 1716 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1717 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1718 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_128_key); | 
|  | 1719 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1720 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1721 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1722 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1723 |  | 
|  | 1724 | cmd_ptr_vaddr = (uint32_t *)ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1725 | cmdptrlist->cipher_aes_256_ecb = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1726 |  | 
|  | 1727 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1728 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1729 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_256_key); | 
|  | 1730 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1731 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1732 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1733 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1734 |  | 
|  | 1735 | cmd_ptr_vaddr = (uint32_t *)ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1736 | cmdptrlist->cipher_aes_128_xts = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1737 |  | 
|  | 1738 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1739 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1740 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_128_key); | 
|  | 1741 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_128_xts_key); | 
|  | 1742 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_iv); | 
|  | 1743 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1744 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_xts_du_size); | 
|  | 1745 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1746 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1747 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1748 |  | 
|  | 1749 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1750 | cmdptrlist->cipher_aes_256_xts = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1751 |  | 
|  | 1752 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1753 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1754 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_256_key); | 
|  | 1755 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_256_xts_key); | 
|  | 1756 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_iv); | 
|  | 1757 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1758 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_xts_du_size); | 
|  | 1759 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1760 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1761 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1762 |  | 
|  | 1763 | cmd_ptr_vaddr = (uint32_t *)ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1764 | cmdptrlist->cipher_des_cbc = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1765 |  | 
|  | 1766 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1767 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1768 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_des_key); | 
|  | 1769 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_des_iv); | 
|  | 1770 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1771 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1772 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1773 |  | 
|  | 1774 | cmd_ptr_vaddr = (uint32_t *)ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1775 | cmdptrlist->cipher_des_ecb = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1776 |  | 
|  | 1777 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1778 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1779 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_des_key); | 
|  | 1780 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1781 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1782 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1783 |  | 
|  | 1784 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1785 | cmdptrlist->cipher_3des_cbc = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1786 |  | 
|  | 1787 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1788 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1789 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_3des_key); | 
|  | 1790 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_des_iv); | 
|  | 1791 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1792 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1793 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1794 |  | 
|  | 1795 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1796 | cmdptrlist->cipher_3des_ecb = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1797 |  | 
|  | 1798 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1799 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1800 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_3des_key); | 
|  | 1801 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_cfg); | 
|  | 1802 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1803 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1804 |  | 
|  | 1805 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1806 | cmdptrlist->cipher_ce_out = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1807 |  | 
|  | 1808 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_out); | 
|  | 1809 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 1810 |  | 
|  | 1811 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1812 | cmdptrlist->cipher_ce_out_get_iv = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1813 |  | 
|  | 1814 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_out); | 
|  | 1815 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_cipher_iv); | 
|  | 1816 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 1817 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1818 | *pvaddr = (unsigned char *) cmd_ptr_vaddr; | 
|  | 1819 |  | 
|  | 1820 | return 0; | 
|  | 1821 | } | 
|  | 1822 |  | 
|  | 1823 | static int _setup_auth_cmdptrlists(struct qce_device *pce_dev, | 
|  | 1824 | unsigned char **pvaddr) | 
|  | 1825 | { | 
|  | 1826 | uint32_t * cmd_ptr_vaddr = (uint32_t *)(*pvaddr); | 
|  | 1827 | struct ce_cmdlists *cmdlist = &pce_dev->ce_dm.cmdlist; | 
|  | 1828 | struct ce_cmdptrlists_ops *cmdptrlist = &pce_dev->ce_dm.cmdptrlist; | 
|  | 1829 |  | 
|  | 1830 | /* | 
|  | 1831 | * Designate chunks of the allocated memory to various | 
|  | 1832 | * command list pointers related to authentication operations | 
|  | 1833 | * defined in ce_cmdptrlists_ops structure. | 
|  | 1834 | */ | 
|  | 1835 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1836 | cmdptrlist->auth_sha1 = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1837 |  | 
|  | 1838 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1839 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_cipher_cfg); | 
|  | 1840 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1841 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_iv_20); | 
|  | 1842 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_byte_count); | 
|  | 1843 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1844 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1845 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1846 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 03675a1 | 2012-11-07 11:52:44 -0800 | [diff] [blame] | 1847 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1848 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1849 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_byte_count); | 
|  | 1850 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_result_20); | 
|  | 1851 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 1852 |  | 
|  | 1853 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1854 | cmdptrlist->auth_sha256 = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1855 |  | 
|  | 1856 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1857 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_cipher_cfg); | 
|  | 1858 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1859 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_iv_32); | 
|  | 1860 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_byte_count); | 
|  | 1861 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1862 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1863 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1864 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 03675a1 | 2012-11-07 11:52:44 -0800 | [diff] [blame] | 1865 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1866 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1867 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_byte_count); | 
|  | 1868 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_result_32); | 
|  | 1869 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 1870 |  | 
|  | 1871 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1872 | cmdptrlist->auth_sha1_hmac = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1873 |  | 
|  | 1874 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1875 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_cipher_cfg); | 
|  | 1876 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_key_512); | 
|  | 1877 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1878 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_iv_20); | 
|  | 1879 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_byte_count); | 
|  | 1880 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1881 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1882 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1883 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 03675a1 | 2012-11-07 11:52:44 -0800 | [diff] [blame] | 1884 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1885 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1886 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_byte_count); | 
|  | 1887 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_result_20); | 
|  | 1888 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 1889 |  | 
|  | 1890 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1891 | cmdptrlist->auth_sha256_hmac = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1892 |  | 
|  | 1893 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1894 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_cipher_cfg); | 
|  | 1895 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_key_512); | 
|  | 1896 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1897 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_iv_32); | 
|  | 1898 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_byte_count); | 
|  | 1899 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1900 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1901 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1902 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 03675a1 | 2012-11-07 11:52:44 -0800 | [diff] [blame] | 1903 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1904 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 1905 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_byte_count); | 
|  | 1906 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_result_32); | 
|  | 1907 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 1908 |  | 
|  | 1909 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1910 | cmdptrlist->auth_aes_128_cmac = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1911 |  | 
|  | 1912 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1913 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_cipher_cfg); | 
|  | 1914 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_iv); | 
|  | 1915 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_key); | 
|  | 1916 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_byte_count); | 
|  | 1917 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_key_128); | 
|  | 1918 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1919 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1920 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1921 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1922 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1923 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_byte_count); | 
|  | 1924 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_result_16); | 
|  | 1925 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 1926 |  | 
|  | 1927 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1928 | cmdptrlist->auth_aes_256_cmac = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1929 |  | 
|  | 1930 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1931 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_cipher_cfg); | 
|  | 1932 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_iv); | 
|  | 1933 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_key); | 
|  | 1934 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_byte_count); | 
|  | 1935 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_key_256); | 
|  | 1936 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1937 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1938 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1939 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1940 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 1941 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_byte_count); | 
|  | 1942 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_auth_result_16); | 
|  | 1943 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 1944 |  | 
|  | 1945 | *pvaddr = (unsigned char *) cmd_ptr_vaddr; | 
|  | 1946 |  | 
|  | 1947 | return 0; | 
|  | 1948 | } | 
|  | 1949 |  | 
|  | 1950 | static int _setup_aead_cmdptrlists(struct qce_device *pce_dev, | 
|  | 1951 | unsigned char **pvaddr) | 
|  | 1952 | { | 
|  | 1953 | uint32_t * cmd_ptr_vaddr = (uint32_t *)(*pvaddr); | 
|  | 1954 | struct ce_cmdlists *cmdlist = &pce_dev->ce_dm.cmdlist; | 
|  | 1955 | struct ce_cmdptrlists_ops *cmdptrlist = &pce_dev->ce_dm.cmdptrlist; | 
|  | 1956 |  | 
|  | 1957 | /* | 
|  | 1958 | * Designate chunks of the allocated memory to various | 
|  | 1959 | * command list pointers related to aead operations | 
|  | 1960 | * defined in ce_cmdptrlists_ops structure. | 
|  | 1961 | */ | 
|  | 1962 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1963 | cmdptrlist->aead_aes_128_ccm = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1964 |  | 
|  | 1965 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1966 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_iv); | 
|  | 1967 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_key); | 
|  | 1968 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_byte_count); | 
|  | 1969 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_key_128); | 
|  | 1970 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_nonce_info); | 
|  | 1971 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1972 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1973 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_128_key); | 
|  | 1974 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_iv); | 
|  | 1975 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1976 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1977 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1978 |  | 
|  | 1979 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1980 | cmdptrlist->aead_aes_256_ccm = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1981 |  | 
|  | 1982 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_seg_size_ocb); | 
|  | 1983 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_iv); | 
|  | 1984 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_key); | 
|  | 1985 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->reset_auth_byte_count); | 
|  | 1986 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_key_256); | 
|  | 1987 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_nonce_info); | 
|  | 1988 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_auth_cfg); | 
|  | 1989 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_cfg); | 
|  | 1990 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_256_key); | 
|  | 1991 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_aes_iv); | 
|  | 1992 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_cipher_mask); | 
|  | 1993 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->set_go_proc); | 
|  | 1994 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->ce_data_in); | 
|  | 1995 |  | 
|  | 1996 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 1997 | cmdptrlist->aead_ce_out = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 1998 |  | 
|  | 1999 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->ce_data_out); | 
|  | 2000 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 2001 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_status_wait); | 
|  | 2002 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 2003 |  | 
|  | 2004 | *pvaddr = (unsigned char *) cmd_ptr_vaddr; | 
|  | 2005 |  | 
|  | 2006 | return 0; | 
|  | 2007 | } | 
|  | 2008 |  | 
|  | 2009 | static int qce_setup_cmdptrlists(struct qce_device *pce_dev, | 
|  | 2010 | unsigned char **pvaddr) | 
|  | 2011 | { | 
|  | 2012 | uint32_t * cmd_ptr_vaddr = (uint32_t *)(*pvaddr); | 
|  | 2013 | struct ce_cmdlists *cmdlist = &pce_dev->ce_dm.cmdlist; | 
|  | 2014 | struct ce_cmdptrlists_ops *cmdptrlist = &pce_dev->ce_dm.cmdptrlist; | 
|  | 2015 | /* | 
|  | 2016 | * Designate chunks of the allocated memory to various | 
|  | 2017 | * command list pointers related to operations defined | 
|  | 2018 | * in ce_cmdptrlists_ops structure. | 
|  | 2019 | */ | 
|  | 2020 | cmd_ptr_vaddr = (uint32_t *) ALIGN(((unsigned int) cmd_ptr_vaddr), 16); | 
|  | 2021 | cmdptrlist->probe_ce_hw = QCE_SET_CMD_PTR(cmd_ptr_vaddr); | 
|  | 2022 |  | 
|  | 2023 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->get_hw_version); | 
| Mona Hossain | b8db743 | 2011-11-17 12:33:24 -0800 | [diff] [blame] | 2024 | *cmd_ptr_vaddr++ = QCE_SET_CMD_PTR(cmdlist->clear_status); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2025 | *cmd_ptr_vaddr++ = QCE_SET_LAST_CMD_PTR(cmdlist->get_status_ocu); | 
|  | 2026 |  | 
|  | 2027 | *pvaddr = (unsigned char *) cmd_ptr_vaddr; | 
|  | 2028 |  | 
|  | 2029 | _setup_cipher_cmdptrlists(pce_dev, pvaddr); | 
|  | 2030 | _setup_auth_cmdptrlists(pce_dev, pvaddr); | 
|  | 2031 | _setup_aead_cmdptrlists(pce_dev, pvaddr); | 
|  | 2032 |  | 
|  | 2033 | return 0; | 
|  | 2034 | } | 
|  | 2035 |  | 
|  | 2036 |  | 
|  | 2037 | static int qce_setup_ce_dm_data(struct qce_device *pce_dev) | 
|  | 2038 | { | 
|  | 2039 | unsigned char *vaddr; | 
|  | 2040 |  | 
|  | 2041 | /* 1. ce_in channel data xfer command src descriptors, 128 entries */ | 
|  | 2042 | vaddr = pce_dev->coh_vmem; | 
|  | 2043 | vaddr = (unsigned char *) ALIGN(((unsigned int)vaddr),  16); | 
|  | 2044 | pce_dev->ce_dm.ce_in_src_desc = (struct dmov_desc *) vaddr; | 
|  | 2045 | vaddr = vaddr + (sizeof(struct dmov_desc) * QCE_MAX_NUM_DESC); | 
|  | 2046 |  | 
|  | 2047 | /* 2. ce_in channel data xfer command dst descriptors, 128 entries */ | 
|  | 2048 | vaddr = (unsigned char *) ALIGN(((unsigned int)vaddr), 16); | 
|  | 2049 | pce_dev->ce_dm.ce_in_dst_desc = (struct dmov_desc *) vaddr; | 
|  | 2050 | vaddr = vaddr + (sizeof(struct dmov_desc) * QCE_MAX_NUM_DESC); | 
|  | 2051 |  | 
|  | 2052 |  | 
|  | 2053 | /* 3. ce_out channel data xfer command src descriptors, 128 entries */ | 
|  | 2054 | vaddr = (unsigned char *) ALIGN(((unsigned int)vaddr), 16); | 
|  | 2055 | pce_dev->ce_dm.ce_out_src_desc = (struct dmov_desc *) vaddr; | 
|  | 2056 | vaddr = vaddr + (sizeof(struct dmov_desc) * QCE_MAX_NUM_DESC); | 
|  | 2057 |  | 
|  | 2058 | /* 4. ce_out channel data xfer command dst descriptors, 128 entries. */ | 
|  | 2059 | vaddr = (unsigned char *) ALIGN(((unsigned int)vaddr), 16); | 
|  | 2060 | pce_dev->ce_dm.ce_out_dst_desc = (struct dmov_desc *) vaddr; | 
|  | 2061 | vaddr = vaddr + (sizeof(struct dmov_desc) * QCE_MAX_NUM_DESC); | 
|  | 2062 |  | 
|  | 2063 | qce_setup_cmd_buffers(pce_dev, &vaddr); | 
|  | 2064 | qce_setup_cmdlists(pce_dev, &vaddr); | 
|  | 2065 | qce_setup_cmdptrlists(pce_dev, &vaddr); | 
|  | 2066 |  | 
|  | 2067 | pce_dev->ce_dm.buffer.ignore_data = vaddr; | 
|  | 2068 |  | 
|  | 2069 | pce_dev->ce_dm.phy_ce_pad = GET_PHYS_ADDR(pce_dev->ce_dm.buffer.pad); | 
|  | 2070 | pce_dev->ce_dm.phy_ce_out_ignore  = | 
|  | 2071 | GET_PHYS_ADDR(pce_dev->ce_dm.buffer.ignore_data); | 
|  | 2072 |  | 
|  | 2073 | pce_dev->ce_dm.chan_ce_in_cmd->user = (void *) pce_dev; | 
|  | 2074 | pce_dev->ce_dm.chan_ce_in_cmd->exec_func = NULL; | 
|  | 2075 |  | 
|  | 2076 | pce_dev->ce_dm.chan_ce_out_cmd->user = (void *) pce_dev; | 
|  | 2077 | pce_dev->ce_dm.chan_ce_out_cmd->exec_func = NULL; | 
|  | 2078 |  | 
|  | 2079 | return 0; | 
|  | 2080 | } | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2081 |  | 
|  | 2082 | static int _qce_start_dma(struct qce_device *pce_dev, bool ce_in, bool ce_out) | 
|  | 2083 | { | 
|  | 2084 |  | 
|  | 2085 | if (ce_in) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2086 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IN_PROG; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2087 | else | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2088 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_COMP; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2089 |  | 
|  | 2090 | if (ce_out) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2091 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IN_PROG; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2092 | else | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2093 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_COMP; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2094 |  | 
|  | 2095 | if (ce_in) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2096 | msm_dmov_enqueue_cmd(pce_dev->ce_dm.chan_ce_in, | 
|  | 2097 | pce_dev->ce_dm.chan_ce_in_cmd); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2098 | if (ce_out) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2099 | msm_dmov_enqueue_cmd(pce_dev->ce_dm.chan_ce_out, | 
|  | 2100 | pce_dev->ce_dm.chan_ce_out_cmd); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2101 |  | 
|  | 2102 | return 0; | 
|  | 2103 | }; | 
|  | 2104 |  | 
|  | 2105 | int qce_aead_req(void *handle, struct qce_req *q_req) | 
|  | 2106 | { | 
|  | 2107 | struct qce_device *pce_dev = (struct qce_device *) handle; | 
|  | 2108 | struct aead_request *areq = (struct aead_request *) q_req->areq; | 
|  | 2109 | uint32_t authsize = q_req->authsize; | 
|  | 2110 | uint32_t totallen_in, totallen_out, out_len; | 
|  | 2111 | uint32_t pad_len_in, pad_len_out; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2112 | int rc = 0; | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 2113 | int ce_block_size; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2114 |  | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 2115 | ce_block_size = pce_dev->ce_dm.ce_block_size; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2116 | if (q_req->dir == QCE_ENCRYPT) { | 
| Mona Hossain | 43fd26a | 2012-05-16 14:36:54 -0700 | [diff] [blame] | 2117 | uint32_t pad_mac_len_out; | 
|  | 2118 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2119 | q_req->cryptlen = areq->cryptlen; | 
|  | 2120 | totallen_in = q_req->cryptlen + areq->assoclen; | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 2121 | pad_len_in = ALIGN(totallen_in, ce_block_size) - totallen_in; | 
| Mona Hossain | 43fd26a | 2012-05-16 14:36:54 -0700 | [diff] [blame] | 2122 |  | 
|  | 2123 | out_len = areq->cryptlen + authsize; | 
|  | 2124 | totallen_out = q_req->cryptlen + authsize + areq->assoclen; | 
|  | 2125 | pad_mac_len_out = ALIGN(authsize, ce_block_size) - authsize; | 
|  | 2126 | totallen_out += pad_mac_len_out; | 
|  | 2127 | pad_len_out = ALIGN(totallen_out, ce_block_size) - | 
|  | 2128 | totallen_out + pad_mac_len_out; | 
|  | 2129 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2130 | } else { | 
|  | 2131 | q_req->cryptlen = areq->cryptlen - authsize; | 
|  | 2132 | totallen_in = areq->cryptlen + areq->assoclen; | 
| Mona Hossain | 43fd26a | 2012-05-16 14:36:54 -0700 | [diff] [blame] | 2133 | pad_len_in = ALIGN(totallen_in, ce_block_size) - totallen_in; | 
|  | 2134 |  | 
|  | 2135 | out_len = q_req->cryptlen; | 
|  | 2136 | totallen_out = totallen_in; | 
|  | 2137 | pad_len_out = ALIGN(totallen_out, ce_block_size) - totallen_out; | 
|  | 2138 | pad_len_out += authsize; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2139 | } | 
|  | 2140 |  | 
|  | 2141 | _chain_buffer_in_init(pce_dev); | 
|  | 2142 | _chain_buffer_out_init(pce_dev); | 
|  | 2143 |  | 
|  | 2144 | pce_dev->assoc_nents = 0; | 
|  | 2145 | pce_dev->src_nents = 0; | 
|  | 2146 | pce_dev->dst_nents = 0; | 
|  | 2147 | pce_dev->ivsize = q_req->ivsize; | 
|  | 2148 | pce_dev->authsize = q_req->authsize; | 
|  | 2149 |  | 
|  | 2150 | /* associated data input */ | 
|  | 2151 | pce_dev->assoc_nents = count_sg(areq->assoc, areq->assoclen); | 
|  | 2152 | dma_map_sg(pce_dev->pdev, areq->assoc, pce_dev->assoc_nents, | 
|  | 2153 | DMA_TO_DEVICE); | 
|  | 2154 | if (_chain_sg_buffer_in(pce_dev, areq->assoc, areq->assoclen) < 0) { | 
|  | 2155 | rc = -ENOMEM; | 
|  | 2156 | goto bad; | 
|  | 2157 | } | 
|  | 2158 | /* cipher input */ | 
|  | 2159 | pce_dev->src_nents = count_sg(areq->src, areq->cryptlen); | 
|  | 2160 | dma_map_sg(pce_dev->pdev, areq->src, pce_dev->src_nents, | 
|  | 2161 | (areq->src == areq->dst) ? DMA_BIDIRECTIONAL : | 
|  | 2162 | DMA_TO_DEVICE); | 
|  | 2163 | if (_chain_sg_buffer_in(pce_dev, areq->src, areq->cryptlen) < 0) { | 
|  | 2164 | rc = -ENOMEM; | 
|  | 2165 | goto bad; | 
|  | 2166 | } | 
|  | 2167 | /* pad data in */ | 
|  | 2168 | if (pad_len_in) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2169 | if (_chain_pm_buffer_in(pce_dev, pce_dev->ce_dm.phy_ce_pad, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2170 | pad_len_in) < 0) { | 
|  | 2171 | rc = -ENOMEM; | 
|  | 2172 | goto bad; | 
|  | 2173 | } | 
|  | 2174 | } | 
|  | 2175 |  | 
|  | 2176 | /* ignore associated data */ | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2177 | if (_chain_pm_buffer_out(pce_dev, pce_dev->ce_dm.phy_ce_out_ignore, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2178 | areq->assoclen) < 0) { | 
|  | 2179 | rc = -ENOMEM; | 
|  | 2180 | goto bad; | 
|  | 2181 | } | 
|  | 2182 | /* cipher + mac output  for encryption    */ | 
|  | 2183 | if (areq->src != areq->dst) { | 
|  | 2184 | pce_dev->dst_nents = count_sg(areq->dst, out_len); | 
|  | 2185 | dma_map_sg(pce_dev->pdev, areq->dst, pce_dev->dst_nents, | 
|  | 2186 | DMA_FROM_DEVICE); | 
|  | 2187 | }; | 
|  | 2188 | if (_chain_sg_buffer_out(pce_dev, areq->dst, out_len) < 0) { | 
|  | 2189 | rc = -ENOMEM; | 
|  | 2190 | goto bad; | 
|  | 2191 | } | 
|  | 2192 | /* pad data out */ | 
|  | 2193 | if (pad_len_out) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2194 | if (_chain_pm_buffer_out(pce_dev, pce_dev->ce_dm.phy_ce_pad, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2195 | pad_len_out) < 0) { | 
|  | 2196 | rc = -ENOMEM; | 
|  | 2197 | goto bad; | 
|  | 2198 | } | 
|  | 2199 | } | 
|  | 2200 |  | 
|  | 2201 | /* finalize the ce_in and ce_out channels command lists */ | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 2202 | _ce_in_final(pce_dev, ALIGN(totallen_in, ce_block_size)); | 
|  | 2203 | _ce_out_final(pce_dev, ALIGN(totallen_out, ce_block_size)); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2204 |  | 
|  | 2205 | /* set up crypto device */ | 
|  | 2206 | rc = _ce_setup_cipher(pce_dev, q_req, totallen_in, areq->assoclen); | 
|  | 2207 | if (rc < 0) | 
|  | 2208 | goto bad; | 
|  | 2209 |  | 
|  | 2210 | /* setup for callback, and issue command to adm */ | 
|  | 2211 | pce_dev->areq = q_req->areq; | 
|  | 2212 | pce_dev->qce_cb = q_req->qce_cb; | 
|  | 2213 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2214 | pce_dev->ce_dm.chan_ce_in_cmd->complete_func = _aead_ce_in_call_back; | 
|  | 2215 | pce_dev->ce_dm.chan_ce_out_cmd->complete_func = _aead_ce_out_call_back; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2216 |  | 
|  | 2217 | _ce_in_dump(pce_dev); | 
|  | 2218 | _ce_out_dump(pce_dev); | 
|  | 2219 |  | 
|  | 2220 | rc = _qce_start_dma(pce_dev, true, true); | 
|  | 2221 | if (rc == 0) | 
|  | 2222 | return 0; | 
|  | 2223 | bad: | 
|  | 2224 | if (pce_dev->assoc_nents) { | 
|  | 2225 | dma_unmap_sg(pce_dev->pdev, areq->assoc, pce_dev->assoc_nents, | 
|  | 2226 | DMA_TO_DEVICE); | 
|  | 2227 | } | 
|  | 2228 |  | 
|  | 2229 | if (pce_dev->src_nents) { | 
|  | 2230 | dma_unmap_sg(pce_dev->pdev, areq->src, pce_dev->src_nents, | 
|  | 2231 | (areq->src == areq->dst) ? DMA_BIDIRECTIONAL : | 
|  | 2232 | DMA_TO_DEVICE); | 
|  | 2233 | } | 
|  | 2234 | if (pce_dev->dst_nents) { | 
|  | 2235 | dma_unmap_sg(pce_dev->pdev, areq->dst, pce_dev->dst_nents, | 
|  | 2236 | DMA_FROM_DEVICE); | 
|  | 2237 | } | 
|  | 2238 | return rc; | 
|  | 2239 | } | 
|  | 2240 | EXPORT_SYMBOL(qce_aead_req); | 
|  | 2241 |  | 
|  | 2242 | int qce_ablk_cipher_req(void *handle, struct qce_req *c_req) | 
|  | 2243 | { | 
|  | 2244 | int rc = 0; | 
|  | 2245 | struct qce_device *pce_dev = (struct qce_device *) handle; | 
|  | 2246 | struct ablkcipher_request *areq = (struct ablkcipher_request *) | 
|  | 2247 | c_req->areq; | 
|  | 2248 |  | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 2249 | uint32_t pad_len = ALIGN(areq->nbytes, pce_dev->ce_dm.ce_block_size) | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2250 | - areq->nbytes; | 
|  | 2251 |  | 
|  | 2252 | _chain_buffer_in_init(pce_dev); | 
|  | 2253 | _chain_buffer_out_init(pce_dev); | 
|  | 2254 |  | 
|  | 2255 | pce_dev->src_nents = 0; | 
|  | 2256 | pce_dev->dst_nents = 0; | 
|  | 2257 |  | 
|  | 2258 | /* cipher input */ | 
|  | 2259 | pce_dev->src_nents = count_sg(areq->src, areq->nbytes); | 
|  | 2260 |  | 
|  | 2261 | if (c_req->use_pmem != 1) | 
|  | 2262 | dma_map_sg(pce_dev->pdev, areq->src, pce_dev->src_nents, | 
|  | 2263 | (areq->src == areq->dst) ? DMA_BIDIRECTIONAL : | 
|  | 2264 | DMA_TO_DEVICE); | 
|  | 2265 | else | 
|  | 2266 | dma_map_pmem_sg(&c_req->pmem->src[0], pce_dev->src_nents, | 
|  | 2267 | areq->src); | 
|  | 2268 |  | 
|  | 2269 | if (_chain_sg_buffer_in(pce_dev, areq->src, areq->nbytes) < 0) { | 
|  | 2270 | rc = -ENOMEM; | 
|  | 2271 | goto bad; | 
|  | 2272 | } | 
|  | 2273 |  | 
|  | 2274 | /* cipher output */ | 
|  | 2275 | if (areq->src != areq->dst) { | 
|  | 2276 | pce_dev->dst_nents = count_sg(areq->dst, areq->nbytes); | 
|  | 2277 | if (c_req->use_pmem != 1) | 
|  | 2278 | dma_map_sg(pce_dev->pdev, areq->dst, pce_dev->dst_nents, | 
|  | 2279 | DMA_FROM_DEVICE); | 
|  | 2280 | else | 
|  | 2281 | dma_map_pmem_sg(&c_req->pmem->dst[0], | 
|  | 2282 | pce_dev->dst_nents, areq->dst); | 
|  | 2283 | }; | 
|  | 2284 | if (_chain_sg_buffer_out(pce_dev, areq->dst, areq->nbytes) < 0) { | 
|  | 2285 | rc = -ENOMEM; | 
|  | 2286 | goto bad; | 
|  | 2287 | } | 
|  | 2288 |  | 
|  | 2289 | /* pad data */ | 
|  | 2290 | if (pad_len) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2291 | if (_chain_pm_buffer_in(pce_dev, pce_dev->ce_dm.phy_ce_pad, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2292 | pad_len) < 0) { | 
|  | 2293 | rc = -ENOMEM; | 
|  | 2294 | goto bad; | 
|  | 2295 | } | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2296 | if (_chain_pm_buffer_out(pce_dev, pce_dev->ce_dm.phy_ce_pad, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2297 | pad_len) < 0) { | 
|  | 2298 | rc = -ENOMEM; | 
|  | 2299 | goto bad; | 
|  | 2300 | } | 
|  | 2301 | } | 
|  | 2302 |  | 
|  | 2303 | /* finalize the ce_in and ce_out channels command lists */ | 
| Mona Hossain | 2563cbc | 2011-09-14 15:24:08 -0700 | [diff] [blame] | 2304 | _ce_in_final(pce_dev, areq->nbytes + pad_len); | 
|  | 2305 | _ce_out_final(pce_dev, areq->nbytes + pad_len); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2306 |  | 
|  | 2307 | _ce_in_dump(pce_dev); | 
|  | 2308 | _ce_out_dump(pce_dev); | 
|  | 2309 |  | 
|  | 2310 | /* set up crypto device */ | 
|  | 2311 | rc = _ce_setup_cipher(pce_dev, c_req, areq->nbytes, 0); | 
|  | 2312 | if (rc < 0) | 
|  | 2313 | goto bad; | 
|  | 2314 |  | 
|  | 2315 | /* setup for callback, and issue command to adm */ | 
|  | 2316 | pce_dev->areq = areq; | 
|  | 2317 | pce_dev->qce_cb = c_req->qce_cb; | 
|  | 2318 | if (c_req->use_pmem == 1) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2319 | pce_dev->ce_dm.chan_ce_in_cmd->complete_func = | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2320 | _ablk_cipher_ce_in_call_back_pmem; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2321 | pce_dev->ce_dm.chan_ce_out_cmd->complete_func = | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2322 | _ablk_cipher_ce_out_call_back_pmem; | 
|  | 2323 | } else { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2324 | pce_dev->ce_dm.chan_ce_in_cmd->complete_func = | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2325 | _ablk_cipher_ce_in_call_back; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2326 | pce_dev->ce_dm.chan_ce_out_cmd->complete_func = | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2327 | _ablk_cipher_ce_out_call_back; | 
|  | 2328 | } | 
|  | 2329 | rc = _qce_start_dma(pce_dev, true, true); | 
|  | 2330 |  | 
|  | 2331 | if (rc == 0) | 
|  | 2332 | return 0; | 
|  | 2333 | bad: | 
|  | 2334 | if (c_req->use_pmem != 1) { | 
|  | 2335 | if (pce_dev->dst_nents) { | 
|  | 2336 | dma_unmap_sg(pce_dev->pdev, areq->dst, | 
|  | 2337 | pce_dev->dst_nents, DMA_FROM_DEVICE); | 
|  | 2338 | } | 
|  | 2339 | if (pce_dev->src_nents) { | 
|  | 2340 | dma_unmap_sg(pce_dev->pdev, areq->src, | 
|  | 2341 | pce_dev->src_nents, | 
|  | 2342 | (areq->src == areq->dst) ? | 
|  | 2343 | DMA_BIDIRECTIONAL : | 
|  | 2344 | DMA_TO_DEVICE); | 
|  | 2345 | } | 
|  | 2346 | } | 
|  | 2347 | return rc; | 
|  | 2348 | } | 
|  | 2349 | EXPORT_SYMBOL(qce_ablk_cipher_req); | 
|  | 2350 |  | 
|  | 2351 | int qce_process_sha_req(void *handle, struct qce_sha_req *sreq) | 
|  | 2352 | { | 
|  | 2353 | struct qce_device *pce_dev = (struct qce_device *) handle; | 
|  | 2354 | int rc; | 
| Mona Hossain | 5f5dde1 | 2011-09-12 10:28:34 -0700 | [diff] [blame] | 2355 | uint32_t pad_len = ALIGN(sreq->size, pce_dev->ce_dm.ce_block_size) - | 
|  | 2356 | sreq->size; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2357 | struct ahash_request *areq = (struct ahash_request *)sreq->areq; | 
|  | 2358 |  | 
|  | 2359 | _chain_buffer_in_init(pce_dev); | 
|  | 2360 | pce_dev->src_nents = count_sg(sreq->src, sreq->size); | 
|  | 2361 | dma_map_sg(pce_dev->pdev, sreq->src, pce_dev->src_nents, | 
|  | 2362 | DMA_TO_DEVICE); | 
|  | 2363 |  | 
|  | 2364 | if (_chain_sg_buffer_in(pce_dev, sreq->src, sreq->size) < 0) { | 
|  | 2365 | rc = -ENOMEM; | 
|  | 2366 | goto bad; | 
|  | 2367 | } | 
|  | 2368 |  | 
|  | 2369 | if (pad_len) { | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2370 | if (_chain_pm_buffer_in(pce_dev, pce_dev->ce_dm.phy_ce_pad, | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2371 | pad_len) < 0) { | 
|  | 2372 | rc = -ENOMEM; | 
|  | 2373 | goto bad; | 
|  | 2374 | } | 
|  | 2375 | } | 
| Mona Hossain | 2563cbc | 2011-09-14 15:24:08 -0700 | [diff] [blame] | 2376 | _ce_in_final(pce_dev, sreq->size + pad_len); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2377 |  | 
|  | 2378 | _ce_in_dump(pce_dev); | 
|  | 2379 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2380 | rc = _ce_setup_hash(pce_dev, sreq); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2381 |  | 
|  | 2382 | if (rc < 0) | 
|  | 2383 | goto bad; | 
|  | 2384 |  | 
|  | 2385 | pce_dev->areq = areq; | 
|  | 2386 | pce_dev->qce_cb = sreq->qce_cb; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2387 | pce_dev->ce_dm.chan_ce_in_cmd->complete_func = _sha_ce_in_call_back; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2388 |  | 
|  | 2389 | rc =  _qce_start_dma(pce_dev, true, false); | 
|  | 2390 |  | 
|  | 2391 | if (rc == 0) | 
|  | 2392 | return 0; | 
|  | 2393 | bad: | 
|  | 2394 | if (pce_dev->src_nents) { | 
|  | 2395 | dma_unmap_sg(pce_dev->pdev, sreq->src, | 
|  | 2396 | pce_dev->src_nents, DMA_TO_DEVICE); | 
|  | 2397 | } | 
|  | 2398 |  | 
|  | 2399 | return rc; | 
|  | 2400 | } | 
|  | 2401 | EXPORT_SYMBOL(qce_process_sha_req); | 
|  | 2402 |  | 
|  | 2403 | /* crypto engine open function. */ | 
|  | 2404 | void *qce_open(struct platform_device *pdev, int *rc) | 
|  | 2405 | { | 
|  | 2406 | struct qce_device *pce_dev; | 
|  | 2407 | struct resource *resource; | 
|  | 2408 | struct clk *ce_core_clk; | 
|  | 2409 | struct clk *ce_clk; | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 2410 | struct clk *ce_core_src_clk; | 
|  | 2411 | int ret = 0; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2412 |  | 
|  | 2413 | pce_dev = kzalloc(sizeof(struct qce_device), GFP_KERNEL); | 
|  | 2414 | if (!pce_dev) { | 
|  | 2415 | *rc = -ENOMEM; | 
|  | 2416 | dev_err(&pdev->dev, "Can not allocate memory\n"); | 
|  | 2417 | return NULL; | 
|  | 2418 | } | 
|  | 2419 | pce_dev->pdev = &pdev->dev; | 
|  | 2420 |  | 
|  | 2421 | resource = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 
|  | 2422 | if (!resource) { | 
|  | 2423 | *rc = -ENXIO; | 
|  | 2424 | dev_err(pce_dev->pdev, "Missing MEM resource\n"); | 
|  | 2425 | goto err_pce_dev; | 
|  | 2426 | }; | 
|  | 2427 | pce_dev->phy_iobase = resource->start; | 
|  | 2428 | pce_dev->iobase = ioremap_nocache(resource->start, | 
|  | 2429 | resource->end - resource->start + 1); | 
|  | 2430 | if (!pce_dev->iobase) { | 
|  | 2431 | *rc = -ENOMEM; | 
|  | 2432 | dev_err(pce_dev->pdev, "Can not map io memory\n"); | 
|  | 2433 | goto err_pce_dev; | 
|  | 2434 | } | 
|  | 2435 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2436 | pce_dev->ce_dm.chan_ce_in_cmd = kzalloc(sizeof(struct msm_dmov_cmd), | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2437 | GFP_KERNEL); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2438 | pce_dev->ce_dm.chan_ce_out_cmd = kzalloc(sizeof(struct msm_dmov_cmd), | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2439 | GFP_KERNEL); | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2440 | if (pce_dev->ce_dm.chan_ce_in_cmd == NULL || | 
|  | 2441 | pce_dev->ce_dm.chan_ce_out_cmd == NULL) { | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2442 | dev_err(pce_dev->pdev, "Can not allocate memory\n"); | 
|  | 2443 | *rc = -ENOMEM; | 
|  | 2444 | goto err_dm_chan_cmd; | 
|  | 2445 | } | 
|  | 2446 |  | 
|  | 2447 | resource = platform_get_resource_byname(pdev, IORESOURCE_DMA, | 
|  | 2448 | "crypto_channels"); | 
|  | 2449 | if (!resource) { | 
|  | 2450 | *rc = -ENXIO; | 
|  | 2451 | dev_err(pce_dev->pdev, "Missing DMA channel resource\n"); | 
|  | 2452 | goto err_dm_chan_cmd; | 
|  | 2453 | }; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2454 | pce_dev->ce_dm.chan_ce_in = resource->start; | 
|  | 2455 | pce_dev->ce_dm.chan_ce_out = resource->end; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2456 | resource = platform_get_resource_byname(pdev, IORESOURCE_DMA, | 
|  | 2457 | "crypto_crci_in"); | 
|  | 2458 | if (!resource) { | 
|  | 2459 | *rc = -ENXIO; | 
|  | 2460 | dev_err(pce_dev->pdev, "Missing DMA crci in resource\n"); | 
|  | 2461 | goto err_dm_chan_cmd; | 
|  | 2462 | }; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2463 | pce_dev->ce_dm.crci_in = resource->start; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2464 | resource = platform_get_resource_byname(pdev, IORESOURCE_DMA, | 
|  | 2465 | "crypto_crci_out"); | 
|  | 2466 | if (!resource) { | 
|  | 2467 | *rc = -ENXIO; | 
|  | 2468 | dev_err(pce_dev->pdev, "Missing DMA crci out resource\n"); | 
|  | 2469 | goto err_dm_chan_cmd; | 
|  | 2470 | }; | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2471 | pce_dev->ce_dm.crci_out = resource->start; | 
|  | 2472 | pce_dev->memsize = 2 * PAGE_SIZE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2473 | pce_dev->coh_vmem = dma_alloc_coherent(pce_dev->pdev, | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2474 | pce_dev->memsize, &pce_dev->coh_pmem, GFP_KERNEL); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2475 |  | 
|  | 2476 | if (pce_dev->coh_vmem == NULL) { | 
|  | 2477 | *rc = -ENOMEM; | 
|  | 2478 | dev_err(pce_dev->pdev, "Can not allocate coherent memory.\n"); | 
|  | 2479 | goto err; | 
|  | 2480 | } | 
|  | 2481 |  | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 2482 | /* Get CE3 src core clk. */ | 
|  | 2483 | ce_core_src_clk = clk_get(pce_dev->pdev, "ce3_core_src_clk"); | 
|  | 2484 | if (!IS_ERR(ce_core_src_clk)) { | 
|  | 2485 | pce_dev->ce_core_src_clk = ce_core_src_clk; | 
|  | 2486 |  | 
|  | 2487 | /* Set the core src clk @100Mhz */ | 
|  | 2488 | ret = clk_set_rate(pce_dev->ce_core_src_clk, 100000000); | 
|  | 2489 | if (ret) { | 
|  | 2490 | clk_put(pce_dev->ce_core_src_clk); | 
|  | 2491 | goto err; | 
|  | 2492 | } | 
|  | 2493 | } else | 
|  | 2494 | pce_dev->ce_core_src_clk = NULL; | 
|  | 2495 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2496 | /* Get CE core clk */ | 
| Matt Wagantall | c4b3a4d | 2011-08-17 16:58:39 -0700 | [diff] [blame] | 2497 | ce_core_clk = clk_get(pce_dev->pdev, "core_clk"); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2498 | if (IS_ERR(ce_core_clk)) { | 
|  | 2499 | *rc = PTR_ERR(ce_core_clk); | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 2500 | if (pce_dev->ce_core_src_clk != NULL) | 
|  | 2501 | clk_put(pce_dev->ce_core_src_clk); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2502 | goto err; | 
|  | 2503 | } | 
|  | 2504 | pce_dev->ce_core_clk = ce_core_clk; | 
|  | 2505 | /* Get CE clk */ | 
| Matt Wagantall | c4b3a4d | 2011-08-17 16:58:39 -0700 | [diff] [blame] | 2506 | ce_clk = clk_get(pce_dev->pdev, "iface_clk"); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2507 | if (IS_ERR(ce_clk)) { | 
|  | 2508 | *rc = PTR_ERR(ce_clk); | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 2509 | if (pce_dev->ce_core_src_clk != NULL) | 
|  | 2510 | clk_put(pce_dev->ce_core_src_clk); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2511 | clk_put(pce_dev->ce_core_clk); | 
|  | 2512 | goto err; | 
|  | 2513 | } | 
|  | 2514 | pce_dev->ce_clk = ce_clk; | 
|  | 2515 |  | 
|  | 2516 | /* Enable CE core clk */ | 
| Ramesh Masavarapu | 2d082fa | 2012-04-24 16:38:31 -0700 | [diff] [blame] | 2517 | *rc = clk_prepare_enable(pce_dev->ce_core_clk); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2518 | if (*rc) { | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 2519 | if (pce_dev->ce_core_src_clk != NULL) | 
|  | 2520 | clk_put(pce_dev->ce_core_src_clk); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2521 | clk_put(pce_dev->ce_core_clk); | 
|  | 2522 | clk_put(pce_dev->ce_clk); | 
|  | 2523 | goto err; | 
|  | 2524 | } else { | 
|  | 2525 | /* Enable CE clk */ | 
| Ramesh Masavarapu | 2d082fa | 2012-04-24 16:38:31 -0700 | [diff] [blame] | 2526 | *rc = clk_prepare_enable(pce_dev->ce_clk); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2527 | if (*rc) { | 
| Ramesh Masavarapu | 2d082fa | 2012-04-24 16:38:31 -0700 | [diff] [blame] | 2528 | clk_disable_unprepare(pce_dev->ce_core_clk); | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 2529 | if (pce_dev->ce_core_src_clk != NULL) | 
|  | 2530 | clk_put(pce_dev->ce_core_src_clk); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2531 | clk_put(pce_dev->ce_core_clk); | 
|  | 2532 | clk_put(pce_dev->ce_clk); | 
|  | 2533 | goto err; | 
|  | 2534 |  | 
|  | 2535 | } | 
|  | 2536 | } | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2537 | qce_setup_ce_dm_data(pce_dev); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2538 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2539 | pce_dev->ce_dm.chan_ce_in_state = QCE_CHAN_STATE_IDLE; | 
|  | 2540 | pce_dev->ce_dm.chan_ce_out_state = QCE_CHAN_STATE_IDLE; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2541 | if (_init_ce_engine(pce_dev)) { | 
|  | 2542 | *rc = -ENXIO; | 
|  | 2543 | goto err; | 
|  | 2544 | } | 
|  | 2545 | *rc = 0; | 
|  | 2546 | return pce_dev; | 
|  | 2547 |  | 
|  | 2548 | err: | 
|  | 2549 | if (pce_dev->coh_vmem) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2550 | dma_free_coherent(pce_dev->pdev, pce_dev->memsize, | 
| Mona Hossain | e1b13f8 | 2011-08-30 09:35:49 -0700 | [diff] [blame] | 2551 | pce_dev->coh_vmem, pce_dev->coh_pmem); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2552 | err_dm_chan_cmd: | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2553 | kfree(pce_dev->ce_dm.chan_ce_in_cmd); | 
|  | 2554 | kfree(pce_dev->ce_dm.chan_ce_out_cmd); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2555 | if (pce_dev->iobase) | 
|  | 2556 | iounmap(pce_dev->iobase); | 
|  | 2557 |  | 
|  | 2558 | err_pce_dev: | 
|  | 2559 |  | 
|  | 2560 | kfree(pce_dev); | 
|  | 2561 |  | 
|  | 2562 | return NULL; | 
|  | 2563 | } | 
|  | 2564 | EXPORT_SYMBOL(qce_open); | 
|  | 2565 |  | 
|  | 2566 | /* crypto engine close function. */ | 
|  | 2567 | int qce_close(void *handle) | 
|  | 2568 | { | 
|  | 2569 | struct qce_device *pce_dev = (struct qce_device *) handle; | 
|  | 2570 |  | 
|  | 2571 | if (handle == NULL) | 
|  | 2572 | return -ENODEV; | 
|  | 2573 | if (pce_dev->iobase) | 
|  | 2574 | iounmap(pce_dev->iobase); | 
|  | 2575 |  | 
|  | 2576 | if (pce_dev->coh_vmem) | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2577 | dma_free_coherent(pce_dev->pdev, pce_dev->memsize, | 
|  | 2578 | pce_dev->coh_vmem, pce_dev->coh_pmem); | 
| Ramesh Masavarapu | 2d082fa | 2012-04-24 16:38:31 -0700 | [diff] [blame] | 2579 | clk_disable_unprepare(pce_dev->ce_clk); | 
|  | 2580 | clk_disable_unprepare(pce_dev->ce_core_clk); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2581 |  | 
| Ramesh Masavarapu | 2831191 | 2011-10-27 11:04:12 -0700 | [diff] [blame] | 2582 | if (pce_dev->ce_core_src_clk != NULL) | 
|  | 2583 | clk_put(pce_dev->ce_core_src_clk); | 
|  | 2584 |  | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2585 | clk_put(pce_dev->ce_clk); | 
|  | 2586 | clk_put(pce_dev->ce_core_clk); | 
|  | 2587 |  | 
| Mona Hossain | 3b574d8 | 2011-09-01 15:02:01 -0700 | [diff] [blame] | 2588 | kfree(pce_dev->ce_dm.chan_ce_in_cmd); | 
|  | 2589 | kfree(pce_dev->ce_dm.chan_ce_out_cmd); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2590 | kfree(handle); | 
|  | 2591 |  | 
|  | 2592 | return 0; | 
|  | 2593 | } | 
|  | 2594 | EXPORT_SYMBOL(qce_close); | 
|  | 2595 |  | 
|  | 2596 | int qce_hw_support(void *handle, struct ce_hw_support *ce_support) | 
|  | 2597 | { | 
|  | 2598 | if (ce_support == NULL) | 
|  | 2599 | return -EINVAL; | 
|  | 2600 |  | 
|  | 2601 | ce_support->sha1_hmac_20 = false; | 
|  | 2602 | ce_support->sha1_hmac = false; | 
|  | 2603 | ce_support->sha256_hmac = false; | 
|  | 2604 | ce_support->sha_hmac = false; | 
|  | 2605 | ce_support->cmac  = true; | 
|  | 2606 | ce_support->aes_key_192 = false; | 
|  | 2607 | ce_support->aes_xts = true; | 
|  | 2608 | ce_support->aes_ccm = true; | 
|  | 2609 | ce_support->ota = false; | 
| Mona Hossain | b43e94b | 2012-05-07 08:52:06 -0700 | [diff] [blame] | 2610 | ce_support->aligned_only = false; | 
|  | 2611 | ce_support->bam = false; | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2612 | return 0; | 
|  | 2613 | } | 
|  | 2614 | EXPORT_SYMBOL(qce_hw_support); | 
|  | 2615 |  | 
|  | 2616 | MODULE_LICENSE("GPL v2"); | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 2617 | MODULE_DESCRIPTION("Crypto Engine driver"); |