Selaa lähdekoodia

Started with the ICM partitioning code.

tags/v0.9.3
Michael Brown 16 vuotta sitten
vanhempi
commit
af88f60228
2 muutettua tiedostoa jossa 116 lisäystä ja 4 poistoa
  1. 2
    2
      src/drivers/net/mlx_ipoib/arbel.h
  2. 114
    2
      src/drivers/net/mlx_ipoib/mt25218.c

+ 2
- 2
src/drivers/net/mlx_ipoib/arbel.h Näytä tiedosto

@@ -38,6 +38,7 @@
38 38
 /* HCA command register opcodes */
39 39
 #define ARBEL_HCR_QUERY_DEV_LIM		0x0003
40 40
 #define ARBEL_HCR_QUERY_FW		0x0004
41
+#define ARBEL_HCR_INIT_HCA		0x0007
41 42
 #define ARBEL_HCR_SW2HW_CQ		0x0016
42 43
 #define ARBEL_HCR_HW2SW_CQ		0x0017
43 44
 #define ARBEL_HCR_RST2INIT_QPEE		0x0019
@@ -82,6 +83,7 @@ struct MLX_DECLARE_STRUCT ( arbelprm_completion_with_error );
82 83
 struct MLX_DECLARE_STRUCT ( arbelprm_cq_arm_db_record );
83 84
 struct MLX_DECLARE_STRUCT ( arbelprm_cq_ci_db_record );
84 85
 struct MLX_DECLARE_STRUCT ( arbelprm_hca_command_register );
86
+struct MLX_DECLARE_STRUCT ( arbelprm_init_hca );
85 87
 struct MLX_DECLARE_STRUCT ( arbelprm_mad_ifc );
86 88
 struct MLX_DECLARE_STRUCT ( arbelprm_mgm_entry );
87 89
 struct MLX_DECLARE_STRUCT ( arbelprm_mgm_hash );
@@ -160,8 +162,6 @@ struct arbel_dev_limits {
160 162
 	unsigned int reserved_qps;
161 163
 	/** Number of reserved EEs */
162 164
 	unsigned int reserved_ees;
163
-	/** Number of reserved MPTs */
164
-	unsigned int reserved_mpts;
165 165
 	/** Number of reserved MTTs */
166 166
 	unsigned int reserved_mtts;
167 167
 	/** Number of reserved CQs */

+ 114
- 2
src/drivers/net/mlx_ipoib/mt25218.c Näytä tiedosto

@@ -226,6 +226,15 @@ arbel_cmd_query_fw ( struct arbel *arbel, struct arbelprm_query_fw *fw ) {
226 226
 			   0, NULL, 0, fw );
227 227
 }
228 228
 
229
+static inline int
230
+arbel_cmd_init_hca ( struct arbel *arbel,
231
+		     const struct arbelprm_init_hca *init_hca ) {
232
+	return arbel_cmd ( arbel,
233
+			   ARBEL_HCR_IN_CMD ( ARBEL_HCR_INIT_HCA,
234
+					      1, sizeof ( *init_hca ) ),
235
+			   0, init_hca, 0, NULL );
236
+}
237
+
229 238
 static inline int
230 239
 arbel_cmd_sw2hw_cq ( struct arbel *arbel, unsigned long cqn,
231 240
 		     const struct arbelprm_completion_queue_context *cqctx ) {
@@ -1499,13 +1508,116 @@ static int arbel_get_limits ( struct arbel *arbel ) {
1499 1508
 }
1500 1509
 
1501 1510
 /**
1502
- * Allocate ICM areas
1511
+ * Get ICM usage
1512
+ *
1513
+ * @v log_num_entries	Log2 of the number of entries
1514
+ * @v entry_size	Entry size
1515
+ * @ret usage		Usage size in ICM
1516
+ */
1517
+static size_t icm_usage ( unsigned int log_num_entries, size_t entry_size ) {
1518
+	size_t usage;
1519
+
1520
+	usage = ( ( 1 << log_num_entries ) * entry_size );
1521
+	usage = ( ( usage + 4095 ) & ~4095 );
1522
+	return usage;
1523
+}
1524
+
1525
+/**
1526
+ * Partition ICM
1503 1527
  *
1504 1528
  * @v arbel		Arbel device
1505 1529
  * @ret rc		Return status code
1506 1530
  */
1507 1531
 static int arbel_alloc_icm ( struct arbel *arbel ) {
1508
-	
1532
+	struct arbelprm_init_hca init_hca;
1533
+	size_t icm_offset = 0;
1534
+	unsigned int log_num_qps, log_num_srqs, log_num_ees, log_num_cqs;
1535
+	unsigned int log_num_mtts, log_num_mpts, log_num_rdbs, log_num_eqs;
1536
+
1537
+	memset ( &init_hca, 0, sizeof ( init_hca ) );
1538
+	icm_offset = ( ( arbel->limits.reserved_uars + 1 ) << 12 );
1539
+
1540
+	/* Queue pair contexts */
1541
+	log_num_qps = fls ( arbel->limits.reserved_qps + ARBEL_MAX_QPS - 1 );
1542
+	MLX_FILL_2 ( &init_hca, 13,
1543
+		     qpc_eec_cqc_eqc_rdb_parameters.qpc_base_addr_l,
1544
+		     ( icm_offset >> 7 ),
1545
+		     qpc_eec_cqc_eqc_rdb_parameters.log_num_of_qp,
1546
+		     log_num_qps );
1547
+	icm_offset += icm_usage ( log_num_qps, arbel->limits.qpc_entry_size );
1548
+
1549
+	/* Extended queue pair contexts */
1550
+	MLX_FILL_1 ( &init_hca, 25,
1551
+		     qpc_eec_cqc_eqc_rdb_parameters.eqpc_base_addr_l,
1552
+		     icm_offset );
1553
+	icm_offset += icm_usage ( log_num_qps, arbel->limits.eqpc_entry_size );
1554
+
1555
+	/* Shared receive queue contexts */
1556
+	log_num_srqs = fls ( arbel->limits.reserved_srqs - 1 );
1557
+	MLX_FILL_2 ( &init_hca, 19,
1558
+		     qpc_eec_cqc_eqc_rdb_parameters.srqc_base_addr_l,
1559
+		     ( icm_offset >> 5 ),
1560
+		     qpc_eec_cqc_eqc_rdb_parameters.log_num_of_srq,
1561
+		     log_num_srqs );
1562
+	icm_offset += icm_usage ( log_num_srqs, arbel->limits.srqc_entry_size );
1563
+
1564
+	/* End-to-end contexts */
1565
+	log_num_ees = fls ( arbel->limits.reserved_ees - 1 );
1566
+	MLX_FILL_2 ( &init_hca, 17,
1567
+		     qpc_eec_cqc_eqc_rdb_parameters.eec_base_addr_l,
1568
+		     ( icm_offset >> 7 ),
1569
+		     qpc_eec_cqc_eqc_rdb_parameters.log_num_of_ee,
1570
+		     log_num_ees );
1571
+	icm_offset += icm_usage ( log_num_ees, arbel->limits.eec_entry_size );
1572
+
1573
+	/* Extended end-to-end contexts */
1574
+	MLX_FILL_1 ( &init_hca, 29,
1575
+		     qpc_eec_cqc_eqc_rdb_parameters.eeec_base_addr_l,
1576
+		     icm_offset );
1577
+	icm_offset += icm_usage ( log_num_ees, arbel->limits.eeec_entry_size );
1578
+
1579
+	/* Completion queue contexts */
1580
+	log_num_cqs = fls ( arbel->limits.reserved_cqs + ARBEL_MAX_CQS - 1 );
1581
+	MLX_FILL_2 ( &init_hca, 21,
1582
+		     qpc_eec_cqc_eqc_rdb_parameters.cqc_base_addr_l,
1583
+		     ( icm_offset >> 6 ),
1584
+		     qpc_eec_cqc_eqc_rdb_parameters.log_num_of_cq,
1585
+		     log_num_cqs );
1586
+	icm_offset += icm_usage ( log_num_cqs, arbel->limits.cqc_entry_size );
1587
+
1588
+	/* Memory translation table */
1589
+	log_num_mtts = fls ( arbel->limits.reserved_mtts - 1 );
1590
+	MLX_FILL_1 ( &init_hca, 65,
1591
+		     tpt_parameters.mtt_base_addr_l, icm_offset );
1592
+	icm_offset += icm_usage ( log_num_mtts, arbel->limits.mtt_entry_size );
1593
+
1594
+	/* Memory protection table */
1595
+	log_num_mpts = fls ( arbel->limits.reserved_mrws - 1 );
1596
+	MLX_FILL_1 ( &init_hca, 61,
1597
+		     tpt_parameters.mpt_base_adr_l, icm_offset );
1598
+	MLX_FILL_1 ( &init_hca, 62,
1599
+		     tpt_parameters.log_mpt_sz, log_num_mpts );
1600
+	icm_offset += icm_usage ( log_num_mpts, arbel->limits.mpt_entry_size );
1601
+
1602
+	/* RDMA something or other */
1603
+	log_num_rdbs = fls ( arbel->limits.reserved_rdbs - 1 );
1604
+	MLX_FILL_1 ( &init_hca, 37,
1605
+		     qpc_eec_cqc_eqc_rdb_parameters.rdb_base_addr_l,
1606
+		     icm_offset );
1607
+	icm_offset += icm_usage ( log_num_rdbs, 32 );
1608
+
1609
+	/* Event queue contexts */
1610
+	log_num_eqs = 6;
1611
+	MLX_FILL_2 ( &init_hca, 33,
1612
+		     qpc_eec_cqc_eqc_rdb_parameters.eqc_base_addr_l,
1613
+		     ( icm_offset >> 6 ),
1614
+		     qpc_eec_cqc_eqc_rdb_parameters.log_num_eq,
1615
+		     log_num_eqs );
1616
+	icm_offset += ( ( 1 << log_num_eqs ) * arbel->limits.eqc_entry_size );
1617
+
1618
+	/* Multicast table */
1619
+
1620
+
1509 1621
 	return 0;
1510 1622
 }
1511 1623
 

Loading…
Peruuta
Tallenna