summaryrefslogtreecommitdiff
path: root/gpxe/src/include/gpxe/infiniband.h
diff options
context:
space:
mode:
Diffstat (limited to 'gpxe/src/include/gpxe/infiniband.h')
-rw-r--r--gpxe/src/include/gpxe/infiniband.h659
1 files changed, 0 insertions, 659 deletions
diff --git a/gpxe/src/include/gpxe/infiniband.h b/gpxe/src/include/gpxe/infiniband.h
deleted file mode 100644
index d90b1c10..00000000
--- a/gpxe/src/include/gpxe/infiniband.h
+++ /dev/null
@@ -1,659 +0,0 @@
-#ifndef _GPXE_INFINIBAND_H
-#define _GPXE_INFINIBAND_H
-
-/** @file
- *
- * Infiniband protocol
- *
- */
-
-FILE_LICENCE ( GPL2_OR_LATER );
-
-#include <stdint.h>
-#include <gpxe/refcnt.h>
-#include <gpxe/device.h>
-#include <gpxe/ib_packet.h>
-#include <gpxe/ib_mad.h>
-
-/** Subnet management interface QPN */
-#define IB_QPN_SMI 0
-
-/** Subnet management interface queue key */
-#define IB_QKEY_SMI 0
-
-/** General service interface QPN */
-#define IB_QPN_GSI 1
-
-/** General service interface queue key */
-#define IB_QKEY_GSI 0x80010000UL
-
-/** Broadcast QPN */
-#define IB_QPN_BROADCAST 0xffffffUL
-
-/** QPN mask */
-#define IB_QPN_MASK 0xffffffUL
-
-/** Default Infiniband partition key */
-#define IB_PKEY_DEFAULT 0xffff
-
-/** Infiniband partition key full membership flag */
-#define IB_PKEY_FULL 0x8000
-
-/**
- * Maximum payload size
- *
- * This is currently hard-coded in various places (drivers, subnet
- * management agent, etc.) to 2048.
- */
-#define IB_MAX_PAYLOAD_SIZE 2048
-
-struct ib_device;
-struct ib_queue_pair;
-struct ib_address_vector;
-struct ib_completion_queue;
-struct ib_mad_interface;
-
-/** Infiniband transmission rates */
-enum ib_rate {
- IB_RATE_2_5 = 2,
- IB_RATE_10 = 3,
- IB_RATE_30 = 4,
- IB_RATE_5 = 5,
- IB_RATE_20 = 6,
- IB_RATE_40 = 7,
- IB_RATE_60 = 8,
- IB_RATE_80 = 9,
- IB_RATE_120 = 10,
-};
-
-/** An Infiniband Address Vector */
-struct ib_address_vector {
- /** Queue Pair Number */
- unsigned long qpn;
- /** Queue key
- *
- * Not specified for received packets.
- */
- unsigned long qkey;
- /** Local ID */
- unsigned int lid;
- /** Rate
- *
- * Not specified for received packets.
- */
- enum ib_rate rate;
- /** Service level */
- unsigned int sl;
- /** GID is present */
- unsigned int gid_present;
- /** GID, if present */
- struct ib_gid gid;
-};
-
-/** An Infiniband Work Queue */
-struct ib_work_queue {
- /** Containing queue pair */
- struct ib_queue_pair *qp;
- /** "Is a send queue" flag */
- int is_send;
- /** Associated completion queue */
- struct ib_completion_queue *cq;
- /** List of work queues on this completion queue */
- struct list_head list;
- /** Packet sequence number */
- uint32_t psn;
- /** Number of work queue entries */
- unsigned int num_wqes;
- /** Number of occupied work queue entries */
- unsigned int fill;
- /** 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.
- */
- unsigned long next_idx;
- /** I/O buffers assigned to work queue */
- struct io_buffer **iobufs;
- /** Driver private data */
- void *drv_priv;
-};
-
-/** An Infiniband multicast GID */
-struct ib_multicast_gid {
- /** List of multicast GIDs on this QP */
- struct list_head list;
- /** Multicast GID */
- struct ib_gid gid;
-};
-
-/** An Infiniband queue pair type */
-enum ib_queue_pair_type {
- IB_QPT_SMI,
- IB_QPT_GSI,
- IB_QPT_UD,
- IB_QPT_RC,
-};
-
-/** An Infiniband Queue Pair */
-struct ib_queue_pair {
- /** Containing Infiniband device */
- struct ib_device *ibdev;
- /** List of queue pairs on this Infiniband device */
- struct list_head list;
- /** Queue pair number */
- unsigned long qpn;
- /** Externally-visible queue pair number
- *
- * This may differ from the real queue pair number (e.g. when
- * the HCA cannot use the management QPNs 0 and 1 as hardware
- * QPNs and needs to remap them).
- */
- unsigned long ext_qpn;
- /** Queue pair type */
- enum ib_queue_pair_type type;
- /** Queue key */
- unsigned long qkey;
- /** Send queue */
- struct ib_work_queue send;
- /** Receive queue */
- struct ib_work_queue recv;
- /** List of multicast GIDs */
- struct list_head mgids;
- /** Address vector */
- struct ib_address_vector av;
- /** Driver private data */
- void *drv_priv;
- /** Queue owner private data */
- void *owner_priv;
-};
-
-/** Infiniband completion queue operations */
-struct ib_completion_queue_operations {
- /**
- * Complete Send WQE
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @v iobuf I/O buffer
- * @v rc Completion status code
- */
- void ( * complete_send ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct io_buffer *iobuf, int rc );
- /**
- * Complete Receive WQE
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @v av Address vector, or NULL
- * @v iobuf I/O buffer
- * @v rc Completion status code
- */
- void ( * complete_recv ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct ib_address_vector *av,
- struct io_buffer *iobuf, int rc );
-};
-
-/** An Infiniband Completion Queue */
-struct ib_completion_queue {
- /** Containing Infiniband device */
- struct ib_device *ibdev;
- /** List of completion queues on this Infiniband device */
- struct list_head list;
- /** Completion queue number */
- unsigned long cqn;
- /** Number of completion queue entries */
- unsigned int num_cqes;
- /** Next completion 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.
- */
- unsigned long next_idx;
- /** List of work queues completing to this queue */
- struct list_head work_queues;
- /** Completion queue operations */
- struct ib_completion_queue_operations *op;
- /** Driver private data */
- void *drv_priv;
-};
-
-/**
- * Infiniband device operations
- *
- * These represent a subset of the Infiniband Verbs.
- */
-struct ib_device_operations {
- /** Create completion queue
- *
- * @v ibdev Infiniband device
- * @v cq Completion queue
- * @ret rc Return status code
- */
- int ( * create_cq ) ( struct ib_device *ibdev,
- struct ib_completion_queue *cq );
- /** Destroy completion queue
- *
- * @v ibdev Infiniband device
- * @v cq Completion queue
- */
- void ( * destroy_cq ) ( struct ib_device *ibdev,
- struct ib_completion_queue *cq );
- /** Create queue pair
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @ret rc Return status code
- */
- int ( * create_qp ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp );
- /** Modify queue pair
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @ret rc Return status code
- */
- int ( * modify_qp ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp );
- /** Destroy queue pair
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- */
- void ( * destroy_qp ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp );
- /** Post send work queue entry
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @v av Address vector
- * @v iobuf I/O buffer
- * @ret rc Return status code
- *
- * If this method returns success, the I/O buffer remains
- * owned by the queue pair. If this method returns failure,
- * the I/O buffer is immediately released; the failure is
- * interpreted as "failure to enqueue buffer".
- */
- int ( * post_send ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct ib_address_vector *av,
- struct io_buffer *iobuf );
- /** Post receive work queue entry
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @v iobuf I/O buffer
- * @ret rc Return status code
- *
- * If this method returns success, the I/O buffer remains
- * owned by the queue pair. If this method returns failure,
- * the I/O buffer is immediately released; the failure is
- * interpreted as "failure to enqueue buffer".
- */
- int ( * post_recv ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct io_buffer *iobuf );
- /** Poll completion queue
- *
- * @v ibdev Infiniband device
- * @v cq Completion queue
- *
- * The relevant completion handler (specified at completion
- * queue creation time) takes ownership of the I/O buffer.
- */
- void ( * poll_cq ) ( struct ib_device *ibdev,
- struct ib_completion_queue *cq );
- /**
- * Poll event queue
- *
- * @v ibdev Infiniband device
- */
- void ( * poll_eq ) ( struct ib_device *ibdev );
- /**
- * Open port
- *
- * @v ibdev Infiniband device
- * @ret rc Return status code
- */
- int ( * open ) ( struct ib_device *ibdev );
- /**
- * Close port
- *
- * @v ibdev Infiniband device
- */
- void ( * close ) ( struct ib_device *ibdev );
- /** Attach to multicast group
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @v gid Multicast GID
- * @ret rc Return status code
- */
- int ( * mcast_attach ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct ib_gid *gid );
- /** Detach from multicast group
- *
- * @v ibdev Infiniband device
- * @v qp Queue pair
- * @v gid Multicast GID
- */
- void ( * mcast_detach ) ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct ib_gid *gid );
- /** Set port information
- *
- * @v ibdev Infiniband device
- * @v mad Set port information MAD
- *
- * This method is required only by adapters that do not have
- * an embedded SMA.
- */
- int ( * set_port_info ) ( struct ib_device *ibdev, union ib_mad *mad );
- /** Set partition key table
- *
- * @v ibdev Infiniband device
- * @v mad Set partition key table MAD
- *
- * This method is required only by adapters that do not have
- * an embedded SMA.
- */
- int ( * set_pkey_table ) ( struct ib_device *ibdev,
- union ib_mad *mad );
-};
-
-/** An Infiniband device */
-struct ib_device {
- /** Reference counter */
- struct refcnt refcnt;
- /** List of Infiniband devices */
- struct list_head list;
- /** List of open Infiniband devices */
- struct list_head open_list;
- /** Underlying device */
- struct device *dev;
- /** List of completion queues */
- struct list_head cqs;
- /** List of queue pairs */
- struct list_head qps;
- /** Infiniband operations */
- struct ib_device_operations *op;
- /** Port number */
- unsigned int port;
- /** Port open request counter */
- unsigned int open_count;
-
- /** Port state */
- uint8_t port_state;
- /** Link width supported */
- uint8_t link_width_supported;
- /** Link width enabled */
- uint8_t link_width_enabled;
- /** Link width active */
- uint8_t link_width_active;
- /** Link speed supported */
- uint8_t link_speed_supported;
- /** Link speed enabled */
- uint8_t link_speed_enabled;
- /** Link speed active */
- uint8_t link_speed_active;
- /** Port GID */
- struct ib_gid gid;
- /** Port LID */
- uint16_t lid;
- /** Subnet manager LID */
- uint16_t sm_lid;
- /** Subnet manager SL */
- uint8_t sm_sl;
- /** Partition key */
- uint16_t pkey;
-
- /** RDMA key
- *
- * This is a single key allowing unrestricted access to
- * memory.
- */
- uint32_t rdma_key;
-
- /** Subnet management interface */
- struct ib_mad_interface *smi;
- /** General services interface */
- struct ib_mad_interface *gsi;
-
- /** Driver private data */
- void *drv_priv;
- /** Owner private data */
- void *owner_priv;
-};
-
-extern struct ib_completion_queue *
-ib_create_cq ( struct ib_device *ibdev, unsigned int num_cqes,
- struct ib_completion_queue_operations *op );
-extern void ib_destroy_cq ( struct ib_device *ibdev,
- struct ib_completion_queue *cq );
-extern void ib_poll_cq ( struct ib_device *ibdev,
- struct ib_completion_queue *cq );
-extern struct ib_queue_pair *
-ib_create_qp ( struct ib_device *ibdev, enum ib_queue_pair_type type,
- unsigned int num_send_wqes, struct ib_completion_queue *send_cq,
- unsigned int num_recv_wqes,
- struct ib_completion_queue *recv_cq );
-extern int ib_modify_qp ( struct ib_device *ibdev, struct ib_queue_pair *qp );
-extern void ib_destroy_qp ( struct ib_device *ibdev,
- struct ib_queue_pair *qp );
-extern struct ib_queue_pair * ib_find_qp_qpn ( struct ib_device *ibdev,
- unsigned long qpn );
-extern struct ib_queue_pair * ib_find_qp_mgid ( struct ib_device *ibdev,
- struct ib_gid *gid );
-extern struct ib_work_queue * ib_find_wq ( struct ib_completion_queue *cq,
- unsigned long qpn, int is_send );
-extern int ib_post_send ( struct ib_device *ibdev, struct ib_queue_pair *qp,
- struct ib_address_vector *av,
- struct io_buffer *iobuf );
-extern int ib_post_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp,
- struct io_buffer *iobuf );
-extern void ib_complete_send ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct io_buffer *iobuf, int rc );
-extern void ib_complete_recv ( struct ib_device *ibdev,
- struct ib_queue_pair *qp,
- struct ib_address_vector *av,
- struct io_buffer *iobuf, int rc );
-extern void ib_refill_recv ( struct ib_device *ibdev,
- struct ib_queue_pair *qp );
-extern int ib_open ( struct ib_device *ibdev );
-extern void ib_close ( struct ib_device *ibdev );
-extern int ib_link_rc ( struct ib_device *ibdev );
-extern int ib_mcast_attach ( struct ib_device *ibdev, struct ib_queue_pair *qp,
- struct ib_gid *gid );
-extern void ib_mcast_detach ( struct ib_device *ibdev,
- struct ib_queue_pair *qp, struct ib_gid *gid );
-extern int ib_get_hca_info ( struct ib_device *ibdev,
- struct ib_gid_half *hca_guid );
-extern int ib_set_port_info ( struct ib_device *ibdev, union ib_mad *mad );
-extern int ib_set_pkey_table ( struct ib_device *ibdev, union ib_mad *mad );
-extern struct ib_device * alloc_ibdev ( size_t priv_size );
-extern int register_ibdev ( struct ib_device *ibdev );
-extern void unregister_ibdev ( struct ib_device *ibdev );
-extern struct ib_device * find_ibdev ( struct ib_gid *gid );
-extern struct ib_device * last_opened_ibdev ( void );
-extern void ib_link_state_changed ( struct ib_device *ibdev );
-extern void ib_poll_eq ( struct ib_device *ibdev );
-extern struct list_head ib_devices;
-
-/** Iterate over all network devices */
-#define for_each_ibdev( ibdev ) \
- list_for_each_entry ( (ibdev), &ib_devices, list )
-
-/**
- * Check link state
- *
- * @v ibdev Infiniband device
- * @ret link_up Link is up
- */
-static inline __always_inline int
-ib_link_ok ( struct ib_device *ibdev ) {
- return ( ibdev->port_state == IB_PORT_STATE_ACTIVE );
-}
-
-/**
- * Get reference to Infiniband device
- *
- * @v ibdev Infiniband device
- * @ret ibdev Infiniband device
- */
-static inline __always_inline struct ib_device *
-ibdev_get ( struct ib_device *ibdev ) {
- ref_get ( &ibdev->refcnt );
- return ibdev;
-}
-
-/**
- * Drop reference to Infiniband device
- *
- * @v ibdev Infiniband device
- */
-static inline __always_inline void
-ibdev_put ( struct ib_device *ibdev ) {
- ref_put ( &ibdev->refcnt );
-}
-
-/**
- * Set Infiniband work queue driver-private data
- *
- * @v wq Work queue
- * @v priv Private data
- */
-static inline __always_inline void
-ib_wq_set_drvdata ( struct ib_work_queue *wq, void *priv ) {
- wq->drv_priv = priv;
-}
-
-/**
- * Get Infiniband work queue driver-private data
- *
- * @v wq Work queue
- * @ret priv Private data
- */
-static inline __always_inline void *
-ib_wq_get_drvdata ( struct ib_work_queue *wq ) {
- return wq->drv_priv;
-}
-
-/**
- * Set Infiniband queue pair driver-private data
- *
- * @v qp Queue pair
- * @v priv Private data
- */
-static inline __always_inline void
-ib_qp_set_drvdata ( struct ib_queue_pair *qp, void *priv ) {
- qp->drv_priv = priv;
-}
-
-/**
- * Get Infiniband queue pair driver-private data
- *
- * @v qp Queue pair
- * @ret priv Private data
- */
-static inline __always_inline void *
-ib_qp_get_drvdata ( struct ib_queue_pair *qp ) {
- return qp->drv_priv;
-}
-
-/**
- * Set Infiniband queue pair owner-private data
- *
- * @v qp Queue pair
- * @v priv Private data
- */
-static inline __always_inline void
-ib_qp_set_ownerdata ( struct ib_queue_pair *qp, void *priv ) {
- qp->owner_priv = priv;
-}
-
-/**
- * Get Infiniband queue pair owner-private data
- *
- * @v qp Queue pair
- * @ret priv Private data
- */
-static inline __always_inline void *
-ib_qp_get_ownerdata ( struct ib_queue_pair *qp ) {
- return qp->owner_priv;
-}
-
-/**
- * Set Infiniband completion queue driver-private data
- *
- * @v cq Completion queue
- * @v priv Private data
- */
-static inline __always_inline void
-ib_cq_set_drvdata ( struct ib_completion_queue *cq, void *priv ) {
- cq->drv_priv = priv;
-}
-
-/**
- * Get Infiniband completion queue driver-private data
- *
- * @v cq Completion queue
- * @ret priv Private data
- */
-static inline __always_inline void *
-ib_cq_get_drvdata ( struct ib_completion_queue *cq ) {
- return cq->drv_priv;
-}
-
-/**
- * Set Infiniband device driver-private data
- *
- * @v ibdev Infiniband device
- * @v priv Private data
- */
-static inline __always_inline void
-ib_set_drvdata ( struct ib_device *ibdev, void *priv ) {
- ibdev->drv_priv = priv;
-}
-
-/**
- * Get Infiniband device driver-private data
- *
- * @v ibdev Infiniband device
- * @ret priv Private data
- */
-static inline __always_inline void *
-ib_get_drvdata ( struct ib_device *ibdev ) {
- return ibdev->drv_priv;
-}
-
-/**
- * Set Infiniband device owner-private data
- *
- * @v ibdev Infiniband device
- * @v priv Private data
- */
-static inline __always_inline void
-ib_set_ownerdata ( struct ib_device *ibdev, void *priv ) {
- ibdev->owner_priv = priv;
-}
-
-/**
- * Get Infiniband device owner-private data
- *
- * @v ibdev Infiniband device
- * @ret priv Private data
- */
-static inline __always_inline void *
-ib_get_ownerdata ( struct ib_device *ibdev ) {
- return ibdev->owner_priv;
-}
-
-#endif /* _GPXE_INFINIBAND_H */