[Infiniband] Add multiport support for Arbel cards

This commit is contained in:
Michael Brown
2008-04-22 01:37:00 +01:00
parent 35a5836677
commit c9fb012d4f
3 changed files with 306 additions and 20 deletions

View File

@@ -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