mirror of
https://github.com/ipxe/ipxe
synced 2025-12-28 18:42:53 +03:00
[Infiniband] Add multiport support for Arbel cards
This commit is contained in:
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
|
||||
/* Ports in existence */
|
||||
#define ARBEL_NUM_PORTS 1
|
||||
#define ARBEL_NUM_PORTS 2
|
||||
#define ARBEL_PORT_BASE 1
|
||||
|
||||
/* PCI BARs */
|
||||
@@ -57,6 +57,7 @@
|
||||
#define ARBEL_HCR_RST2INIT_QPEE 0x0019
|
||||
#define ARBEL_HCR_INIT2RTR_QPEE 0x001a
|
||||
#define ARBEL_HCR_RTR2RTS_QPEE 0x001b
|
||||
#define ARBEL_HCR_RTS2RTS_QPEE 0x001c
|
||||
#define ARBEL_HCR_2RST_QPEE 0x0021
|
||||
#define ARBEL_HCR_MAD_IFC 0x0024
|
||||
#define ARBEL_HCR_READ_MGM 0x0025
|
||||
@@ -86,6 +87,14 @@
|
||||
#define ARBEL_PAGE_SIZE 4096
|
||||
|
||||
#define ARBEL_DB_POST_SND_OFFSET 0x10
|
||||
#define ARBEL_DB_EQ_OFFSET(_eqn) ( 0x08 * (_eqn) )
|
||||
|
||||
#define ARBEL_QPEE_OPT_PARAM_QKEY 0x00000020UL
|
||||
|
||||
#define ARBEL_MAP_EQ ( 0UL << 31 )
|
||||
#define ARBEL_UNMAP_EQ ( 1UL << 31 )
|
||||
|
||||
#define ARBEL_EV_PORT_STATE_CHANGE 0x09
|
||||
|
||||
/*
|
||||
* Datatypes that seem to be missing from the autogenerated documentation
|
||||
@@ -104,6 +113,20 @@ struct arbelprm_scalar_parameter_st {
|
||||
pseudo_bit_t value[0x00020];
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
struct arbelprm_event_mask_st {
|
||||
pseudo_bit_t reserved0[0x00020];
|
||||
/* -------------- */
|
||||
pseudo_bit_t completion[0x00001];
|
||||
pseudo_bit_t reserved1[0x0008];
|
||||
pseudo_bit_t port_state_change[0x00001];
|
||||
pseudo_bit_t reserved2[0x00016];
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
struct arbelprm_port_state_change_event_st {
|
||||
pseudo_bit_t reserved[0x00020];
|
||||
struct arbelprm_port_state_change_st data;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/*
|
||||
* Wrapper structures for hardware datatypes
|
||||
*
|
||||
@@ -115,6 +138,8 @@ struct MLX_DECLARE_STRUCT ( arbelprm_completion_queue_entry );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_completion_with_error );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_cq_arm_db_record );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_cq_ci_db_record );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_event_mask );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_event_queue_entry );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_eqc );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_hca_command_register );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_init_hca );
|
||||
@@ -123,6 +148,7 @@ struct MLX_DECLARE_STRUCT ( arbelprm_mad_ifc );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_mgm_entry );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_mgm_hash );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_mpt );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_port_state_change_event );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_qp_db_record );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_qp_ee_state_transitions );
|
||||
struct MLX_DECLARE_STRUCT ( arbelprm_query_dev_lim );
|
||||
@@ -172,6 +198,11 @@ union arbelprm_completion_entry {
|
||||
struct arbelprm_completion_with_error error;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
union arbelprm_event_entry {
|
||||
struct arbelprm_event_queue_entry generic;
|
||||
struct arbelprm_port_state_change_event port_state_change;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
union arbelprm_doorbell_record {
|
||||
struct arbelprm_cq_arm_db_record cq_arm;
|
||||
struct arbelprm_cq_ci_db_record cq_ci;
|
||||
@@ -215,6 +246,8 @@ struct arbel_dev_limits {
|
||||
unsigned int reserved_cqs;
|
||||
/** CQ context entry size */
|
||||
size_t cqc_entry_size;
|
||||
/** Number of reserved EQs */
|
||||
unsigned int reserved_eqs;
|
||||
/** Number of reserved MTTs */
|
||||
unsigned int reserved_mtts;
|
||||
/** MTT entry size */
|
||||
@@ -304,6 +337,33 @@ struct arbel_completion_queue {
|
||||
size_t cqe_size;
|
||||
};
|
||||
|
||||
/** Maximum number of allocatable event queues
|
||||
*
|
||||
* This is a policy decision, not a device limit.
|
||||
*/
|
||||
#define ARBEL_MAX_EQS 64
|
||||
|
||||
/** A Arbel event queue */
|
||||
struct arbel_event_queue {
|
||||
/** Event queue entries */
|
||||
union arbelprm_event_entry *eqe;
|
||||
/** Size of event queue */
|
||||
size_t eqe_size;
|
||||
/** Event queue number */
|
||||
unsigned long eqn;
|
||||
/** Next event queue entry index */
|
||||
unsigned long next_idx;
|
||||
/** Doorbell register */
|
||||
void *doorbell;
|
||||
};
|
||||
|
||||
/** Number of event queue entries
|
||||
*
|
||||
* This is a policy decision.
|
||||
*/
|
||||
#define ARBEL_NUM_EQES 4
|
||||
|
||||
|
||||
/** An Arbel resource bitmask */
|
||||
typedef uint32_t arbel_bitmask_t;
|
||||
|
||||
@@ -318,6 +378,8 @@ struct arbel {
|
||||
void *config;
|
||||
/** PCI user Access Region */
|
||||
void *uar;
|
||||
/** Event queue consumer index doorbells */
|
||||
void *eq_ci_doorbells;
|
||||
|
||||
/** Command input mailbox */
|
||||
void *mailbox_in;
|
||||
@@ -333,6 +395,8 @@ struct arbel {
|
||||
/** ICM area */
|
||||
userptr_t icm;
|
||||
|
||||
/** Event queue */
|
||||
struct arbel_event_queue eq;
|
||||
/** Doorbell records */
|
||||
union arbelprm_doorbell_record *db_rec;
|
||||
/** Reserved LKey
|
||||
|
||||
Reference in New Issue
Block a user