diff options
Diffstat (limited to 'gpxe/src/include/gpxe/infiniband.h')
-rw-r--r-- | gpxe/src/include/gpxe/infiniband.h | 659 |
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 */ |