iPXE
flexboot_nodnic.h File Reference

Go to the source code of this file.

Data Structures

struct  flexboot_nodnic_port
 A flexboot nodnic port. More...
struct  flexboot_nodnic_queue_pair
 A flexboot nodnic queue pair. More...
struct  flexboot_nodnic_completion_queue
 A flexboot nodnic cq. More...
struct  flexboot_nodnic
 A flexboot_nodnic device. More...
struct  flexboot_nodnic_port_type
 A flexboot_nodnic port type. More...
struct  cqe_data
union  arm_cq_uar
struct  flexboot_nodnic_callbacks

Macros

#define NODNIC_IRQ_ENABLED
#define FLEXBOOT_NODNIC_MAX_PORTS   2
#define FLEXBOOT_NODNIC_PORT_BASE   1
#define FLEXBOOT_NODNIC_OPCODE_SEND   0xa
#define FLEXBOOT_NODNIC_HCA_BAR   PCI_BASE_ADDRESS_0
#define FLEXBOOT_NODNIC_PAGE_SHIFT   12
#define FLEXBOOT_NODNIC_PAGE_SIZE   (1 << FLEXBOOT_NODNIC_PAGE_SHIFT)
#define FLEXBOOT_NODNIC_PAGE_MASK   (FLEXBOOT_NODNIC_PAGE_SIZE - 1)
#define EN_DEFAULT_ADMIN_MTU   1522

Enumerations

enum  flexboot_nodnic_protocol { FLEXBOOT_NODNIC_PROT_IB_IPV6 = 0 , FLEXBOOT_NODNIC_PROT_ETH , FLEXBOOT_NODNIC_PROT_IB_IPV4 , FLEXBOOT_NODNIC_PROT_FCOE }

Functions

 FILE_LICENCE (GPL2_OR_LATER)
int flexboot_nodnic_probe (struct pci_device *pci, struct flexboot_nodnic_callbacks *callbacks, void *drv_priv)
void flexboot_nodnic_remove (struct pci_device *pci)
void flexboot_nodnic_eth_irq (struct net_device *netdev, int enable)
int flexboot_nodnic_is_supported (struct pci_device *pci)
void flexboot_nodnic_copy_mac (uint8_t mac_addr[], uint32_t low_byte, uint16_t high_byte)
int init_mlx_utils (mlx_utils **utils, struct pci_device *pci)
void free_mlx_utils (mlx_utils **utils)

Macro Definition Documentation

◆ NODNIC_IRQ_ENABLED

#define NODNIC_IRQ_ENABLED

Definition at line 35 of file flexboot_nodnic.h.

◆ FLEXBOOT_NODNIC_MAX_PORTS

#define FLEXBOOT_NODNIC_MAX_PORTS   2

Definition at line 37 of file flexboot_nodnic.h.

◆ FLEXBOOT_NODNIC_PORT_BASE

#define FLEXBOOT_NODNIC_PORT_BASE   1

Definition at line 38 of file flexboot_nodnic.h.

Referenced by flexboot_nodnic_allocate_infiniband_devices().

◆ FLEXBOOT_NODNIC_OPCODE_SEND

#define FLEXBOOT_NODNIC_OPCODE_SEND   0xa

Definition at line 40 of file flexboot_nodnic.h.

Referenced by shomron_fill_eth_send_wqe().

◆ FLEXBOOT_NODNIC_HCA_BAR

#define FLEXBOOT_NODNIC_HCA_BAR   PCI_BASE_ADDRESS_0

Definition at line 41 of file flexboot_nodnic.h.

Referenced by flexboot_nodnic_alloc_uar().

◆ FLEXBOOT_NODNIC_PAGE_SHIFT

#define FLEXBOOT_NODNIC_PAGE_SHIFT   12

Definition at line 42 of file flexboot_nodnic.h.

◆ FLEXBOOT_NODNIC_PAGE_SIZE

#define FLEXBOOT_NODNIC_PAGE_SIZE   (1 << FLEXBOOT_NODNIC_PAGE_SHIFT)

Definition at line 43 of file flexboot_nodnic.h.

Referenced by flexboot_nodnic_alloc_uar().

◆ FLEXBOOT_NODNIC_PAGE_MASK

#define FLEXBOOT_NODNIC_PAGE_MASK   (FLEXBOOT_NODNIC_PAGE_SIZE - 1)

Definition at line 44 of file flexboot_nodnic.h.

◆ EN_DEFAULT_ADMIN_MTU

#define EN_DEFAULT_ADMIN_MTU   1522

Definition at line 45 of file flexboot_nodnic.h.

Referenced by flexboot_nodnic_probe().

Enumeration Type Documentation

◆ flexboot_nodnic_protocol

Enumerator
FLEXBOOT_NODNIC_PROT_IB_IPV6 
FLEXBOOT_NODNIC_PROT_ETH 
FLEXBOOT_NODNIC_PROT_IB_IPV4 
FLEXBOOT_NODNIC_PROT_FCOE 

Definition at line 48 of file flexboot_nodnic.h.

48 {
53};
@ FLEXBOOT_NODNIC_PROT_FCOE
@ FLEXBOOT_NODNIC_PROT_ETH
@ FLEXBOOT_NODNIC_PROT_IB_IPV6
@ FLEXBOOT_NODNIC_PROT_IB_IPV4

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER )

◆ flexboot_nodnic_probe()

int flexboot_nodnic_probe ( struct pci_device * pci,
struct flexboot_nodnic_callbacks * callbacks,
void * drv_priv )

Definition at line 1483 of file flexboot_nodnic.c.

1485 {
1487 struct flexboot_nodnic *flexboot_nodnic_priv = NULL;
1489 int i = 0;
1490
1491 if ( ( pci == NULL ) || ( callbacks == NULL ) ) {
1492 DBGC ( flexboot_nodnic_priv, "%s: Bad Parameter\n", __FUNCTION__ );
1493 return -EINVAL;
1494 }
1495
1496 flexboot_nodnic_priv = zalloc( sizeof ( *flexboot_nodnic_priv ) );
1497 if ( flexboot_nodnic_priv == NULL ) {
1498 DBGC ( flexboot_nodnic_priv, "%s: Failed to allocate priv data\n", __FUNCTION__ );
1500 goto device_err_alloc;
1501 }
1502
1503 /* Register settings
1504 * Note that pci->priv will be the device private data */
1505 flexboot_nodnic_priv->pci = pci;
1506 flexboot_nodnic_priv->callbacks = callbacks;
1507 pci_set_drvdata ( pci, flexboot_nodnic_priv );
1508
1509 device_priv = &flexboot_nodnic_priv->device_priv;
1510 /* init mlx utils */
1512 MLX_FATAL_CHECK_STATUS(status, err_utils_init,
1513 "init_mlx_utils failed");
1514
1515 /* init device */
1517 MLX_FATAL_CHECK_STATUS(status, device_init_err,
1518 "nodnic_device_init failed");
1519
1521 MLX_FATAL_CHECK_STATUS(status, get_cap_err,
1522 "nodnic_device_get_cap failed");
1523
1525 MLX_DEBUG_ERROR( device_priv->utils, "Failed to set admin mtu\n" );
1526 }
1527
1528 status = flexboot_nodnic_set_port_masking ( flexboot_nodnic_priv );
1529 MLX_FATAL_CHECK_STATUS(status, err_set_masking,
1530 "flexboot_nodnic_set_port_masking failed");
1531
1532 status = flexboot_nodnic_allocate_infiniband_devices( flexboot_nodnic_priv );
1533 MLX_FATAL_CHECK_STATUS(status, err_alloc_ibdev,
1534 "flexboot_nodnic_allocate_infiniband_devices failed");
1535
1536 /* port init */
1537 status = flexboot_nodnic_thin_init_ports( flexboot_nodnic_priv );
1538 MLX_FATAL_CHECK_STATUS(status, err_thin_init_ports,
1539 "flexboot_nodnic_thin_init_ports failed");
1540
1541 if ( ( status = flexboot_nodnic_alloc_uar ( flexboot_nodnic_priv ) ) ) {
1542 DBGC(flexboot_nodnic_priv, "%s: flexboot_nodnic_alloc_uar failed"
1543 " ( status = %d )\n",__FUNCTION__, status );
1544 }
1545
1546 /* device reg */
1547 status = flexboot_nodnic_set_ports_type( flexboot_nodnic_priv );
1548 MLX_CHECK_STATUS( flexboot_nodnic_priv, status, err_set_ports_types,
1549 "flexboot_nodnic_set_ports_type failed");
1550
1551 status = flexboot_nodnic_ports_register_dev( flexboot_nodnic_priv );
1553 "flexboot_nodnic_ports_register_dev failed");
1554
1555 for ( i = 0; i < device_priv->device_cap.num_ports; i++ ) {
1556 if ( ! ( flexboot_nodnic_priv->port_mask & ( i + 1 ) ) )
1557 continue;
1558 flexboot_nodnic_get_factory_mac ( flexboot_nodnic_priv, i );
1559 }
1560
1561 /* Update ETH operations with IRQ function if supported */
1562 DBGC ( flexboot_nodnic_priv, "%s: %s IRQ function\n",
1563 __FUNCTION__, ( callbacks->irq ? "Valid" : "No" ) );
1565 return 0;
1566
1567 flexboot_nodnic_ports_unregister_dev ( flexboot_nodnic_priv );
1568reg_err:
1569err_set_ports_types:
1570 flexboot_nodnic_dealloc_uar ( flexboot_nodnic_priv );
1571err_thin_init_ports:
1572err_alloc_ibdev:
1573err_set_masking:
1574get_cap_err:
1576device_init_err:
1578err_utils_init:
1579 free ( flexboot_nodnic_priv );
1580device_err_alloc:
1581 return status;
1582}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
uint8_t status
Status.
Definition ena.h:5
static mlx_status flexboot_nodnic_allocate_infiniband_devices(struct flexboot_nodnic *flexboot_nodnic_priv)
static int flexboot_nodnic_set_port_masking(struct flexboot_nodnic *flexboot_nodnic)
Set port masking.
static int flexboot_nodnic_alloc_uar(struct flexboot_nodnic *flexboot_nodnic)
Initialise Nodnic PCI parameters.
static mlx_status flexboot_nodnic_get_factory_mac(struct flexboot_nodnic *flexboot_nodnic_priv, uint8_t port)
static mlx_status flexboot_nodnic_ports_unregister_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
int init_mlx_utils(mlx_utils **utils, struct pci_device *pci)
static mlx_status flexboot_nodnic_thin_init_ports(struct flexboot_nodnic *flexboot_nodnic_priv)
static mlx_status flexboot_nodnic_set_ports_type(struct flexboot_nodnic *flexboot_nodnic_priv)
static struct net_device_operations flexboot_nodnic_eth_operations
flexboot_nodnic Ethernet network device operations
static int flexboot_nodnic_dealloc_uar(struct flexboot_nodnic *flexboot_nodnic)
void free_mlx_utils(mlx_utils **utils)
static mlx_status flexboot_nodnic_ports_register_dev(struct flexboot_nodnic *flexboot_nodnic_priv)
#define EN_DEFAULT_ADMIN_MTU
#define DBGC(...)
Definition compiler.h:505
#define EINVAL
Invalid argument.
Definition errno.h:429
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
#define MLX_CHECK_STATUS(id, status, label, message)
Definition mlx_bail.h:37
#define MLX_FATAL_CHECK_STATUS(status, label, message)
Definition mlx_bail.h:29
mlx_status nodnic_device_init(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:195
mlx_status nodnic_device_teardown(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:218
mlx_status nodnic_device_get_cap(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:230
#define MLX_DEBUG_ERROR(...)
Definition mlx_logging.h:29
mlx_status mlx_set_admin_mtu(IN mlx_utils *utils, IN mlx_uint8 port_num, IN mlx_uint32 admin_mtu)
Definition mlx_mtu.c:63
struct _nodnic_device_priv nodnic_device_priv
#define MLX_SUCCESS
int mlx_status
#define MLX_OUT_OF_RESOURCES
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition pci.h:366
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
nodnic_device_capabilites device_cap
void(* irq)(struct net_device *netdev, int enable)
A flexboot_nodnic device.
nodnic_device_priv device_priv
nodnic device
struct pci_device * pci
PCI device.
struct flexboot_nodnic_callbacks * callbacks
nic specific data
u16 port_mask
Port masking.

References __unused, flexboot_nodnic::callbacks, DBGC, _nodnic_device_priv::device_cap, flexboot_nodnic::device_priv, EINVAL, EN_DEFAULT_ADMIN_MTU, flexboot_nodnic_alloc_uar(), flexboot_nodnic_allocate_infiniband_devices(), flexboot_nodnic_dealloc_uar(), flexboot_nodnic_eth_operations, flexboot_nodnic_get_factory_mac(), flexboot_nodnic_ports_register_dev(), flexboot_nodnic_ports_unregister_dev(), flexboot_nodnic_set_port_masking(), flexboot_nodnic_set_ports_type(), flexboot_nodnic_thin_init_ports(), free, free_mlx_utils(), init_mlx_utils(), flexboot_nodnic_callbacks::irq, MLX_CHECK_STATUS, MLX_DEBUG_ERROR, MLX_FATAL_CHECK_STATUS, MLX_OUT_OF_RESOURCES, mlx_set_admin_mtu(), MLX_SUCCESS, nodnic_device_get_cap(), nodnic_device_init(), nodnic_device_teardown(), NULL, _nodnic_device_capabilites::num_ports, flexboot_nodnic::pci, pci_set_drvdata(), flexboot_nodnic::port_mask, status, _nodnic_device_priv::utils, and zalloc().

Referenced by golan_probe().

◆ flexboot_nodnic_remove()

void flexboot_nodnic_remove ( struct pci_device * pci)

Definition at line 1584 of file flexboot_nodnic.c.

1585{
1586 struct flexboot_nodnic *flexboot_nodnic_priv = pci_get_drvdata ( pci );
1587 nodnic_device_priv *device_priv = & ( flexboot_nodnic_priv->device_priv );
1588
1589 flexboot_nodnic_dealloc_uar ( flexboot_nodnic_priv );
1590 flexboot_nodnic_ports_unregister_dev ( flexboot_nodnic_priv );
1593 free( flexboot_nodnic_priv );
1594}
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition pci.h:376

References flexboot_nodnic::device_priv, flexboot_nodnic_dealloc_uar(), flexboot_nodnic_ports_unregister_dev(), free, free_mlx_utils(), nodnic_device_teardown(), flexboot_nodnic::pci, pci_get_drvdata(), and _nodnic_device_priv::utils.

Referenced by golan_remove().

◆ flexboot_nodnic_eth_irq()

void flexboot_nodnic_eth_irq ( struct net_device * netdev,
int enable )

Definition at line 1029 of file flexboot_nodnic.c.

1029 {
1030 struct flexboot_nodnic_port *port = netdev->priv;
1031
1032 if ( enable ) {
1033 if ( ( port->port_priv.port_state & NODNIC_PORT_OPENED ) &&
1034 ! ( port->port_priv.port_state & NODNIC_PORT_DISABLING_DMA ) ) {
1036 } else {
1037 /* do nothing */
1038 }
1039 } else {
1040 nodnic_device_clear_int( port->port_priv.device );
1041 }
1042}
u8 port
Port number.
Definition CIB_PRM.h:3
static int flexboot_nodnic_arm_cq(struct flexboot_nodnic_port *port)
static struct net_device * netdev
Definition gdbudp.c:53
mlx_status nodnic_device_clear_int(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:165
#define NODNIC_PORT_OPENED
#define NODNIC_PORT_DISABLING_DMA
A flexboot nodnic port.

References flexboot_nodnic_arm_cq(), netdev, nodnic_device_clear_int(), NODNIC_PORT_DISABLING_DMA, NODNIC_PORT_OPENED, and port.

◆ flexboot_nodnic_is_supported()

int flexboot_nodnic_is_supported ( struct pci_device * pci)

Definition at line 1306 of file flexboot_nodnic.c.

1306 {
1307 mlx_utils utils;
1310 int is_supported = 0;
1311
1312 DBG ( "%s: start\n", __FUNCTION__ );
1313
1314 memset ( &utils, 0, sizeof ( utils ) );
1315
1316 status = mlx_utils_init ( &utils, pci );
1317 MLX_CHECK_STATUS ( pci, status, utils_init_err, "mlx_utils_init failed" );
1318
1319 status = mlx_pci_gw_init ( &utils );
1320 MLX_CHECK_STATUS ( pci, status, pci_gw_init_err, "mlx_pci_gw_init failed" );
1321
1324
1325 if ( status == MLX_SUCCESS ) {
1327 is_supported = ( buffer & 0x1 );
1328 }
1329
1330 mlx_pci_gw_teardown( &utils );
1331
1332pci_gw_init_err:
1333 mlx_utils_teardown(&utils);
1334utils_init_err:
1335 DBG ( "%s: NODNIC is %s supported (status = %d)\n",
1336 __FUNCTION__, ( is_supported ? "": "not" ), status );
1337 return is_supported;
1338}
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition netvsc.h:5
void * memset(void *dest, int character, size_t len) __nonnull
#define NODNIC_NIC_INTERFACE_SUPPORTED_BIT
Definition mlx_device.h:41
#define NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET
Definition mlx_device.h:33
mlx_status mlx_pci_gw_teardown(IN mlx_utils *utils)
Definition mlx_pci_gw.c:247
mlx_status mlx_pci_gw_read(IN mlx_utils *utils, IN mlx_pci_gw_space space, IN mlx_uint32 address, OUT mlx_pci_gw_buffer *buffer)
Definition mlx_pci_gw.c:258
mlx_status mlx_pci_gw_init(IN mlx_utils *utils)
Definition mlx_pci_gw.c:218
mlx_uint32 mlx_pci_gw_buffer
Definition mlx_pci_gw.h:52
#define PCI_GW_SPACE_NODNIC
Definition mlx_pci_gw.h:47
mlx_status mlx_utils_init(IN mlx_utils *utils, IN mlx_pci *pci)
Definition mlx_utils.c:28
mlx_status mlx_utils_teardown(IN mlx_utils *utils)
Definition mlx_utils.c:46

References buffer, DBG, memset(), MLX_CHECK_STATUS, mlx_pci_gw_init(), mlx_pci_gw_read(), mlx_pci_gw_teardown(), MLX_SUCCESS, mlx_utils_init(), mlx_utils_teardown(), NODNIC_NIC_INTERFACE_SUPPORTED_BIT, NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET, PCI_GW_SPACE_NODNIC, and status.

Referenced by shomron_nodnic_is_supported().

◆ flexboot_nodnic_copy_mac()

void flexboot_nodnic_copy_mac ( uint8_t mac_addr[],
uint32_t low_byte,
uint16_t high_byte )

Definition at line 1341 of file flexboot_nodnic.c.

1342 {
1343 union mac_addr {
1344 struct {
1345 uint32_t low_byte;
1346 uint16_t high_byte;
1347 };
1348 uint8_t mac_addr[ETH_ALEN];
1349 } mac_addr_aux;
1350
1351 mac_addr_aux.high_byte = high_byte;
1352 mac_addr_aux.low_byte = low_byte;
1353
1354 mac_addr[0] = mac_addr_aux.mac_addr[5];
1355 mac_addr[1] = mac_addr_aux.mac_addr[4];
1356 mac_addr[2] = mac_addr_aux.mac_addr[3];
1357 mac_addr[3] = mac_addr_aux.mac_addr[2];
1358 mac_addr[4] = mac_addr_aux.mac_addr[1];
1359 mac_addr[5] = mac_addr_aux.mac_addr[0];
1360}
unsigned short uint16_t
Definition stdint.h:11
unsigned int uint32_t
Definition stdint.h:12
unsigned char uint8_t
Definition stdint.h:10
#define ETH_ALEN
Definition if_ether.h:9

References ETH_ALEN.

◆ init_mlx_utils()

int init_mlx_utils ( mlx_utils ** utils,
struct pci_device * pci )

Definition at line 1404 of file flexboot_nodnic.c.

1404 {
1405 int rc = 0;
1406
1407 *utils = ( mlx_utils * ) zalloc ( sizeof ( mlx_utils ) );
1408 if ( *utils == NULL ) {
1409 DBGC ( utils, "%s: Failed to allocate utils\n", __FUNCTION__ );
1410 rc = -1;
1411 goto err_utils_alloc;
1412 }
1413 if ( mlx_utils_init ( *utils, pci ) ) {
1414 DBGC ( utils, "%s: mlx_utils_init failed\n", __FUNCTION__ );
1415 rc = -1;
1416 goto err_utils_init;
1417 }
1418 if ( mlx_pci_gw_init ( *utils ) ){
1419 DBGC ( utils, "%s: mlx_pci_gw_init failed\n", __FUNCTION__ );
1420 rc = -1;
1421 goto err_cmd_init;
1422 }
1423
1424 return 0;
1425
1426 mlx_pci_gw_teardown ( *utils );
1427err_cmd_init:
1428 mlx_utils_teardown ( *utils );
1429err_utils_init:
1430 free ( *utils );
1431err_utils_alloc:
1432 *utils = NULL;
1433
1434 return rc;
1435}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3

References DBGC, free, mlx_pci_gw_init(), mlx_pci_gw_teardown(), mlx_utils_init(), mlx_utils_teardown(), NULL, rc, and zalloc().

Referenced by flexboot_nodnic_probe(), golan_probe_normal(), and golan_set_link_speed().

◆ free_mlx_utils()

void free_mlx_utils ( mlx_utils ** utils)

Definition at line 1437 of file flexboot_nodnic.c.

1437 {
1438
1439 mlx_pci_gw_teardown ( *utils );
1440 mlx_utils_teardown ( *utils );
1441 free ( *utils );
1442 *utils = NULL;
1443}

References free, mlx_pci_gw_teardown(), mlx_utils_teardown(), and NULL.

Referenced by flexboot_nodnic_probe(), flexboot_nodnic_remove(), golan_probe_normal(), golan_remove_normal(), and golan_set_link_speed().