iPXE
mlx_device.h File Reference

Go to the source code of this file.

Macros

#define NODIC_SUPPORTED_REVISION   1
#define NODNIC_CMDQ_PHY_ADDR_HIGH_OFFSET   0x10
#define NODNIC_CMDQ_PHY_ADDR_LOW_OFFSET   0x14
#define NODNIC_NIC_INTERFACE_OFFSET   0x14
#define NODNIC_INITIALIZING_OFFSET   0x1fc
#define NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET   0x1fc
#define NODNIC_LOCATION_OFFSET   0x240
#define NODNIC_CMDQ_PHY_ADDR_LOW_MASK   0xFFFFE000
#define NODNIC_NIC_INTERFACE_SUPPORTED_MASK   0x4000000
#define NODNIC_NIC_INTERFACE_BIT   9
#define NODNIC_DISABLE_INTERFACE_BIT   8
#define NODNIC_NIC_INTERFACE_SUPPORTED_BIT   26
#define NODNIC_INITIALIZING_BIT   31
#define NODNIC_NIC_DISABLE_INT_OFFSET   0x100c
#define NODNIC_REVISION_OFFSET   0x0
#define NODNIC_HARDWARE_FORMAT_OFFSET   0x0

Functions

 FILE_LICENCE (GPL2_OR_LATER)
mlx_status nodnic_device_init (IN nodnic_device_priv *device_priv)
mlx_status nodnic_device_teardown (IN nodnic_device_priv *device_priv)
mlx_status nodnic_device_get_cap (IN nodnic_device_priv *device_priv)
mlx_status nodnic_device_clear_int (IN nodnic_device_priv *device_priv)
mlx_status nodnic_device_get_fw_version (IN nodnic_device_priv *device_priv, OUT mlx_uint16 *fw_ver_minor, OUT mlx_uint16 *fw_ver_sub_minor, OUT mlx_uint16 *fw_ver_major)

Macro Definition Documentation

◆ NODIC_SUPPORTED_REVISION

#define NODIC_SUPPORTED_REVISION   1

Definition at line 27 of file mlx_device.h.

Referenced by nodnic_device_get_nodnic_data().

◆ NODNIC_CMDQ_PHY_ADDR_HIGH_OFFSET

#define NODNIC_CMDQ_PHY_ADDR_HIGH_OFFSET   0x10

Definition at line 29 of file mlx_device.h.

◆ NODNIC_CMDQ_PHY_ADDR_LOW_OFFSET

#define NODNIC_CMDQ_PHY_ADDR_LOW_OFFSET   0x14

Definition at line 30 of file mlx_device.h.

Referenced by disable_nodnic_inteface().

◆ NODNIC_NIC_INTERFACE_OFFSET

#define NODNIC_NIC_INTERFACE_OFFSET   0x14

Definition at line 31 of file mlx_device.h.

Referenced by nodnic_device_start_nodnic().

◆ NODNIC_INITIALIZING_OFFSET

#define NODNIC_INITIALIZING_OFFSET   0x1fc

Definition at line 32 of file mlx_device.h.

Referenced by wait_for_device_initialization().

◆ NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET

#define NODNIC_NIC_INTERFACE_SUPPORTED_OFFSET   0x1fc

Definition at line 33 of file mlx_device.h.

Referenced by check_nodnic_interface_supported(), and flexboot_nodnic_is_supported().

◆ NODNIC_LOCATION_OFFSET

#define NODNIC_LOCATION_OFFSET   0x240

Definition at line 34 of file mlx_device.h.

Referenced by nodnic_device_get_nodnic_data().

◆ NODNIC_CMDQ_PHY_ADDR_LOW_MASK

#define NODNIC_CMDQ_PHY_ADDR_LOW_MASK   0xFFFFE000

Definition at line 36 of file mlx_device.h.

◆ NODNIC_NIC_INTERFACE_SUPPORTED_MASK

#define NODNIC_NIC_INTERFACE_SUPPORTED_MASK   0x4000000

Definition at line 37 of file mlx_device.h.

◆ NODNIC_NIC_INTERFACE_BIT

#define NODNIC_NIC_INTERFACE_BIT   9

Definition at line 39 of file mlx_device.h.

Referenced by nodnic_device_start_nodnic().

◆ NODNIC_DISABLE_INTERFACE_BIT

#define NODNIC_DISABLE_INTERFACE_BIT   8

Definition at line 40 of file mlx_device.h.

Referenced by disable_nodnic_inteface().

◆ NODNIC_NIC_INTERFACE_SUPPORTED_BIT

#define NODNIC_NIC_INTERFACE_SUPPORTED_BIT   26

Definition at line 41 of file mlx_device.h.

Referenced by check_nodnic_interface_supported(), and flexboot_nodnic_is_supported().

◆ NODNIC_INITIALIZING_BIT

#define NODNIC_INITIALIZING_BIT   31

Definition at line 42 of file mlx_device.h.

Referenced by wait_for_device_initialization().

◆ NODNIC_NIC_DISABLE_INT_OFFSET

#define NODNIC_NIC_DISABLE_INT_OFFSET   0x100c

Definition at line 44 of file mlx_device.h.

Referenced by nodnic_device_clear_int().

◆ NODNIC_REVISION_OFFSET

#define NODNIC_REVISION_OFFSET   0x0

Definition at line 47 of file mlx_device.h.

Referenced by nodnic_device_get_nodnic_data().

◆ NODNIC_HARDWARE_FORMAT_OFFSET

#define NODNIC_HARDWARE_FORMAT_OFFSET   0x0

Definition at line 48 of file mlx_device.h.

Referenced by nodnic_device_get_nodnic_data().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER )

◆ nodnic_device_init()

mlx_status nodnic_device_init ( IN nodnic_device_priv * device_priv)

Definition at line 195 of file mlx_device.c.

198{
200
201 if( device_priv == NULL ){
203 goto parm_err;
204 }
205 status = nodnic_device_start_nodnic(device_priv);
206 MLX_FATAL_CHECK_STATUS(status, start_nodnic_err, "nodnic_device_start_nodnic failed");
207
209 MLX_FATAL_CHECK_STATUS(status, data_err, "nodnic_device_get_nodnic_data failed");
210 return status;
211data_err:
212start_nodnic_err:
213parm_err:
214 return status;
215}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
uint8_t status
Status.
Definition ena.h:5
#define MLX_FATAL_CHECK_STATUS(status, label, message)
Definition mlx_bail.h:29
static mlx_status nodnic_device_start_nodnic(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:94
static mlx_status nodnic_device_get_nodnic_data(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:128
#define MLX_INVALID_PARAMETER
#define MLX_SUCCESS
int mlx_status

References IN, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_device_get_nodnic_data(), nodnic_device_start_nodnic(), NULL, and status.

Referenced by flexboot_nodnic_probe().

◆ nodnic_device_teardown()

mlx_status nodnic_device_teardown ( IN nodnic_device_priv * device_priv)

Definition at line 218 of file mlx_device.c.

221{
223 status = disable_nodnic_inteface(device_priv);
224 MLX_FATAL_CHECK_STATUS(status, disable_failed, "failed to disable nodnic interface");
225disable_failed:
226 return status;
227}
static mlx_status disable_nodnic_inteface(IN nodnic_device_priv *device_priv)
Definition mlx_device.c:75

References disable_nodnic_inteface(), IN, MLX_FATAL_CHECK_STATUS, MLX_SUCCESS, and status.

Referenced by flexboot_nodnic_probe(), and flexboot_nodnic_remove().

◆ nodnic_device_get_cap()

mlx_status nodnic_device_get_cap ( IN nodnic_device_priv * device_priv)

Definition at line 230 of file mlx_device.c.

233{
235 nodnic_device_capabilites *device_cap = NULL;
236 mlx_uint32 buffer = 0;
237 mlx_uint64 guid_l = 0;
238 mlx_uint64 guid_h = 0;
239 if( device_priv == NULL ){
241 goto parm_err;
242 }
243
244 device_cap = &device_priv->device_cap;
245
246 //get device capabilities
247 status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x0, &buffer);
248 MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic first dword");
249
250#define NODNIC_DEVICE_SUPPORT_MAC_FILTERS_OFFSET 15
251#define NODNIC_DEVICE_SUPPORT_PROMISC_FILTER_OFFSET 14
252#define NODNIC_DEVICE_SUPPORT_PROMISC_MULT_FILTER_OFFSET 13
253#define NODNIC_DEVICE_LOG_WORKING_BUFFER_SIZE_OFFSET 8
254#define NODNIC_DEVICE_LOG_WORKING_BUFFER_SIZE_MASK 0x7
255#define NODNIC_DEVICE_LOG_PKEY_TABLE_SIZE_OFFSET 4
256#define NODNIC_DEVICE_LOG_PKEY_TABLE_SIZE_MASK 0xF
257#define NODNIC_DEVICE_NUM_PORTS_OFFSET 0
259
261
263
264 device_cap->log_working_buffer_size =
266
267 device_cap->log_pkey_table_size =
269
271
272#ifdef DEVICE_CX3
273#define NODNIC_DEVICE_CRSPACE_DB_OFFSET 12
274 device_cap->crspace_doorbells = CHECK_BIT(buffer, NODNIC_DEVICE_CRSPACE_DB_OFFSET);
275#endif
276
277 status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x4, &buffer);
278 MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic second dword");
279
280#define NODNIC_DEVICE_LOG_MAX_RING_SIZE_OFFSET 24
281#define NODNIC_DEVICE_LOG_MAX_RING_SIZE_MASK 0x3F
282#define NODNIC_DEVICE_PD_MASK 0xFFFFFF
283 device_cap->log_max_ring_size =
285
286 //get device magic numbers
287 device_priv->pd = buffer & NODNIC_DEVICE_PD_MASK;
288
289 status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x8, &buffer);
290 MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic third dword");
291 device_priv->lkey = buffer;
292
293#ifdef DEVICE_CX3
294 if ( device_cap->crspace_doorbells ) {
295 status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x18, &buffer);
296 MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic_crspace_clear_int address");
297 device_priv->crspace_clear_int = device_priv->utils->config + buffer;
298 }
299#endif
300
301 status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x10, (mlx_uint32*)&guid_h);
302 MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic guid_h");
303 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");
305 device_priv->device_guid = guid_l | (guid_h << 32);
306
307#define NODNIC_DEVICE_SUPPORT_RX_PI_DMA_OFFSET 31
308#define NODNIC_DEVICE_SUPPORT_RX_PI_DMA_MASK 0x1
309#define NODNIC_DEVICE_SUPPORT_UAR_TRX_DB_OFFSET 29
310#define NODNIC_DEVICE_SUPPORT_UAR_TRX_DB_MASK 0x1
311#define NODNIC_DEVICE_SUPPORT_BAR_CQ_CONTROL_OFFSET 27
312#define NODNIC_DEVICE_SUPPORT_BAR_CQ_CONTROL_MASK 0x1
313 status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x1c, &buffer);
314 MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic support_rx_pi_dma");
315 if ( sizeof ( mlx_uintn ) == sizeof ( mlx_uint32 ) ) {
316 device_cap->support_rx_pi_dma = FALSE;
317 device_cap->support_uar_tx_db = FALSE;
318 device_cap->support_bar_cq_ctrl = FALSE;
319 } else {
323 }
324
325#define NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_OFFSET 0
326#define NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_MASK 0xFF
327 status = nodnic_cmd_read(device_priv, device_priv->device_offset + 0x20, &buffer);
328 MLX_FATAL_CHECK_STATUS(status, read_err, "failed to read nodnic log_uar_page_size");
330read_err:
331parm_err:
332 return status;
333}
uint32_t buffer
Buffer index (or NETVSC_RNDIS_NO_BUFFER)
Definition netvsc.h:5
mlx_status nodnic_cmd_read(IN nodnic_device_priv *device_priv, IN mlx_uint32 address, OUT mlx_pci_gw_buffer *buffer)
Definition mlx_cmd.c:29
#define NODNIC_DEVICE_PD_MASK
#define NODNIC_DEVICE_SUPPORT_PROMISC_MULT_FILTER_OFFSET
#define NODNIC_DEVICE_SUPPORT_RX_PI_DMA_OFFSET
#define NODNIC_DEVICE_LOG_PKEY_TABLE_SIZE_OFFSET
#define NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_OFFSET
#define NODNIC_DEVICE_LOG_WORKING_BUFFER_SIZE_MASK
#define NODNIC_DEVICE_LOG_MAX_RING_SIZE_OFFSET
#define NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_MASK
#define NODNIC_DEVICE_LOG_PKEY_TABLE_SIZE_MASK
#define NODNIC_DEVICE_NUM_PORTS_OFFSET
#define NODNIC_DEVICE_SUPPORT_MAC_FILTERS_OFFSET
#define NODNIC_DEVICE_LOG_WORKING_BUFFER_SIZE_OFFSET
#define NODNIC_DEVICE_LOG_MAX_RING_SIZE_MASK
#define NODNIC_DEVICE_SUPPORT_PROMISC_FILTER_OFFSET
#define NODNIC_DEVICE_SUPPORT_UAR_TRX_DB_OFFSET
#define NODNIC_DEVICE_SUPPORT_BAR_CQ_CONTROL_OFFSET
#define CHECK_BIT(field, offset)
Definition mlx_device.c:29
struct _nodnic_device_capabilites nodnic_device_capabilites
uint32_t mlx_uint32
uint64_t mlx_uint64
unsigned long mlx_uintn
#define FALSE
Definition tlan.h:45

References buffer, CHECK_BIT, FALSE, IN, _nodnic_device_capabilites::log_max_ring_size, _nodnic_device_capabilites::log_pkey_table_size, _nodnic_device_capabilites::log_uar_page_size, _nodnic_device_capabilites::log_working_buffer_size, MLX_FATAL_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_cmd_read(), NODNIC_DEVICE_LOG_MAX_RING_SIZE_MASK, NODNIC_DEVICE_LOG_MAX_RING_SIZE_OFFSET, NODNIC_DEVICE_LOG_PKEY_TABLE_SIZE_MASK, NODNIC_DEVICE_LOG_PKEY_TABLE_SIZE_OFFSET, NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_MASK, NODNIC_DEVICE_LOG_UAR_PAGE_SIZE_OFFSET, NODNIC_DEVICE_LOG_WORKING_BUFFER_SIZE_MASK, NODNIC_DEVICE_LOG_WORKING_BUFFER_SIZE_OFFSET, NODNIC_DEVICE_NUM_PORTS_OFFSET, NODNIC_DEVICE_PD_MASK, NODNIC_DEVICE_SUPPORT_BAR_CQ_CONTROL_OFFSET, NODNIC_DEVICE_SUPPORT_MAC_FILTERS_OFFSET, NODNIC_DEVICE_SUPPORT_PROMISC_FILTER_OFFSET, NODNIC_DEVICE_SUPPORT_PROMISC_MULT_FILTER_OFFSET, NODNIC_DEVICE_SUPPORT_RX_PI_DMA_OFFSET, NODNIC_DEVICE_SUPPORT_UAR_TRX_DB_OFFSET, NULL, _nodnic_device_capabilites::num_ports, status, _nodnic_device_capabilites::support_bar_cq_ctrl, _nodnic_device_capabilites::support_mac_filters, _nodnic_device_capabilites::support_promisc_filter, _nodnic_device_capabilites::support_promisc_multicast_filter, _nodnic_device_capabilites::support_rx_pi_dma, and _nodnic_device_capabilites::support_uar_tx_db.

Referenced by flexboot_nodnic_probe().

◆ nodnic_device_clear_int()

mlx_status nodnic_device_clear_int ( IN nodnic_device_priv * device_priv)

Definition at line 165 of file mlx_device.c.

168{
170 mlx_uint32 disable = 1;
171#ifndef DEVICE_CX3
173 MLX_CHECK_STATUS(device_priv, status, clear_int_done, "failed writing to disable_bit");
174#else
175 mlx_utils *utils = device_priv->utils;
176 mlx_uint64 clear_int = (mlx_uintn)(device_priv->crspace_clear_int);
177 mlx_uint32 swapped = 0;
178
179 if (device_priv->device_cap.crspace_doorbells == 0) {
181 MLX_CHECK_STATUS(device_priv, status, clear_int_done, "failed writing to disable_bit");
182 } else {
183 /* Write the new index and update FW that new data was submitted */
184 disable = 0x80000000;
185 mlx_memory_cpu_to_be32(utils, disable, &swapped);
186 mlx_pci_mem_write (utils, MlxPciWidthUint32, 0, clear_int, 1, &swapped);
187 mlx_pci_mem_read (utils, MlxPciWidthUint32, 0, clear_int, 1, &swapped);
188 }
189#endif
190clear_int_done:
191 return status;
192}
#define MLX_CHECK_STATUS(id, status, label, message)
Definition mlx_bail.h:37
mlx_status nodnic_cmd_write(IN nodnic_device_priv *device_priv, IN mlx_uint32 address, IN mlx_pci_gw_buffer buffer)
Definition mlx_cmd.c:54
#define NODNIC_NIC_DISABLE_INT_OFFSET
Definition mlx_device.h:44
mlx_status mlx_memory_cpu_to_be32(IN mlx_utils *utils, IN mlx_uint32 source, IN mlx_uint32 *destination)
Definition mlx_memory.c:207
mlx_status mlx_pci_mem_read(IN mlx_utils *utils, IN mlx_pci_width width, IN mlx_uint8 bar_index, IN mlx_uint64 offset, IN mlx_uintn count, OUT mlx_void *buffer)
Definition mlx_pci.c:96
mlx_status mlx_pci_mem_write(IN mlx_utils *utils, IN mlx_pci_width width, IN mlx_uint8 bar_index, IN mlx_uint64 offset, IN mlx_uintn count, IN mlx_void *buffer)
Definition mlx_pci.c:116
@ MlxPciWidthUint32
Definition mlx_pci.h:30

References IN, MLX_CHECK_STATUS, mlx_memory_cpu_to_be32(), mlx_pci_mem_read(), mlx_pci_mem_write(), MLX_SUCCESS, MlxPciWidthUint32, nodnic_cmd_write(), NODNIC_NIC_DISABLE_INT_OFFSET, and status.

Referenced by flexboot_nodnic_eth_irq().

◆ nodnic_device_get_fw_version()

mlx_status nodnic_device_get_fw_version ( IN nodnic_device_priv * device_priv,
OUT mlx_uint16 * fw_ver_minor,
OUT mlx_uint16 * fw_ver_sub_minor,
OUT mlx_uint16 * fw_ver_major )

Definition at line 336 of file mlx_device.c.

341 {
343 mlx_uint32 buffer = 0;
344
345 if( device_priv == NULL ){
347 goto parm_err;
348 }
349
350 status = nodnic_cmd_read(device_priv, 0x0, &buffer);
351 MLX_CHECK_STATUS(device_priv, status, read_err, "failed to read fw revision major and minor");
352
353 *fw_ver_minor = (mlx_uint16)(buffer >> 16);
354 *fw_ver_major = (mlx_uint16)buffer;
355
356 status = nodnic_cmd_read(device_priv, 0x4, &buffer);
357 MLX_CHECK_STATUS(device_priv, status, read_err, "failed to read fw revision sub minor");
358
359 *fw_ver_sub_minor = (mlx_uint16)buffer;
360read_err:
361parm_err:
362 return status;
363}
uint16_t mlx_uint16

References buffer, IN, MLX_CHECK_STATUS, MLX_INVALID_PARAMETER, MLX_SUCCESS, nodnic_cmd_read(), NULL, OUT, and status.