1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2017 Intel Corporation. All rights reserved. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #ifndef _RTE_CRYPTO_SCHEDULER_H 35 #define _RTE_CRYPTO_SCHEDULER_H 36 37 /** 38 * @file rte_cryptodev_scheduler.h 39 * 40 * RTE Cryptodev Scheduler Device 41 * 42 * The RTE Cryptodev Scheduler Device allows the aggregation of multiple (slave) 43 * Cryptodevs into a single logical crypto device, and the scheduling the 44 * crypto operations to the slaves based on the mode of the specified mode of 45 * operation specified and supported. This implementation supports 3 modes of 46 * operation: round robin, packet-size based, and fail-over. 47 */ 48 49 #include <stdint.h> 50 #include "rte_cryptodev_scheduler_operations.h" 51 52 #ifdef __cplusplus 53 extern "C" { 54 #endif 55 56 /** Maximum number of bonded devices per device */ 57 #ifndef RTE_CRYPTODEV_SCHEDULER_MAX_NB_SLAVES 58 #define RTE_CRYPTODEV_SCHEDULER_MAX_NB_SLAVES (8) 59 #endif 60 61 /** Round-robin scheduling mode string */ 62 #define SCHEDULER_MODE_NAME_ROUND_ROBIN round-robin 63 /** Packet-size based distribution scheduling mode string */ 64 #define SCHEDULER_MODE_NAME_PKT_SIZE_DISTR packet-size-distr 65 /** Fail-over scheduling mode string */ 66 #define SCHEDULER_MODE_NAME_FAIL_OVER fail-over 67 68 /** 69 * Crypto scheduler PMD operation modes 70 */ 71 enum rte_cryptodev_scheduler_mode { 72 CDEV_SCHED_MODE_NOT_SET = 0, 73 /** User defined mode */ 74 CDEV_SCHED_MODE_USERDEFINED, 75 /** Round-robin mode */ 76 CDEV_SCHED_MODE_ROUNDROBIN, 77 /** Packet-size based distribution mode */ 78 CDEV_SCHED_MODE_PKT_SIZE_DISTR, 79 /** Fail-over mode */ 80 CDEV_SCHED_MODE_FAILOVER, 81 82 CDEV_SCHED_MODE_COUNT /**< number of modes */ 83 }; 84 85 #define RTE_CRYPTODEV_SCHEDULER_NAME_MAX_LEN (64) 86 #define RTE_CRYPTODEV_SCHEDULER_DESC_MAX_LEN (256) 87 88 /** 89 * Crypto scheduler option types 90 */ 91 enum rte_cryptodev_schedule_option_type { 92 CDEV_SCHED_OPTION_NOT_SET = 0, 93 CDEV_SCHED_OPTION_THRESHOLD, 94 95 CDEV_SCHED_OPTION_COUNT 96 }; 97 98 /** 99 * Threshold option structure 100 */ 101 struct rte_cryptodev_scheduler_threshold_option { 102 uint32_t threshold; /**< Threshold for packet-size mode */ 103 }; 104 105 struct rte_cryptodev_scheduler; 106 107 /** 108 * Load a user defined scheduler 109 * 110 * @param scheduler_id 111 * The target scheduler device ID 112 * @param scheduler 113 * Pointer to the user defined scheduler 114 * 115 * @return 116 * - 0 if the scheduler is successfully loaded 117 * - -ENOTSUP if the operation is not supported. 118 * - -EBUSY if device is started. 119 */ 120 int 121 rte_cryptodev_scheduler_load_user_scheduler(uint8_t scheduler_id, 122 struct rte_cryptodev_scheduler *scheduler); 123 124 /** 125 * Attach a crypto device to the scheduler 126 * 127 * @param scheduler_id 128 * The target scheduler device ID 129 * @param slave_id 130 * Crypto device ID to be attached 131 * 132 * @return 133 * - 0 if the slave is attached. 134 * - -ENOTSUP if the operation is not supported. 135 * - -EBUSY if device is started. 136 * - -ENOMEM if the scheduler's slave list is full. 137 */ 138 int 139 rte_cryptodev_scheduler_slave_attach(uint8_t scheduler_id, uint8_t slave_id); 140 141 /** 142 * Detach a crypto device from the scheduler 143 * 144 * @param scheduler_id 145 * The target scheduler device ID 146 * @param slave_id 147 * Crypto device ID to be detached 148 * 149 * @return 150 * - 0 if the slave is detached. 151 * - -ENOTSUP if the operation is not supported. 152 * - -EBUSY if device is started. 153 */ 154 int 155 rte_cryptodev_scheduler_slave_detach(uint8_t scheduler_id, uint8_t slave_id); 156 157 158 /** 159 * Set the scheduling mode 160 * 161 * @param scheduler_id 162 * The target scheduler device ID 163 * @param mode 164 * The scheduling mode 165 * 166 * @return 167 * - 0 if the mode is set. 168 * - -ENOTSUP if the operation is not supported. 169 * - -EBUSY if device is started. 170 */ 171 int 172 rte_cryptodev_scheduler_mode_set(uint8_t scheduler_id, 173 enum rte_cryptodev_scheduler_mode mode); 174 175 /** 176 * Get the current scheduling mode 177 * 178 * @param scheduler_id 179 * The target scheduler device ID 180 * 181 * @return mode 182 * - non-negative enumerate value: the scheduling mode 183 * - -ENOTSUP if the operation is not supported. 184 */ 185 enum rte_cryptodev_scheduler_mode 186 rte_cryptodev_scheduler_mode_get(uint8_t scheduler_id); 187 188 /** 189 * Set the crypto ops reordering feature on/off 190 * 191 * @param scheduler_id 192 * The target scheduler device ID 193 * @param enable_reorder 194 * Set the crypto op reordering feature 195 * - 0: disable reordering 196 * - 1: enable reordering 197 * 198 * @return 199 * - 0 if the ordering is set. 200 * - -ENOTSUP if the operation is not supported. 201 * - -EBUSY if device is started. 202 */ 203 int 204 rte_cryptodev_scheduler_ordering_set(uint8_t scheduler_id, 205 uint32_t enable_reorder); 206 207 /** 208 * Get the current crypto ops reordering feature 209 * 210 * @param scheduler_id 211 * The target scheduler device ID 212 * 213 * @return 214 * - 0 if reordering is disabled 215 * - 1 if reordering is enabled 216 * - -ENOTSUP if the operation is not supported. 217 */ 218 int 219 rte_cryptodev_scheduler_ordering_get(uint8_t scheduler_id); 220 221 /** 222 * Get the the attached slaves' count and/or ID 223 * 224 * @param scheduler_id 225 * The target scheduler device ID 226 * @param slaves 227 * If successful, the function will write back all slaves' device IDs to it. 228 * This parameter will either be an uint8_t array of 229 * RTE_CRYPTODEV_SCHEDULER_MAX_NB_SLAVES elements or NULL. 230 * 231 * @return 232 * - non-negative number: the number of slaves attached 233 * - -ENOTSUP if the operation is not supported. 234 */ 235 int 236 rte_cryptodev_scheduler_slaves_get(uint8_t scheduler_id, uint8_t *slaves); 237 238 /** 239 * Set the mode specific option 240 * 241 * @param scheduler_id 242 * The target scheduler device ID 243 * @param option_type 244 * The option type enumerate 245 * @param option 246 * The specific mode's option structure 247 * 248 * @return 249 * - 0 if successful 250 * - negative integer if otherwise. 251 */ 252 int 253 rte_cryptodev_scheduler_option_set(uint8_t scheduler_id, 254 enum rte_cryptodev_schedule_option_type option_type, 255 void *option); 256 257 /** 258 * Set the mode specific option 259 * 260 * @param scheduler_id 261 * The target scheduler device ID 262 * @param option_type 263 * The option type enumerate 264 * @param option 265 * If successful, the function will write back the current 266 * 267 * @return 268 * - 0 if successful 269 * - negative integer if otherwise. 270 */ 271 int 272 rte_cryptodev_scheduler_option_get(uint8_t scheduler_id, 273 enum rte_cryptodev_schedule_option_type option_type, 274 void *option); 275 276 typedef uint16_t (*rte_cryptodev_scheduler_burst_enqueue_t)(void *qp_ctx, 277 struct rte_crypto_op **ops, uint16_t nb_ops); 278 279 typedef uint16_t (*rte_cryptodev_scheduler_burst_dequeue_t)(void *qp_ctx, 280 struct rte_crypto_op **ops, uint16_t nb_ops); 281 282 /** The data structure associated with each mode of scheduler. */ 283 struct rte_cryptodev_scheduler { 284 const char *name; /**< Scheduler name */ 285 const char *description; /**< Scheduler description */ 286 enum rte_cryptodev_scheduler_mode mode; /**< Scheduling mode */ 287 288 /** Pointer to scheduler operation structure */ 289 struct rte_cryptodev_scheduler_ops *ops; 290 }; 291 292 /** Round-robin mode scheduler */ 293 extern struct rte_cryptodev_scheduler *roundrobin_scheduler; 294 /** Packet-size based distribution mode scheduler */ 295 extern struct rte_cryptodev_scheduler *pkt_size_based_distr_scheduler; 296 /** Fail-over mode scheduler */ 297 extern struct rte_cryptodev_scheduler *failover_scheduler; 298 299 #ifdef __cplusplus 300 } 301 #endif 302 #endif /* _RTE_CRYPTO_SCHEDULER_H */ 303