|
@@ -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
|
|