Browse Source

[golan] Update Connect-IB, ConnectX-4 and ConnectX-4 Lx (Infiniband) support

Updates:
- Nodnic: Support for arm cq doorbell via the UAR BAR
- Ensure hardware is quiescent when no interface is open - WinPE WA
- Support for clear interrupt via BAR
- Nodnic: Support for send TX doorbells via the UAR BAR
- Added ConnectX-5EX device
- Added ConnectX-5 device

Signed-off-by: Raed Salem <raeds@mellanox.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Raed Salem 8 years ago
parent
commit
26050fd4c8
23 changed files with 901 additions and 152 deletions
  1. 131
    35
      src/drivers/infiniband/flexboot_nodnic.c
  2. 27
    1
      src/drivers/infiniband/flexboot_nodnic.h
  3. 126
    80
      src/drivers/infiniband/golan.c
  4. 5
    3
      src/drivers/infiniband/golan.h
  5. 31
    1
      src/drivers/infiniband/mlx_nodnic/include/mlx_nodnic_data_structures.h
  6. 13
    0
      src/drivers/infiniband/mlx_nodnic/include/mlx_port.h
  7. 32
    2
      src/drivers/infiniband/mlx_nodnic/src/mlx_device.c
  8. 343
    11
      src/drivers/infiniband/mlx_nodnic/src/mlx_port.c
  9. 5
    0
      src/drivers/infiniband/mlx_utils/include/private/mlx_pci_priv.h
  10. 1
    0
      src/drivers/infiniband/mlx_utils/include/public/mlx_logging.h
  11. 5
    0
      src/drivers/infiniband/mlx_utils/include/public/mlx_pci.h
  12. 5
    0
      src/drivers/infiniband/mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h
  13. 7
    0
      src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.c
  14. 16
    0
      src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h
  15. 28
    2
      src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.c
  16. 6
    0
      src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h
  17. 83
    11
      src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_prm.h
  18. 1
    1
      src/drivers/infiniband/mlx_utils/src/public/mlx_icmd.c
  19. 16
    0
      src/drivers/infiniband/mlx_utils/src/public/mlx_pci.c
  20. 3
    2
      src/drivers/infiniband/mlx_utils/src/public/mlx_utils.c
  21. 3
    2
      src/drivers/infiniband/mlx_utils_flexboot/include/mlx_logging_priv.h
  22. 1
    1
      src/drivers/infiniband/mlx_utils_flexboot/include/mlx_types_priv.h
  23. 13
    0
      src/drivers/infiniband/mlx_utils_flexboot/src/mlx_pci_priv.c

+ 131
- 35
src/drivers/infiniband/flexboot_nodnic.c View File

22
 #include <stdio.h>
22
 #include <stdio.h>
23
 #include <unistd.h>
23
 #include <unistd.h>
24
 #include <errno.h>
24
 #include <errno.h>
25
-#include <byteswap.h>
26
 #include <ipxe/pci.h>
25
 #include <ipxe/pci.h>
27
 #include <ipxe/malloc.h>
26
 #include <ipxe/malloc.h>
28
 #include <ipxe/umalloc.h>
27
 #include <ipxe/umalloc.h>
31
 #include <ipxe/vlan.h>
30
 #include <ipxe/vlan.h>
32
 #include <ipxe/io.h>
31
 #include <ipxe/io.h>
33
 #include "flexboot_nodnic.h"
32
 #include "flexboot_nodnic.h"
34
-#include "mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h"
35
-#include "mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h"
36
-#include "mlx_utils/include/public/mlx_pci_gw.h"
37
-#include "mlx_utils/mlx_lib/mlx_vmac/mlx_vmac.h"
38
 #include "mlx_utils/include/public/mlx_types.h"
33
 #include "mlx_utils/include/public/mlx_types.h"
39
 #include "mlx_utils/include/public/mlx_utils.h"
34
 #include "mlx_utils/include/public/mlx_utils.h"
40
 #include "mlx_utils/include/public/mlx_bail.h"
35
 #include "mlx_utils/include/public/mlx_bail.h"
43
 #include "mlx_utils/include/public/mlx_pci.h"
38
 #include "mlx_utils/include/public/mlx_pci.h"
44
 #include "mlx_nodnic/include/mlx_device.h"
39
 #include "mlx_nodnic/include/mlx_device.h"
45
 #include "mlx_nodnic/include/mlx_port.h"
40
 #include "mlx_nodnic/include/mlx_port.h"
41
+#include <byteswap.h>
42
+#include <usr/ifmgmt.h>
43
+#include "mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h"
44
+#include "mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h"
45
+#include "mlx_utils/include/public/mlx_pci_gw.h"
46
+#include "mlx_utils/mlx_lib/mlx_vmac/mlx_vmac.h"
46
 
47
 
47
 /***************************************************************************
48
 /***************************************************************************
48
  *
49
  *
52
  */
53
  */
53
 static int flexboot_nodnic_arm_cq ( struct flexboot_nodnic_port *port ) {
54
 static int flexboot_nodnic_arm_cq ( struct flexboot_nodnic_port *port ) {
54
 #ifndef DEVICE_CX3
55
 #ifndef DEVICE_CX3
55
-	mlx_uint32 val = ( port->eth_cq->next_idx & 0xffff );
56
-	if ( nodnic_port_set ( & port->port_priv, nodnic_port_option_arm_cq, val ) ) {
57
-		MLX_DEBUG_ERROR( port->port_priv.device, "Failed to arm the CQ\n" );
58
-		return MLX_FAILED;
56
+	mlx_uint32 val32 = 0;
57
+	union arm_cq_uar cq_uar;
58
+
59
+#define ARM_CQ_UAR_CQ_CI_MASK 0xffffff
60
+#define ARM_CQ_UAR_CMDSN_MASK 3
61
+#define ARM_CQ_UAR_CMDSN_OFFSET 28
62
+#define ARM_CQ_UAR_CQ_CI_OFFSET 0x20
63
+	if ( port->port_priv.device->device_cap.support_bar_cq_ctrl ) {
64
+		cq_uar.dword[0] = cpu_to_be32((port->eth_cq->next_idx  & ARM_CQ_UAR_CQ_CI_MASK) |
65
+				((port->cmdsn++ & ARM_CQ_UAR_CMDSN_MASK) << ARM_CQ_UAR_CMDSN_OFFSET));
66
+		cq_uar.dword[1] = cpu_to_be32(port->eth_cq->cqn);
67
+		wmb();
68
+		writeq(cq_uar.qword, port->port_priv.device->uar.virt + ARM_CQ_UAR_CQ_CI_OFFSET);
69
+		port->port_priv.arm_cq_doorbell_record->dword[0] = cq_uar.dword[1];
70
+		port->port_priv.arm_cq_doorbell_record->dword[1] = cq_uar.dword[0];
71
+	} else {
72
+		val32 = ( port->eth_cq->next_idx & 0xffffff );
73
+		if ( nodnic_port_set ( & port->port_priv, nodnic_port_option_arm_cq, val32 ) ) {
74
+			MLX_DEBUG_ERROR( port->port_priv.device, "Failed to arm the CQ\n" );
75
+			return MLX_FAILED;
76
+		}
59
 	}
77
 	}
60
 #else
78
 #else
61
 	mlx_utils *utils = port->port_priv.device->utils;
79
 	mlx_utils *utils = port->port_priv.device->utils;
77
 		data = ( ( ( port->eth_cq->next_idx & 0xffff ) << 16 ) | 0x0080 );
95
 		data = ( ( ( port->eth_cq->next_idx & 0xffff ) << 16 ) | 0x0080 );
78
 		/* Write the new index and update FW that new data was submitted */
96
 		/* Write the new index and update FW that new data was submitted */
79
 		mlx_pci_mem_write ( utils, MlxPciWidthUint32, 0,
97
 		mlx_pci_mem_write ( utils, MlxPciWidthUint32, 0,
80
-				( mlx_uint64 ) & ( ptr->armcq_cq_ci_dword ), 1, &data );
98
+				( mlx_uintn ) & ( ptr->armcq_cq_ci_dword ), 1, &data );
81
 	}
99
 	}
82
 #endif
100
 #endif
83
 	return 0;
101
 	return 0;
96
 	struct flexboot_nodnic_port *port = &flexboot_nodnic->port[ibdev->port - 1];
114
 	struct flexboot_nodnic_port *port = &flexboot_nodnic->port[ibdev->port - 1];
97
 	struct flexboot_nodnic_completion_queue *flexboot_nodnic_cq;
115
 	struct flexboot_nodnic_completion_queue *flexboot_nodnic_cq;
98
 	mlx_status status = MLX_SUCCESS;
116
 	mlx_status status = MLX_SUCCESS;
117
+	mlx_uint32 cqn;
99
 
118
 
100
 	flexboot_nodnic_cq = (struct flexboot_nodnic_completion_queue *)
119
 	flexboot_nodnic_cq = (struct flexboot_nodnic_completion_queue *)
101
 			zalloc(sizeof(*flexboot_nodnic_cq));
120
 			zalloc(sizeof(*flexboot_nodnic_cq));
114
 	flexboot_nodnic->callbacks->cqe_set_owner(
133
 	flexboot_nodnic->callbacks->cqe_set_owner(
115
 			flexboot_nodnic_cq->nodnic_completion_queue->cq_virt,
134
 			flexboot_nodnic_cq->nodnic_completion_queue->cq_virt,
116
 			cq->num_cqes);
135
 			cq->num_cqes);
117
-
136
+	if ( flexboot_nodnic->device_priv.device_cap.support_bar_cq_ctrl ) {
137
+		status = nodnic_port_query(&port->port_priv,
138
+					nodnic_port_option_cq_n_index,
139
+					(mlx_uint32 *)&cqn );
140
+		MLX_FATAL_CHECK_STATUS(status, read_cqn_err,
141
+				"failed to query cqn");
142
+		cq->cqn = cqn;
143
+	}
118
 
144
 
119
 	ib_cq_set_drvdata ( cq, flexboot_nodnic_cq );
145
 	ib_cq_set_drvdata ( cq, flexboot_nodnic_cq );
120
 	return status;
146
 	return status;
147
+read_cqn_err:
121
 create_err:
148
 create_err:
122
 	free(flexboot_nodnic_cq);
149
 	free(flexboot_nodnic_cq);
123
 qp_alloc_err:
150
 qp_alloc_err:
450
 
477
 
451
 	status = port->port_priv.send_doorbell ( &port->port_priv,
478
 	status = port->port_priv.send_doorbell ( &port->port_priv,
452
 				&send_ring->nodnic_ring, ( mlx_uint16 ) wq->next_idx );
479
 				&send_ring->nodnic_ring, ( mlx_uint16 ) wq->next_idx );
480
+	if ( flexboot_nodnic->callbacks->tx_uar_send_doorbell_fn ) {
481
+		flexboot_nodnic->callbacks->tx_uar_send_doorbell_fn ( ibdev, wqbb );
482
+	}
453
 	if ( status != 0 ) {
483
 	if ( status != 0 ) {
454
 		DBGC ( flexboot_nodnic, "flexboot_nodnic %p ring send doorbell failed\n", flexboot_nodnic );
484
 		DBGC ( flexboot_nodnic, "flexboot_nodnic %p ring send doorbell failed\n", flexboot_nodnic );
455
 	}
485
 	}
1293
 	mlx_pci_gw_teardown( &utils );
1323
 	mlx_pci_gw_teardown( &utils );
1294
 
1324
 
1295
 pci_gw_init_err:
1325
 pci_gw_init_err:
1326
+	mlx_utils_teardown(&utils);
1296
 utils_init_err:
1327
 utils_init_err:
1297
 	DBG ( "%s: NODNIC is %s supported (status = %d)\n",
1328
 	DBG ( "%s: NODNIC is %s supported (status = %d)\n",
1298
 			__FUNCTION__, ( is_supported ? "": "not" ), status );
1329
 			__FUNCTION__, ( is_supported ? "": "not" ), status );
1299
 	return is_supported;
1330
 	return is_supported;
1300
 }
1331
 }
1301
 
1332
 
1333
+
1302
 void flexboot_nodnic_copy_mac ( uint8_t mac_addr[], uint32_t low_byte,
1334
 void flexboot_nodnic_copy_mac ( uint8_t mac_addr[], uint32_t low_byte,
1303
 		uint16_t high_byte ) {
1335
 		uint16_t high_byte ) {
1304
 	union mac_addr {
1336
 	union mac_addr {
1329
 	status = mlx_vmac_query_virt_mac ( flexboot_nodnic_priv->device_priv.utils,
1361
 	status = mlx_vmac_query_virt_mac ( flexboot_nodnic_priv->device_priv.utils,
1330
 			&virt_mac );
1362
 			&virt_mac );
1331
 	if ( ! status ) {
1363
 	if ( ! status ) {
1332
-		DBGC ( flexboot_nodnic_priv, "NODNIC %p Failed to set the virtual MAC\n",
1333
-			flexboot_nodnic_priv );
1364
+		DBGC ( flexboot_nodnic_priv, "NODNIC %p Failed to set the virtual MAC\n"
1365
+			,flexboot_nodnic_priv );
1334
 	}
1366
 	}
1335
 
1367
 
1336
 	return status;
1368
 	return status;
1337
 }
1369
 }
1338
 
1370
 
1371
+
1339
 /**
1372
 /**
1340
  * Set port masking
1373
  * Set port masking
1341
  *
1374
  *
1361
 	return 0;
1394
 	return 0;
1362
 }
1395
 }
1363
 
1396
 
1397
+int init_mlx_utils ( mlx_utils **utils, struct pci_device *pci ) {
1398
+	int rc = 0;
1399
+
1400
+	*utils = ( mlx_utils * ) zalloc ( sizeof ( mlx_utils ) );
1401
+	if ( *utils == NULL ) {
1402
+		DBGC ( utils, "%s: Failed to allocate utils\n", __FUNCTION__ );
1403
+		rc = -1;
1404
+		goto err_utils_alloc;
1405
+	}
1406
+	if ( mlx_utils_init ( *utils, pci ) ) {
1407
+		DBGC ( utils, "%s: mlx_utils_init failed\n", __FUNCTION__ );
1408
+		rc = -1;
1409
+		goto err_utils_init;
1410
+	}
1411
+	if ( mlx_pci_gw_init ( *utils ) ){
1412
+		DBGC ( utils, "%s: mlx_pci_gw_init failed\n", __FUNCTION__ );
1413
+		rc = -1;
1414
+		goto err_cmd_init;
1415
+	}
1416
+
1417
+	return 0;
1418
+
1419
+	mlx_pci_gw_teardown ( *utils );
1420
+err_cmd_init:
1421
+	mlx_utils_teardown ( *utils );
1422
+err_utils_init:
1423
+	free ( *utils );
1424
+err_utils_alloc:
1425
+	*utils = NULL;
1426
+
1427
+	return rc;
1428
+}
1429
+
1430
+void free_mlx_utils ( mlx_utils **utils ) {
1431
+
1432
+	mlx_pci_gw_teardown ( *utils );
1433
+	mlx_utils_teardown ( *utils );
1434
+	free ( *utils );
1435
+	*utils = NULL;
1436
+}
1437
+
1438
+/**
1439
+ * Initialise Nodnic PCI parameters
1440
+ *
1441
+ * @v hermon		Nodnic device
1442
+ */
1443
+static int flexboot_nodnic_alloc_uar ( struct flexboot_nodnic *flexboot_nodnic ) {
1444
+	mlx_status status = MLX_SUCCESS;
1445
+	struct pci_device *pci = flexboot_nodnic->pci;
1446
+	nodnic_uar *uar = &flexboot_nodnic->port[0].port_priv.device->uar;
1447
+
1448
+	if ( ! flexboot_nodnic->device_priv.utils ) {
1449
+		uar->virt = NULL;
1450
+		DBGC ( flexboot_nodnic, "%s: mlx_utils is not initialized \n", __FUNCTION__ );
1451
+		return -EINVAL;
1452
+	}
1453
+
1454
+	if  ( ! flexboot_nodnic->device_priv.device_cap.support_uar_tx_db ) {
1455
+		DBGC ( flexboot_nodnic, "%s: tx db using uar is not supported \n", __FUNCTION__ );
1456
+		return -ENOTSUP;
1457
+	}
1458
+	/* read uar offset then allocate */
1459
+	if  ( ( status = nodnic_port_set_send_uar_offset ( &flexboot_nodnic->port[0].port_priv ) ) ) {
1460
+		DBGC ( flexboot_nodnic, "%s: nodnic_port_set_send_uar_offset failed,"
1461
+				"status = %d\n", __FUNCTION__, status );
1462
+		return -EINVAL;
1463
+	}
1464
+	uar->phys = ( pci_bar_start ( pci, FLEXBOOT_NODNIC_HCA_BAR ) + (mlx_uint32)uar->offset );
1465
+	uar->virt = ( void * )( ioremap ( uar->phys, FLEXBOOT_NODNIC_PAGE_SIZE ) );
1466
+
1467
+	return status;
1468
+}
1469
+
1364
 int flexboot_nodnic_probe ( struct pci_device *pci,
1470
 int flexboot_nodnic_probe ( struct pci_device *pci,
1365
 		struct flexboot_nodnic_callbacks *callbacks,
1471
 		struct flexboot_nodnic_callbacks *callbacks,
1366
 		void *drv_priv __unused ) {
1472
 		void *drv_priv __unused ) {
1388
 	pci_set_drvdata ( pci, flexboot_nodnic_priv );
1494
 	pci_set_drvdata ( pci, flexboot_nodnic_priv );
1389
 
1495
 
1390
 	device_priv = &flexboot_nodnic_priv->device_priv;
1496
 	device_priv = &flexboot_nodnic_priv->device_priv;
1391
-	device_priv->utils = (mlx_utils *)zalloc( sizeof ( mlx_utils ) );
1392
-	if ( device_priv->utils == NULL ) {
1393
-		DBGC ( flexboot_nodnic_priv, "%s: Failed to allocate utils\n", __FUNCTION__ );
1394
-		status = MLX_OUT_OF_RESOURCES;
1395
-		goto utils_err_alloc;
1396
-	}
1397
-
1398
-	status = mlx_utils_init( device_priv->utils, pci );
1399
-	MLX_FATAL_CHECK_STATUS(status, utils_init_err,
1400
-			"mlx_utils_init failed");
1401
-
1402
-	/* nodnic init*/
1403
-	status = mlx_pci_gw_init( device_priv->utils );
1404
-	MLX_FATAL_CHECK_STATUS(status, cmd_init_err,
1405
-			"mlx_pci_gw_init failed");
1497
+	/* init mlx utils */
1498
+	status = init_mlx_utils ( & device_priv->utils, pci );
1499
+	MLX_FATAL_CHECK_STATUS(status, err_utils_init,
1500
+				"init_mlx_utils failed");
1406
 
1501
 
1407
 	/* init device */
1502
 	/* init device */
1408
 	status = nodnic_device_init( device_priv );
1503
 	status = nodnic_device_init( device_priv );
1426
 	MLX_FATAL_CHECK_STATUS(status, err_thin_init_ports,
1521
 	MLX_FATAL_CHECK_STATUS(status, err_thin_init_ports,
1427
 						"flexboot_nodnic_thin_init_ports failed");
1522
 						"flexboot_nodnic_thin_init_ports failed");
1428
 
1523
 
1524
+	if ( ( status = flexboot_nodnic_alloc_uar ( flexboot_nodnic_priv ) ) ) {
1525
+		DBGC(flexboot_nodnic_priv, "%s: flexboot_nodnic_pci_init failed"
1526
+				" ( status = %d )\n",__FUNCTION__, status );
1527
+	}
1528
+
1429
 	/* device reg */
1529
 	/* device reg */
1430
 	status = flexboot_nodnic_set_ports_type( flexboot_nodnic_priv );
1530
 	status = flexboot_nodnic_set_ports_type( flexboot_nodnic_priv );
1431
 	MLX_CHECK_STATUS( flexboot_nodnic_priv, status, err_set_ports_types,
1531
 	MLX_CHECK_STATUS( flexboot_nodnic_priv, status, err_set_ports_types,
1456
 get_cap_err:
1556
 get_cap_err:
1457
 	nodnic_device_teardown ( device_priv );
1557
 	nodnic_device_teardown ( device_priv );
1458
 device_init_err:
1558
 device_init_err:
1459
-	mlx_pci_gw_teardown ( device_priv->utils );
1460
-cmd_init_err:
1461
-utils_init_err:
1462
-	free ( device_priv->utils );
1463
-utils_err_alloc:
1559
+	free_mlx_utils ( & device_priv->utils );
1560
+err_utils_init:
1464
 	free ( flexboot_nodnic_priv );
1561
 	free ( flexboot_nodnic_priv );
1465
 device_err_alloc:
1562
 device_err_alloc:
1466
 	return status;
1563
 	return status;
1473
 
1570
 
1474
 	flexboot_nodnic_ports_unregister_dev ( flexboot_nodnic_priv );
1571
 	flexboot_nodnic_ports_unregister_dev ( flexboot_nodnic_priv );
1475
 	nodnic_device_teardown( device_priv );
1572
 	nodnic_device_teardown( device_priv );
1476
-	mlx_pci_gw_teardown( device_priv->utils );
1477
-	free( device_priv->utils );
1573
+	free_mlx_utils ( & device_priv->utils );
1478
 	free( flexboot_nodnic_priv );
1574
 	free( flexboot_nodnic_priv );
1479
 }
1575
 }

+ 27
- 1
src/drivers/infiniband/flexboot_nodnic.h View File

27
 #include <ipxe/io.h>
27
 #include <ipxe/io.h>
28
 #include <ipxe/infiniband.h>
28
 #include <ipxe/infiniband.h>
29
 #include <ipxe/netdevice.h>
29
 #include <ipxe/netdevice.h>
30
+#include "mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h"
30
 
31
 
31
 /*
32
 /*
32
  * If defined, use interrupts in NODNIC driver
33
  * If defined, use interrupts in NODNIC driver
37
 #define FLEXBOOT_NODNIC_PORT_BASE		1
38
 #define FLEXBOOT_NODNIC_PORT_BASE		1
38
 
39
 
39
 #define FLEXBOOT_NODNIC_OPCODE_SEND		0xa
40
 #define FLEXBOOT_NODNIC_OPCODE_SEND		0xa
41
+#define FLEXBOOT_NODNIC_HCA_BAR	PCI_BASE_ADDRESS_0	//BAR 0
42
+#define FLEXBOOT_NODNIC_PAGE_SHIFT	12
43
+#define	FLEXBOOT_NODNIC_PAGE_SIZE		(1 << FLEXBOOT_NODNIC_PAGE_SHIFT)
44
+#define FLEXBOOT_NODNIC_PAGE_MASK		(FLEXBOOT_NODNIC_PAGE_SIZE - 1)
40
 
45
 
41
 /* Port protocol */
46
 /* Port protocol */
42
 enum flexboot_nodnic_protocol {
47
 enum flexboot_nodnic_protocol {
60
 	struct ib_completion_queue *eth_cq;
65
 	struct ib_completion_queue *eth_cq;
61
 	/** Ethernet queue pair */
66
 	/** Ethernet queue pair */
62
 	struct ib_queue_pair *eth_qp;
67
 	struct ib_queue_pair *eth_qp;
68
+	mlx_uint8 cmdsn;
63
 };
69
 };
64
 
70
 
65
 
71
 
136
 	mlx_uint32 byte_cnt;
142
 	mlx_uint32 byte_cnt;
137
 };
143
 };
138
 
144
 
145
+union arm_cq_uar {
146
+	struct {
147
+		//big endian
148
+		mlx_uint32 reserved0	:2;
149
+		mlx_uint32 cmdn			:2;
150
+		mlx_uint32 reserved1	:3;
151
+		mlx_uint32 cmd			:1;
152
+		mlx_uint32 cq_ci		:24;
153
+		mlx_uint32 reserved2	:8;
154
+		mlx_uint32 cq_n		:24;
155
+	};
156
+	mlx_uint32 dword[2];
157
+	mlx_uint64 qword;
158
+};
159
+
139
 struct flexboot_nodnic_callbacks {
160
 struct flexboot_nodnic_callbacks {
140
 	mlx_status ( * fill_completion ) ( void *cqe, struct cqe_data *cqe_data );
161
 	mlx_status ( * fill_completion ) ( void *cqe, struct cqe_data *cqe_data );
141
 	mlx_status ( * cqe_set_owner ) ( void *cq, unsigned int num_cqes );
162
 	mlx_status ( * cqe_set_owner ) ( void *cq, unsigned int num_cqes );
149
 				unsigned long wqe_idx
170
 				unsigned long wqe_idx
150
 				);
171
 				);
151
 	void ( * irq ) ( struct net_device *netdev, int enable );
172
 	void ( * irq ) ( struct net_device *netdev, int enable );
173
+	mlx_status ( * tx_uar_send_doorbell_fn ) (
174
+					struct ib_device *ibdev,
175
+					struct nodnic_send_wqbb *wqbb
176
+					);
152
 };
177
 };
153
 
178
 
154
 int flexboot_nodnic_probe ( struct pci_device *pci,
179
 int flexboot_nodnic_probe ( struct pci_device *pci,
159
 int flexboot_nodnic_is_supported ( struct pci_device *pci );
184
 int flexboot_nodnic_is_supported ( struct pci_device *pci );
160
 void flexboot_nodnic_copy_mac ( uint8_t mac_addr[], uint32_t low_byte,
185
 void flexboot_nodnic_copy_mac ( uint8_t mac_addr[], uint32_t low_byte,
161
 		uint16_t high_byte );
186
 		uint16_t high_byte );
162
-
187
+int init_mlx_utils ( mlx_utils **utils, struct pci_device *pci );
188
+void free_mlx_utils ( mlx_utils **utils );
163
 #endif /* SRC_DRIVERS_INFINIBAND_FLEXBOOT_NODNIC_FLEXBOOT_NODNIC_H_ */
189
 #endif /* SRC_DRIVERS_INFINIBAND_FLEXBOOT_NODNIC_FLEXBOOT_NODNIC_H_ */

+ 126
- 80
src/drivers/infiniband/golan.c View File

21
 
21
 
22
 #include <errno.h>
22
 #include <errno.h>
23
 #include <strings.h>
23
 #include <strings.h>
24
-#include <byteswap.h>
25
 #include <ipxe/malloc.h>
24
 #include <ipxe/malloc.h>
26
 #include <ipxe/umalloc.h>
25
 #include <ipxe/umalloc.h>
27
 #include <ipxe/infiniband.h>
26
 #include <ipxe/infiniband.h>
28
 #include <ipxe/ib_smc.h>
27
 #include <ipxe/ib_smc.h>
29
 #include <ipxe/iobuf.h>
28
 #include <ipxe/iobuf.h>
30
 #include <ipxe/netdevice.h>
29
 #include <ipxe/netdevice.h>
30
+#include "flexboot_nodnic.h"
31
 #include <ipxe/ethernet.h>
31
 #include <ipxe/ethernet.h>
32
 #include <ipxe/if_ether.h>
32
 #include <ipxe/if_ether.h>
33
+#include <usr/ifmgmt.h>
33
 #include <ipxe/in.h>
34
 #include <ipxe/in.h>
35
+#include <byteswap.h>
36
+#include "mlx_utils/include/public/mlx_pci_gw.h"
37
+#include <config/general.h>
34
 #include <ipxe/ipoib.h>
38
 #include <ipxe/ipoib.h>
35
-#include "flexboot_nodnic.h"
39
+#include "mlx_nodnic/include/mlx_port.h"
36
 #include "nodnic_shomron_prm.h"
40
 #include "nodnic_shomron_prm.h"
37
 #include "golan.h"
41
 #include "golan.h"
38
 #include "mlx_utils/include/public/mlx_bail.h"
42
 #include "mlx_utils/include/public/mlx_bail.h"
39
 #include "mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h"
43
 #include "mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h"
40
-#include "mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h"
41
-#include "mlx_utils/include/public/mlx_pci_gw.h"
42
-#include "mlx_nodnic/include/mlx_port.h"
43
 
44
 
45
+#define DEVICE_IS_CIB( device ) ( device == 0x1011 )
44
 /******************************************************************************/
46
 /******************************************************************************/
45
 /************* Very simple memory management for umalloced pages **************/
47
 /************* Very simple memory management for umalloced pages **************/
46
 /******* Temporary solution until full memory management is implemented *******/
48
 /******* Temporary solution until full memory management is implemented *******/
47
 /******************************************************************************/
49
 /******************************************************************************/
48
-#define GOLAN_PAGES	20
49
 struct golan_page {
50
 struct golan_page {
50
 	struct list_head list;
51
 	struct list_head list;
51
 	userptr_t addr;
52
 	userptr_t addr;
61
 }
62
 }
62
 
63
 
63
 static int golan_init_pages ( struct list_head *head ) {
64
 static int golan_init_pages ( struct list_head *head ) {
64
-	struct golan_page *new_entry;
65
-	int rc, i;
65
+	int rc = 0;
66
 
66
 
67
 	if ( !head ) {
67
 	if ( !head ) {
68
 		rc = -EINVAL;
68
 		rc = -EINVAL;
70
 	}
70
 	}
71
 
71
 
72
 	INIT_LIST_HEAD ( head );
72
 	INIT_LIST_HEAD ( head );
73
+	return rc;
73
 
74
 
74
-	for ( i = 0; i < GOLAN_PAGES; i++ ) {
75
-		new_entry = zalloc ( sizeof ( *new_entry ) );
76
-		if ( new_entry == NULL ) {
77
-			rc = -ENOMEM;
78
-			goto err_golan_init_pages_alloc_page;
79
-		}
80
-		new_entry->addr = umalloc ( GOLAN_PAGE_SIZE );
81
-		if ( new_entry->addr == UNULL ) {
82
-			free ( new_entry );
83
-			rc = -ENOMEM;
84
-			goto err_golan_init_pages_alloc_page;
85
-		}
86
-		list_add ( &new_entry->list, head );
87
-	}
88
-
89
-	return 0;
90
-
91
-err_golan_init_pages_alloc_page:
92
-	golan_free_pages ( head );
93
 err_golan_init_pages_bad_param:
75
 err_golan_init_pages_bad_param:
94
 	return rc;
76
 	return rc;
95
 }
77
 }
98
 	struct golan_page *page;
80
 	struct golan_page *page;
99
 	userptr_t addr;
81
 	userptr_t addr;
100
 
82
 
101
-	if ( list_empty ( head ) )
102
-		return UNULL;
103
-
104
-	page = list_first_entry ( head, struct golan_page, list );
105
-	list_del ( &page->list );
106
-	addr = page->addr;
107
-	free ( page );
83
+	if ( list_empty ( head ) ) {
84
+		addr = umalloc ( GOLAN_PAGE_SIZE );
85
+		if ( addr == UNULL ) {
86
+			goto err_golan_iget_page_alloc_page;
87
+		}
88
+	} else {
89
+		page = list_first_entry ( head, struct golan_page, list );
90
+		list_del ( &page->list );
91
+		addr = page->addr;
92
+		free ( page );
93
+	}
94
+err_golan_iget_page_alloc_page:
108
 	return addr;
95
 	return addr;
109
 }
96
 }
110
 
97
 
98
+static int golan_return_page ( struct list_head *head,
99
+		userptr_t addr ) {
100
+	struct golan_page *new_entry;
101
+	int rc = 0;
102
+
103
+	if ( ! head ) {
104
+		rc = -EINVAL;
105
+		goto err_golan_return_page_bad_param;
106
+	}
107
+	new_entry = zalloc ( sizeof ( *new_entry ) );
108
+	if ( new_entry == NULL ) {
109
+		rc = -ENOMEM;
110
+		goto err_golan_return_page_alloc_page;
111
+	}
112
+	new_entry->addr = addr;
113
+	list_add_tail( &new_entry->list, head );
114
+
115
+err_golan_return_page_alloc_page:
116
+err_golan_return_page_bad_param:
117
+	return rc;
118
+}
111
 /******************************************************************************/
119
 /******************************************************************************/
112
 
120
 
113
 const char *golan_qp_state_as_string[] = {
121
 const char *golan_qp_state_as_string[] = {
450
 
458
 
451
 static inline int golan_take_pages ( struct golan *golan, uint32_t pages, __be16 func_id ) {
459
 static inline int golan_take_pages ( struct golan *golan, uint32_t pages, __be16 func_id ) {
452
 	uint32_t out_num_entries = 0;
460
 	uint32_t out_num_entries = 0;
453
-	int size_ibox =  sizeof(struct golan_manage_pages_inbox);
454
-	int size_obox = sizeof(struct golan_manage_pages_outbox);
461
+	int size_ibox = 0;
462
+	int size_obox = 0;
455
 	int rc = 0;
463
 	int rc = 0;
456
 
464
 
457
 	DBGC(golan, "%s\n", __FUNCTION__);
465
 	DBGC(golan, "%s\n", __FUNCTION__);
463
 		struct golan_manage_pages_inbox *in;
471
 		struct golan_manage_pages_inbox *in;
464
 		struct golan_manage_pages_outbox_data *out;
472
 		struct golan_manage_pages_outbox_data *out;
465
 
473
 
466
-		size_ibox += (pas_num * GOLAN_PAS_SIZE);
467
-		size_obox += (pas_num * GOLAN_PAS_SIZE);
474
+		size_ibox = sizeof(struct golan_manage_pages_inbox) + (pas_num * GOLAN_PAS_SIZE);
475
+		size_obox = sizeof(struct golan_manage_pages_outbox) + (pas_num * GOLAN_PAS_SIZE);
468
 
476
 
469
 		cmd = write_cmd(golan, MEM_CMD_IDX, GOLAN_CMD_OP_MANAGE_PAGES, GOLAN_PAGES_TAKE,
477
 		cmd = write_cmd(golan, MEM_CMD_IDX, GOLAN_CMD_OP_MANAGE_PAGES, GOLAN_PAGES_TAKE,
470
 				MEM_MBOX, MEM_MBOX,
478
 				MEM_MBOX, MEM_MBOX,
480
 			out = (struct golan_manage_pages_outbox_data *)GET_OUTBOX(golan, MEM_MBOX);
488
 			out = (struct golan_manage_pages_outbox_data *)GET_OUTBOX(golan, MEM_MBOX);
481
 			out_num_entries = be32_to_cpu(((struct golan_manage_pages_outbox *)(cmd->out))->num_entries);
489
 			out_num_entries = be32_to_cpu(((struct golan_manage_pages_outbox *)(cmd->out))->num_entries);
482
 			for (i = 0; i < out_num_entries; ++i) {
490
 			for (i = 0; i < out_num_entries; ++i) {
483
-				ufree(BE64_BUS_2_USR(out->pas[i]));
491
+				golan_return_page ( &golan->pages, ( BE64_BUS_2_USR( out->pas[i] ) ) );
484
 			}
492
 			}
485
 		} else {
493
 		} else {
486
 			if ( rc == -EBUSY ) {
494
 			if ( rc == -EBUSY ) {
503
 
511
 
504
 static inline int golan_provide_pages ( struct golan *golan , uint32_t pages, __be16 func_id ) {
512
 static inline int golan_provide_pages ( struct golan *golan , uint32_t pages, __be16 func_id ) {
505
 	struct mbox *mailbox;
513
 	struct mbox *mailbox;
506
-	int size_ibox =  sizeof(struct golan_manage_pages_inbox);
507
-	int size_obox = sizeof(struct golan_manage_pages_outbox);
514
+	int size_ibox = 0;
515
+	int size_obox = 0;
508
 	int rc = 0;
516
 	int rc = 0;
509
 
517
 
510
 	DBGC(golan, "%s\n", __FUNCTION__);
518
 	DBGC(golan, "%s\n", __FUNCTION__);
517
 		userptr_t addr = 0;
525
 		userptr_t addr = 0;
518
 
526
 
519
 		mailbox = GET_INBOX(golan, MEM_MBOX);
527
 		mailbox = GET_INBOX(golan, MEM_MBOX);
520
-		size_ibox += (pas_num * GOLAN_PAS_SIZE);
521
-		size_obox += (pas_num * GOLAN_PAS_SIZE);
528
+		size_ibox = sizeof(struct golan_manage_pages_inbox) + (pas_num * GOLAN_PAS_SIZE);
529
+		size_obox = sizeof(struct golan_manage_pages_outbox) + (pas_num * GOLAN_PAS_SIZE);
522
 
530
 
523
 		cmd = write_cmd(golan, MEM_CMD_IDX, GOLAN_CMD_OP_MANAGE_PAGES, GOLAN_PAGES_GIVE,
531
 		cmd = write_cmd(golan, MEM_CMD_IDX, GOLAN_CMD_OP_MANAGE_PAGES, GOLAN_PAGES_GIVE,
524
 				MEM_MBOX, MEM_MBOX,
532
 				MEM_MBOX, MEM_MBOX,
531
 		in->num_entries = cpu_to_be32(pas_num);
539
 		in->num_entries = cpu_to_be32(pas_num);
532
 
540
 
533
 		for ( i = 0 , j = MANAGE_PAGES_PSA_OFFSET; i < pas_num; ++i ,++j ) {
541
 		for ( i = 0 , j = MANAGE_PAGES_PSA_OFFSET; i < pas_num; ++i ,++j ) {
534
-			if (!(addr = umalloc(GOLAN_PAGE_SIZE))) {
542
+			if ( ! ( addr = golan_get_page ( & golan->pages ) ) ) {
535
 				rc = -ENOMEM;
543
 				rc = -ENOMEM;
536
 				DBGC (golan ,"Couldnt allocated page \n");
544
 				DBGC (golan ,"Couldnt allocated page \n");
537
 				goto malloc_dma_failed;
545
 				goto malloc_dma_failed;
555
 						get_cmd( golan , MEM_CMD_IDX )->status_own,
563
 						get_cmd( golan , MEM_CMD_IDX )->status_own,
556
 						be32_to_cpu(CMD_SYND(golan, MEM_CMD_IDX)), pas_num);
564
 						be32_to_cpu(CMD_SYND(golan, MEM_CMD_IDX)), pas_num);
557
 			}
565
 			}
558
-			ufree ( addr );
566
+			golan_return_page ( &golan->pages ,addr );
559
 			goto err_send_command;
567
 			goto err_send_command;
560
 		}
568
 		}
561
 	}
569
 	}
834
 	return 0;
842
 	return 0;
835
 
843
 
836
 err_create_eq_cmd:
844
 err_create_eq_cmd:
837
-	ufree(virt_to_user(golan->eq.eqes));
845
+	golan_return_page ( & golan->pages, virt_to_user ( eq->eqes ) );
838
 err_create_eq_eqe_alloc:
846
 err_create_eq_eqe_alloc:
839
 	DBGC (golan ,"%s [%d] out\n", __FUNCTION__, rc);
847
 	DBGC (golan ,"%s [%d] out\n", __FUNCTION__, rc);
840
 	return rc;
848
 	return rc;
859
 	rc = send_command_and_wait(golan, DEF_CMD_IDX, NO_MBOX, NO_MBOX, __FUNCTION__);
867
 	rc = send_command_and_wait(golan, DEF_CMD_IDX, NO_MBOX, NO_MBOX, __FUNCTION__);
860
 	GOLAN_PRINT_RC_AND_CMD_STATUS;
868
 	GOLAN_PRINT_RC_AND_CMD_STATUS;
861
 
869
 
862
-	ufree(virt_to_user(golan->eq.eqes));
870
+	golan_return_page ( &golan->pages, virt_to_user ( golan->eq.eqes ) );
863
 	golan->eq.eqn = 0;
871
 	golan->eq.eqn = 0;
864
 
872
 
865
 	DBGC( golan, "%s Event queue (0x%x) was destroyed\n", __FUNCTION__, eqn);
873
 	DBGC( golan, "%s Event queue (0x%x) was destroyed\n", __FUNCTION__, eqn);
1063
 	return 0;
1071
 	return 0;
1064
 
1072
 
1065
 err_create_cq_cmd:
1073
 err_create_cq_cmd:
1066
-	ufree(virt_to_user(golan_cq->cqes));
1074
+	golan_return_page ( & golan->pages, virt_to_user ( golan_cq->cqes ) );
1067
 err_create_cq_cqe_alloc:
1075
 err_create_cq_cqe_alloc:
1068
 	free_dma(golan_cq->doorbell_record, GOLAN_CQ_DB_RECORD_SIZE);
1076
 	free_dma(golan_cq->doorbell_record, GOLAN_CQ_DB_RECORD_SIZE);
1069
 err_create_cq_db_alloc:
1077
 err_create_cq_db_alloc:
1100
 	cq->cqn = 0;
1108
 	cq->cqn = 0;
1101
 
1109
 
1102
 	ib_cq_set_drvdata(cq, NULL);
1110
 	ib_cq_set_drvdata(cq, NULL);
1103
-	ufree(virt_to_user(golan_cq->cqes));
1111
+	golan_return_page ( & golan->pages, virt_to_user ( golan_cq->cqes ) );
1104
 	free_dma(golan_cq->doorbell_record, GOLAN_CQ_DB_RECORD_SIZE);
1112
 	free_dma(golan_cq->doorbell_record, GOLAN_CQ_DB_RECORD_SIZE);
1105
 	free(golan_cq);
1113
 	free(golan_cq);
1106
 
1114
 
1272
 err_create_qp_cmd:
1280
 err_create_qp_cmd:
1273
 	free_dma(golan_qp->doorbell_record, sizeof(struct golan_qp_db));
1281
 	free_dma(golan_qp->doorbell_record, sizeof(struct golan_qp_db));
1274
 err_create_qp_db_alloc:
1282
 err_create_qp_db_alloc:
1275
-	ufree((userptr_t)golan_qp->wqes);
1283
+	golan_return_page ( & golan->pages, ( userptr_t ) golan_qp->wqes );
1276
 err_create_qp_wqe_alloc:
1284
 err_create_qp_wqe_alloc:
1277
 err_create_qp_sq_size:
1285
 err_create_qp_sq_size:
1278
 err_create_qp_sq_wqe_size:
1286
 err_create_qp_sq_wqe_size:
1326
 
1334
 
1327
 	in->ctx.pri_path.port		= ibdev->port;
1335
 	in->ctx.pri_path.port		= ibdev->port;
1328
 	in->ctx.flags			|= cpu_to_be32(GOLAN_QP_PM_MIGRATED << GOLAN_QP_CTX_PM_STATE_BIT);
1336
 	in->ctx.flags			|= cpu_to_be32(GOLAN_QP_PM_MIGRATED << GOLAN_QP_CTX_PM_STATE_BIT);
1329
-	in->ctx.pri_path.pkey_index	= 0; /* default index */
1337
+	in->ctx.pri_path.pkey_index	= 0;
1330
 	/* QK is 0 */
1338
 	/* QK is 0 */
1331
 	/* QP cntr set 0 */
1339
 	/* QP cntr set 0 */
1332
 	return rc;
1340
 	return rc;
1480
 
1488
 
1481
 	ib_qp_set_drvdata(qp, NULL);
1489
 	ib_qp_set_drvdata(qp, NULL);
1482
 	free_dma(golan_qp->doorbell_record, sizeof(struct golan_qp_db));
1490
 	free_dma(golan_qp->doorbell_record, sizeof(struct golan_qp_db));
1483
-	ufree((userptr_t)golan_qp->wqes);
1491
+	golan_return_page ( & golan->pages, ( userptr_t ) golan_qp->wqes );
1484
 	free(golan_qp);
1492
 	free(golan_qp);
1485
 
1493
 
1486
 	DBGC( golan ,"%s QP 0x%lx was destroyed\n", __FUNCTION__, qpn);
1494
 	DBGC( golan ,"%s QP 0x%lx was destroyed\n", __FUNCTION__, qpn);
1694
 static int golan_query_vport_pkey ( struct ib_device *ibdev ) {
1702
 static int golan_query_vport_pkey ( struct ib_device *ibdev ) {
1695
 	struct golan *golan = ib_get_drvdata ( ibdev );
1703
 	struct golan *golan = ib_get_drvdata ( ibdev );
1696
 	struct golan_cmd_layout	*cmd;
1704
 	struct golan_cmd_layout	*cmd;
1697
-	struct golan_query_hca_vport_pkey_inbox *in;
1698
 	//struct golan_query_hca_vport_pkey_data *pkey_table;
1705
 	//struct golan_query_hca_vport_pkey_data *pkey_table;
1706
+	struct golan_query_hca_vport_pkey_inbox *in;
1699
 	int pkey_table_size_in_entries = (1 << (7 + golan->caps.pkey_table_size));
1707
 	int pkey_table_size_in_entries = (1 << (7 + golan->caps.pkey_table_size));
1700
 	int rc;
1708
 	int rc;
1701
 
1709
 
2244
 }
2252
 }
2245
 
2253
 
2246
 static int golan_set_link_speed ( struct golan *golan ){
2254
 static int golan_set_link_speed ( struct golan *golan ){
2247
-	mlx_utils utils;
2248
 	mlx_status status;
2255
 	mlx_status status;
2249
 	int i = 0;
2256
 	int i = 0;
2257
+	int utils_inited = 0;
2250
 
2258
 
2251
-	memset ( &utils, 0, sizeof ( utils ) );
2252
-
2253
-	status = mlx_utils_init ( &utils, golan->pci );
2254
-	MLX_CHECK_STATUS ( golan->pci, status, utils_init_err, "mlx_utils_init failed" );
2255
-
2256
-	status = mlx_pci_gw_init ( &utils );
2257
-	MLX_CHECK_STATUS ( golan->pci, status, pci_gw_init_err, "mlx_pci_gw_init failed" );
2259
+	if ( ! golan->utils ) {
2260
+		utils_inited = 1;
2261
+		status = init_mlx_utils ( & golan->utils, golan->pci );
2262
+		MLX_CHECK_STATUS ( golan->pci, status, utils_init_err, "mlx_utils_init failed" );
2263
+	}
2258
 
2264
 
2259
 	for ( i = 0; i < golan->caps.num_ports; ++i ) {
2265
 	for ( i = 0; i < golan->caps.num_ports; ++i ) {
2260
-		status = mlx_set_link_speed( &utils, i + 1, LINK_SPEED_IB, LINK_SPEED_SDR );
2266
+		status = mlx_set_link_speed ( golan->utils, i + 1, LINK_SPEED_IB, LINK_SPEED_SDR );
2261
 		MLX_CHECK_STATUS ( golan->pci, status, set_link_speed_err, "mlx_set_link_speed failed" );
2267
 		MLX_CHECK_STATUS ( golan->pci, status, set_link_speed_err, "mlx_set_link_speed failed" );
2262
 	}
2268
 	}
2263
 
2269
 
2264
 set_link_speed_err:
2270
 set_link_speed_err:
2265
-	mlx_pci_gw_teardown( &utils );
2266
-pci_gw_init_err:
2271
+if ( utils_inited )
2272
+	free_mlx_utils ( & golan->utils );
2267
 utils_init_err:
2273
 utils_init_err:
2268
 	return status;
2274
 	return status;
2269
 }
2275
 }
2344
  *
2350
  *
2345
  * @v ibdev		Infiniband device
2351
  * @v ibdev		Infiniband device
2346
  */
2352
  */
2347
-static void golan_ib_close ( struct ib_device *ibdev __unused ) {}
2353
+static void golan_ib_close ( struct ib_device *ibdev ) {
2354
+	struct golan *golan = NULL;
2355
+
2356
+	DBG ( "%s start\n", __FUNCTION__ );
2357
+	if ( ! ibdev )
2358
+		return;
2359
+	golan = ib_get_drvdata ( ibdev );
2360
+	golan_bring_down ( golan );
2361
+	DBG ( "%s end\n", __FUNCTION__ );
2362
+}
2348
 
2363
 
2349
 /**
2364
 /**
2350
  * Initialise Infiniband link
2365
  * Initialise Infiniband link
2353
  * @ret rc		Return status code
2368
  * @ret rc		Return status code
2354
  */
2369
  */
2355
 static int golan_ib_open ( struct ib_device *ibdev ) {
2370
 static int golan_ib_open ( struct ib_device *ibdev ) {
2371
+	struct golan *golan = NULL;
2356
 	DBG ( "%s start\n", __FUNCTION__ );
2372
 	DBG ( "%s start\n", __FUNCTION__ );
2357
 
2373
 
2358
 	if ( ! ibdev )
2374
 	if ( ! ibdev )
2359
 		return -EINVAL;
2375
 		return -EINVAL;
2360
-
2376
+	golan = ib_get_drvdata ( ibdev );
2377
+	golan_bring_up ( golan );
2361
 	golan_ib_update ( ibdev );
2378
 	golan_ib_update ( ibdev );
2362
 
2379
 
2363
 	DBG ( "%s end\n", __FUNCTION__ );
2380
 	DBG ( "%s end\n", __FUNCTION__ );
2417
 		goto err_golan_bringup;
2434
 		goto err_golan_bringup;
2418
 	}
2435
 	}
2419
 
2436
 
2437
+	if ( ! DEVICE_IS_CIB ( pci->device ) ) {
2438
+		if ( init_mlx_utils ( & golan->utils, pci ) ) {
2439
+			rc = -1;
2440
+			goto err_utils_init;
2441
+		}
2442
+	}
2420
 	/* Allocate Infiniband devices */
2443
 	/* Allocate Infiniband devices */
2421
 	for (i = 0; i < golan->caps.num_ports; ++i) {
2444
 	for (i = 0; i < golan->caps.num_ports; ++i) {
2422
 		ibdev = alloc_ibdev( 0 );
2445
 		ibdev = alloc_ibdev( 0 );
2435
 	/* Register devices */
2458
 	/* Register devices */
2436
 	for ( i = 0; i < golan->caps.num_ports; ++i ) {
2459
 	for ( i = 0; i < golan->caps.num_ports; ++i ) {
2437
 		port = &golan->ports[i];
2460
 		port = &golan->ports[i];
2438
-		if ((rc = golan_register_ibdev ( port ) ) != 0 )
2461
+		if ((rc = golan_register_ibdev ( port ) ) != 0 ) {
2439
 			goto err_golan_probe_register_ibdev;
2462
 			goto err_golan_probe_register_ibdev;
2463
+		}
2440
 	}
2464
 	}
2441
 
2465
 
2466
+	golan_bring_down ( golan );
2467
+
2442
 	return 0;
2468
 	return 0;
2443
 
2469
 
2444
 	i = golan->caps.num_ports;
2470
 	i = golan->caps.num_ports;
2450
 err_golan_probe_alloc_ibdev:
2476
 err_golan_probe_alloc_ibdev:
2451
 	for ( i-- ; ( signed int ) i >= 0 ; i-- )
2477
 	for ( i-- ; ( signed int ) i >= 0 ; i-- )
2452
 		ibdev_put ( golan->ports[i].ibdev );
2478
 		ibdev_put ( golan->ports[i].ibdev );
2453
-
2479
+	if ( ! DEVICE_IS_CIB ( pci->device ) ) {
2480
+		free_mlx_utils ( & golan->utils );
2481
+	}
2482
+err_utils_init:
2454
 	golan_bring_down ( golan );
2483
 	golan_bring_down ( golan );
2455
 err_golan_bringup:
2484
 err_golan_bringup:
2456
 err_fw_ver_cmdif:
2485
 err_fw_ver_cmdif:
2476
 	}
2505
 	}
2477
 	for ( i = ( golan->caps.num_ports - 1 ) ; i >= 0 ; i-- ) {
2506
 	for ( i = ( golan->caps.num_ports - 1 ) ; i >= 0 ; i-- ) {
2478
 		netdev_nullify ( golan->ports[i].netdev );
2507
 		netdev_nullify ( golan->ports[i].netdev );
2479
-		netdev_put ( golan->ports[i].netdev );
2480
 	}
2508
 	}
2481
 	for ( i = ( golan->caps.num_ports - 1 ) ; i >= 0 ; i-- ) {
2509
 	for ( i = ( golan->caps.num_ports - 1 ) ; i >= 0 ; i-- ) {
2482
 		ibdev_put ( golan->ports[i].ibdev );
2510
 		ibdev_put ( golan->ports[i].ibdev );
2483
 	}
2511
 	}
2484
-
2485
-	golan_bring_down(golan);
2512
+	if ( ! DEVICE_IS_CIB ( pci->device ) ) {
2513
+		free_mlx_utils ( & golan->utils );
2514
+	}
2486
 	iounmap( golan->iseg );
2515
 	iounmap( golan->iseg );
2487
 	golan_free_pages( &golan->pages );
2516
 	golan_free_pages( &golan->pages );
2488
 	free(golan);
2517
 	free(golan);
2491
 /***************************************************************************
2520
 /***************************************************************************
2492
  * NODNIC operations
2521
  * NODNIC operations
2493
  **************************************************************************/
2522
  **************************************************************************/
2523
+static mlx_status shomron_tx_uar_send_db ( struct ib_device *ibdev,
2524
+		struct nodnic_send_wqbb *wqbb ) {
2525
+	mlx_status status = MLX_SUCCESS;
2526
+	struct flexboot_nodnic *flexboot_nodnic = ib_get_drvdata ( ibdev );
2527
+	struct shomron_nodnic_eth_send_wqe *eth_wqe =
2528
+			( struct shomron_nodnic_eth_send_wqe * )wqbb;
2529
+	struct shomronprm_wqe_segment_ctrl_send *ctrl;
2530
+
2531
+	if ( ! ibdev || ! eth_wqe || ! flexboot_nodnic->device_priv.uar.virt ) {
2532
+		DBG("%s: Invalid parameters\n",__FUNCTION__);
2533
+		status = MLX_FAILED;
2534
+		goto err;
2535
+	}
2536
+	wmb();
2537
+	ctrl = & eth_wqe->ctrl;
2538
+	writeq(*((__be64 *)ctrl), flexboot_nodnic->device_priv.uar.virt + 0x800);
2539
+err:
2540
+	return status;
2541
+}
2542
+
2494
 static mlx_status shomron_fill_eth_send_wqe ( struct ib_device *ibdev,
2543
 static mlx_status shomron_fill_eth_send_wqe ( struct ib_device *ibdev,
2495
 			   struct ib_queue_pair *qp, struct ib_address_vector *av __unused,
2544
 			   struct ib_queue_pair *qp, struct ib_address_vector *av __unused,
2496
 			   struct io_buffer *iobuf, struct nodnic_send_wqbb *wqbb,
2545
 			   struct io_buffer *iobuf, struct nodnic_send_wqbb *wqbb,
2599
 	.fill_completion = shomron_fill_completion,
2648
 	.fill_completion = shomron_fill_completion,
2600
 	.cqe_set_owner = shomron_cqe_set_owner,
2649
 	.cqe_set_owner = shomron_cqe_set_owner,
2601
 	.irq = flexboot_nodnic_eth_irq,
2650
 	.irq = flexboot_nodnic_eth_irq,
2651
+	.tx_uar_send_doorbell_fn = shomron_tx_uar_send_db,
2602
 };
2652
 };
2603
 
2653
 
2604
 static int shomron_nodnic_supported = 0;
2654
 static int shomron_nodnic_supported = 0;
2605
 
2655
 
2606
 static int shomron_nodnic_is_supported ( struct pci_device *pci ) {
2656
 static int shomron_nodnic_is_supported ( struct pci_device *pci ) {
2607
-	if ( pci->device == 0x1011 )
2657
+	if ( DEVICE_IS_CIB ( pci->device ) )
2608
 		return 0;
2658
 		return 0;
2609
 
2659
 
2610
 	return flexboot_nodnic_is_supported ( pci );
2660
 	return flexboot_nodnic_is_supported ( pci );
2624
 
2674
 
2625
 	shomron_nodnic_supported = shomron_nodnic_is_supported ( pci );
2675
 	shomron_nodnic_supported = shomron_nodnic_is_supported ( pci );
2626
 	if ( shomron_nodnic_supported ) {
2676
 	if ( shomron_nodnic_supported ) {
2677
+		DBG ( "%s: Using NODNIC driver\n", __FUNCTION__ );
2627
 		rc = flexboot_nodnic_probe ( pci, &shomron_nodnic_callbacks, NULL );
2678
 		rc = flexboot_nodnic_probe ( pci, &shomron_nodnic_callbacks, NULL );
2628
-		if ( rc == 0 ) {
2629
-			DBG ( "%s: Using NODNIC driver\n", __FUNCTION__ );
2630
-			goto probe_done;
2631
-		}
2632
-		shomron_nodnic_supported = 0;
2633
-	}
2634
-
2635
-	if ( ! shomron_nodnic_supported ) {
2679
+	} else {
2636
 		DBG ( "%s: Using normal driver\n", __FUNCTION__ );
2680
 		DBG ( "%s: Using normal driver\n", __FUNCTION__ );
2637
 		rc = golan_probe_normal ( pci );
2681
 		rc = golan_probe_normal ( pci );
2638
 	}
2682
 	}
2662
 	PCI_ROM ( 0x15b3, 0x1011, "ConnectIB", "ConnectIB HCA driver: DevID 4113", 0 ),
2706
 	PCI_ROM ( 0x15b3, 0x1011, "ConnectIB", "ConnectIB HCA driver: DevID 4113", 0 ),
2663
 	PCI_ROM ( 0x15b3, 0x1013, "ConnectX-4", "ConnectX-4 HCA driver, DevID 4115", 0 ),
2707
 	PCI_ROM ( 0x15b3, 0x1013, "ConnectX-4", "ConnectX-4 HCA driver, DevID 4115", 0 ),
2664
 	PCI_ROM ( 0x15b3, 0x1015, "ConnectX-4Lx", "ConnectX-4Lx HCA driver, DevID 4117", 0 ),
2708
 	PCI_ROM ( 0x15b3, 0x1015, "ConnectX-4Lx", "ConnectX-4Lx HCA driver, DevID 4117", 0 ),
2709
+	PCI_ROM ( 0x15b3, 0x1017, "ConnectX-5", "ConnectX-5 HCA driver, DevID 4119", 0 ),
2710
+	PCI_ROM ( 0x15b3, 0x1019, "ConnectX-5EX", "ConnectX-5EX HCA driver, DevID 4121", 0 ),
2665
 };
2711
 };
2666
 
2712
 
2667
 struct pci_driver golan_driver __pci_driver = {
2713
 struct pci_driver golan_driver __pci_driver = {

+ 5
- 3
src/drivers/infiniband/golan.h View File

22
 
22
 
23
 FILE_LICENCE ( GPL2_OR_LATER );
23
 FILE_LICENCE ( GPL2_OR_LATER );
24
 
24
 
25
+#include <ipxe/pci.h>
26
+#include <ipxe/pcibackup.h>
25
 #include <byteswap.h>
27
 #include <byteswap.h>
26
 #include <errno.h>
28
 #include <errno.h>
29
+#include <ipxe/io.h>
27
 #include <stdio.h>
30
 #include <stdio.h>
28
 #include <unistd.h>
31
 #include <unistd.h>
29
-#include <ipxe/io.h>
30
-#include <ipxe/pci.h>
31
-#include <ipxe/pcibackup.h>
32
 #include "CIB_PRM.h"
32
 #include "CIB_PRM.h"
33
+#include "mlx_utils/include/public/mlx_utils.h"
33
 
34
 
34
 #define GOLAN_PCI_CONFIG_BAR_SIZE	0x100000//HERMON_PCI_CONFIG_BAR_SIZE //TODO: What is the BAR size?
35
 #define GOLAN_PCI_CONFIG_BAR_SIZE	0x100000//HERMON_PCI_CONFIG_BAR_SIZE //TODO: What is the BAR size?
35
 
36
 
319
 	uint32_t			pdn;
320
 	uint32_t			pdn;
320
 	u32				mkey;
321
 	u32				mkey;
321
 	u32				flags;
322
 	u32				flags;
323
+	mlx_utils		*utils;
322
 
324
 
323
 	struct golan_port		ports[GOLAN_MAX_PORTS];
325
 	struct golan_port		ports[GOLAN_MAX_PORTS];
324
 };
326
 };

+ 31
- 1
src/drivers/infiniband/mlx_nodnic/include/mlx_nodnic_data_structures.h View File

36
 typedef struct _nodnic_qp 						nodnic_qp;
36
 typedef struct _nodnic_qp 						nodnic_qp;
37
 typedef struct _nodnic_cq 						nodnic_cq;
37
 typedef struct _nodnic_cq 						nodnic_cq;
38
 typedef struct _nodnic_eq						nodnic_eq;
38
 typedef struct _nodnic_eq						nodnic_eq;
39
+typedef struct _nodnic_qp_db					nodnic_qp_db;
40
+typedef struct _nodnic_arm_cq_db				nodnic_arm_cq_db;
39
 
41
 
40
 /* NODNIC Port states
42
 /* NODNIC Port states
41
  * Bit 0 - port open/close
43
  * Bit 0 - port open/close
73
 struct nodnic_send_wqbb {
75
 struct nodnic_send_wqbb {
74
 	mlx_uint8 force_align[NODNIC_WQBB_SIZE];
76
 	mlx_uint8 force_align[NODNIC_WQBB_SIZE];
75
 };
77
 };
78
+
79
+struct nodnic_doorbell {
80
+	mlx_physical_address doorbell_physical;
81
+	mlx_void *map;
82
+	nodnic_qp_db *qp_doorbell_record;
83
+};
76
 struct nodnic_ring {
84
 struct nodnic_ring {
77
 	mlx_uint32 offset;
85
 	mlx_uint32 offset;
78
 	/** Work queue entries */
86
 	/** Work queue entries */
91
 	mlx_uint32 num_wqes;
99
 	mlx_uint32 num_wqes;
92
 	mlx_uint32 qpn;
100
 	mlx_uint32 qpn;
93
 	mlx_uint32 next_idx;
101
 	mlx_uint32 next_idx;
94
-	mlx_uint32	ring_pi;
102
+	struct nodnic_doorbell recv_doorbell;
103
+	struct nodnic_doorbell send_doorbell;
95
 };
104
 };
96
 
105
 
97
 struct nodnic_send_ring{
106
 struct nodnic_send_ring{
117
 	mlx_void *map;
126
 	mlx_void *map;
118
 	/** cq */
127
 	/** cq */
119
 	mlx_size cq_size;
128
 	mlx_size cq_size;
129
+	struct nodnic_doorbell arm_cq_doorbell;
120
 };
130
 };
121
 
131
 
122
 struct _nodnic_eq{
132
 struct _nodnic_eq{
136
 #ifdef DEVICE_CX3
146
 #ifdef DEVICE_CX3
137
 	mlx_uint8					crspace_doorbells;
147
 	mlx_uint8					crspace_doorbells;
138
 #endif
148
 #endif
149
+	mlx_uint8					support_rx_pi_dma;
150
+	mlx_uint8					support_uar_tx_db;
151
+	mlx_uint8					support_bar_cq_ctrl;
152
+	mlx_uint8					log_uar_page_size;
139
 };
153
 };
140
 
154
 
141
 #ifdef DEVICE_CX3
155
 #ifdef DEVICE_CX3
151
 } __attribute__ ((packed));
165
 } __attribute__ ((packed));
152
 #endif
166
 #endif
153
 
167
 
168
+typedef struct _nodnic_uar_priv{
169
+	mlx_uint8 inited;
170
+	mlx_uint64	offset;
171
+	void	*virt;
172
+	unsigned long	phys;
173
+} nodnic_uar;
174
+
154
 struct _nodnic_device_priv{
175
 struct _nodnic_device_priv{
155
 	mlx_boolean					is_initiailzied;
176
 	mlx_boolean					is_initiailzied;
156
 	mlx_utils					*utils;
177
 	mlx_utils					*utils;
169
 #ifdef DEVICE_CX3
190
 #ifdef DEVICE_CX3
170
 	mlx_void					*crspace_clear_int;
191
 	mlx_void					*crspace_clear_int;
171
 #endif
192
 #endif
193
+	nodnic_uar uar;
172
 };
194
 };
173
 
195
 
174
 struct _nodnic_port_priv{
196
 struct _nodnic_port_priv{
181
 	mlx_uint8				port_num;
203
 	mlx_uint8				port_num;
182
 	nodnic_eq				eq;
204
 	nodnic_eq				eq;
183
 	mlx_mac_address			mac_filters[5];
205
 	mlx_mac_address			mac_filters[5];
206
+	nodnic_arm_cq_db		*arm_cq_doorbell_record;
184
 	mlx_status (*send_doorbell)(
207
 	mlx_status (*send_doorbell)(
185
 			IN nodnic_port_priv		*port_priv,
208
 			IN nodnic_port_priv		*port_priv,
186
 			IN struct nodnic_ring	*ring,
209
 			IN struct nodnic_ring	*ring,
197
 #endif
220
 #endif
198
 };
221
 };
199
 
222
 
223
+struct _nodnic_qp_db {
224
+	mlx_uint32	recv_db;
225
+	mlx_uint32	send_db;
226
+} __attribute ( ( packed ) );
200
 
227
 
228
+struct _nodnic_arm_cq_db {
229
+	mlx_uint32	dword[2];
230
+} __attribute ( ( packed ) );
201
 #endif /* STUB_NODNIC_NODNICDATASTRUCTURES_H_ */
231
 #endif /* STUB_NODNIC_NODNICDATASTRUCTURES_H_ */

+ 13
- 0
src/drivers/infiniband/mlx_nodnic/include/mlx_port.h View File

47
 #ifdef DEVICE_CX3
47
 #ifdef DEVICE_CX3
48
 	nodnic_port_option_crspace_en,
48
 	nodnic_port_option_crspace_en,
49
 #endif
49
 #endif
50
+	nodnic_port_option_send_ring0_uar_index,
51
+	nodnic_port_option_send_ring1_uar_index,
52
+	nodnic_port_option_cq_n_index,
50
 }nodnic_port_option;
53
 }nodnic_port_option;
51
 
54
 
52
 struct nodnic_port_data_entry{
55
 struct nodnic_port_data_entry{
226
 						IN nodnic_port_priv		*port_priv,
229
 						IN nodnic_port_priv		*port_priv,
227
 						OUT mlx_boolean			*change_event
230
 						OUT mlx_boolean			*change_event
228
 						);
231
 						);
232
+mlx_status
233
+nodnic_port_set_send_uar_offset(
234
+		IN  nodnic_port_priv	*port_priv
235
+		);
236
+
237
+mlx_status
238
+nodnic_port_update_tx_db_func(
239
+		IN nodnic_device_priv	*device_priv,
240
+		IN nodnic_port_priv		*port_priv
241
+		);
229
 #endif /* STUB_NODNIC_PORT_H_ */
242
 #endif /* STUB_NODNIC_PORT_H_ */

+ 32
- 2
src/drivers/infiniband/mlx_nodnic/src/mlx_device.c View File

169
 	mlx_status 			status = MLX_SUCCESS;
169
 	mlx_status 			status = MLX_SUCCESS;
170
 	mlx_uint32			disable = 1;
170
 	mlx_uint32			disable = 1;
171
 #ifndef DEVICE_CX3
171
 #ifndef DEVICE_CX3
172
-	status = nodnic_cmd_write(device_priv, NODNIC_NIC_DISABLE_INT_OFFSET, disable);
172
+#define NODNIC_CLEAR_INT_BAR_OFFSET 0x100C
173
+	if ( device_priv->device_cap.support_bar_cq_ctrl ) {
174
+		status = mlx_pci_mem_write ( device_priv->utils, MlxPciWidthUint32, 0,
175
+			( mlx_uint64 ) ( NODNIC_CLEAR_INT_BAR_OFFSET ), 1, &disable );
176
+	} else {
177
+		status = nodnic_cmd_write(device_priv, NODNIC_NIC_DISABLE_INT_OFFSET, disable);
178
+	}
173
 	MLX_CHECK_STATUS(device_priv, status, clear_int_done, "failed writing to disable_bit");
179
 	MLX_CHECK_STATUS(device_priv, status, clear_int_done, "failed writing to disable_bit");
174
 #else
180
 #else
175
 	mlx_utils *utils = device_priv->utils;
181
 	mlx_utils *utils = device_priv->utils;
176
-	mlx_uint64 clear_int = (mlx_uint64)(device_priv->crspace_clear_int);
182
+	mlx_uint64 clear_int = (mlx_uintn)(device_priv->crspace_clear_int);
177
 	mlx_uint32 swapped = 0;
183
 	mlx_uint32 swapped = 0;
178
 
184
 
179
 	if (device_priv->device_cap.crspace_doorbells == 0) {
185
 	if (device_priv->device_cap.crspace_doorbells == 0) {
303
 	status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x14, (mlx_uint32*)&guid_l);
309
 	status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x14, (mlx_uint32*)&guid_l);
304
 	MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic guid_l");
310
 	MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic guid_l");
305
 	device_priv->device_guid = guid_l | (guid_h << 32);
311
 	device_priv->device_guid = guid_l | (guid_h << 32);
312
+
313
+#define NODNIC_DEVICE_SUPPORT_RX_PI_DMA_OFFSET 31
314
+#define NODNIC_DEVICE_SUPPORT_RX_PI_DMA_MASK 0x1
315
+#define NODNIC_DEVICE_SUPPORT_UAR_TRX_DB_OFFSET 29
316
+#define NODNIC_DEVICE_SUPPORT_UAR_TRX_DB_MASK 0x1
317
+#define NODNIC_DEVICE_SUPPORT_BAR_CQ_CONTROL_OFFSET 27
318
+#define NODNIC_DEVICE_SUPPORT_BAR_CQ_CONTROL_MASK 0x1
319
+	status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x1c, &buffer);
320
+	MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic support_rx_pi_dma");
321
+	if ( sizeof ( mlx_uintn ) == sizeof ( mlx_uint32 ) ) {
322
+		device_cap->support_rx_pi_dma = FALSE;
323
+		device_cap->support_uar_tx_db = FALSE;
324
+		device_cap->support_bar_cq_ctrl = FALSE;
325
+	} else {
326
+		device_cap->support_rx_pi_dma = CHECK_BIT(buffer, NODNIC_DEVICE_SUPPORT_RX_PI_DMA_OFFSET);
327
+		device_cap->support_uar_tx_db = CHECK_BIT(buffer, NODNIC_DEVICE_SUPPORT_UAR_TRX_DB_OFFSET);
328
+		device_cap->support_bar_cq_ctrl = CHECK_BIT(buffer, NODNIC_DEVICE_SUPPORT_BAR_CQ_CONTROL_OFFSET);
329
+	}
330
+
331
+#define NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_OFFSET 0
332
+#define NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_MASK 0xFF
333
+	status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x20, &buffer);
334
+	MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic log_uar_page_size");
335
+	device_cap->log_uar_page_size = ( buffer >> NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_OFFSET) & NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_MASK;
306
 read_err:
336
 read_err:
307
 parm_err:
337
 parm_err:
308
 	return status;
338
 	return status;

+ 343
- 11
src/drivers/infiniband/mlx_nodnic/src/mlx_port.c View File

55
 		PortDataEntry(nodnic_port_option_cq_addr_high, 0x68, 0, 0xFFFFFFFF),
55
 		PortDataEntry(nodnic_port_option_cq_addr_high, 0x68, 0, 0xFFFFFFFF),
56
 		PortDataEntry(nodnic_port_option_port_management_change_event, 0x0, 30, 0x1),
56
 		PortDataEntry(nodnic_port_option_port_management_change_event, 0x0, 30, 0x1),
57
 		PortDataEntry(nodnic_port_option_port_promisc_en, 0x4, 29, 0x1),
57
 		PortDataEntry(nodnic_port_option_port_promisc_en, 0x4, 29, 0x1),
58
+#ifndef DEVICE_CX3
59
+		PortDataEntry(nodnic_port_option_arm_cq, 0x78, 8, 0xffffff),
60
+#else
58
 		PortDataEntry(nodnic_port_option_arm_cq, 0x78, 8, 0xffff),
61
 		PortDataEntry(nodnic_port_option_arm_cq, 0x78, 8, 0xffff),
62
+#endif
59
 		PortDataEntry(nodnic_port_option_port_promisc_multicast_en, 0x4, 28, 0x1),
63
 		PortDataEntry(nodnic_port_option_port_promisc_multicast_en, 0x4, 28, 0x1),
60
 #ifdef DEVICE_CX3
64
 #ifdef DEVICE_CX3
61
 		PortDataEntry(nodnic_port_option_crspace_en, 0x4, 27, 0x1),
65
 		PortDataEntry(nodnic_port_option_crspace_en, 0x4, 27, 0x1),
62
 #endif
66
 #endif
67
+		PortDataEntry(nodnic_port_option_send_ring0_uar_index, 0x108, 0, 0xFFFFFFFF),
68
+		PortDataEntry(nodnic_port_option_send_ring1_uar_index, 0x10c, 0, 0xFFFFFFFF),
69
+		PortDataEntry(nodnic_port_option_cq_n_index, 0x118, 0, 0xFFFFFF),
63
 };
70
 };
64
 
71
 
65
 #define MAX_QP_DATA_ENTRIES 5
72
 #define MAX_QP_DATA_ENTRIES 5
186
 	return status;
193
 	return status;
187
 }
194
 }
188
 
195
 
196
+mlx_status
197
+nodnic_port_set_send_uar_offset(
198
+		IN  nodnic_port_priv	*port_priv
199
+		)
200
+{
201
+	mlx_status status = MLX_SUCCESS;
202
+	mlx_uint32 out = 0;
203
+
204
+	if  ( ! port_priv->device->device_cap.support_uar_tx_db ) {
205
+		MLX_DEBUG_INFO1 ( port_priv, "nodnic_port_set_send_uar_offset: tx db using uar is not supported \n");
206
+		status = MLX_UNSUPPORTED;
207
+		goto uar_not_supported;
208
+   }
209
+
210
+	status = nodnic_port_query(port_priv,
211
+			nodnic_port_option_send_ring0_uar_index, &out);
212
+	MLX_CHECK_STATUS(port_priv->device, status, query_err,
213
+			"nodnic_port_query failed");
214
+	port_priv->device->uar.offset = out << port_priv->device->device_cap.log_uar_page_size;
215
+uar_not_supported:
216
+query_err:
217
+	return status;
218
+}
219
+
189
 mlx_status
220
 mlx_status
190
 nodnic_port_read_reset_needed(
221
 nodnic_port_read_reset_needed(
191
 						IN nodnic_port_priv		*port_priv,
222
 						IN nodnic_port_priv		*port_priv,
220
 	return status;
251
 	return status;
221
 }
252
 }
222
 
253
 
254
+static
255
+mlx_status
256
+nodnic_port_allocate_dbr_dma (
257
+		IN nodnic_port_priv	*port_priv,
258
+		IN struct nodnic_doorbell	*nodnic_db,
259
+		IN mlx_uint32	dbr_addr_low_ofst,
260
+		IN mlx_uint32	dbr_addr_high_ofst,
261
+		IN void	**dbr_addr,
262
+		IN mlx_size	size,
263
+		IN void	**map
264
+		)
265
+{
266
+	mlx_status status = MLX_SUCCESS;
267
+	mlx_uint64 address = 0;
268
+	nodnic_device_priv *device_priv = NULL;
269
+
270
+	if( port_priv == NULL || nodnic_db == NULL ){
271
+			status = MLX_INVALID_PARAMETER;
272
+			goto invalid_parm;
273
+	}
274
+
275
+	device_priv = port_priv->device;
276
+	status = mlx_memory_alloc_dma(device_priv->utils,
277
+					size,
278
+					NODNIC_MEMORY_ALIGN,
279
+					(void **)dbr_addr
280
+					);
281
+	MLX_FATAL_CHECK_STATUS(status, alloc_db_record_err,
282
+				"doorbell record dma allocation error");
283
+
284
+	status = mlx_memory_map_dma(device_priv->utils,
285
+					(void *)(*dbr_addr),
286
+					size,
287
+					&nodnic_db->doorbell_physical,
288
+					map//nodnic_ring->map
289
+					);
290
+	MLX_FATAL_CHECK_STATUS(status, map_db_record_err,
291
+				"doorbell record map dma error");
292
+
293
+	address = (mlx_uint64)nodnic_db->doorbell_physical;
294
+	status = nodnic_cmd_write(device_priv,
295
+				dbr_addr_low_ofst,
296
+				(mlx_uint32)address);
297
+	MLX_FATAL_CHECK_STATUS(status, set_err,
298
+			"failed to set doorbell addr low");
299
+
300
+	address = address >> 32;
301
+	status = nodnic_cmd_write(device_priv,
302
+				dbr_addr_high_ofst,
303
+				(mlx_uint32)address);
304
+	MLX_FATAL_CHECK_STATUS(status, set_err,
305
+			"failed to set doorbell addr high");
306
+
307
+	return status;
308
+
309
+set_err:
310
+	mlx_memory_ummap_dma(device_priv->utils, *map);
311
+map_db_record_err:
312
+	mlx_memory_free_dma(device_priv->utils, size,
313
+		(void **)dbr_addr);
314
+alloc_db_record_err:
315
+invalid_parm:
316
+	return status;
317
+}
318
+
319
+static
320
+mlx_status
321
+nodnic_port_cq_dbr_dma_init(
322
+		IN nodnic_port_priv	*port_priv,
323
+		OUT nodnic_cq	**cq
324
+		)
325
+{
326
+	mlx_status status = MLX_SUCCESS;
327
+	nodnic_device_priv *device_priv = NULL;
328
+
329
+	if( port_priv == NULL ){
330
+		status = MLX_INVALID_PARAMETER;
331
+		goto invalid_parm;
332
+	}
333
+
334
+	device_priv =  port_priv->device;
335
+	if ( ! device_priv->device_cap.support_bar_cq_ctrl ) {
336
+		status = MLX_UNSUPPORTED;
337
+		goto uar_arm_cq_db_unsupported;
338
+	}
339
+
340
+#define NODNIC_PORT_ARM_CQ_DBR_ADDR_LOW_OFFSET 0x114
341
+#define NODNIC_PORT_ARM_CQ_DBR_ADDR_HIGH_OFFSET 0x110
342
+
343
+	status = nodnic_port_allocate_dbr_dma ( port_priv,&(*cq)->arm_cq_doorbell,
344
+			port_priv->port_offset + NODNIC_PORT_ARM_CQ_DBR_ADDR_LOW_OFFSET,
345
+			port_priv->port_offset + NODNIC_PORT_ARM_CQ_DBR_ADDR_HIGH_OFFSET,
346
+			(void **)&port_priv->arm_cq_doorbell_record ,
347
+			sizeof(nodnic_arm_cq_db),
348
+			(void **)&((*cq)->arm_cq_doorbell.map));
349
+	MLX_FATAL_CHECK_STATUS(status, alloc_dbr_dma_err,
350
+				"failed to allocate doorbell record dma");
351
+	return status;
352
+
353
+alloc_dbr_dma_err:
354
+uar_arm_cq_db_unsupported:
355
+invalid_parm:
356
+	return status;
357
+}
358
+
223
 mlx_status
359
 mlx_status
224
 nodnic_port_create_cq(
360
 nodnic_port_create_cq(
225
 					IN nodnic_port_priv	*port_priv,
361
 					IN nodnic_port_priv	*port_priv,
257
 	MLX_FATAL_CHECK_STATUS(status, cq_map_err,
393
 	MLX_FATAL_CHECK_STATUS(status, cq_map_err,
258
 				"cq map error");
394
 				"cq map error");
259
 
395
 
396
+	status = nodnic_port_cq_dbr_dma_init(port_priv,cq);
397
+
260
 	/* update cq address */
398
 	/* update cq address */
261
 #define NODIC_CQ_ADDR_HIGH 0x68
399
 #define NODIC_CQ_ADDR_HIGH 0x68
262
 #define NODIC_CQ_ADDR_LOW 0x6c
400
 #define NODIC_CQ_ADDR_LOW 0x6c
263
 	address = (mlx_uint64)(*cq)->cq_physical;
401
 	address = (mlx_uint64)(*cq)->cq_physical;
264
-	nodnic_port_set(port_priv, nodnic_port_option_cq_addr_low,
265
-			(mlx_uint32)(address >> 12));
402
+	status = nodnic_port_set(port_priv, nodnic_port_option_cq_addr_low,
403
+			(mlx_uint32)(address) >> 12);
404
+	MLX_FATAL_CHECK_STATUS(status, dma_set_addr_low_err,
405
+					"cq set addr low error");
266
 	address = address >> 32;
406
 	address = address >> 32;
267
-	nodnic_port_set(port_priv, nodnic_port_option_cq_addr_high,
407
+	status = nodnic_port_set(port_priv, nodnic_port_option_cq_addr_high,
268
 				(mlx_uint32)address);
408
 				(mlx_uint32)address);
269
-
409
+	MLX_FATAL_CHECK_STATUS(status, dma_set_addr_high_err,
410
+						"cq set addr high error");
270
 	return status;
411
 	return status;
412
+dma_set_addr_high_err:
413
+dma_set_addr_low_err:
271
 	mlx_memory_ummap_dma(device_priv->utils, (*cq)->map);
414
 	mlx_memory_ummap_dma(device_priv->utils, (*cq)->map);
272
 cq_map_err:
415
 cq_map_err:
273
 	mlx_memory_free_dma(device_priv->utils, (*cq)->cq_size,
416
 	mlx_memory_free_dma(device_priv->utils, (*cq)->cq_size,
294
 	}
437
 	}
295
 	device_priv =  port_priv->device;
438
 	device_priv =  port_priv->device;
296
 
439
 
440
+	if ( device_priv->device_cap.support_bar_cq_ctrl ){
441
+			status = mlx_memory_ummap_dma(device_priv->utils,
442
+					cq->arm_cq_doorbell.map);
443
+			if( status != MLX_SUCCESS){
444
+				MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
445
+			}
446
+
447
+			status = mlx_memory_free_dma(device_priv->utils,
448
+					sizeof(nodnic_arm_cq_db),
449
+					(void **)&(port_priv->arm_cq_doorbell_record));
450
+			if( status != MLX_SUCCESS){
451
+				MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
452
+			}
453
+		}
454
+
297
 	mlx_memory_ummap_dma(device_priv->utils, cq->map);
455
 	mlx_memory_ummap_dma(device_priv->utils, cq->map);
298
 
456
 
299
 	mlx_memory_free_dma(device_priv->utils, cq->cq_size,
457
 	mlx_memory_free_dma(device_priv->utils, cq->cq_size,
303
 invalid_parm:
461
 invalid_parm:
304
 	return status;
462
 	return status;
305
 }
463
 }
464
+
465
+static
466
+mlx_status
467
+nodnic_port_allocate_ring_db_dma (
468
+		IN nodnic_port_priv	*port_priv,
469
+		IN struct nodnic_ring *nodnic_ring,
470
+		IN struct nodnic_doorbell *nodnic_db
471
+		)
472
+{
473
+	mlx_status status = MLX_SUCCESS;
474
+
475
+	if( port_priv == NULL || nodnic_ring == NULL || nodnic_db == NULL ){
476
+			status = MLX_INVALID_PARAMETER;
477
+			goto invalid_parm;
478
+	}
479
+#define NODNIC_RING_DBR_ADDR_LOW_OFFSET 0x1C
480
+#define NODNIC_RING_DBR_ADDR_HIGH_OFFSET 0x18
481
+	status = nodnic_port_allocate_dbr_dma ( port_priv,nodnic_db,
482
+			nodnic_ring->offset + NODNIC_RING_DBR_ADDR_LOW_OFFSET,
483
+			nodnic_ring->offset + NODNIC_RING_DBR_ADDR_HIGH_OFFSET,
484
+			(void **)&nodnic_db->qp_doorbell_record,
485
+			sizeof(nodnic_qp_db),
486
+			(void **)&nodnic_ring->map );
487
+	MLX_FATAL_CHECK_STATUS(status, alloc_dbr_dma_err,
488
+			"failed to allocate doorbell record dma");
489
+
490
+	return status;
491
+alloc_dbr_dma_err:
492
+invalid_parm:
493
+	return status;
494
+}
495
+
496
+static
497
+mlx_status
498
+nodnic_port_rx_pi_dma_alloc(
499
+		IN nodnic_port_priv	*port_priv,
500
+		OUT nodnic_qp	**qp
501
+		)
502
+{
503
+	mlx_status status = MLX_SUCCESS;
504
+	nodnic_device_priv *device_priv = NULL;
505
+
506
+	if( port_priv == NULL || qp == NULL){
507
+		status = MLX_INVALID_PARAMETER;
508
+		goto invalid_parm;
509
+	}
510
+
511
+	device_priv =  port_priv->device;
512
+
513
+	if ( ! device_priv->device_cap.support_rx_pi_dma ) {
514
+		goto rx_pi_dma_unsupported;
515
+	}
516
+
517
+	if ( device_priv->device_cap.support_rx_pi_dma ) {
518
+		status = nodnic_port_allocate_ring_db_dma(port_priv,
519
+				&(*qp)->receive.nodnic_ring,&(*qp)->receive.nodnic_ring.recv_doorbell);
520
+		MLX_FATAL_CHECK_STATUS(status, dma_alloc_err,
521
+				"rx doorbell dma allocation error");
522
+	}
523
+
524
+	return status;
525
+
526
+dma_alloc_err:
527
+rx_pi_dma_unsupported:
528
+invalid_parm:
529
+	return status;
530
+}
531
+
532
+static
533
+mlx_status
534
+nodnic_port_send_db_dma(
535
+		IN nodnic_port_priv	*port_priv,
536
+		IN struct nodnic_ring *ring,
537
+		IN mlx_uint16 index
538
+		)
539
+{
540
+	mlx_uint32 swapped = 0;
541
+	mlx_uint32 index32 = index;
542
+	mlx_memory_cpu_to_be32(port_priv->device->utils, index32, &swapped);
543
+	ring->send_doorbell.qp_doorbell_record->send_db =  swapped;
544
+
545
+	return MLX_SUCCESS;
546
+}
547
+
548
+static
549
+mlx_status
550
+nodnic_port_tx_dbr_dma_init(
551
+		IN nodnic_port_priv	*port_priv,
552
+		OUT nodnic_qp	**qp
553
+		)
554
+{
555
+	mlx_status status = MLX_SUCCESS;
556
+	nodnic_device_priv *device_priv = NULL;
557
+
558
+	if( port_priv == NULL || qp == NULL){
559
+		status = MLX_INVALID_PARAMETER;
560
+		goto invalid_parm;
561
+	}
562
+
563
+	device_priv =  port_priv->device;
564
+
565
+	if ( ! device_priv->device_cap.support_uar_tx_db || ! device_priv->uar.offset ) {
566
+		status = MLX_UNSUPPORTED;
567
+		goto uar_tx_db_unsupported;
568
+	}
569
+	status = nodnic_port_allocate_ring_db_dma(port_priv,
570
+			&(*qp)->send.nodnic_ring,&(*qp)->send.nodnic_ring.send_doorbell);
571
+	MLX_FATAL_CHECK_STATUS(status, dma_alloc_err,
572
+			"tx doorbell dma allocation error");
573
+	port_priv->send_doorbell = nodnic_port_send_db_dma;
574
+
575
+	return status;
576
+
577
+dma_alloc_err:
578
+uar_tx_db_unsupported:
579
+invalid_parm:
580
+
581
+	return status;
582
+}
583
+
306
 mlx_status
584
 mlx_status
307
 nodnic_port_create_qp(
585
 nodnic_port_create_qp(
308
 					IN nodnic_port_priv	*port_priv,
586
 					IN nodnic_port_priv	*port_priv,
376
 	MLX_FATAL_CHECK_STATUS(status, receive_map_err,
654
 	MLX_FATAL_CHECK_STATUS(status, receive_map_err,
377
 				"receive wq map error");
655
 				"receive wq map error");
378
 
656
 
657
+	status = nodnic_port_rx_pi_dma_alloc(port_priv,qp);
658
+	MLX_FATAL_CHECK_STATUS(status, rx_pi_dma_alloc_err,
659
+				"receive db dma error");
660
+
661
+	status = nodnic_port_tx_dbr_dma_init(port_priv,qp);
662
+
663
+
379
 	(*qp)->send.nodnic_ring.wq_size = send_wq_size;
664
 	(*qp)->send.nodnic_ring.wq_size = send_wq_size;
380
 	(*qp)->send.nodnic_ring.num_wqes = send_wqe_num;
665
 	(*qp)->send.nodnic_ring.num_wqes = send_wqe_num;
381
 	(*qp)->receive.nodnic_ring.wq_size = receive_wq_size;
666
 	(*qp)->receive.nodnic_ring.wq_size = receive_wq_size;
420
 write_recv_addr_err:
705
 write_recv_addr_err:
421
 write_send_addr_err:
706
 write_send_addr_err:
422
 	mlx_memory_ummap_dma(device_priv->utils, (*qp)->receive.nodnic_ring.map);
707
 	mlx_memory_ummap_dma(device_priv->utils, (*qp)->receive.nodnic_ring.map);
708
+rx_pi_dma_alloc_err:
423
 receive_map_err:
709
 receive_map_err:
424
 	mlx_memory_ummap_dma(device_priv->utils, (*qp)->send.nodnic_ring.map);
710
 	mlx_memory_ummap_dma(device_priv->utils, (*qp)->send.nodnic_ring.map);
425
 send_map_err:
711
 send_map_err:
457
 		MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
743
 		MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
458
 	}
744
 	}
459
 
745
 
746
+	if ( device_priv->device_cap.support_rx_pi_dma ){
747
+		status = mlx_memory_ummap_dma(device_priv->utils,
748
+					qp->receive.nodnic_ring.recv_doorbell.map);
749
+		if( status != MLX_SUCCESS){
750
+			MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
751
+		}
752
+
753
+		status = mlx_memory_free_dma(device_priv->utils,
754
+				sizeof(nodnic_qp_db),
755
+				(void **)&(qp->receive.nodnic_ring.recv_doorbell.qp_doorbell_record));
756
+		if( status != MLX_SUCCESS){
757
+			MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
758
+		}
759
+	}
760
+
761
+	if ( device_priv->device_cap.support_uar_tx_db || ! device_priv->uar.offset){
762
+		status = mlx_memory_ummap_dma(device_priv->utils,
763
+					qp->send.nodnic_ring.send_doorbell.map);
764
+		if( status != MLX_SUCCESS){
765
+			MLX_DEBUG_ERROR(device_priv, "mlx_memory_ummap_dma failed (Status = %d)\n", status);
766
+		}
767
+
768
+		status = mlx_memory_free_dma(device_priv->utils,
769
+				sizeof(nodnic_qp_db),
770
+				(void **)&(qp->send.nodnic_ring.send_doorbell.qp_doorbell_record));
771
+		if( status != MLX_SUCCESS){
772
+			MLX_DEBUG_ERROR(device_priv, "mlx_memory_free_dma failed (Status = %d)\n", status);
773
+		}
774
+	}
775
+
460
 	status = mlx_memory_free_dma(device_priv->utils,
776
 	status = mlx_memory_free_dma(device_priv->utils,
461
 			qp->receive.nodnic_ring.wq_size,
777
 			qp->receive.nodnic_ring.wq_size,
462
 			(void **)&(qp->receive.wqe_virt));
778
 			(void **)&(qp->receive.wqe_virt));
520
 	nodnic_port_data_flow_gw *ptr = port_priv->data_flow_gw;
836
 	nodnic_port_data_flow_gw *ptr = port_priv->data_flow_gw;
521
 	mlx_uint32 index32 = index;
837
 	mlx_uint32 index32 = index;
522
 	mlx_pci_mem_write(port_priv->device->utils, MlxPciWidthUint32, 0,
838
 	mlx_pci_mem_write(port_priv->device->utils, MlxPciWidthUint32, 0,
523
-			(mlx_uint64)&(ptr->send_doorbell), 1, &index32);
839
+			(mlx_uintn)&(ptr->send_doorbell), 1, &index32);
524
 	return MLX_SUCCESS;
840
 	return MLX_SUCCESS;
525
 }
841
 }
526
 
842
 
535
 	nodnic_port_data_flow_gw *ptr = port_priv->data_flow_gw;
851
 	nodnic_port_data_flow_gw *ptr = port_priv->data_flow_gw;
536
 	mlx_uint32 index32 = index;
852
 	mlx_uint32 index32 = index;
537
 	mlx_pci_mem_write(port_priv->device->utils, MlxPciWidthUint32, 0,
853
 	mlx_pci_mem_write(port_priv->device->utils, MlxPciWidthUint32, 0,
538
-			(mlx_uint64)&(ptr->recv_doorbell), 1, &index32);
854
+			(mlx_uintn)&(ptr->recv_doorbell), 1, &index32);
539
 	return MLX_SUCCESS;
855
 	return MLX_SUCCESS;
540
 }
856
 }
541
 #endif
857
 #endif
858
+static
859
+mlx_status
860
+nodnic_port_recv_db_dma(
861
+		IN nodnic_port_priv	*port_priv __attribute__((unused)),
862
+		IN struct nodnic_ring *ring,
863
+		IN mlx_uint16 index
864
+		)
865
+{
866
+	mlx_uint32 swapped = 0;
867
+	mlx_uint32 index32 = index;
868
+	mlx_memory_cpu_to_be32(port_priv->device->utils, index32, &swapped);
869
+	ring->recv_doorbell.qp_doorbell_record->recv_db =  swapped;
870
+	return MLX_SUCCESS;
871
+}
542
 
872
 
543
 mlx_status
873
 mlx_status
544
 nodnic_port_update_ring_doorbell(
874
 nodnic_port_update_ring_doorbell(
678
 		goto bad_param;
1008
 		goto bad_param;
679
 	}
1009
 	}
680
 
1010
 
681
-	memset(&zero_mac, 0, sizeof(zero_mac));
682
-
683
 	device = port_priv->device;
1011
 	device = port_priv->device;
684
 	utils = device->utils;
1012
 	utils = device->utils;
685
 
1013
 
1014
+	mlx_memory_set(utils, &zero_mac, 0, sizeof(zero_mac));
686
 	/* check if mac already exists */
1015
 	/* check if mac already exists */
687
 	for( ; index < NODNIC_MAX_MAC_FILTERS ; index ++) {
1016
 	for( ; index < NODNIC_MAX_MAC_FILTERS ; index ++) {
688
 		mlx_memory_cmp(utils, &port_priv->mac_filters[index], &mac,
1017
 		mlx_memory_cmp(utils, &port_priv->mac_filters[index], &mac,
759
 		goto bad_param;
1088
 		goto bad_param;
760
 	}
1089
 	}
761
 
1090
 
762
-	memset(&zero_mac, 0, sizeof(zero_mac));
763
-
764
 	device = port_priv->device;
1091
 	device = port_priv->device;
765
 	utils = device->utils;
1092
 	utils = device->utils;
766
 
1093
 
1094
+	mlx_memory_set(utils, &zero_mac, 0, sizeof(zero_mac));
767
 	/* serch for mac filter */
1095
 	/* serch for mac filter */
768
 	for( ; index < NODNIC_MAX_MAC_FILTERS ; index ++) {
1096
 	for( ; index < NODNIC_MAX_MAC_FILTERS ; index ++) {
769
 		mlx_memory_cmp(utils, &port_priv->mac_filters[index], &mac,
1097
 		mlx_memory_cmp(utils, &port_priv->mac_filters[index], &mac,
832
 	nodnic_port_data_flow_gw *ptr = port_priv->data_flow_gw;
1160
 	nodnic_port_data_flow_gw *ptr = port_priv->data_flow_gw;
833
 	mlx_uint32 data = (value ? 0xffffffff : 0x0);
1161
 	mlx_uint32 data = (value ? 0xffffffff : 0x0);
834
 	mlx_pci_mem_write(utils, MlxPciWidthUint32, 0,
1162
 	mlx_pci_mem_write(utils, MlxPciWidthUint32, 0,
835
-			(mlx_uint64)&(ptr->dma_en), 1, &data);
1163
+			(mlx_uintn)&(ptr->dma_en), 1, &data);
836
 	return MLX_SUCCESS;
1164
 	return MLX_SUCCESS;
837
 }
1165
 }
838
 #endif
1166
 #endif
1029
 		port_priv->set_dma = nodnic_port_set_dma_connectx3;
1357
 		port_priv->set_dma = nodnic_port_set_dma_connectx3;
1030
 	}
1358
 	}
1031
 #endif
1359
 #endif
1360
+	if ( device_priv->device_cap.support_rx_pi_dma ) {
1361
+		port_priv->recv_doorbell = nodnic_port_recv_db_dma;
1362
+	}
1363
+
1032
 	/* clear reset_needed */
1364
 	/* clear reset_needed */
1033
 	nodnic_port_read_reset_needed(port_priv, &reset_needed);
1365
 	nodnic_port_read_reset_needed(port_priv, &reset_needed);
1034
 
1366
 

+ 5
- 0
src/drivers/infiniband/mlx_utils/include/private/mlx_pci_priv.h View File

30
 			IN mlx_utils *utils
30
 			IN mlx_utils *utils
31
 			);
31
 			);
32
 
32
 
33
+mlx_status
34
+mlx_pci_teardown_priv(
35
+			IN mlx_utils *utils
36
+			);
37
+
33
 mlx_status
38
 mlx_status
34
 mlx_pci_read_priv(
39
 mlx_pci_read_priv(
35
 			IN mlx_utils *utils,
40
 			IN mlx_utils *utils,

+ 1
- 0
src/drivers/infiniband/mlx_utils/include/public/mlx_logging.h View File

24
 
24
 
25
 #include "../../../mlx_utils_flexboot/include/mlx_logging_priv.h"
25
 #include "../../../mlx_utils_flexboot/include/mlx_logging_priv.h"
26
 
26
 
27
+#define MLX_PRINT(...)				MLX_PRINT_PRIVATE(__VA_ARGS__)
27
 #define MLX_DEBUG_FATAL_ERROR(...)	MLX_DEBUG_FATAL_ERROR_PRIVATE(__VA_ARGS__)
28
 #define MLX_DEBUG_FATAL_ERROR(...)	MLX_DEBUG_FATAL_ERROR_PRIVATE(__VA_ARGS__)
28
 #define MLX_DEBUG_ERROR(...)		MLX_DEBUG_ERROR_PRIVATE(__VA_ARGS__)
29
 #define MLX_DEBUG_ERROR(...)		MLX_DEBUG_ERROR_PRIVATE(__VA_ARGS__)
29
 #define MLX_DEBUG_WARN(...)			MLX_DEBUG_WARN_PRIVATE(__VA_ARGS__)
30
 #define MLX_DEBUG_WARN(...)			MLX_DEBUG_WARN_PRIVATE(__VA_ARGS__)

+ 5
- 0
src/drivers/infiniband/mlx_utils/include/public/mlx_pci.h View File

36
 			IN mlx_utils *utils
36
 			IN mlx_utils *utils
37
 			);
37
 			);
38
 
38
 
39
+mlx_status
40
+mlx_pci_teardown(
41
+			IN mlx_utils *utils
42
+			);
43
+
39
 mlx_status
44
 mlx_status
40
 mlx_pci_read(
45
 mlx_pci_read(
41
 			IN mlx_utils *utils,
46
 			IN mlx_utils *utils,

+ 5
- 0
src/drivers/infiniband/mlx_utils/mlx_lib/mlx_link_speed/mlx_link_speed.h View File

124
 	/* -------------- */
124
 	/* -------------- */
125
 	mlx_uint32 ib_proto_oper	:16;
125
 	mlx_uint32 ib_proto_oper	:16;
126
 	mlx_uint32 ib_link_width_oper	:16;
126
 	mlx_uint32 ib_link_width_oper	:16;
127
+	/* -------------- */
128
+	mlx_uint32 reserved7	:32;
129
+	/* -------------- */
130
+	mlx_uint32 eth_proto_lp_advertise	:32;
131
+	mlx_uint32 reserved[3];
127
 };
132
 };
128
 
133
 
129
 mlx_status
134
 mlx_status

+ 7
- 0
src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.c View File

42
 		TlvMappingEntry(0x2020, 0x2020, NVRAM_TLV_CLASS_PHYSICAL_PORT, FALSE),
42
 		TlvMappingEntry(0x2020, 0x2020, NVRAM_TLV_CLASS_PHYSICAL_PORT, FALSE),
43
 		TlvMappingEntry(0x2021, 0x221, NVRAM_TLV_CLASS_HOST, FALSE),
43
 		TlvMappingEntry(0x2021, 0x221, NVRAM_TLV_CLASS_HOST, FALSE),
44
 		TlvMappingEntry(0x2023, 0x223, NVRAM_TLV_CLASS_HOST, FALSE),
44
 		TlvMappingEntry(0x2023, 0x223, NVRAM_TLV_CLASS_HOST, FALSE),
45
+		TlvMappingEntry(0x2006, 0x206, NVRAM_TLV_CLASS_HOST, FALSE),
45
 		TlvMappingEntry(0x2100, 0x230, NVRAM_TLV_CLASS_HOST, FALSE),
46
 		TlvMappingEntry(0x2100, 0x230, NVRAM_TLV_CLASS_HOST, FALSE),
46
 		TlvMappingEntry(0x2101, 0x231, NVRAM_TLV_CLASS_HOST, FALSE),
47
 		TlvMappingEntry(0x2101, 0x231, NVRAM_TLV_CLASS_HOST, FALSE),
47
 		TlvMappingEntry(0x2102, 0x232, NVRAM_TLV_CLASS_HOST, FALSE),
48
 		TlvMappingEntry(0x2102, 0x232, NVRAM_TLV_CLASS_HOST, FALSE),
53
 		TlvMappingEntry(0x2108, 0x238, NVRAM_TLV_CLASS_HOST, FALSE),
54
 		TlvMappingEntry(0x2108, 0x238, NVRAM_TLV_CLASS_HOST, FALSE),
54
 		TlvMappingEntry(0x2109, 0x239, NVRAM_TLV_CLASS_HOST, FALSE),
55
 		TlvMappingEntry(0x2109, 0x239, NVRAM_TLV_CLASS_HOST, FALSE),
55
 		TlvMappingEntry(0x210A, 0x23A, NVRAM_TLV_CLASS_HOST, FALSE),
56
 		TlvMappingEntry(0x210A, 0x23A, NVRAM_TLV_CLASS_HOST, FALSE),
57
+		TlvMappingEntry(0x2022, 0x222, NVRAM_TLV_CLASS_HOST, FALSE),
56
 		TlvMappingEntry(0x2200, 0x240, NVRAM_TLV_CLASS_HOST, FALSE),
58
 		TlvMappingEntry(0x2200, 0x240, NVRAM_TLV_CLASS_HOST, FALSE),
57
 		TlvMappingEntry(0x2201, 0x241, NVRAM_TLV_CLASS_HOST, FALSE),
59
 		TlvMappingEntry(0x2201, 0x241, NVRAM_TLV_CLASS_HOST, FALSE),
58
 		TlvMappingEntry(0x2202, 0x242, NVRAM_TLV_CLASS_HOST, FALSE),
60
 		TlvMappingEntry(0x2202, 0x242, NVRAM_TLV_CLASS_HOST, FALSE),
60
 		TlvMappingEntry(0x2204, 0x244, NVRAM_TLV_CLASS_HOST, FALSE),
62
 		TlvMappingEntry(0x2204, 0x244, NVRAM_TLV_CLASS_HOST, FALSE),
61
 		TlvMappingEntry(0x2205, 0x245, NVRAM_TLV_CLASS_HOST, FALSE),
63
 		TlvMappingEntry(0x2205, 0x245, NVRAM_TLV_CLASS_HOST, FALSE),
62
 		TlvMappingEntry(0x2207, 0x247, NVRAM_TLV_CLASS_HOST, FALSE),
64
 		TlvMappingEntry(0x2207, 0x247, NVRAM_TLV_CLASS_HOST, FALSE),
65
+		TlvMappingEntry(0x2002, 0x202, NVRAM_TLV_CLASS_HOST, FALSE),
66
+		TlvMappingEntry(0x2004, 0x204, NVRAM_TLV_CLASS_HOST, FALSE),
67
+		TlvMappingEntry(0x110, 0x110, NVRAM_TLV_CLASS_HOST, FALSE),
68
+		TlvMappingEntry(0x192, 0x192, NVRAM_TLV_CLASS_GLOBAL, FALSE),
69
+		TlvMappingEntry(0x101, 0x101, NVRAM_TLV_CLASS_GLOBAL, TRUE),
63
 		TlvMappingEntry(0, 0, 0, 0),
70
 		TlvMappingEntry(0, 0, 0, 0),
64
 };
71
 };
65
 
72
 

+ 16
- 0
src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h View File

107
 	mlx_uint8 data[NVCONFIG_MAX_TLV_SIZE];
107
 	mlx_uint8 data[NVCONFIG_MAX_TLV_SIZE];
108
 };
108
 };
109
 
109
 
110
+struct nv_conf_cap {
111
+	/** WOL En/Dis **/
112
+	mlx_uint8	wol_en;
113
+	/** VPI En/Dis **/
114
+	mlx_uint8	vpi_en;
115
+};
116
+
117
+struct mlx_nvconfig_virt_net_addr {
118
+		mlx_uint32	reserved1		:29;
119
+		mlx_uint32	erase_on_powerup:1;
120
+		mlx_uint32	reserverd2		:1;
121
+		mlx_uint32 	virtual_mac_en 	:1;
122
+		mlx_uint32	virtual_mac_high;
123
+		mlx_uint32	virtual_mac_low;
124
+};
125
+
110
 
126
 
111
 mlx_status
127
 mlx_status
112
 nvconfig_query_capability(
128
 nvconfig_query_capability(

+ 28
- 2
src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.c View File

86
 			"TLV not found. Using hard-coded defaults ");
86
 			"TLV not found. Using hard-coded defaults ");
87
 	port_conf_def->linkup_timeout = nic_boot_ext_conf->linkup_timeout;
87
 	port_conf_def->linkup_timeout = nic_boot_ext_conf->linkup_timeout;
88
 	port_conf_def->ip_ver = nic_boot_ext_conf->ip_ver;
88
 	port_conf_def->ip_ver = nic_boot_ext_conf->ip_ver;
89
-
89
+	port_conf_def->undi_network_wait_to = nic_boot_ext_conf->undi_network_wait_to;
90
 	return MLX_SUCCESS;
90
 	return MLX_SUCCESS;
91
 
91
 
92
 nvdata_access_err:
92
 nvdata_access_err:
93
 	port_conf_def->linkup_timeout = DEFAULT_BOOT_LINK_UP_TO;
93
 	port_conf_def->linkup_timeout = DEFAULT_BOOT_LINK_UP_TO;
94
 	port_conf_def->ip_ver = DEFAULT_BOOT_IP_VER;
94
 	port_conf_def->ip_ver = DEFAULT_BOOT_IP_VER;
95
-
95
+	port_conf_def->undi_network_wait_to = DEFAULT_BOOT_UNDI_NETWORK_WAIT_TO;
96
 	return status;
96
 	return status;
97
 }
97
 }
98
 
98
 
185
 	port_conf_def->iscsi_chap_auth_en = iscsi_gen->chap_auth_en;
185
 	port_conf_def->iscsi_chap_auth_en = iscsi_gen->chap_auth_en;
186
 	port_conf_def->iscsi_lun_busy_retry_count = iscsi_gen->lun_busy_retry_count;
186
 	port_conf_def->iscsi_lun_busy_retry_count = iscsi_gen->lun_busy_retry_count;
187
 	port_conf_def->iscsi_link_up_delay_time = iscsi_gen->link_up_delay_time;
187
 	port_conf_def->iscsi_link_up_delay_time = iscsi_gen->link_up_delay_time;
188
+	port_conf_def->iscsi_drive_num = iscsi_gen->drive_num;
189
+
190
+	return MLX_SUCCESS;
188
 
191
 
189
 nvdata_access_err:
192
 nvdata_access_err:
193
+	port_conf_def->iscsi_drive_num = DEFAULT_ISCSI_DRIVE_NUM;
190
 	return status;
194
 	return status;
191
 }
195
 }
192
 
196
 
327
 	return status;
331
 	return status;
328
 }
332
 }
329
 
333
 
334
+static
335
+mlx_status
336
+nvconfig_get_rom_cap_default_conf( IN void *data,
337
+		IN int status, OUT void *def_struct) {
338
+	union mlx_nvconfig_rom_cap_conf *rom_cap_conf =
339
+			(union mlx_nvconfig_rom_cap_conf *) data;
340
+	struct mlx_nvconfig_conf_defaults *conf_def =
341
+			(struct mlx_nvconfig_conf_defaults *) def_struct;
342
+
343
+	MLX_CHECK_STATUS(NULL, status, nvdata_access_err,
344
+			"TLV not found. Using hard-coded defaults ");
345
+	conf_def->boot_ip_ver_en = rom_cap_conf->boot_ip_ver_en;
346
+
347
+	return MLX_SUCCESS;
348
+
349
+nvdata_access_err:
350
+	rom_cap_conf->boot_ip_ver_en = DEFAULT_BOOT_IP_VERSION_EN;
351
+
352
+	return status;
353
+}
354
+
330
 static struct tlv_default tlv_port_defaults[] = {
355
 static struct tlv_default tlv_port_defaults[] = {
331
 	TlvDefaultEntry(BOOT_SETTINGS_TYPE, union mlx_nvconfig_nic_boot_conf, &nvconfig_get_boot_default_conf),
356
 	TlvDefaultEntry(BOOT_SETTINGS_TYPE, union mlx_nvconfig_nic_boot_conf, &nvconfig_get_boot_default_conf),
332
 	TlvDefaultEntry(BOOT_SETTINGS_EXT_TYPE, union mlx_nvconfig_nic_boot_ext_conf, &nvconfig_get_boot_ext_default_conf),
357
 	TlvDefaultEntry(BOOT_SETTINGS_EXT_TYPE, union mlx_nvconfig_nic_boot_ext_conf, &nvconfig_get_boot_ext_default_conf),
343
 	TlvDefaultEntry(GLOPAL_PCI_CAPS_TYPE, union mlx_nvconfig_virt_caps, &nvconfig_get_nv_virt_caps_default_conf),
368
 	TlvDefaultEntry(GLOPAL_PCI_CAPS_TYPE, union mlx_nvconfig_virt_caps, &nvconfig_get_nv_virt_caps_default_conf),
344
 	TlvDefaultEntry(GLOPAL_PCI_SETTINGS_TYPE, union mlx_nvconfig_virt_conf, &nvconfig_get_nv_virt_default_conf),
369
 	TlvDefaultEntry(GLOPAL_PCI_SETTINGS_TYPE, union mlx_nvconfig_virt_conf, &nvconfig_get_nv_virt_default_conf),
345
 	TlvDefaultEntry(OCSD_OCBB_TYPE, union mlx_nvconfig_ocsd_ocbb_conf, &nvconfig_get_ocsd_ocbb_default_conf),
370
 	TlvDefaultEntry(OCSD_OCBB_TYPE, union mlx_nvconfig_ocsd_ocbb_conf, &nvconfig_get_ocsd_ocbb_default_conf),
371
+	TlvDefaultEntry(NV_ROM_CAP_TYPE, union mlx_nvconfig_rom_cap_conf, &nvconfig_get_rom_cap_default_conf),
346
 };
372
 };
347
 
373
 
348
 static
374
 static

+ 6
- 0
src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_defaults.h View File

32
 #define DEFAULT_BOOT_VLAN 1
32
 #define DEFAULT_BOOT_VLAN 1
33
 #define DEFAULT_ISCSI_DHCP_PARAM_EN 1
33
 #define DEFAULT_ISCSI_DHCP_PARAM_EN 1
34
 #define DEFAULT_ISCSI_IPV4_DHCP_EN 1
34
 #define DEFAULT_ISCSI_IPV4_DHCP_EN 1
35
+#define DEFAULT_ISCSI_DRIVE_NUM 0x80
35
 #define DEFAULT_OCSD_OCBB_EN 1
36
 #define DEFAULT_OCSD_OCBB_EN 1
36
 #define DEFAULT_BOOT_IP_VER 0
37
 #define DEFAULT_BOOT_IP_VER 0
37
 #define DEFAULT_BOOT_LINK_UP_TO 0
38
 #define DEFAULT_BOOT_LINK_UP_TO 0
39
+#define DEFAULT_BOOT_UNDI_NETWORK_WAIT_TO 30
40
+#define DEFAULT_BOOT_IP_VERSION_EN 1
38
 
41
 
39
 struct mlx_nvconfig_port_conf_defaults {
42
 struct mlx_nvconfig_port_conf_defaults {
40
 	mlx_uint8 pptx;
43
 	mlx_uint8 pptx;
56
 	mlx_boolean iscsi_ipv4_dhcp_en;
59
 	mlx_boolean iscsi_ipv4_dhcp_en;
57
 	mlx_uint8 iscsi_lun_busy_retry_count;
60
 	mlx_uint8 iscsi_lun_busy_retry_count;
58
 	mlx_uint8 iscsi_link_up_delay_time;
61
 	mlx_uint8 iscsi_link_up_delay_time;
62
+	mlx_uint8 iscsi_drive_num;
59
 	mlx_uint8 client_identifier;
63
 	mlx_uint8 client_identifier;
60
 	mlx_uint8 mac_admin_bit;
64
 	mlx_uint8 mac_admin_bit;
61
 	mlx_uint8 default_link_type;
65
 	mlx_uint8 default_link_type;
62
 	mlx_uint8 linkup_timeout;
66
 	mlx_uint8 linkup_timeout;
63
 	mlx_uint8 ip_ver;
67
 	mlx_uint8 ip_ver;
68
+	mlx_uint8 undi_network_wait_to;
64
 };
69
 };
65
 
70
 
66
 struct mlx_nvconfig_conf_defaults  {
71
 struct mlx_nvconfig_conf_defaults  {
71
 	mlx_uint8 uar_bar_size;
76
 	mlx_uint8 uar_bar_size;
72
 	mlx_uint8 flexboot_menu_to;
77
 	mlx_uint8 flexboot_menu_to;
73
 	mlx_boolean ocsd_ocbb_en;
78
 	mlx_boolean ocsd_ocbb_en;
79
+	mlx_boolean boot_ip_ver_en;
74
 };
80
 };
75
 
81
 
76
 mlx_status
82
 mlx_status

+ 83
- 11
src/drivers/infiniband/mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig_prm.h View File

33
 	OCSD_OCBB_TYPE 					= 0x2011,
33
 	OCSD_OCBB_TYPE 					= 0x2011,
34
 	FLOW_CONTROL_TYPE				= 0x2020,
34
 	FLOW_CONTROL_TYPE				= 0x2020,
35
 	BOOT_SETTINGS_TYPE				= 0x2021,
35
 	BOOT_SETTINGS_TYPE				= 0x2021,
36
+	NV_ROM_FLEXBOOT_DEBUG				= 0x2004,
37
+
36
 	ISCSI_GENERAL_SETTINGS_TYPE		= 0x2100,
38
 	ISCSI_GENERAL_SETTINGS_TYPE		= 0x2100,
37
 	IB_BOOT_SETTING_TYPE			= 0x2022,
39
 	IB_BOOT_SETTING_TYPE			= 0x2022,
38
 	IB_DHCP_SETTINGS_TYPE			= 0x2023,
40
 	IB_DHCP_SETTINGS_TYPE			= 0x2023,
39
 	GLOPAL_PCI_SETTINGS_TYPE		= 0x80,
41
 	GLOPAL_PCI_SETTINGS_TYPE		= 0x80,
40
 	GLOPAL_PCI_CAPS_TYPE			= 0x81,
42
 	GLOPAL_PCI_CAPS_TYPE			= 0x81,
41
 	GLOBAL_ROM_INI_TYPE				= 0x100,
43
 	GLOBAL_ROM_INI_TYPE				= 0x100,
44
+	NV_VIRT_NET_ADDR				= 0x110,
42
 
45
 
43
 	// Types for iSCSI strings
46
 	// Types for iSCSI strings
44
 	DHCP_VEND_ID					= 0x2101,
47
 	DHCP_VEND_ID					= 0x2101,
59
 	FIRST_TGT_ISCSI_NAME			= 0x2204,
62
 	FIRST_TGT_ISCSI_NAME			= 0x2204,
60
 	FIRST_TGT_CHAP_ID				= 0x2205,
63
 	FIRST_TGT_CHAP_ID				= 0x2205,
61
 	FIRST_TGT_CHAP_PWD				= 0x2207,
64
 	FIRST_TGT_CHAP_PWD				= 0x2207,
65
+	NV_ROM_DEBUG_LEVEL				= 0x2002,
66
+	NV_ROM_CAP_TYPE					= 0x101,
62
 };
67
 };
63
 
68
 
64
 union mlx_nvconfig_nic_boot_conf {
69
 union mlx_nvconfig_nic_boot_conf {
78
 	struct {
83
 	struct {
79
 		mlx_uint32	linkup_timeout	: 8;
84
 		mlx_uint32	linkup_timeout	: 8;
80
 		mlx_uint32	ip_ver			: 2;
85
 		mlx_uint32	ip_ver			: 2;
81
-		mlx_uint32	reserved0		: 22;
86
+		mlx_uint32	reserved0		: 6;
87
+		mlx_uint32	undi_network_wait_to : 8;
88
+		mlx_uint32	reserved1		: 8;
82
 	};
89
 	};
83
 	mlx_uint32 dword;
90
 	mlx_uint32 dword;
84
 };
91
 };
194
 		/*-------------------*/
201
 		/*-------------------*/
195
 		mlx_uint32	lun_busy_retry_count:8;
202
 		mlx_uint32	lun_busy_retry_count:8;
196
 		mlx_uint32	link_up_delay_time	:8;
203
 		mlx_uint32	link_up_delay_time	:8;
197
-		mlx_uint32	reserved4			:16;
204
+		mlx_uint32	drive_num			:8;
205
+		mlx_uint32	reserved4			:8;
198
 	};
206
 	};
199
 	mlx_uint32 dword[3];
207
 	mlx_uint32 dword[3];
200
 };
208
 };
226
 };
234
 };
227
 
235
 
228
 struct  mlx_nvcofnig_romini {
236
 struct  mlx_nvcofnig_romini {
229
-	mlx_uint32 reserved0    :1;
237
+	mlx_uint32 reserved0    		:1;
230
 	mlx_uint32 shared_memory_en     :1;
238
 	mlx_uint32 shared_memory_en     :1;
231
-	mlx_uint32 hii_vpi_en   :1;
232
-	mlx_uint32 tech_enum    :1;
233
-	mlx_uint32 reserved1    :4;
239
+	mlx_uint32 hii_vpi_en   		:1;
240
+	mlx_uint32 tech_enum    		:1;
241
+	mlx_uint32 reserved1    		:4;
234
 	mlx_uint32 static_component_name_string :1;
242
 	mlx_uint32 static_component_name_string :1;
235
 	mlx_uint32 hii_iscsi_configuration      :1;
243
 	mlx_uint32 hii_iscsi_configuration      :1;
236
-	mlx_uint32 hii_ibm_aim  :1;
244
+	mlx_uint32 hii_ibm_aim  		:1;
237
 	mlx_uint32 hii_platform_setup   :1;
245
 	mlx_uint32 hii_platform_setup   :1;
238
 	mlx_uint32 hii_bdf_decimal      :1;
246
 	mlx_uint32 hii_bdf_decimal      :1;
239
 	mlx_uint32 hii_read_only        :1;
247
 	mlx_uint32 hii_read_only        :1;
240
-	mlx_uint32 reserved2    :10;
248
+	mlx_uint32 reserved2    		:10;
241
 	mlx_uint32 mac_enum             :1;
249
 	mlx_uint32 mac_enum             :1;
242
-	mlx_uint32 port_enum    :1;
250
+	mlx_uint32 port_enum    		:1;
243
 	mlx_uint32 flash_en             :1;
251
 	mlx_uint32 flash_en             :1;
244
 	mlx_uint32 fmp_en               :1;
252
 	mlx_uint32 fmp_en               :1;
245
 	mlx_uint32 bofm_en              :1;
253
 	mlx_uint32 bofm_en              :1;
246
-	mlx_uint32 platform_to_driver_en                :1;
254
+	mlx_uint32 platform_to_driver_en:1;
247
 	mlx_uint32 hii_en               :1;
255
 	mlx_uint32 hii_en               :1;
248
 	mlx_uint32 undi_en              :1;
256
 	mlx_uint32 undi_en              :1;
249
 	/* -------------- */
257
 	/* -------------- */
250
 	mlx_uint64 dhcp_user_class;
258
 	mlx_uint64 dhcp_user_class;
251
 	/* -------------- */
259
 	/* -------------- */
252
-	mlx_uint32 reserved3    :22;
260
+	mlx_uint32 reserved3    		:10;
261
+	mlx_uint32 ucm_single_port		:1;
262
+	mlx_uint32 tivoli_wa_en			:1;
263
+	mlx_uint32 dhcp_pxe_discovery_control_dis	:1;
264
+	mlx_uint32 hii_flexaddr_override:1;
265
+	mlx_uint32 hii_flexaddr_setting :1;
266
+	mlx_uint32 guided_ops			:1;
267
+	mlx_uint32 hii_type				:4;
268
+	mlx_uint32 hii_mriname2			:1;
269
+	mlx_uint32 hii_aim_ucm_ver2		:1;
253
 	mlx_uint32 uri_boot_retry_delay :4;
270
 	mlx_uint32 uri_boot_retry_delay :4;
254
 	mlx_uint32 uri_boot_retry       :4;
271
 	mlx_uint32 uri_boot_retry       :4;
255
 	mlx_uint32 option_rom_debug     :1;
272
 	mlx_uint32 option_rom_debug     :1;
256
 	mlx_uint32 promiscuous_vlan     :1;
273
 	mlx_uint32 promiscuous_vlan     :1;
274
+
275
+} __attribute__ ((packed));
276
+
277
+union mlx_nvconfig_debug_conf {
278
+	struct {
279
+	mlx_uint32	dbg_log_en				:1;
280
+	mlx_uint32	reserved1				:31;
281
+		/***************************************************/
282
+	mlx_uint32	stp_dbg_lvl				:2;
283
+	mlx_uint32	romprefix_dbg_lvl		:2;
284
+	mlx_uint32	dhcp_dbg_lvl			:2;
285
+	mlx_uint32	dhcpv6_dbg_lvl			:2;
286
+	mlx_uint32	arp_dbg_lvl				:2;
287
+	mlx_uint32	neighbor_dbg_lvl		:2;
288
+	mlx_uint32	ndp_dbg_lvl				:2;
289
+	mlx_uint32	uri_dbg_lvl				:2;
290
+	mlx_uint32	driver_dbg_lvl			:2;
291
+	mlx_uint32	nodnic_dbg_lvl			:2;
292
+	mlx_uint32	nodnic_cmd_dbg_lvl		:2;
293
+	mlx_uint32	nodnic_device_dbg_lvl	:2;
294
+	mlx_uint32	nodnic_port_dbg_lvl		:2;
295
+	mlx_uint32	netdevice_dbg_lvl		:2;
296
+	mlx_uint32	tftp_dbg_lvl			:2;
297
+	mlx_uint32	udp_dbg_lvl				:2;
298
+		/***************************************************/
299
+	mlx_uint32	tcp_dbg_lvl				:2;
300
+	mlx_uint32	tcpip_dbg_lvl			:2;
301
+	mlx_uint32	ipv4_dbg_lvl			:2;
302
+	mlx_uint32	ipv6_dbg_lvl			:2;
303
+	mlx_uint32	drv_set_dbg_lvl			:2;
304
+	mlx_uint32	stat_update_dbg_lvl		:2;
305
+	mlx_uint32	pxe_undi_dbg_lvl		:2;
306
+	mlx_uint32	reserved2				:18;
307
+	};
308
+	mlx_uint32 dword[3];
309
+};
310
+
311
+union mlx_nvconfig_flexboot_debug {
312
+	struct {
313
+	mlx_uint32	reserved0				:29;
314
+	mlx_uint32	panic_behavior				:2;
315
+	mlx_uint32	boot_to_shell				:1;
316
+	};
317
+	mlx_uint32 dword;
318
+};
319
+
320
+union mlx_nvconfig_rom_cap_conf {
321
+	struct {
322
+		mlx_uint32	reserved0			:28;
323
+		mlx_uint32	uefi_logs_en		:1;
324
+		mlx_uint32	flexboot_debug_en	:1;
325
+		mlx_uint32	boot_debug_log_en	:1;
326
+		mlx_uint32	boot_ip_ver_en		:1;
327
+	};
328
+	mlx_uint32 dword;
257
 };
329
 };
258
 
330
 
259
 #endif /* MLX_NVCONFIG_PRM_H_ */
331
 #endif /* MLX_NVCONFIG_PRM_H_ */

+ 1
- 1
src/drivers/infiniband/mlx_utils/src/public/mlx_icmd.c View File

316
 				)
316
 				)
317
 {
317
 {
318
 	mlx_status status = MLX_SUCCESS;
318
 	mlx_status status = MLX_SUCCESS;
319
-	mlx_uint32 icmd_status = MLX_FAILED;
319
+	mlx_uint32 icmd_status = 0;
320
 
320
 
321
 	if (utils == NULL || data == NULL) {
321
 	if (utils == NULL || data == NULL) {
322
 		status = MLX_INVALID_PARAMETER;
322
 		status = MLX_INVALID_PARAMETER;

+ 16
- 0
src/drivers/infiniband/mlx_utils/src/public/mlx_pci.c View File

20
 FILE_LICENCE ( GPL2_OR_LATER );
20
 FILE_LICENCE ( GPL2_OR_LATER );
21
 
21
 
22
 #include <stddef.h>
22
 #include <stddef.h>
23
+
23
 #include "../../include/private/mlx_pci_priv.h"
24
 #include "../../include/private/mlx_pci_priv.h"
24
 #include "../../include/public/mlx_pci.h"
25
 #include "../../include/public/mlx_pci.h"
25
 
26
 
38
 	return status;
39
 	return status;
39
 }
40
 }
40
 
41
 
42
+mlx_status
43
+mlx_pci_teardown(
44
+			IN mlx_utils *utils
45
+			)
46
+{
47
+	mlx_status status = MLX_SUCCESS;
48
+	if( utils == NULL){
49
+		status = MLX_INVALID_PARAMETER;
50
+		goto bail;
51
+	}
52
+	status = mlx_pci_teardown_priv(utils);
53
+bail:
54
+	return status;
55
+}
56
+
41
 mlx_status
57
 mlx_status
42
 mlx_pci_read(
58
 mlx_pci_read(
43
 			IN mlx_utils *utils,
59
 			IN mlx_utils *utils,

+ 3
- 2
src/drivers/infiniband/mlx_utils/src/public/mlx_utils.c View File

20
 FILE_LICENCE ( GPL2_OR_LATER );
20
 FILE_LICENCE ( GPL2_OR_LATER );
21
 
21
 
22
 #include <stddef.h>
22
 #include <stddef.h>
23
+
23
 #include "../../include/private/mlx_utils_priv.h"
24
 #include "../../include/private/mlx_utils_priv.h"
24
 #include "../../include/public/mlx_pci.h"
25
 #include "../../include/public/mlx_pci.h"
25
 #include "../../include/public/mlx_utils.h"
26
 #include "../../include/public/mlx_utils.h"
26
-
27
 mlx_status
27
 mlx_status
28
 mlx_utils_init(
28
 mlx_utils_init(
29
 				IN mlx_utils *utils,
29
 				IN mlx_utils *utils,
44
 
44
 
45
 mlx_status
45
 mlx_status
46
 mlx_utils_teardown(
46
 mlx_utils_teardown(
47
-				IN mlx_utils *utils __attribute__ ((unused))
47
+				IN mlx_utils *utils
48
 				)
48
 				)
49
 {
49
 {
50
 	mlx_status status = MLX_SUCCESS;
50
 	mlx_status status = MLX_SUCCESS;
51
 	mlx_utils_free_lock(utils);
51
 	mlx_utils_free_lock(utils);
52
+	mlx_pci_teardown(utils);
52
 	return status;
53
 	return status;
53
 }
54
 }
54
 
55
 

+ 3
- 2
src/drivers/infiniband/mlx_utils_flexboot/include/mlx_logging_priv.h View File

12
 #include <compiler.h>
12
 #include <compiler.h>
13
 
13
 
14
 #define MLX_DEBUG_FATAL_ERROR_PRIVATE(...)		do {				\
14
 #define MLX_DEBUG_FATAL_ERROR_PRIVATE(...)		do {				\
15
-		DBG("%s: ",__func__);						\
16
-		DBG(__VA_ARGS__);			\
15
+		printf("%s: ",__func__);						\
16
+		printf(__VA_ARGS__);			\
17
 	} while ( 0 )
17
 	} while ( 0 )
18
 
18
 
19
 #define MLX_DEBUG_ERROR_PRIVATE(id, ...)		do {				\
19
 #define MLX_DEBUG_ERROR_PRIVATE(id, ...)		do {				\
56
 		DBG2(__VA_ARGS__);			\
56
 		DBG2(__VA_ARGS__);			\
57
 	} while ( 0 )
57
 	} while ( 0 )
58
 
58
 
59
+#define MLX_PRINT_PRIVATE(...)				printf(__VA_ARGS__)
59
 
60
 
60
 
61
 
61
 #endif /* STUB_MLXUTILS_INCLUDE_PRIVATE_FLEXBOOT_DEBUG_H_ */
62
 #endif /* STUB_MLXUTILS_INCLUDE_PRIVATE_FLEXBOOT_DEBUG_H_ */

+ 1
- 1
src/drivers/infiniband/mlx_utils_flexboot/include/mlx_types_priv.h View File

33
 typedef uint16_t	mlx_uint16;
33
 typedef uint16_t	mlx_uint16;
34
 typedef uint32_t	mlx_uint32;
34
 typedef uint32_t	mlx_uint32;
35
 typedef uint64_t	mlx_uint64;
35
 typedef uint64_t	mlx_uint64;
36
-typedef uint32_t 	mlx_uintn;
36
+typedef unsigned long	mlx_uintn;
37
 
37
 
38
 typedef int8_t		mlx_int8;
38
 typedef int8_t		mlx_int8;
39
 typedef int16_t		mlx_int16;;
39
 typedef int16_t		mlx_int16;;

+ 13
- 0
src/drivers/infiniband/mlx_utils_flexboot/src/mlx_pci_priv.c View File

6
  */
6
  */
7
 
7
 
8
 #include <ipxe/pci.h>
8
 #include <ipxe/pci.h>
9
+
9
 #include "../../mlx_utils/include/private/mlx_pci_priv.h"
10
 #include "../../mlx_utils/include/private/mlx_pci_priv.h"
10
 
11
 
11
 
12
 
120
 	return status;
121
 	return status;
121
 }
122
 }
122
 
123
 
124
+mlx_status
125
+mlx_pci_teardown_priv(
126
+			IN mlx_utils *utils __attribute__ ((unused))
127
+			)
128
+{
129
+	mlx_status status = MLX_SUCCESS;
130
+#ifdef DEVICE_CX3
131
+	iounmap( utils->config );
132
+#endif
133
+	return status;
134
+}
135
+
123
 mlx_status
136
 mlx_status
124
 mlx_pci_read_priv(
137
 mlx_pci_read_priv(
125
 			IN mlx_utils *utils,
138
 			IN mlx_utils *utils,

Loading…
Cancel
Save