linux/include/linux/mlx5/device.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and/or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 */
  32
  33#ifndef MLX5_DEVICE_H
  34#define MLX5_DEVICE_H
  35
  36#include <linux/types.h>
  37#include <rdma/ib_verbs.h>
  38
  39#if defined(__LITTLE_ENDIAN)
  40#define MLX5_SET_HOST_ENDIANNESS        0
  41#elif defined(__BIG_ENDIAN)
  42#define MLX5_SET_HOST_ENDIANNESS        0x80
  43#else
  44#error Host endianness not defined
  45#endif
  46
  47/* helper macros */
  48#define __mlx5_nullp(typ) ((struct mlx5_ifc_##typ##_bits *)0)
  49#define __mlx5_bit_sz(typ, fld) sizeof(__mlx5_nullp(typ)->fld)
  50#define __mlx5_bit_off(typ, fld) ((unsigned)(unsigned long)(&(__mlx5_nullp(typ)->fld)))
  51#define __mlx5_dw_off(typ, fld) (__mlx5_bit_off(typ, fld) / 32)
  52#define __mlx5_64_off(typ, fld) (__mlx5_bit_off(typ, fld) / 64)
  53#define __mlx5_dw_bit_off(typ, fld) (32 - __mlx5_bit_sz(typ, fld) - (__mlx5_bit_off(typ, fld) & 0x1f))
  54#define __mlx5_mask(typ, fld) ((u32)((1ull << __mlx5_bit_sz(typ, fld)) - 1))
  55#define __mlx5_dw_mask(typ, fld) (__mlx5_mask(typ, fld) << __mlx5_dw_bit_off(typ, fld))
  56#define __mlx5_st_sz_bits(typ) sizeof(struct mlx5_ifc_##typ##_bits)
  57
  58#define MLX5_FLD_SZ_BYTES(typ, fld) (__mlx5_bit_sz(typ, fld) / 8)
  59#define MLX5_ST_SZ_BYTES(typ) (sizeof(struct mlx5_ifc_##typ##_bits) / 8)
  60#define MLX5_ST_SZ_DW(typ) (sizeof(struct mlx5_ifc_##typ##_bits) / 32)
  61#define MLX5_BYTE_OFF(typ, fld) (__mlx5_bit_off(typ, fld) / 8)
  62#define MLX5_ADDR_OF(typ, p, fld) ((char *)(p) + MLX5_BYTE_OFF(typ, fld))
  63
  64/* insert a value to a struct */
  65#define MLX5_SET(typ, p, fld, v) do { \
  66        BUILD_BUG_ON(__mlx5_st_sz_bits(typ) % 32);             \
  67        *((__be32 *)(p) + __mlx5_dw_off(typ, fld)) = \
  68        cpu_to_be32((be32_to_cpu(*((__be32 *)(p) + __mlx5_dw_off(typ, fld))) & \
  69                     (~__mlx5_dw_mask(typ, fld))) | (((v) & __mlx5_mask(typ, fld)) \
  70                     << __mlx5_dw_bit_off(typ, fld))); \
  71} while (0)
  72
  73#define MLX5_GET(typ, p, fld) ((be32_to_cpu(*((__be32 *)(p) +\
  74__mlx5_dw_off(typ, fld))) >> __mlx5_dw_bit_off(typ, fld)) & \
  75__mlx5_mask(typ, fld))
  76
  77#define MLX5_GET_PR(typ, p, fld) ({ \
  78        u32 ___t = MLX5_GET(typ, p, fld); \
  79        pr_debug(#fld " = 0x%x\n", ___t); \
  80        ___t; \
  81})
  82
  83#define MLX5_SET64(typ, p, fld, v) do { \
  84        BUILD_BUG_ON(__mlx5_bit_sz(typ, fld) != 64); \
  85        BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \
  86        *((__be64 *)(p) + __mlx5_64_off(typ, fld)) = cpu_to_be64(v); \
  87} while (0)
  88
  89#define MLX5_GET64(typ, p, fld) be64_to_cpu(*((__be64 *)(p) + __mlx5_64_off(typ, fld)))
  90
  91enum {
  92        MLX5_MAX_COMMANDS               = 32,
  93        MLX5_CMD_DATA_BLOCK_SIZE        = 512,
  94        MLX5_PCI_CMD_XPORT              = 7,
  95        MLX5_MKEY_BSF_OCTO_SIZE         = 4,
  96        MLX5_MAX_PSVS                   = 4,
  97};
  98
  99enum {
 100        MLX5_EXTENDED_UD_AV             = 0x80000000,
 101};
 102
 103enum {
 104        MLX5_CQ_STATE_ARMED             = 9,
 105        MLX5_CQ_STATE_ALWAYS_ARMED      = 0xb,
 106        MLX5_CQ_STATE_FIRED             = 0xa,
 107};
 108
 109enum {
 110        MLX5_STAT_RATE_OFFSET   = 5,
 111};
 112
 113enum {
 114        MLX5_INLINE_SEG = 0x80000000,
 115};
 116
 117enum {
 118        MLX5_MIN_PKEY_TABLE_SIZE = 128,
 119        MLX5_MAX_LOG_PKEY_TABLE  = 5,
 120};
 121
 122enum {
 123        MLX5_MKEY_INBOX_PG_ACCESS = 1 << 31
 124};
 125
 126enum {
 127        MLX5_PFAULT_SUBTYPE_WQE = 0,
 128        MLX5_PFAULT_SUBTYPE_RDMA = 1,
 129};
 130
 131enum {
 132        MLX5_PERM_LOCAL_READ    = 1 << 2,
 133        MLX5_PERM_LOCAL_WRITE   = 1 << 3,
 134        MLX5_PERM_REMOTE_READ   = 1 << 4,
 135        MLX5_PERM_REMOTE_WRITE  = 1 << 5,
 136        MLX5_PERM_ATOMIC        = 1 << 6,
 137        MLX5_PERM_UMR_EN        = 1 << 7,
 138};
 139
 140enum {
 141        MLX5_PCIE_CTRL_SMALL_FENCE      = 1 << 0,
 142        MLX5_PCIE_CTRL_RELAXED_ORDERING = 1 << 2,
 143        MLX5_PCIE_CTRL_NO_SNOOP         = 1 << 3,
 144        MLX5_PCIE_CTRL_TLP_PROCE_EN     = 1 << 6,
 145        MLX5_PCIE_CTRL_TPH_MASK         = 3 << 4,
 146};
 147
 148enum {
 149        MLX5_ACCESS_MODE_PA     = 0,
 150        MLX5_ACCESS_MODE_MTT    = 1,
 151        MLX5_ACCESS_MODE_KLM    = 2
 152};
 153
 154enum {
 155        MLX5_MKEY_REMOTE_INVAL  = 1 << 24,
 156        MLX5_MKEY_FLAG_SYNC_UMR = 1 << 29,
 157        MLX5_MKEY_BSF_EN        = 1 << 30,
 158        MLX5_MKEY_LEN64         = 1 << 31,
 159};
 160
 161enum {
 162        MLX5_EN_RD      = (u64)1,
 163        MLX5_EN_WR      = (u64)2
 164};
 165
 166enum {
 167        MLX5_BF_REGS_PER_PAGE           = 4,
 168        MLX5_MAX_UAR_PAGES              = 1 << 8,
 169        MLX5_NON_FP_BF_REGS_PER_PAGE    = 2,
 170        MLX5_MAX_UUARS  = MLX5_MAX_UAR_PAGES * MLX5_NON_FP_BF_REGS_PER_PAGE,
 171};
 172
 173enum {
 174        MLX5_MKEY_MASK_LEN              = 1ull << 0,
 175        MLX5_MKEY_MASK_PAGE_SIZE        = 1ull << 1,
 176        MLX5_MKEY_MASK_START_ADDR       = 1ull << 6,
 177        MLX5_MKEY_MASK_PD               = 1ull << 7,
 178        MLX5_MKEY_MASK_EN_RINVAL        = 1ull << 8,
 179        MLX5_MKEY_MASK_EN_SIGERR        = 1ull << 9,
 180        MLX5_MKEY_MASK_BSF_EN           = 1ull << 12,
 181        MLX5_MKEY_MASK_KEY              = 1ull << 13,
 182        MLX5_MKEY_MASK_QPN              = 1ull << 14,
 183        MLX5_MKEY_MASK_LR               = 1ull << 17,
 184        MLX5_MKEY_MASK_LW               = 1ull << 18,
 185        MLX5_MKEY_MASK_RR               = 1ull << 19,
 186        MLX5_MKEY_MASK_RW               = 1ull << 20,
 187        MLX5_MKEY_MASK_A                = 1ull << 21,
 188        MLX5_MKEY_MASK_SMALL_FENCE      = 1ull << 23,
 189        MLX5_MKEY_MASK_FREE             = 1ull << 29,
 190};
 191
 192enum {
 193        MLX5_UMR_TRANSLATION_OFFSET_EN  = (1 << 4),
 194
 195        MLX5_UMR_CHECK_NOT_FREE         = (1 << 5),
 196        MLX5_UMR_CHECK_FREE             = (2 << 5),
 197
 198        MLX5_UMR_INLINE                 = (1 << 7),
 199};
 200
 201#define MLX5_UMR_MTT_ALIGNMENT 0x40
 202#define MLX5_UMR_MTT_MASK      (MLX5_UMR_MTT_ALIGNMENT - 1)
 203#define MLX5_UMR_MTT_MIN_CHUNK_SIZE MLX5_UMR_MTT_ALIGNMENT
 204
 205enum mlx5_event {
 206        MLX5_EVENT_TYPE_COMP               = 0x0,
 207
 208        MLX5_EVENT_TYPE_PATH_MIG           = 0x01,
 209        MLX5_EVENT_TYPE_COMM_EST           = 0x02,
 210        MLX5_EVENT_TYPE_SQ_DRAINED         = 0x03,
 211        MLX5_EVENT_TYPE_SRQ_LAST_WQE       = 0x13,
 212        MLX5_EVENT_TYPE_SRQ_RQ_LIMIT       = 0x14,
 213
 214        MLX5_EVENT_TYPE_CQ_ERROR           = 0x04,
 215        MLX5_EVENT_TYPE_WQ_CATAS_ERROR     = 0x05,
 216        MLX5_EVENT_TYPE_PATH_MIG_FAILED    = 0x07,
 217        MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR = 0x10,
 218        MLX5_EVENT_TYPE_WQ_ACCESS_ERROR    = 0x11,
 219        MLX5_EVENT_TYPE_SRQ_CATAS_ERROR    = 0x12,
 220
 221        MLX5_EVENT_TYPE_INTERNAL_ERROR     = 0x08,
 222        MLX5_EVENT_TYPE_PORT_CHANGE        = 0x09,
 223        MLX5_EVENT_TYPE_GPIO_EVENT         = 0x15,
 224        MLX5_EVENT_TYPE_REMOTE_CONFIG      = 0x19,
 225
 226        MLX5_EVENT_TYPE_DB_BF_CONGESTION   = 0x1a,
 227        MLX5_EVENT_TYPE_STALL_EVENT        = 0x1b,
 228
 229        MLX5_EVENT_TYPE_CMD                = 0x0a,
 230        MLX5_EVENT_TYPE_PAGE_REQUEST       = 0xb,
 231
 232        MLX5_EVENT_TYPE_PAGE_FAULT         = 0xc,
 233};
 234
 235enum {
 236        MLX5_PORT_CHANGE_SUBTYPE_DOWN           = 1,
 237        MLX5_PORT_CHANGE_SUBTYPE_ACTIVE         = 4,
 238        MLX5_PORT_CHANGE_SUBTYPE_INITIALIZED    = 5,
 239        MLX5_PORT_CHANGE_SUBTYPE_LID            = 6,
 240        MLX5_PORT_CHANGE_SUBTYPE_PKEY           = 7,
 241        MLX5_PORT_CHANGE_SUBTYPE_GUID           = 8,
 242        MLX5_PORT_CHANGE_SUBTYPE_CLIENT_REREG   = 9,
 243};
 244
 245enum {
 246        MLX5_DEV_CAP_FLAG_XRC           = 1LL <<  3,
 247        MLX5_DEV_CAP_FLAG_BAD_PKEY_CNTR = 1LL <<  8,
 248        MLX5_DEV_CAP_FLAG_BAD_QKEY_CNTR = 1LL <<  9,
 249        MLX5_DEV_CAP_FLAG_APM           = 1LL << 17,
 250        MLX5_DEV_CAP_FLAG_ATOMIC        = 1LL << 18,
 251        MLX5_DEV_CAP_FLAG_BLOCK_MCAST   = 1LL << 23,
 252        MLX5_DEV_CAP_FLAG_ON_DMND_PG    = 1LL << 24,
 253        MLX5_DEV_CAP_FLAG_CQ_MODER      = 1LL << 29,
 254        MLX5_DEV_CAP_FLAG_RESIZE_CQ     = 1LL << 30,
 255        MLX5_DEV_CAP_FLAG_DCT           = 1LL << 37,
 256        MLX5_DEV_CAP_FLAG_SIG_HAND_OVER = 1LL << 40,
 257        MLX5_DEV_CAP_FLAG_CMDIF_CSUM    = 3LL << 46,
 258};
 259
 260enum {
 261        MLX5_OPCODE_NOP                 = 0x00,
 262        MLX5_OPCODE_SEND_INVAL          = 0x01,
 263        MLX5_OPCODE_RDMA_WRITE          = 0x08,
 264        MLX5_OPCODE_RDMA_WRITE_IMM      = 0x09,
 265        MLX5_OPCODE_SEND                = 0x0a,
 266        MLX5_OPCODE_SEND_IMM            = 0x0b,
 267        MLX5_OPCODE_RDMA_READ           = 0x10,
 268        MLX5_OPCODE_ATOMIC_CS           = 0x11,
 269        MLX5_OPCODE_ATOMIC_FA           = 0x12,
 270        MLX5_OPCODE_ATOMIC_MASKED_CS    = 0x14,
 271        MLX5_OPCODE_ATOMIC_MASKED_FA    = 0x15,
 272        MLX5_OPCODE_BIND_MW             = 0x18,
 273        MLX5_OPCODE_CONFIG_CMD          = 0x1f,
 274
 275        MLX5_RECV_OPCODE_RDMA_WRITE_IMM = 0x00,
 276        MLX5_RECV_OPCODE_SEND           = 0x01,
 277        MLX5_RECV_OPCODE_SEND_IMM       = 0x02,
 278        MLX5_RECV_OPCODE_SEND_INVAL     = 0x03,
 279
 280        MLX5_CQE_OPCODE_ERROR           = 0x1e,
 281        MLX5_CQE_OPCODE_RESIZE          = 0x16,
 282
 283        MLX5_OPCODE_SET_PSV             = 0x20,
 284        MLX5_OPCODE_GET_PSV             = 0x21,
 285        MLX5_OPCODE_CHECK_PSV           = 0x22,
 286        MLX5_OPCODE_RGET_PSV            = 0x26,
 287        MLX5_OPCODE_RCHECK_PSV          = 0x27,
 288
 289        MLX5_OPCODE_UMR                 = 0x25,
 290
 291};
 292
 293enum {
 294        MLX5_SET_PORT_RESET_QKEY        = 0,
 295        MLX5_SET_PORT_GUID0             = 16,
 296        MLX5_SET_PORT_NODE_GUID         = 17,
 297        MLX5_SET_PORT_SYS_GUID          = 18,
 298        MLX5_SET_PORT_GID_TABLE         = 19,
 299        MLX5_SET_PORT_PKEY_TABLE        = 20,
 300};
 301
 302enum {
 303        MLX5_MAX_PAGE_SHIFT             = 31
 304};
 305
 306enum {
 307        MLX5_ADAPTER_PAGE_SHIFT         = 12,
 308        MLX5_ADAPTER_PAGE_SIZE          = 1 << MLX5_ADAPTER_PAGE_SHIFT,
 309};
 310
 311enum {
 312        MLX5_CAP_OFF_CMDIF_CSUM         = 46,
 313};
 314
 315enum {
 316        HCA_CAP_OPMOD_GET_MAX   = 0,
 317        HCA_CAP_OPMOD_GET_CUR   = 1,
 318        HCA_CAP_OPMOD_GET_ODP_MAX = 4,
 319        HCA_CAP_OPMOD_GET_ODP_CUR = 5
 320};
 321
 322struct mlx5_inbox_hdr {
 323        __be16          opcode;
 324        u8              rsvd[4];
 325        __be16          opmod;
 326};
 327
 328struct mlx5_outbox_hdr {
 329        u8              status;
 330        u8              rsvd[3];
 331        __be32          syndrome;
 332};
 333
 334struct mlx5_cmd_query_adapter_mbox_in {
 335        struct mlx5_inbox_hdr   hdr;
 336        u8                      rsvd[8];
 337};
 338
 339struct mlx5_cmd_query_adapter_mbox_out {
 340        struct mlx5_outbox_hdr  hdr;
 341        u8                      rsvd0[24];
 342        u8                      intapin;
 343        u8                      rsvd1[13];
 344        __be16                  vsd_vendor_id;
 345        u8                      vsd[208];
 346        u8                      vsd_psid[16];
 347};
 348
 349enum mlx5_odp_transport_cap_bits {
 350        MLX5_ODP_SUPPORT_SEND    = 1 << 31,
 351        MLX5_ODP_SUPPORT_RECV    = 1 << 30,
 352        MLX5_ODP_SUPPORT_WRITE   = 1 << 29,
 353        MLX5_ODP_SUPPORT_READ    = 1 << 28,
 354};
 355
 356struct mlx5_odp_caps {
 357        char reserved[0x10];
 358        struct {
 359                __be32                  rc_odp_caps;
 360                __be32                  uc_odp_caps;
 361                __be32                  ud_odp_caps;
 362        } per_transport_caps;
 363        char reserved2[0xe4];
 364};
 365
 366struct mlx5_cmd_init_hca_mbox_in {
 367        struct mlx5_inbox_hdr   hdr;
 368        u8                      rsvd0[2];
 369        __be16                  profile;
 370        u8                      rsvd1[4];
 371};
 372
 373struct mlx5_cmd_init_hca_mbox_out {
 374        struct mlx5_outbox_hdr  hdr;
 375        u8                      rsvd[8];
 376};
 377
 378struct mlx5_cmd_teardown_hca_mbox_in {
 379        struct mlx5_inbox_hdr   hdr;
 380        u8                      rsvd0[2];
 381        __be16                  profile;
 382        u8                      rsvd1[4];
 383};
 384
 385struct mlx5_cmd_teardown_hca_mbox_out {
 386        struct mlx5_outbox_hdr  hdr;
 387        u8                      rsvd[8];
 388};
 389
 390struct mlx5_cmd_layout {
 391        u8              type;
 392        u8              rsvd0[3];
 393        __be32          inlen;
 394        __be64          in_ptr;
 395        __be32          in[4];
 396        __be32          out[4];
 397        __be64          out_ptr;
 398        __be32          outlen;
 399        u8              token;
 400        u8              sig;
 401        u8              rsvd1;
 402        u8              status_own;
 403};
 404
 405
 406struct health_buffer {
 407        __be32          assert_var[5];
 408        __be32          rsvd0[3];
 409        __be32          assert_exit_ptr;
 410        __be32          assert_callra;
 411        __be32          rsvd1[2];
 412        __be32          fw_ver;
 413        __be32          hw_id;
 414        __be32          rsvd2;
 415        u8              irisc_index;
 416        u8              synd;
 417        __be16          ext_sync;
 418};
 419
 420struct mlx5_init_seg {
 421        __be32                  fw_rev;
 422        __be32                  cmdif_rev_fw_sub;
 423        __be32                  rsvd0[2];
 424        __be32                  cmdq_addr_h;
 425        __be32                  cmdq_addr_l_sz;
 426        __be32                  cmd_dbell;
 427        __be32                  rsvd1[121];
 428        struct health_buffer    health;
 429        __be32                  rsvd2[884];
 430        __be32                  health_counter;
 431        __be32                  rsvd3[1019];
 432        __be64                  ieee1588_clk;
 433        __be32                  ieee1588_clk_type;
 434        __be32                  clr_intx;
 435};
 436
 437struct mlx5_eqe_comp {
 438        __be32  reserved[6];
 439        __be32  cqn;
 440};
 441
 442struct mlx5_eqe_qp_srq {
 443        __be32  reserved[6];
 444        __be32  qp_srq_n;
 445};
 446
 447struct mlx5_eqe_cq_err {
 448        __be32  cqn;
 449        u8      reserved1[7];
 450        u8      syndrome;
 451};
 452
 453struct mlx5_eqe_port_state {
 454        u8      reserved0[8];
 455        u8      port;
 456};
 457
 458struct mlx5_eqe_gpio {
 459        __be32  reserved0[2];
 460        __be64  gpio_event;
 461};
 462
 463struct mlx5_eqe_congestion {
 464        u8      type;
 465        u8      rsvd0;
 466        u8      congestion_level;
 467};
 468
 469struct mlx5_eqe_stall_vl {
 470        u8      rsvd0[3];
 471        u8      port_vl;
 472};
 473
 474struct mlx5_eqe_cmd {
 475        __be32  vector;
 476        __be32  rsvd[6];
 477};
 478
 479struct mlx5_eqe_page_req {
 480        u8              rsvd0[2];
 481        __be16          func_id;
 482        __be32          num_pages;
 483        __be32          rsvd1[5];
 484};
 485
 486struct mlx5_eqe_page_fault {
 487        __be32 bytes_committed;
 488        union {
 489                struct {
 490                        u16     reserved1;
 491                        __be16  wqe_index;
 492                        u16     reserved2;
 493                        __be16  packet_length;
 494                        u8      reserved3[12];
 495                } __packed wqe;
 496                struct {
 497                        __be32  r_key;
 498                        u16     reserved1;
 499                        __be16  packet_length;
 500                        __be32  rdma_op_len;
 501                        __be64  rdma_va;
 502                } __packed rdma;
 503        } __packed;
 504        __be32 flags_qpn;
 505} __packed;
 506
 507union ev_data {
 508        __be32                          raw[7];
 509        struct mlx5_eqe_cmd             cmd;
 510        struct mlx5_eqe_comp            comp;
 511        struct mlx5_eqe_qp_srq          qp_srq;
 512        struct mlx5_eqe_cq_err          cq_err;
 513        struct mlx5_eqe_port_state      port;
 514        struct mlx5_eqe_gpio            gpio;
 515        struct mlx5_eqe_congestion      cong;
 516        struct mlx5_eqe_stall_vl        stall_vl;
 517        struct mlx5_eqe_page_req        req_pages;
 518        struct mlx5_eqe_page_fault      page_fault;
 519} __packed;
 520
 521struct mlx5_eqe {
 522        u8              rsvd0;
 523        u8              type;
 524        u8              rsvd1;
 525        u8              sub_type;
 526        __be32          rsvd2[7];
 527        union ev_data   data;
 528        __be16          rsvd3;
 529        u8              signature;
 530        u8              owner;
 531} __packed;
 532
 533struct mlx5_cmd_prot_block {
 534        u8              data[MLX5_CMD_DATA_BLOCK_SIZE];
 535        u8              rsvd0[48];
 536        __be64          next;
 537        __be32          block_num;
 538        u8              rsvd1;
 539        u8              token;
 540        u8              ctrl_sig;
 541        u8              sig;
 542};
 543
 544struct mlx5_err_cqe {
 545        u8      rsvd0[32];
 546        __be32  srqn;
 547        u8      rsvd1[18];
 548        u8      vendor_err_synd;
 549        u8      syndrome;
 550        __be32  s_wqe_opcode_qpn;
 551        __be16  wqe_counter;
 552        u8      signature;
 553        u8      op_own;
 554};
 555
 556struct mlx5_cqe64 {
 557        u8              rsvd0[17];
 558        u8              ml_path;
 559        u8              rsvd20[4];
 560        __be16          slid;
 561        __be32          flags_rqpn;
 562        u8              rsvd28[4];
 563        __be32          srqn;
 564        __be32          imm_inval_pkey;
 565        u8              rsvd40[4];
 566        __be32          byte_cnt;
 567        __be64          timestamp;
 568        __be32          sop_drop_qpn;
 569        __be16          wqe_counter;
 570        u8              signature;
 571        u8              op_own;
 572};
 573
 574struct mlx5_sig_err_cqe {
 575        u8              rsvd0[16];
 576        __be32          expected_trans_sig;
 577        __be32          actual_trans_sig;
 578        __be32          expected_reftag;
 579        __be32          actual_reftag;
 580        __be16          syndrome;
 581        u8              rsvd22[2];
 582        __be32          mkey;
 583        __be64          err_offset;
 584        u8              rsvd30[8];
 585        __be32          qpn;
 586        u8              rsvd38[2];
 587        u8              signature;
 588        u8              op_own;
 589};
 590
 591struct mlx5_wqe_srq_next_seg {
 592        u8                      rsvd0[2];
 593        __be16                  next_wqe_index;
 594        u8                      signature;
 595        u8                      rsvd1[11];
 596};
 597
 598union mlx5_ext_cqe {
 599        struct ib_grh   grh;
 600        u8              inl[64];
 601};
 602
 603struct mlx5_cqe128 {
 604        union mlx5_ext_cqe      inl_grh;
 605        struct mlx5_cqe64       cqe64;
 606};
 607
 608struct mlx5_srq_ctx {
 609        u8                      state_log_sz;
 610        u8                      rsvd0[3];
 611        __be32                  flags_xrcd;
 612        __be32                  pgoff_cqn;
 613        u8                      rsvd1[4];
 614        u8                      log_pg_sz;
 615        u8                      rsvd2[7];
 616        __be32                  pd;
 617        __be16                  lwm;
 618        __be16                  wqe_cnt;
 619        u8                      rsvd3[8];
 620        __be64                  db_record;
 621};
 622
 623struct mlx5_create_srq_mbox_in {
 624        struct mlx5_inbox_hdr   hdr;
 625        __be32                  input_srqn;
 626        u8                      rsvd0[4];
 627        struct mlx5_srq_ctx     ctx;
 628        u8                      rsvd1[208];
 629        __be64                  pas[0];
 630};
 631
 632struct mlx5_create_srq_mbox_out {
 633        struct mlx5_outbox_hdr  hdr;
 634        __be32                  srqn;
 635        u8                      rsvd[4];
 636};
 637
 638struct mlx5_destroy_srq_mbox_in {
 639        struct mlx5_inbox_hdr   hdr;
 640        __be32                  srqn;
 641        u8                      rsvd[4];
 642};
 643
 644struct mlx5_destroy_srq_mbox_out {
 645        struct mlx5_outbox_hdr  hdr;
 646        u8                      rsvd[8];
 647};
 648
 649struct mlx5_query_srq_mbox_in {
 650        struct mlx5_inbox_hdr   hdr;
 651        __be32                  srqn;
 652        u8                      rsvd0[4];
 653};
 654
 655struct mlx5_query_srq_mbox_out {
 656        struct mlx5_outbox_hdr  hdr;
 657        u8                      rsvd0[8];
 658        struct mlx5_srq_ctx     ctx;
 659        u8                      rsvd1[32];
 660        __be64                  pas[0];
 661};
 662
 663struct mlx5_arm_srq_mbox_in {
 664        struct mlx5_inbox_hdr   hdr;
 665        __be32                  srqn;
 666        __be16                  rsvd;
 667        __be16                  lwm;
 668};
 669
 670struct mlx5_arm_srq_mbox_out {
 671        struct mlx5_outbox_hdr  hdr;
 672        u8                      rsvd[8];
 673};
 674
 675struct mlx5_cq_context {
 676        u8                      status;
 677        u8                      cqe_sz_flags;
 678        u8                      st;
 679        u8                      rsvd3;
 680        u8                      rsvd4[6];
 681        __be16                  page_offset;
 682        __be32                  log_sz_usr_page;
 683        __be16                  cq_period;
 684        __be16                  cq_max_count;
 685        __be16                  rsvd20;
 686        __be16                  c_eqn;
 687        u8                      log_pg_sz;
 688        u8                      rsvd25[7];
 689        __be32                  last_notified_index;
 690        __be32                  solicit_producer_index;
 691        __be32                  consumer_counter;
 692        __be32                  producer_counter;
 693        u8                      rsvd48[8];
 694        __be64                  db_record_addr;
 695};
 696
 697struct mlx5_create_cq_mbox_in {
 698        struct mlx5_inbox_hdr   hdr;
 699        __be32                  input_cqn;
 700        u8                      rsvdx[4];
 701        struct mlx5_cq_context  ctx;
 702        u8                      rsvd6[192];
 703        __be64                  pas[0];
 704};
 705
 706struct mlx5_create_cq_mbox_out {
 707        struct mlx5_outbox_hdr  hdr;
 708        __be32                  cqn;
 709        u8                      rsvd0[4];
 710};
 711
 712struct mlx5_destroy_cq_mbox_in {
 713        struct mlx5_inbox_hdr   hdr;
 714        __be32                  cqn;
 715        u8                      rsvd0[4];
 716};
 717
 718struct mlx5_destroy_cq_mbox_out {
 719        struct mlx5_outbox_hdr  hdr;
 720        u8                      rsvd0[8];
 721};
 722
 723struct mlx5_query_cq_mbox_in {
 724        struct mlx5_inbox_hdr   hdr;
 725        __be32                  cqn;
 726        u8                      rsvd0[4];
 727};
 728
 729struct mlx5_query_cq_mbox_out {
 730        struct mlx5_outbox_hdr  hdr;
 731        u8                      rsvd0[8];
 732        struct mlx5_cq_context  ctx;
 733        u8                      rsvd6[16];
 734        __be64                  pas[0];
 735};
 736
 737struct mlx5_modify_cq_mbox_in {
 738        struct mlx5_inbox_hdr   hdr;
 739        __be32                  cqn;
 740        __be32                  field_select;
 741        struct mlx5_cq_context  ctx;
 742        u8                      rsvd[192];
 743        __be64                  pas[0];
 744};
 745
 746struct mlx5_modify_cq_mbox_out {
 747        struct mlx5_outbox_hdr  hdr;
 748        u8                      rsvd[8];
 749};
 750
 751struct mlx5_enable_hca_mbox_in {
 752        struct mlx5_inbox_hdr   hdr;
 753        u8                      rsvd[8];
 754};
 755
 756struct mlx5_enable_hca_mbox_out {
 757        struct mlx5_outbox_hdr  hdr;
 758        u8                      rsvd[8];
 759};
 760
 761struct mlx5_disable_hca_mbox_in {
 762        struct mlx5_inbox_hdr   hdr;
 763        u8                      rsvd[8];
 764};
 765
 766struct mlx5_disable_hca_mbox_out {
 767        struct mlx5_outbox_hdr  hdr;
 768        u8                      rsvd[8];
 769};
 770
 771struct mlx5_eq_context {
 772        u8                      status;
 773        u8                      ec_oi;
 774        u8                      st;
 775        u8                      rsvd2[7];
 776        __be16                  page_pffset;
 777        __be32                  log_sz_usr_page;
 778        u8                      rsvd3[7];
 779        u8                      intr;
 780        u8                      log_page_size;
 781        u8                      rsvd4[15];
 782        __be32                  consumer_counter;
 783        __be32                  produser_counter;
 784        u8                      rsvd5[16];
 785};
 786
 787struct mlx5_create_eq_mbox_in {
 788        struct mlx5_inbox_hdr   hdr;
 789        u8                      rsvd0[3];
 790        u8                      input_eqn;
 791        u8                      rsvd1[4];
 792        struct mlx5_eq_context  ctx;
 793        u8                      rsvd2[8];
 794        __be64                  events_mask;
 795        u8                      rsvd3[176];
 796        __be64                  pas[0];
 797};
 798
 799struct mlx5_create_eq_mbox_out {
 800        struct mlx5_outbox_hdr  hdr;
 801        u8                      rsvd0[3];
 802        u8                      eq_number;
 803        u8                      rsvd1[4];
 804};
 805
 806struct mlx5_destroy_eq_mbox_in {
 807        struct mlx5_inbox_hdr   hdr;
 808        u8                      rsvd0[3];
 809        u8                      eqn;
 810        u8                      rsvd1[4];
 811};
 812
 813struct mlx5_destroy_eq_mbox_out {
 814        struct mlx5_outbox_hdr  hdr;
 815        u8                      rsvd[8];
 816};
 817
 818struct mlx5_map_eq_mbox_in {
 819        struct mlx5_inbox_hdr   hdr;
 820        __be64                  mask;
 821        u8                      mu;
 822        u8                      rsvd0[2];
 823        u8                      eqn;
 824        u8                      rsvd1[24];
 825};
 826
 827struct mlx5_map_eq_mbox_out {
 828        struct mlx5_outbox_hdr  hdr;
 829        u8                      rsvd[8];
 830};
 831
 832struct mlx5_query_eq_mbox_in {
 833        struct mlx5_inbox_hdr   hdr;
 834        u8                      rsvd0[3];
 835        u8                      eqn;
 836        u8                      rsvd1[4];
 837};
 838
 839struct mlx5_query_eq_mbox_out {
 840        struct mlx5_outbox_hdr  hdr;
 841        u8                      rsvd[8];
 842        struct mlx5_eq_context  ctx;
 843};
 844
 845enum {
 846        MLX5_MKEY_STATUS_FREE = 1 << 6,
 847};
 848
 849struct mlx5_mkey_seg {
 850        /* This is a two bit field occupying bits 31-30.
 851         * bit 31 is always 0,
 852         * bit 30 is zero for regular MRs and 1 (e.g free) for UMRs that do not have tanslation
 853         */
 854        u8              status;
 855        u8              pcie_control;
 856        u8              flags;
 857        u8              version;
 858        __be32          qpn_mkey7_0;
 859        u8              rsvd1[4];
 860        __be32          flags_pd;
 861        __be64          start_addr;
 862        __be64          len;
 863        __be32          bsfs_octo_size;
 864        u8              rsvd2[16];
 865        __be32          xlt_oct_size;
 866        u8              rsvd3[3];
 867        u8              log2_page_size;
 868        u8              rsvd4[4];
 869};
 870
 871struct mlx5_query_special_ctxs_mbox_in {
 872        struct mlx5_inbox_hdr   hdr;
 873        u8                      rsvd[8];
 874};
 875
 876struct mlx5_query_special_ctxs_mbox_out {
 877        struct mlx5_outbox_hdr  hdr;
 878        __be32                  dump_fill_mkey;
 879        __be32                  reserved_lkey;
 880};
 881
 882struct mlx5_create_mkey_mbox_in {
 883        struct mlx5_inbox_hdr   hdr;
 884        __be32                  input_mkey_index;
 885        __be32                  flags;
 886        struct mlx5_mkey_seg    seg;
 887        u8                      rsvd1[16];
 888        __be32                  xlat_oct_act_size;
 889        __be32                  rsvd2;
 890        u8                      rsvd3[168];
 891        __be64                  pas[0];
 892};
 893
 894struct mlx5_create_mkey_mbox_out {
 895        struct mlx5_outbox_hdr  hdr;
 896        __be32                  mkey;
 897        u8                      rsvd[4];
 898};
 899
 900struct mlx5_destroy_mkey_mbox_in {
 901        struct mlx5_inbox_hdr   hdr;
 902        __be32                  mkey;
 903        u8                      rsvd[4];
 904};
 905
 906struct mlx5_destroy_mkey_mbox_out {
 907        struct mlx5_outbox_hdr  hdr;
 908        u8                      rsvd[8];
 909};
 910
 911struct mlx5_query_mkey_mbox_in {
 912        struct mlx5_inbox_hdr   hdr;
 913        __be32                  mkey;
 914};
 915
 916struct mlx5_query_mkey_mbox_out {
 917        struct mlx5_outbox_hdr  hdr;
 918        __be64                  pas[0];
 919};
 920
 921struct mlx5_modify_mkey_mbox_in {
 922        struct mlx5_inbox_hdr   hdr;
 923        __be32                  mkey;
 924        __be64                  pas[0];
 925};
 926
 927struct mlx5_modify_mkey_mbox_out {
 928        struct mlx5_outbox_hdr  hdr;
 929        u8                      rsvd[8];
 930};
 931
 932struct mlx5_dump_mkey_mbox_in {
 933        struct mlx5_inbox_hdr   hdr;
 934};
 935
 936struct mlx5_dump_mkey_mbox_out {
 937        struct mlx5_outbox_hdr  hdr;
 938        __be32                  mkey;
 939};
 940
 941struct mlx5_mad_ifc_mbox_in {
 942        struct mlx5_inbox_hdr   hdr;
 943        __be16                  remote_lid;
 944        u8                      rsvd0;
 945        u8                      port;
 946        u8                      rsvd1[4];
 947        u8                      data[256];
 948};
 949
 950struct mlx5_mad_ifc_mbox_out {
 951        struct mlx5_outbox_hdr  hdr;
 952        u8                      rsvd[8];
 953        u8                      data[256];
 954};
 955
 956struct mlx5_access_reg_mbox_in {
 957        struct mlx5_inbox_hdr           hdr;
 958        u8                              rsvd0[2];
 959        __be16                          register_id;
 960        __be32                          arg;
 961        __be32                          data[0];
 962};
 963
 964struct mlx5_access_reg_mbox_out {
 965        struct mlx5_outbox_hdr          hdr;
 966        u8                              rsvd[8];
 967        __be32                          data[0];
 968};
 969
 970#define MLX5_ATTR_EXTENDED_PORT_INFO    cpu_to_be16(0xff90)
 971
 972enum {
 973        MLX_EXT_PORT_CAP_FLAG_EXTENDED_PORT_INFO        = 1 <<  0
 974};
 975
 976struct mlx5_allocate_psv_in {
 977        struct mlx5_inbox_hdr   hdr;
 978        __be32                  npsv_pd;
 979        __be32                  rsvd_psv0;
 980};
 981
 982struct mlx5_allocate_psv_out {
 983        struct mlx5_outbox_hdr  hdr;
 984        u8                      rsvd[8];
 985        __be32                  psv_idx[4];
 986};
 987
 988struct mlx5_destroy_psv_in {
 989        struct mlx5_inbox_hdr   hdr;
 990        __be32                  psv_number;
 991        u8                      rsvd[4];
 992};
 993
 994struct mlx5_destroy_psv_out {
 995        struct mlx5_outbox_hdr  hdr;
 996        u8                      rsvd[8];
 997};
 998
 999#endif /* MLX5_DEVICE_H */
1000