232 lines
5.9 KiB
C
232 lines
5.9 KiB
C
#ifndef NODNIC_NODNICDATASTRUCTURES_H_
|
|
#define NODNIC_NODNICDATASTRUCTURES_H_
|
|
|
|
/*
|
|
* Copyright (C) 2015 Mellanox Technologies Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER );
|
|
|
|
#include "../../mlx_utils/include/public/mlx_utils.h"
|
|
|
|
/* todo: fix coding convention */
|
|
#define NODNIC_MEMORY_ALIGN 0x1000
|
|
|
|
#define NODNIC_MAX_MAC_FILTERS 5
|
|
#define NODNIC_MAX_MGID_FILTERS 4
|
|
|
|
typedef struct _nodnic_device_priv nodnic_device_priv;
|
|
typedef struct _nodnic_port_priv nodnic_port_priv;
|
|
typedef struct _nodnic_device_capabilites nodnic_device_capabilites;
|
|
typedef struct _nodnic_qp nodnic_qp;
|
|
typedef struct _nodnic_cq nodnic_cq;
|
|
typedef struct _nodnic_eq nodnic_eq;
|
|
typedef struct _nodnic_qp_db nodnic_qp_db;
|
|
typedef struct _nodnic_arm_cq_db nodnic_arm_cq_db;
|
|
|
|
/* NODNIC Port states
|
|
* Bit 0 - port open/close
|
|
* Bit 1 - port is [not] in disabling DMA
|
|
* 0 - closed and not disabling DMA
|
|
* 1 - opened and not disabling DMA
|
|
* 3 - opened and disabling DMA
|
|
*/
|
|
#define NODNIC_PORT_OPENED 0b00000001
|
|
#define NODNIC_PORT_DISABLING_DMA 0b00000010
|
|
|
|
typedef enum {
|
|
ConnectX3 = 0,
|
|
Connectx4
|
|
}nodnic_hardware_format;
|
|
|
|
|
|
typedef enum {
|
|
NODNIC_QPT_SMI,
|
|
NODNIC_QPT_GSI,
|
|
NODNIC_QPT_UD,
|
|
NODNIC_QPT_RC,
|
|
NODNIC_QPT_ETH,
|
|
}nodnic_queue_pair_type;
|
|
typedef enum {
|
|
NODNIC_PORT_TYPE_IB = 0,
|
|
NODNIC_PORT_TYPE_ETH,
|
|
NODNIC_PORT_TYPE_UNKNOWN,
|
|
}nodnic_port_type;
|
|
|
|
|
|
#define RECV_WQE_SIZE 16
|
|
#define NODNIC_WQBB_SIZE 64
|
|
/** A nodnic send wqbb */
|
|
struct nodnic_send_wqbb {
|
|
mlx_uint8 force_align[NODNIC_WQBB_SIZE];
|
|
};
|
|
|
|
struct nodnic_doorbell {
|
|
mlx_physical_address doorbell_physical;
|
|
mlx_void *map;
|
|
nodnic_qp_db *qp_doorbell_record;
|
|
};
|
|
struct nodnic_ring {
|
|
mlx_uint32 offset;
|
|
/** Work queue entries */
|
|
/* TODO: add to memory entity */
|
|
mlx_physical_address wqe_physical;
|
|
mlx_void *map;
|
|
/** Size of work queue */
|
|
mlx_size wq_size;
|
|
/** Next work queue entry index
|
|
*
|
|
* This is the index of the next entry to be filled (i.e. the
|
|
* first empty entry). This value is not bounded by num_wqes;
|
|
* users must logical-AND with (num_wqes-1) to generate an
|
|
* array index.
|
|
*/
|
|
mlx_uint32 num_wqes;
|
|
mlx_uint32 qpn;
|
|
mlx_uint32 next_idx;
|
|
struct nodnic_doorbell recv_doorbell;
|
|
struct nodnic_doorbell send_doorbell;
|
|
};
|
|
|
|
struct nodnic_send_ring{
|
|
struct nodnic_ring nodnic_ring;
|
|
struct nodnic_send_wqbb *wqe_virt;
|
|
};
|
|
|
|
|
|
struct nodnic_recv_ring{
|
|
struct nodnic_ring nodnic_ring;
|
|
void *wqe_virt;
|
|
};
|
|
struct _nodnic_qp{
|
|
nodnic_queue_pair_type type;
|
|
struct nodnic_send_ring send;
|
|
struct nodnic_recv_ring receive;
|
|
};
|
|
|
|
struct _nodnic_cq{
|
|
/** cq entries */
|
|
mlx_void *cq_virt;
|
|
mlx_physical_address cq_physical;
|
|
mlx_void *map;
|
|
/** cq */
|
|
mlx_size cq_size;
|
|
struct nodnic_doorbell arm_cq_doorbell;
|
|
};
|
|
|
|
struct _nodnic_eq{
|
|
mlx_void *eq_virt;
|
|
mlx_physical_address eq_physical;
|
|
mlx_void *map;
|
|
mlx_size eq_size;
|
|
};
|
|
struct _nodnic_device_capabilites{
|
|
mlx_boolean support_mac_filters;
|
|
mlx_boolean support_promisc_filter;
|
|
mlx_boolean support_promisc_multicast_filter;
|
|
mlx_uint8 log_working_buffer_size;
|
|
mlx_uint8 log_pkey_table_size;
|
|
mlx_boolean num_ports; // 0 - single port, 1 - dual port
|
|
mlx_uint8 log_max_ring_size;
|
|
#ifdef DEVICE_CX3
|
|
mlx_uint8 crspace_doorbells;
|
|
#endif
|
|
mlx_uint8 support_rx_pi_dma;
|
|
mlx_uint8 support_uar_tx_db;
|
|
mlx_uint8 support_bar_cq_ctrl;
|
|
mlx_uint8 log_uar_page_size;
|
|
};
|
|
|
|
#ifdef DEVICE_CX3
|
|
/* This is the structure of the data in the scratchpad
|
|
* Read/Write data from/to its field using PCI accesses only */
|
|
typedef struct _nodnic_port_data_flow_gw nodnic_port_data_flow_gw;
|
|
struct _nodnic_port_data_flow_gw {
|
|
mlx_uint32 send_doorbell;
|
|
mlx_uint32 recv_doorbell;
|
|
mlx_uint32 reserved2[2];
|
|
mlx_uint32 armcq_cq_ci_dword;
|
|
mlx_uint32 dma_en;
|
|
} __attribute__ ((packed));
|
|
#endif
|
|
|
|
typedef struct _nodnic_uar_priv{
|
|
mlx_uint8 inited;
|
|
mlx_uint64 offset;
|
|
void *virt;
|
|
unsigned long phys;
|
|
} nodnic_uar;
|
|
|
|
struct _nodnic_device_priv{
|
|
mlx_boolean is_initiailzied;
|
|
mlx_utils *utils;
|
|
|
|
//nodnic structure offset in init segment
|
|
mlx_uint32 device_offset;
|
|
|
|
nodnic_device_capabilites device_cap;
|
|
|
|
mlx_uint8 nodnic_revision;
|
|
nodnic_hardware_format hardware_format;
|
|
mlx_uint32 pd;
|
|
mlx_uint32 lkey;
|
|
mlx_uint64 device_guid;
|
|
nodnic_port_priv *ports;
|
|
#ifdef DEVICE_CX3
|
|
mlx_void *crspace_clear_int;
|
|
#endif
|
|
nodnic_uar uar;
|
|
};
|
|
|
|
struct _nodnic_port_priv{
|
|
nodnic_device_priv *device;
|
|
mlx_uint32 port_offset;
|
|
mlx_uint8 port_state;
|
|
mlx_boolean network_state;
|
|
mlx_boolean dma_state;
|
|
nodnic_port_type port_type;
|
|
mlx_uint8 port_num;
|
|
nodnic_eq eq;
|
|
mlx_mac_address mac_filters[5];
|
|
nodnic_arm_cq_db *arm_cq_doorbell_record;
|
|
mlx_status (*send_doorbell)(
|
|
IN nodnic_port_priv *port_priv,
|
|
IN struct nodnic_ring *ring,
|
|
IN mlx_uint16 index);
|
|
mlx_status (*recv_doorbell)(
|
|
IN nodnic_port_priv *port_priv,
|
|
IN struct nodnic_ring *ring,
|
|
IN mlx_uint16 index);
|
|
mlx_status (*set_dma)(
|
|
IN nodnic_port_priv *port_priv,
|
|
IN mlx_boolean value);
|
|
#ifdef DEVICE_CX3
|
|
nodnic_port_data_flow_gw *data_flow_gw;
|
|
#endif
|
|
};
|
|
|
|
struct _nodnic_qp_db {
|
|
mlx_uint32 recv_db;
|
|
mlx_uint32 send_db;
|
|
} __attribute ( ( packed ) );
|
|
|
|
struct _nodnic_arm_cq_db {
|
|
mlx_uint32 dword[2];
|
|
} __attribute ( ( packed ) );
|
|
#endif /* STUB_NODNIC_NODNICDATASTRUCTURES_H_ */
|