Browse Source

[infiniband] Provide ib_get_hca_info() as a commonly-available function

tags/v0.9.8
Michael Brown 15 years ago
parent
commit
7ba33f7826
4 changed files with 35 additions and 19 deletions
  1. 3
    3
      src/include/gpxe/ib_mad.h
  2. 2
    0
      src/include/gpxe/infiniband.h
  3. 26
    0
      src/net/infiniband.c
  4. 4
    16
      src/net/infiniband/ib_sma.c

+ 3
- 3
src/include/gpxe/ib_mad.h View File

75
 	uint8_t class_version;
75
 	uint8_t class_version;
76
 	uint8_t node_type;
76
 	uint8_t node_type;
77
 	uint8_t num_ports;
77
 	uint8_t num_ports;
78
-	uint8_t sys_guid[8];
79
-	uint8_t node_guid[8];
80
-	uint8_t port_guid[8];
78
+	struct ib_gid_half sys_guid;
79
+	struct ib_gid_half node_guid;
80
+	struct ib_gid_half port_guid;
81
 	uint16_t partition_cap;
81
 	uint16_t partition_cap;
82
 	uint16_t device_id;
82
 	uint16_t device_id;
83
 	uint32_t revision;
83
 	uint32_t revision;

+ 2
- 0
src/include/gpxe/infiniband.h View File

374
 			     struct ib_gid *gid );
374
 			     struct ib_gid *gid );
375
 extern void ib_mcast_detach ( struct ib_device *ibdev,
375
 extern void ib_mcast_detach ( struct ib_device *ibdev,
376
 			      struct ib_queue_pair *qp, struct ib_gid *gid );
376
 			      struct ib_queue_pair *qp, struct ib_gid *gid );
377
+extern int ib_get_hca_info ( struct ib_device *ibdev,
378
+			     struct ib_gid_half *hca_guid );
377
 extern struct ib_device * alloc_ibdev ( size_t priv_size );
379
 extern struct ib_device * alloc_ibdev ( size_t priv_size );
378
 extern int register_ibdev ( struct ib_device *ibdev );
380
 extern int register_ibdev ( struct ib_device *ibdev );
379
 extern void unregister_ibdev ( struct ib_device *ibdev );
381
 extern void unregister_ibdev ( struct ib_device *ibdev );

+ 26
- 0
src/net/infiniband.c View File

488
 	}
488
 	}
489
 }
489
 }
490
 
490
 
491
+/**
492
+ * Get Infiniband HCA information
493
+ *
494
+ * @v ibdev		Infiniband device
495
+ * @ret hca_guid	HCA GUID
496
+ * @ret num_ports	Number of ports
497
+ */
498
+int ib_get_hca_info ( struct ib_device *ibdev,
499
+		      struct ib_gid_half *hca_guid ) {
500
+	struct ib_device *tmp;
501
+	int num_ports = 0;
502
+
503
+	/* Search for IB devices with the same physical device to
504
+	 * identify port count and a suitable Node GUID.
505
+	 */
506
+	for_each_ibdev ( tmp ) {
507
+		if ( tmp->dev != ibdev->dev )
508
+			continue;
509
+		if ( num_ports == 0 ) {
510
+			memcpy ( hca_guid, &tmp->gid.u.half[1],
511
+				 sizeof ( *hca_guid ) );
512
+		}
513
+		num_ports++;
514
+	}
515
+	return num_ports;
516
+}
491
 
517
 
492
 /***************************************************************************
518
 /***************************************************************************
493
  *
519
  *

+ 4
- 16
src/net/infiniband/ib_sma.c View File

47
 				   union ib_smp_data *get ) {
47
 				   union ib_smp_data *get ) {
48
 	struct ib_device *ibdev = sma->ibdev;
48
 	struct ib_device *ibdev = sma->ibdev;
49
 	struct ib_node_info *node_info = &get->node_info;
49
 	struct ib_node_info *node_info = &get->node_info;
50
-	struct ib_device *tmp;
51
 
50
 
52
 	memset ( node_info, 0, sizeof ( *node_info ) );
51
 	memset ( node_info, 0, sizeof ( *node_info ) );
53
 	node_info->base_version = IB_MGMT_BASE_VERSION;
52
 	node_info->base_version = IB_MGMT_BASE_VERSION;
54
 	node_info->class_version = IB_SMP_CLASS_VERSION;
53
 	node_info->class_version = IB_SMP_CLASS_VERSION;
55
 	node_info->node_type = IB_NODE_TYPE_HCA;
54
 	node_info->node_type = IB_NODE_TYPE_HCA;
56
-	/* Search for IB devices with the same physical device to
57
-	 * identify port count and a suitable Node GUID.
58
-	 */
59
-	for_each_ibdev ( tmp ) {
60
-		if ( tmp->dev != ibdev->dev )
61
-			continue;
62
-		if ( node_info->num_ports == 0 ) {
63
-			memcpy ( node_info->sys_guid, &tmp->gid.u.half[1],
64
-				 sizeof ( node_info->sys_guid ) );
65
-			memcpy ( node_info->node_guid, &tmp->gid.u.half[1],
66
-				 sizeof ( node_info->node_guid ) );
67
-		}
68
-		node_info->num_ports++;
69
-	}
70
-	memcpy ( node_info->port_guid, &ibdev->gid.u.half[1],
55
+	node_info->num_ports = ib_get_hca_info ( ibdev, &node_info->sys_guid );
56
+	memcpy ( &node_info->node_guid, &node_info->sys_guid,
57
+		 sizeof ( node_info->node_guid ) );
58
+	memcpy ( &node_info->port_guid, &ibdev->gid.u.half[1],
71
 		 sizeof ( node_info->port_guid ) );
59
 		 sizeof ( node_info->port_guid ) );
72
 	node_info->partition_cap = htons ( 1 );
60
 	node_info->partition_cap = htons ( 1 );
73
 	node_info->local_port_num = ibdev->port;
61
 	node_info->local_port_num = ibdev->port;

Loading…
Cancel
Save