diff options
| author | Michael Brown | 2008-04-22 02:37:00 +0200 |
|---|---|---|
| committer | Michael Brown | 2008-04-22 02:37:00 +0200 |
| commit | c9fb012d4fdbd397cef65a8dbf5bb9759228588a (patch) | |
| tree | 108011c1902f4a2370c882ac770be7a085f745c4 /src/drivers/infiniband/arbel.h | |
| parent | [Infiniband] Move event-queue process from driver to Infiniband core (diff) | |
| download | ipxe-c9fb012d4fdbd397cef65a8dbf5bb9759228588a.tar.gz ipxe-c9fb012d4fdbd397cef65a8dbf5bb9759228588a.tar.xz ipxe-c9fb012d4fdbd397cef65a8dbf5bb9759228588a.zip | |
[Infiniband] Add multiport support for Arbel cards
Diffstat (limited to 'src/drivers/infiniband/arbel.h')
| -rw-r--r-- | src/drivers/infiniband/arbel.h | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/src/drivers/infiniband/arbel.h b/src/drivers/infiniband/arbel.h index 94fa67c1b..68be8248d 100644 --- a/src/drivers/infiniband/arbel.h +++ b/src/drivers/infiniband/arbel.h @@ -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 |
