diff options
Diffstat (limited to 'src/include/gpxe')
-rw-r--r-- | src/include/gpxe/errfile.h | 1 | ||||
-rw-r--r-- | src/include/gpxe/ib_gma.h | 71 | ||||
-rw-r--r-- | src/include/gpxe/ib_mad.h | 2 | ||||
-rw-r--r-- | src/include/gpxe/infiniband.h | 17 |
4 files changed, 91 insertions, 0 deletions
diff --git a/src/include/gpxe/errfile.h b/src/include/gpxe/errfile.h index 4b560009..e8132b47 100644 --- a/src/include/gpxe/errfile.h +++ b/src/include/gpxe/errfile.h @@ -144,6 +144,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #define ERRFILE_ib_packet ( ERRFILE_NET | 0x00180000 ) #define ERRFILE_icmp ( ERRFILE_NET | 0x00190000 ) #define ERRFILE_ib_qset ( ERRFILE_NET | 0x001a0000 ) +#define ERRFILE_ib_gma ( ERRFILE_NET | 0x001b0000 ) #define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 ) #define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 ) diff --git a/src/include/gpxe/ib_gma.h b/src/include/gpxe/ib_gma.h new file mode 100644 index 00000000..c305a3a1 --- /dev/null +++ b/src/include/gpxe/ib_gma.h @@ -0,0 +1,71 @@ +#ifndef _GPXE_IB_GMA_H +#define _GPXE_IB_GMA_H + +/** @file + * + * Infiniband General Management Agent + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include <gpxe/list.h> +#include <gpxe/retry.h> +#include <gpxe/tables.h> + +struct ib_device; +struct ib_completion_queue; +struct ib_queue_pair; +union ib_mad; + +/** A MAD attribute handler */ +struct ib_mad_handler { + /** Management class */ + uint8_t mgmt_class; + /** Class version */ + uint8_t class_version; + /** Method */ + uint8_t method; + /** Response method, or zero */ + uint8_t resp_method; + /** Attribute (in network byte order) */ + uint16_t attr_id; + /** Handle attribute + * + * @v ibdev Infiniband device + * @v mad MAD + * @ret rc Return status code + * + * The handler should modify the MAD as applicable. If the + * handler returns with a non-zero value in the MAD's @c + * method field, it will be sent as a response. + */ + int ( * handle ) ( struct ib_device *ibdev, union ib_mad *mad ); +}; + +/** MAD attribute handlers */ +#define IB_MAD_HANDLERS __table ( struct ib_mad_handler, "ib_mad_handlers" ) + +/** Declare a MAD attribute handler */ +#define __ib_mad_handler __table_entry ( IB_MAD_HANDLERS, 01 ) + +/** An Infiniband General Management Agent */ +struct ib_gma { + /** Infiniband device */ + struct ib_device *ibdev; + /** Completion queue */ + struct ib_completion_queue *cq; + /** Queue pair */ + struct ib_queue_pair *qp; + + /** List of outstanding MAD requests */ + struct list_head requests; +}; + +extern int ib_gma_request ( struct ib_gma *gma, union ib_mad *mad, + struct ib_address_vector *av ); +extern int ib_create_gma ( struct ib_gma *gma, struct ib_device *ibdev, + unsigned long qkey ); +extern void ib_destroy_gma ( struct ib_gma *gma ); + +#endif /* _GPXE_IB_GMA_H */ diff --git a/src/include/gpxe/ib_mad.h b/src/include/gpxe/ib_mad.h index 7d497999..eaea12b8 100644 --- a/src/include/gpxe/ib_mad.h +++ b/src/include/gpxe/ib_mad.h @@ -201,6 +201,8 @@ struct ib_smp_class_specific { ***************************************************************************** */ +#define IB_SA_CLASS_VERSION 2 + struct ib_rmpp_hdr { uint32_t raw[3]; } __attribute__ (( packed )); diff --git a/src/include/gpxe/infiniband.h b/src/include/gpxe/infiniband.h index be22b7fe..3ffd5e66 100644 --- a/src/include/gpxe/infiniband.h +++ b/src/include/gpxe/infiniband.h @@ -14,6 +14,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <gpxe/device.h> #include <gpxe/ib_packet.h> #include <gpxe/ib_mad.h> +#include <gpxe/ib_gma.h> /** Subnet management QPN */ #define IB_QPN_SMA 0 @@ -133,6 +134,19 @@ struct ib_address_vector { struct ib_gid gid; }; +/** 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, +}; + /** Infiniband completion queue operations */ struct ib_completion_queue_operations { /** @@ -354,6 +368,9 @@ struct ib_device { /** Outbound packet sequence number */ uint32_t psn; + /** General management agent */ + struct ib_gma gma; + /** Driver private data */ void *drv_priv; /** Owner private data */ |