1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright(c) 2021 Intel Corporation. All rights rsvd. */ 3 4 #ifndef __IAA_CRYPTO_H__ 5 #define __IAA_CRYPTO_H__ 6 7 #include <linux/crypto.h> 8 #include <linux/idxd.h> 9 #include <uapi/linux/idxd.h> 10 11 #define IDXD_SUBDRIVER_NAME "crypto" 12 13 #define IAA_DECOMP_ENABLE BIT(0) 14 #define IAA_DECOMP_FLUSH_OUTPUT BIT(1) 15 #define IAA_DECOMP_CHECK_FOR_EOB BIT(2) 16 #define IAA_DECOMP_STOP_ON_EOB BIT(3) 17 #define IAA_DECOMP_SUPPRESS_OUTPUT BIT(9) 18 19 #define IAA_COMP_FLUSH_OUTPUT BIT(1) 20 #define IAA_COMP_APPEND_EOB BIT(2) 21 22 #define IAA_COMPLETION_TIMEOUT 1000000 23 24 #define IAA_ANALYTICS_ERROR 0x0a 25 #define IAA_ERROR_DECOMP_BUF_OVERFLOW 0x0b 26 #define IAA_ERROR_COMP_BUF_OVERFLOW 0x19 27 #define IAA_ERROR_WATCHDOG_EXPIRED 0x24 28 29 #define IAA_COMP_MODES_MAX 2 30 31 #define FIXED_HDR 0x2 32 #define FIXED_HDR_SIZE 3 33 34 #define IAA_COMP_FLAGS (IAA_COMP_FLUSH_OUTPUT | \ 35 IAA_COMP_APPEND_EOB) 36 37 #define IAA_DECOMP_FLAGS (IAA_DECOMP_ENABLE | \ 38 IAA_DECOMP_FLUSH_OUTPUT | \ 39 IAA_DECOMP_CHECK_FOR_EOB | \ 40 IAA_DECOMP_STOP_ON_EOB) 41 42 /* Representation of IAA workqueue */ 43 struct iaa_wq { 44 struct list_head list; 45 46 struct idxd_wq *wq; 47 int ref; 48 bool remove; 49 50 struct iaa_device *iaa_device; 51 52 u64 comp_calls; 53 u64 comp_bytes; 54 u64 decomp_calls; 55 u64 decomp_bytes; 56 }; 57 58 struct iaa_device_compression_mode { 59 const char *name; 60 61 struct aecs_comp_table_record *aecs_comp_table; 62 struct aecs_decomp_table_record *aecs_decomp_table; 63 64 dma_addr_t aecs_comp_table_dma_addr; 65 dma_addr_t aecs_decomp_table_dma_addr; 66 }; 67 68 /* Representation of IAA device with wqs, populated by probe */ 69 struct iaa_device { 70 struct list_head list; 71 struct idxd_device *idxd; 72 73 struct iaa_device_compression_mode *compression_modes[IAA_COMP_MODES_MAX]; 74 75 int n_wq; 76 struct list_head wqs; 77 78 u64 comp_calls; 79 u64 comp_bytes; 80 u64 decomp_calls; 81 u64 decomp_bytes; 82 }; 83 84 struct wq_table_entry { 85 struct idxd_wq **wqs; 86 int max_wqs; 87 int n_wqs; 88 int cur_wq; 89 }; 90 91 #define IAA_AECS_ALIGN 32 92 93 /* 94 * Analytics Engine Configuration and State (AECS) contains parameters and 95 * internal state of the analytics engine. 96 */ 97 struct aecs_comp_table_record { 98 u32 crc; 99 u32 xor_checksum; 100 u32 reserved0[5]; 101 u32 num_output_accum_bits; 102 u8 output_accum[256]; 103 u32 ll_sym[286]; 104 u32 reserved1; 105 u32 reserved2; 106 u32 d_sym[30]; 107 u32 reserved_padding[2]; 108 } __packed; 109 110 /* AECS for decompress */ 111 struct aecs_decomp_table_record { 112 u32 crc; 113 u32 xor_checksum; 114 u32 low_filter_param; 115 u32 high_filter_param; 116 u32 output_mod_idx; 117 u32 drop_init_decomp_out_bytes; 118 u32 reserved[36]; 119 u32 output_accum_data[2]; 120 u32 out_bits_valid; 121 u32 bit_off_indexing; 122 u32 input_accum_data[64]; 123 u8 size_qw[32]; 124 u32 decomp_state[1220]; 125 } __packed; 126 127 int iaa_aecs_init_fixed(void); 128 void iaa_aecs_cleanup_fixed(void); 129 130 typedef int (*iaa_dev_comp_init_fn_t) (struct iaa_device_compression_mode *mode); 131 typedef int (*iaa_dev_comp_free_fn_t) (struct iaa_device_compression_mode *mode); 132 133 struct iaa_compression_mode { 134 const char *name; 135 u32 *ll_table; 136 int ll_table_size; 137 u32 *d_table; 138 int d_table_size; 139 u32 *header_table; 140 int header_table_size; 141 u16 gen_decomp_table_flags; 142 iaa_dev_comp_init_fn_t init; 143 iaa_dev_comp_free_fn_t free; 144 }; 145 146 int add_iaa_compression_mode(const char *name, 147 const u32 *ll_table, 148 int ll_table_size, 149 const u32 *d_table, 150 int d_table_size, 151 const u8 *header_table, 152 int header_table_size, 153 u16 gen_decomp_table_flags, 154 iaa_dev_comp_init_fn_t init, 155 iaa_dev_comp_free_fn_t free); 156 157 void remove_iaa_compression_mode(const char *name); 158 159 enum iaa_mode { 160 IAA_MODE_FIXED, 161 }; 162 163 struct iaa_compression_ctx { 164 enum iaa_mode mode; 165 bool verify_compress; 166 bool async_mode; 167 bool use_irq; 168 }; 169 170 extern struct list_head iaa_devices; 171 extern struct mutex iaa_devices_lock; 172 173 #endif 174