crypto4xx_core.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * AMCC SoC PPC4xx Crypto Driver
  3. *
  4. * Copyright (c) 2008 Applied Micro Circuits Corporation.
  5. * All rights reserved. James Hsiao <jhsiao@amcc.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * This is the header file for AMCC Crypto offload Linux device driver for
  18. * use with Linux CryptoAPI.
  19. */
  20. #ifndef __CRYPTO4XX_CORE_H__
  21. #define __CRYPTO4XX_CORE_H__
  22. #define PPC460SX_SDR0_SRST 0x201
  23. #define PPC405EX_SDR0_SRST 0x200
  24. #define PPC460EX_SDR0_SRST 0x201
  25. #define PPC460EX_CE_RESET 0x08000000
  26. #define PPC460SX_CE_RESET 0x20000000
  27. #define PPC405EX_CE_RESET 0x00000008
  28. #define CRYPTO4XX_CRYPTO_PRIORITY 300
  29. #define PPC4XX_LAST_PD 63
  30. #define PPC4XX_NUM_PD 64
  31. #define PPC4XX_LAST_GD 1023
  32. #define PPC4XX_NUM_GD 1024
  33. #define PPC4XX_LAST_SD 63
  34. #define PPC4XX_NUM_SD 64
  35. #define PPC4XX_SD_BUFFER_SIZE 2048
  36. #define PD_ENTRY_INUSE 1
  37. #define PD_ENTRY_FREE 0
  38. #define ERING_WAS_FULL 0xffffffff
  39. struct crypto4xx_device;
  40. struct pd_uinfo {
  41. struct crypto4xx_device *dev;
  42. u32 state;
  43. u32 using_sd;
  44. u32 first_gd; /* first gather discriptor
  45. used by this packet */
  46. u32 num_gd; /* number of gather discriptor
  47. used by this packet */
  48. u32 first_sd; /* first scatter discriptor
  49. used by this packet */
  50. u32 num_sd; /* number of scatter discriptors
  51. used by this packet */
  52. void *sa_va; /* shadow sa, when using cp from ctx->sa */
  53. u32 sa_pa;
  54. void *sr_va; /* state record for shadow sa */
  55. u32 sr_pa;
  56. struct scatterlist *dest_va;
  57. struct crypto_async_request *async_req; /* base crypto request
  58. for this packet */
  59. };
  60. struct crypto4xx_device {
  61. struct crypto4xx_core_device *core_dev;
  62. char *name;
  63. u64 ce_phy_address;
  64. void __iomem *ce_base;
  65. void *pdr; /* base address of packet
  66. descriptor ring */
  67. dma_addr_t pdr_pa; /* physical address used to
  68. program ce pdr_base_register */
  69. void *gdr; /* gather descriptor ring */
  70. dma_addr_t gdr_pa; /* physical address used to
  71. program ce gdr_base_register */
  72. void *sdr; /* scatter descriptor ring */
  73. dma_addr_t sdr_pa; /* physical address used to
  74. program ce sdr_base_register */
  75. void *scatter_buffer_va;
  76. dma_addr_t scatter_buffer_pa;
  77. u32 scatter_buffer_size;
  78. void *shadow_sa_pool; /* pool of memory for sa in pd_uinfo */
  79. dma_addr_t shadow_sa_pool_pa;
  80. void *shadow_sr_pool; /* pool of memory for sr in pd_uinfo */
  81. dma_addr_t shadow_sr_pool_pa;
  82. u32 pdr_tail;
  83. u32 pdr_head;
  84. u32 gdr_tail;
  85. u32 gdr_head;
  86. u32 sdr_tail;
  87. u32 sdr_head;
  88. void *pdr_uinfo;
  89. struct list_head alg_list; /* List of algorithm supported
  90. by this device */
  91. };
  92. struct crypto4xx_core_device {
  93. struct device *device;
  94. struct of_device *ofdev;
  95. struct crypto4xx_device *dev;
  96. u32 int_status;
  97. u32 irq;
  98. struct tasklet_struct tasklet;
  99. spinlock_t lock;
  100. };
  101. struct crypto4xx_ctx {
  102. struct crypto4xx_device *dev;
  103. void *sa_in;
  104. dma_addr_t sa_in_dma_addr;
  105. void *sa_out;
  106. dma_addr_t sa_out_dma_addr;
  107. void *state_record;
  108. dma_addr_t state_record_dma_addr;
  109. u32 sa_len;
  110. u32 offset_to_sr_ptr; /* offset to state ptr, in dynamic sa */
  111. u32 direction;
  112. u32 next_hdr;
  113. u32 save_iv;
  114. u32 pd_ctl_len;
  115. u32 pd_ctl;
  116. u32 bypass;
  117. u32 is_hash;
  118. u32 hash_final;
  119. };
  120. struct crypto4xx_req_ctx {
  121. struct crypto4xx_device *dev; /* Device in which
  122. operation to send to */
  123. void *sa;
  124. u32 sa_dma_addr;
  125. u16 sa_len;
  126. };
  127. struct crypto4xx_alg {
  128. struct list_head entry;
  129. struct crypto_alg alg;
  130. struct crypto4xx_device *dev;
  131. };
  132. #define crypto_alg_to_crypto4xx_alg(x) \
  133. container_of(x, struct crypto4xx_alg, alg)
  134. extern int crypto4xx_alloc_sa(struct crypto4xx_ctx *ctx, u32 size);
  135. extern void crypto4xx_free_sa(struct crypto4xx_ctx *ctx);
  136. extern u32 crypto4xx_alloc_sa_rctx(struct crypto4xx_ctx *ctx,
  137. struct crypto4xx_ctx *rctx);
  138. extern void crypto4xx_free_sa_rctx(struct crypto4xx_ctx *rctx);
  139. extern void crypto4xx_free_ctx(struct crypto4xx_ctx *ctx);
  140. extern u32 crypto4xx_alloc_state_record(struct crypto4xx_ctx *ctx);
  141. extern u32 get_dynamic_sa_offset_state_ptr_field(struct crypto4xx_ctx *ctx);
  142. extern u32 get_dynamic_sa_offset_key_field(struct crypto4xx_ctx *ctx);
  143. extern u32 get_dynamic_sa_iv_size(struct crypto4xx_ctx *ctx);
  144. extern void crypto4xx_memcpy_le(unsigned int *dst,
  145. const unsigned char *buf, int len);
  146. extern u32 crypto4xx_build_pd(struct crypto_async_request *req,
  147. struct crypto4xx_ctx *ctx,
  148. struct scatterlist *src,
  149. struct scatterlist *dst,
  150. unsigned int datalen,
  151. void *iv, u32 iv_len);
  152. extern int crypto4xx_setkey_aes_cbc(struct crypto_ablkcipher *cipher,
  153. const u8 *key, unsigned int keylen);
  154. extern int crypto4xx_encrypt(struct ablkcipher_request *req);
  155. extern int crypto4xx_decrypt(struct ablkcipher_request *req);
  156. extern int crypto4xx_sha1_alg_init(struct crypto_tfm *tfm);
  157. extern int crypto4xx_hash_digest(struct ahash_request *req);
  158. extern int crypto4xx_hash_final(struct ahash_request *req);
  159. extern int crypto4xx_hash_update(struct ahash_request *req);
  160. extern int crypto4xx_hash_init(struct ahash_request *req);
  161. #endif