dpdk/drivers/common/cnxk/roc_ie_ot.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(C) 2021 Marvell.
   3 */
   4
   5#ifndef __ROC_IE_OT_H__
   6#define __ROC_IE_OT_H__
   7
   8/* PKIND to be used for CPT Meta parsing */
   9#define ROC_OT_CPT_META_PKIND 58
  10
  11/* CN10K IPSEC opcodes */
  12#define ROC_IE_OT_MAJOR_OP_PROCESS_OUTBOUND_IPSEC 0x28UL
  13#define ROC_IE_OT_MAJOR_OP_PROCESS_INBOUND_IPSEC  0x29UL
  14
  15#define ROC_IE_OT_MAJOR_OP_WRITE_SA 0x01UL
  16#define ROC_IE_OT_MINOR_OP_WRITE_SA 0x09UL
  17
  18#define ROC_IE_OT_CTX_ILEN 2
  19
  20enum roc_ie_ot_ucc_ipsec {
  21        ROC_IE_OT_UCC_SUCCESS = 0x00,
  22        ROC_IE_OT_UCC_ERR_SA_INVAL = 0xb0,
  23        ROC_IE_OT_UCC_ERR_SA_EXPIRED = 0xb1,
  24        ROC_IE_OT_UCC_ERR_SA_OVERFLOW = 0xb2,
  25        ROC_IE_OT_UCC_ERR_SA_ESP_BAD_ALGO = 0xb3,
  26        ROC_IE_OT_UCC_ERR_SA_AH_BAD_ALGO = 0xb4,
  27        ROC_IE_OT_UCC_ERR_SA_BAD_CTX = 0xb5,
  28        ROC_IE_OT_UCC_SA_CTX_FLAG_MISMATCH = 0xb6,
  29        ROC_IE_OT_UCC_ERR_AOP_IPSEC = 0xb7,
  30        ROC_IE_OT_UCC_ERR_PKT_IP = 0xb8,
  31        ROC_IE_OT_UCC_ERR_PKT_IP6_BAD_EXT = 0xb9,
  32        ROC_IE_OT_UCC_ERR_PKT_IP6_HBH = 0xba,
  33        ROC_IE_OT_UCC_ERR_PKT_IP6_BIGEXT = 0xbb,
  34        ROC_IE_OT_UCC_ERR_PKT_IP_ULP = 0xbc,
  35        ROC_IE_OT_UCC_ERR_PKT_SA_MISMATCH = 0xbd,
  36        ROC_IE_OT_UCC_ERR_PKT_SPI_MISMATCH = 0xbe,
  37        ROC_IE_OT_UCC_ERR_PKT_ESP_BADPAD = 0xbf,
  38        ROC_IE_OT_UCC_ERR_PKT_BADICV = 0xc0,
  39        ROC_IE_OT_UCC_ERR_PKT_REPLAY_SEQ = 0xc1,
  40        ROC_IE_OT_UCC_ERR_PKT_BADNH = 0xc2,
  41        ROC_IE_OT_UCC_ERR_PKT_SA_PORT_MISMATCH = 0xc3,
  42        ROC_IE_OT_UCC_ERR_PKT_BAD_DLEN = 0xc4,
  43        ROC_IE_OT_UCC_ERR_SA_ESP_BAD_KEYS = 0xc5,
  44        ROC_IE_OT_UCC_ERR_SA_AH_BAD_KEYS = 0xc6,
  45        ROC_IE_OT_UCC_ERR_SA_BAD_IP = 0xc7,
  46        ROC_IE_OT_UCC_ERR_PKT_REPLAY_WINDOW = 0xc8,
  47        ROC_IE_OT_UCC_ERR_PKT_IP_FRAG = 0xc9,
  48        ROC_IE_OT_UCC_SUCCESS_SA_SOFTEXP_FIRST = 0xf0,
  49        ROC_IE_OT_UCC_SUCCESS_PKT_IP_BADCSUM = 0xf1,
  50        ROC_IE_OT_UCC_SUCCESS_SA_SOFTEXP_AGAIN = 0xf2,
  51        ROC_IE_OT_UCC_SUCCESS_PKT_L4_GOODCSUM = 0xf3,
  52        ROC_IE_OT_UCC_SUCCESS_PKT_L4_BADCSUM = 0xf4,
  53        ROC_IE_OT_UCC_SUCCESS_PKT_UDPESP_NZCSUM = 0xf5,
  54        ROC_IE_OT_UCC_SUCCESS_PKT_UDP_ZEROCSUM = 0xf6,
  55        ROC_IE_OT_UCC_SUCCESS_PKT_IP_GOODCSUM = 0xf7,
  56};
  57
  58enum {
  59        ROC_IE_OT_SA_AR_WIN_DISABLED = 0,
  60        ROC_IE_OT_SA_AR_WIN_64 = 1,
  61        ROC_IE_OT_SA_AR_WIN_128 = 2,
  62        ROC_IE_OT_SA_AR_WIN_256 = 3,
  63        ROC_IE_OT_SA_AR_WIN_512 = 4,
  64        ROC_IE_OT_SA_AR_WIN_1024 = 5,
  65        ROC_IE_OT_SA_AR_WIN_2048 = 6,
  66        ROC_IE_OT_SA_AR_WIN_4096 = 7,
  67};
  68
  69enum {
  70        ROC_IE_OT_SA_PKT_FMT_FULL = 0,
  71        ROC_IE_OT_SA_PKT_FMT_META = 1,
  72};
  73
  74enum {
  75        ROC_IE_OT_SA_PKT_OUTPUT_DECRYPTED = 0,
  76        ROC_IE_OT_SA_PKT_OUTPUT_NO_FRAG = 1,
  77        ROC_IE_OT_SA_PKT_OUTPUT_HW_BASED_DEFRAG = 2,
  78        ROC_IE_OT_SA_PKT_OUTPUT_UCODE_BASED_DEFRAG = 3,
  79};
  80
  81enum {
  82        ROC_IE_OT_SA_DEFRAG_ALL = 0,
  83        ROC_IE_OT_SA_DEFRAG_IN_ORDER = 1,
  84        ROC_IE_OT_SA_DEFRAG_IN_REV_ORDER = 2,
  85};
  86
  87enum {
  88        ROC_IE_OT_SA_IV_SRC_DEFAULT = 0,
  89        ROC_IE_OT_SA_IV_SRC_ENC_CTR = 1,
  90        ROC_IE_OT_SA_IV_SRC_FROM_SA = 2,
  91};
  92
  93enum {
  94        ROC_IE_OT_SA_COPY_FROM_SA = 0,
  95        ROC_IE_OT_SA_COPY_FROM_INNER_IP_HDR = 1,
  96};
  97
  98enum {
  99        ROC_IE_OT_SA_INNER_PKT_IP_CSUM_ENABLE = 0,
 100        ROC_IE_OT_SA_INNER_PKT_IP_CSUM_DISABLE = 1,
 101};
 102
 103enum {
 104        ROC_IE_OT_SA_INNER_PKT_L4_CSUM_ENABLE = 0,
 105        ROC_IE_OT_SA_INNER_PKT_L4_CSUM_DISABLE = 1,
 106};
 107
 108enum {
 109        ROC_IE_OT_SA_ENC_NULL = 0,
 110        ROC_IE_OT_SA_ENC_3DES_CBC = 2,
 111        ROC_IE_OT_SA_ENC_AES_CBC = 3,
 112        ROC_IE_OT_SA_ENC_AES_CTR = 4,
 113        ROC_IE_OT_SA_ENC_AES_GCM = 5,
 114        ROC_IE_OT_SA_ENC_AES_CCM = 6,
 115};
 116
 117enum {
 118        ROC_IE_OT_SA_AUTH_NULL = 0,
 119        ROC_IE_OT_SA_AUTH_SHA1 = 2,
 120        ROC_IE_OT_SA_AUTH_SHA2_256 = 4,
 121        ROC_IE_OT_SA_AUTH_SHA2_384 = 5,
 122        ROC_IE_OT_SA_AUTH_SHA2_512 = 6,
 123        ROC_IE_OT_SA_AUTH_AES_GMAC = 7,
 124        ROC_IE_OT_SA_AUTH_AES_XCBC_128 = 8,
 125};
 126
 127enum {
 128        ROC_IE_OT_SA_ENCAP_NONE = 0,
 129        ROC_IE_OT_SA_ENCAP_UDP = 1,
 130        ROC_IE_OT_SA_ENCAP_TCP = 2,
 131};
 132
 133enum {
 134        ROC_IE_OT_SA_LIFE_UNIT_OCTETS = 0,
 135        ROC_IE_OT_SA_LIFE_UNIT_PKTS = 1,
 136};
 137
 138enum {
 139        ROC_IE_OT_SA_IP_HDR_VERIFY_DISABLED = 0,
 140        ROC_IE_OT_SA_IP_HDR_VERIFY_DST_ADDR = 1,
 141        ROC_IE_OT_SA_IP_HDR_VERIFY_SRC_DST_ADDR = 2,
 142};
 143
 144enum {
 145        ROC_IE_OT_REAS_STS_SUCCESS = 0,
 146        ROC_IE_OT_REAS_STS_TIMEOUT = 1,
 147        ROC_IE_OT_REAS_STS_EVICT = 2,
 148        ROC_IE_OT_REAS_STS_BAD_ORDER = 3,
 149        ROC_IE_OT_REAS_STS_TOO_MANY = 4,
 150        ROC_IE_OT_REAS_STS_HSH_EVICT = 5,
 151        ROC_IE_OT_REAS_STS_OVERLAP = 6,
 152        ROC_IE_OT_REAS_STS_ZOMBIE = 7,
 153        ROC_IE_OT_REAS_STS_L3P_ERR = 8,
 154        ROC_IE_OT_REAS_STS_MAX = 9
 155};
 156/* Context units in bytes */
 157#define ROC_CTX_UNIT_8B           8
 158#define ROC_CTX_UNIT_128B         128
 159#define ROC_CTX_MAX_CKEY_LEN      32
 160#define ROC_CTX_MAX_OPAD_IPAD_LEN 128
 161
 162/* Anti reply window size supported */
 163#define ROC_AR_WIN_SIZE_MIN        64
 164#define ROC_AR_WIN_SIZE_MAX        4096
 165#define ROC_LOG_MIN_AR_WIN_SIZE_M1 5
 166
 167/* u64 array size to fit anti replay window bits */
 168#define ROC_AR_WINBITS_SZ                                                      \
 169        (PLT_ALIGN_CEIL(ROC_AR_WIN_SIZE_MAX, BITS_PER_LONG_LONG) /             \
 170         BITS_PER_LONG_LONG)
 171
 172/* Common bit fields between inbound and outbound SA */
 173union roc_ot_ipsec_sa_word2 {
 174        struct {
 175                uint64_t valid : 1;
 176                uint64_t dir : 1;
 177                uint64_t outer_ip_ver : 1;
 178                uint64_t rsvd0 : 1;
 179                uint64_t mode : 1;
 180                uint64_t protocol : 1;
 181                uint64_t aes_key_len : 2;
 182
 183                uint64_t enc_type : 3;
 184                uint64_t life_unit : 1;
 185                uint64_t auth_type : 4;
 186
 187                uint64_t encap_type : 2;
 188                uint64_t et_ovrwr_ddr_en : 1;
 189                uint64_t esn_en : 1;
 190                uint64_t tport_l4_incr_csum : 1;
 191                uint64_t ip_hdr_verify : 2;
 192                uint64_t udp_ports_verify : 1;
 193
 194                uint64_t rsvd2 : 7;
 195                uint64_t async_mode : 1;
 196
 197                uint64_t spi : 32;
 198        } s;
 199        uint64_t u64;
 200};
 201
 202PLT_STATIC_ASSERT(sizeof(union roc_ot_ipsec_sa_word2) == 1 * sizeof(uint64_t));
 203
 204union roc_ot_ipsec_outer_ip_hdr {
 205        struct {
 206                uint32_t dst_addr;
 207                uint32_t src_addr;
 208        } ipv4;
 209        struct {
 210                uint8_t src_addr[16];
 211                uint8_t dst_addr[16];
 212        } ipv6;
 213};
 214
 215struct roc_ot_ipsec_inb_ctx_update_reg {
 216        uint64_t ar_base;
 217        uint64_t ar_valid_mask;
 218        uint64_t hard_life;
 219        uint64_t soft_life;
 220        uint64_t mib_octs;
 221        uint64_t mib_pkts;
 222        uint64_t ar_winbits[ROC_AR_WINBITS_SZ];
 223};
 224
 225union roc_ot_ipsec_outb_iv {
 226        uint64_t u64[2];
 227        uint8_t iv_dbg[16];
 228        struct {
 229                uint8_t iv_dbg1[4];
 230                uint8_t salt[4];
 231
 232                uint32_t rsvd;
 233                uint8_t iv_dbg2[4];
 234        } s;
 235};
 236
 237struct roc_ot_ipsec_outb_ctx_update_reg {
 238        uint64_t rsvd;
 239        uint64_t esn_val;
 240        uint64_t hard_life;
 241        uint64_t soft_life;
 242        uint64_t mib_octs;
 243        uint64_t mib_pkts;
 244};
 245
 246union roc_ot_ipsec_outb_param1 {
 247        uint16_t u16;
 248        struct {
 249                uint16_t l4_csum_disable : 1;
 250                uint16_t ip_csum_disable : 1;
 251                uint16_t ttl_or_hop_limit : 1;
 252                uint16_t dummy_pkt : 1;
 253                uint16_t rfc_or_override_mode : 1;
 254                uint16_t reserved_5_15 : 11;
 255        } s;
 256};
 257
 258union roc_ot_ipsec_inb_param1 {
 259        uint16_t u16;
 260        struct {
 261                uint16_t l4_csum_disable : 1;
 262                uint16_t ip_csum_disable : 1;
 263                uint16_t esp_trailer_disable : 1;
 264                uint16_t reserved_3_15 : 13;
 265        } s;
 266};
 267
 268struct roc_ot_ipsec_inb_sa {
 269        /* Word0 */
 270        union {
 271                struct {
 272                        uint64_t ar_win : 3;
 273                        uint64_t hard_life_dec : 1;
 274                        uint64_t soft_life_dec : 1;
 275                        uint64_t count_glb_octets : 1;
 276                        uint64_t count_glb_pkts : 1;
 277                        uint64_t count_mib_bytes : 1;
 278
 279                        uint64_t count_mib_pkts : 1;
 280                        uint64_t hw_ctx_off : 7;
 281
 282                        uint64_t ctx_id : 16;
 283
 284                        uint64_t orig_pkt_fabs : 1;
 285                        uint64_t orig_pkt_free : 1;
 286                        uint64_t pkind : 6;
 287
 288                        uint64_t rsvd0 : 1;
 289                        uint64_t et_ovrwr : 1;
 290                        uint64_t pkt_output : 2;
 291                        uint64_t pkt_format : 1;
 292                        uint64_t defrag_opt : 2;
 293                        uint64_t x2p_dst : 1;
 294
 295                        uint64_t ctx_push_size : 7;
 296                        uint64_t rsvd1 : 1;
 297
 298                        uint64_t ctx_hdr_size : 2;
 299                        uint64_t aop_valid : 1;
 300                        uint64_t rsvd2 : 1;
 301                        uint64_t ctx_size : 4;
 302                } s;
 303                uint64_t u64;
 304        } w0;
 305
 306        /* Word1 */
 307        union {
 308                struct {
 309                        uint64_t orig_pkt_aura : 20;
 310                        uint64_t rsvd3 : 4;
 311                        uint64_t orig_pkt_foff : 8;
 312                        uint64_t cookie : 32;
 313                } s;
 314                uint64_t u64;
 315        } w1;
 316
 317        /* Word 2 */
 318        union {
 319                struct {
 320                        uint64_t valid : 1;
 321                        uint64_t dir : 1;
 322                        uint64_t outer_ip_ver : 1;
 323                        uint64_t rsvd4 : 1;
 324                        uint64_t ipsec_mode : 1;
 325                        uint64_t ipsec_protocol : 1;
 326                        uint64_t aes_key_len : 2;
 327
 328                        uint64_t enc_type : 3;
 329                        uint64_t life_unit : 1;
 330                        uint64_t auth_type : 4;
 331
 332                        uint64_t encap_type : 2;
 333                        uint64_t et_ovrwr_ddr_en : 1;
 334                        uint64_t esn_en : 1;
 335                        uint64_t tport_l4_incr_csum : 1;
 336                        uint64_t ip_hdr_verify : 2;
 337                        uint64_t udp_ports_verify : 1;
 338
 339                        uint64_t rsvd6 : 7;
 340                        uint64_t async_mode : 1;
 341
 342                        uint64_t spi : 32;
 343                } s;
 344                uint64_t u64;
 345        } w2;
 346
 347        /* Word3 */
 348        uint64_t rsvd7;
 349
 350        /* Word4 - Word7 */
 351        uint8_t cipher_key[ROC_CTX_MAX_CKEY_LEN];
 352
 353        /* Word8 - Word9 */
 354        union {
 355                struct {
 356                        uint32_t rsvd8;
 357                        uint8_t salt[4];
 358                } s;
 359                uint64_t u64;
 360        } w8;
 361        uint64_t rsvd9;
 362
 363        /* Word10 */
 364        union {
 365                struct {
 366                        uint64_t rsvd10 : 32;
 367                        uint64_t udp_src_port : 16;
 368                        uint64_t udp_dst_port : 16;
 369                } s;
 370                uint64_t u64;
 371        } w10;
 372
 373        /* Word11 - Word14 */
 374        union roc_ot_ipsec_outer_ip_hdr outer_hdr;
 375
 376        /* Word15 - Word30 */
 377        uint8_t hmac_opad_ipad[ROC_CTX_MAX_OPAD_IPAD_LEN];
 378
 379        /* Word31 - Word100 */
 380        struct roc_ot_ipsec_inb_ctx_update_reg ctx;
 381};
 382
 383PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, w1) ==
 384                  1 * sizeof(uint64_t));
 385PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, w2) ==
 386                  2 * sizeof(uint64_t));
 387PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, cipher_key) ==
 388                  4 * sizeof(uint64_t));
 389PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, w8) ==
 390                  8 * sizeof(uint64_t));
 391PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, w10) ==
 392                  10 * sizeof(uint64_t));
 393PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, outer_hdr) ==
 394                  11 * sizeof(uint64_t));
 395PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, hmac_opad_ipad) ==
 396                  15 * sizeof(uint64_t));
 397PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_inb_sa, ctx) ==
 398                  31 * sizeof(uint64_t));
 399
 400struct roc_ot_ipsec_outb_sa {
 401        /* Word0 */
 402        union {
 403                struct {
 404                        uint64_t esn_en : 1;
 405                        uint64_t ip_id : 1;
 406                        uint64_t rsvd0 : 1;
 407                        uint64_t hard_life_dec : 1;
 408                        uint64_t soft_life_dec : 1;
 409                        uint64_t count_glb_octets : 1;
 410                        uint64_t count_glb_pkts : 1;
 411                        uint64_t count_mib_bytes : 1;
 412
 413                        uint64_t count_mib_pkts : 1;
 414                        uint64_t hw_ctx_off : 7;
 415
 416                        uint64_t rsvd1 : 32;
 417
 418                        uint64_t ctx_push_size : 7;
 419                        uint64_t rsvd2 : 1;
 420
 421                        uint64_t ctx_hdr_size : 2;
 422                        uint64_t aop_valid : 1;
 423                        uint64_t rsvd3 : 1;
 424                        uint64_t ctx_size : 4;
 425                } s;
 426                uint64_t u64;
 427        } w0;
 428
 429        /* Word1 */
 430        union {
 431                struct {
 432                        uint64_t rsvd4 : 32;
 433                        uint64_t cookie : 32;
 434                } s;
 435                uint64_t u64;
 436        } w1;
 437
 438        /* Word 2 */
 439        union {
 440                struct {
 441                        uint64_t valid : 1;
 442                        uint64_t dir : 1;
 443                        uint64_t outer_ip_ver : 1;
 444                        uint64_t rsvd5 : 1;
 445                        uint64_t ipsec_mode : 1;
 446                        uint64_t ipsec_protocol : 1;
 447                        uint64_t aes_key_len : 2;
 448
 449                        uint64_t enc_type : 3;
 450                        uint64_t life_unit : 1;
 451                        uint64_t auth_type : 4;
 452
 453                        uint64_t encap_type : 2;
 454                        uint64_t ipv4_df_src_or_ipv6_flw_lbl_src : 1;
 455                        uint64_t dscp_src : 1;
 456                        uint64_t iv_src : 2;
 457                        uint64_t ipid_gen : 1;
 458                        uint64_t rsvd6 : 1;
 459
 460                        uint64_t rsvd7 : 7;
 461                        uint64_t async_mode : 1;
 462
 463                        uint64_t spi : 32;
 464                } s;
 465                uint64_t u64;
 466        } w2;
 467
 468        /* Word3 */
 469        uint64_t rsvd8;
 470
 471        /* Word4 - Word7 */
 472        uint8_t cipher_key[ROC_CTX_MAX_CKEY_LEN];
 473
 474        /* Word8 - Word9 */
 475        union roc_ot_ipsec_outb_iv iv;
 476
 477        /* Word10 */
 478        union {
 479                struct {
 480                        uint64_t rsvd9 : 4;
 481                        uint64_t ipv4_df_or_ipv6_flw_lbl : 20;
 482
 483                        uint64_t dscp : 6;
 484                        uint64_t rsvd10 : 2;
 485
 486                        uint64_t udp_dst_port : 16;
 487
 488                        uint64_t udp_src_port : 16;
 489                } s;
 490                uint64_t u64;
 491        } w10;
 492
 493        /* Word11 - Word14 */
 494        union roc_ot_ipsec_outer_ip_hdr outer_hdr;
 495
 496        /* Word15 - Word30 */
 497        uint8_t hmac_opad_ipad[ROC_CTX_MAX_OPAD_IPAD_LEN];
 498
 499        /* Word31 - Word36 */
 500        struct roc_ot_ipsec_outb_ctx_update_reg ctx;
 501};
 502
 503PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, w1) ==
 504                  1 * sizeof(uint64_t));
 505PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, w2) ==
 506                  2 * sizeof(uint64_t));
 507PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, cipher_key) ==
 508                  4 * sizeof(uint64_t));
 509PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, iv) ==
 510                  8 * sizeof(uint64_t));
 511PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, w10) ==
 512                  10 * sizeof(uint64_t));
 513PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, outer_hdr) ==
 514                  11 * sizeof(uint64_t));
 515PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, hmac_opad_ipad) ==
 516                  15 * sizeof(uint64_t));
 517PLT_STATIC_ASSERT(offsetof(struct roc_ot_ipsec_outb_sa, ctx) ==
 518                  31 * sizeof(uint64_t));
 519
 520#endif /* __ROC_IE_OT_H__ */
 521