iPXE
Functions
intelvf.c File Reference

Intel 10/100/1000 virtual function network card driver. More...

#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <ipxe/io.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include "intelvf.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static void intelvf_mbox_write (struct intel_nic *intel, const union intelvf_msg *msg)
 Write message to mailbox. More...
 
static void intelvf_mbox_read (struct intel_nic *intel, union intelvf_msg *msg)
 Read message from mailbox. More...
 
int intelvf_mbox_poll (struct intel_nic *intel)
 Poll mailbox. More...
 
int intelvf_mbox_wait (struct intel_nic *intel)
 Wait for PF reset to complete. More...
 
int intelvf_mbox_msg (struct intel_nic *intel, union intelvf_msg *msg)
 Send/receive mailbox message. More...
 
int intelvf_mbox_reset (struct intel_nic *intel, uint8_t *hw_addr)
 Send reset message and get initial MAC address. More...
 
int intelvf_mbox_set_mac (struct intel_nic *intel, const uint8_t *ll_addr)
 Send set MAC address message. More...
 
int intelvf_mbox_set_mtu (struct intel_nic *intel, size_t mtu)
 Send set MTU message. More...
 

Detailed Description

Intel 10/100/1000 virtual function network card driver.

Definition in file intelvf.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ intelvf_mbox_write()

static void intelvf_mbox_write ( struct intel_nic intel,
const union intelvf_msg msg 
)
static

Write message to mailbox.

Parameters
intelIntel device
msgMessage

Definition at line 54 of file intelvf.c.

55  {
56  const struct intelvf_msg_raw *raw = &msg->raw;
57  unsigned int i;
58 
59  /* Write message */
60  DBGC2 ( intel, "INTEL %p sending message", intel );
61  for ( i = 0 ; i < ( sizeof ( *msg ) / sizeof ( raw->dword[0] ) ) ; i++){
62  DBGC2 ( intel, "%c%08x", ( i ? ':' : ' ' ), raw->dword[i] );
63  writel ( raw->dword[i], ( intel->regs + intel->mbox.mem +
64  ( i * sizeof ( raw->dword[0] ) ) ) );
65  }
66  DBGC2 ( intel, "\n" );
67 }
void * regs
Registers.
Definition: intel.h:292
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:310
Raw mailbox message.
Definition: intelvf.h:124
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
unsigned int mem
Mailbox memory base.
Definition: intel.h:271
#define DBGC2(...)
Definition: compiler.h:522
__be32 raw[7]
Definition: CIB_PRM.h:28

References DBGC2, intel_nic::mbox, intel_mailbox::mem, msg(), raw, intel_nic::regs, and writel().

Referenced by intelvf_mbox_msg().

◆ intelvf_mbox_read()

static void intelvf_mbox_read ( struct intel_nic intel,
union intelvf_msg msg 
)
static

Read message from mailbox.

Parameters
intelIntel device
msgMessage

Definition at line 75 of file intelvf.c.

76  {
77  struct intelvf_msg_raw *raw = &msg->raw;
78  unsigned int i;
79 
80  /* Read message */
81  DBGC2 ( intel, "INTEL %p received message", intel );
82  for ( i = 0 ; i < ( sizeof ( *msg ) / sizeof ( raw->dword[0] ) ) ; i++){
83  raw->dword[i] = readl ( intel->regs + intel->mbox.mem +
84  ( i * sizeof ( raw->dword[0] ) ) );
85  DBGC2 ( intel, "%c%08x", ( i ? ':' : ' ' ), raw->dword[i] );
86  }
87  DBGC2 ( intel, "\n" );
88 }
void * regs
Registers.
Definition: intel.h:292
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:310
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
Raw mailbox message.
Definition: intelvf.h:124
unsigned int mem
Mailbox memory base.
Definition: intel.h:271
#define DBGC2(...)
Definition: compiler.h:522
__be32 raw[7]
Definition: CIB_PRM.h:28

References DBGC2, intel_nic::mbox, intel_mailbox::mem, msg(), raw, readl(), and intel_nic::regs.

Referenced by intelvf_mbox_msg(), and intelvf_mbox_poll().

◆ intelvf_mbox_poll()

int intelvf_mbox_poll ( struct intel_nic intel)

Poll mailbox.

Parameters
intelIntel device
Return values
rcReturn status code

Note that polling the mailbox may fail if the underlying PF is reset.

Definition at line 99 of file intelvf.c.

99  {
100  struct intel_mailbox *mbox = &intel->mbox;
101  union intelvf_msg msg;
102  uint32_t ctrl;
103 
104  /* Get mailbox status */
105  ctrl = readl ( intel->regs + mbox->ctrl );
106 
107  /* Fail if a reset is in progress */
108  if ( ctrl & INTELVF_MBCTRL_RSTI )
109  return -EPIPE;
110 
111  /* Acknowledge (and ignore) any received messages */
112  if ( ctrl & INTELVF_MBCTRL_PFSTS ) {
113  intelvf_mbox_read ( intel, &msg );
114  writel ( INTELVF_MBCTRL_ACK, intel->regs + mbox->ctrl );
115  }
116 
117  return 0;
118 }
void * regs
Registers.
Definition: intel.h:292
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:310
#define EPIPE
Broken pipe.
Definition: errno.h:620
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
Mailbox message.
Definition: intelvf.h:130
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
Definition: golan.c:120
#define INTELVF_MBCTRL_PFSTS
PF wrote a message.
Definition: intelvf.h:24
An Intel virtual function mailbox.
Definition: intel.h:267
#define INTELVF_MBCTRL_ACK
PF message received.
Definition: intelvf.h:21
unsigned int uint32_t
Definition: stdint.h:12
#define INTELVF_MBCTRL_RSTI
PF reset in progress.
Definition: intelvf.h:26
static void intelvf_mbox_read(struct intel_nic *intel, union intelvf_msg *msg)
Read message from mailbox.
Definition: intelvf.c:75
uint8_t ctrl
Ring control.
Definition: dwmac.h:18

References ctrl, EPIPE, INTELVF_MBCTRL_ACK, INTELVF_MBCTRL_PFSTS, INTELVF_MBCTRL_RSTI, intelvf_mbox_read(), intel_nic::mbox, msg(), readl(), intel_nic::regs, and writel().

Referenced by intelvf_mbox_wait(), and intelxvf_poll().

◆ intelvf_mbox_wait()

int intelvf_mbox_wait ( struct intel_nic intel)

Wait for PF reset to complete.

Parameters
intelIntel device
Return values
rcReturn status code

Definition at line 126 of file intelvf.c.

126  {
127  unsigned int i;
128  int rc;
129 
130  /* Wait until a poll completes successfully */
131  for ( i = 0 ; i < INTELVF_MBOX_MAX_WAIT_MS ; i++ ) {
132 
133  /* Check for successful poll */
134  if ( ( rc = intelvf_mbox_poll ( intel ) ) == 0 )
135  return 0;
136 
137  /* Delay */
138  mdelay ( 1 );
139  }
140 
141  DBGC ( intel, "INTEL %p timed out waiting for reset\n", intel );
142  return -ETIMEDOUT;
143 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
#define INTELVF_MBOX_MAX_WAIT_MS
Maximum time to wait for mailbox message.
Definition: intelvf.h:149
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:79
int intelvf_mbox_poll(struct intel_nic *intel)
Poll mailbox.
Definition: intelvf.c:99
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:670

References DBGC, ETIMEDOUT, INTELVF_MBOX_MAX_WAIT_MS, intelvf_mbox_poll(), mdelay(), and rc.

◆ intelvf_mbox_msg()

int intelvf_mbox_msg ( struct intel_nic intel,
union intelvf_msg msg 
)

Send/receive mailbox message.

Parameters
intelIntel device
msgMessage buffer
Return values
rcReturn status code

Definition at line 152 of file intelvf.c.

152  {
153  struct intel_mailbox *mbox = &intel->mbox;
154  uint32_t ctrl;
155  uint32_t seen = 0;
156  unsigned int i;
157 
158  /* Sanity check */
159  assert ( ! ( msg->hdr & INTELVF_MSG_RESPONSE ) );
160 
161  /* Handle mailbox */
162  for ( i = 0 ; i < INTELVF_MBOX_MAX_WAIT_MS ; i++ ) {
163 
164  /* Attempt to claim mailbox, if we have not yet sent
165  * our message.
166  */
167  if ( ! ( seen & INTELVF_MBCTRL_VFU ) )
168  writel ( INTELVF_MBCTRL_VFU, intel->regs + mbox->ctrl );
169 
170  /* Get mailbox status and record observed flags */
171  ctrl = readl ( intel->regs + mbox->ctrl );
172  seen |= ctrl;
173 
174  /* If a reset is in progress, clear VFU and abort */
175  if ( ctrl & INTELVF_MBCTRL_RSTI ) {
176  writel ( 0, intel->regs + mbox->ctrl );
177  return -EPIPE;
178  }
179 
180  /* Write message to mailbox, if applicable. This
181  * potentially overwrites a message sent by the PF (if
182  * the PF has simultaneously released PFU (thus
183  * allowing our VFU) and asserted PFSTS), but that
184  * doesn't really matter since there are no
185  * unsolicited PF->VF messages that require the actual
186  * message content to be observed.
187  */
188  if ( ctrl & INTELVF_MBCTRL_VFU )
189  intelvf_mbox_write ( intel, msg );
190 
191  /* Read message from mailbox, if applicable. */
192  if ( ( seen & INTELVF_MBCTRL_VFU ) &&
193  ( seen & INTELVF_MBCTRL_PFACK ) &&
194  ( ctrl & INTELVF_MBCTRL_PFSTS ) )
195  intelvf_mbox_read ( intel, msg );
196 
197  /* Acknowledge received message (if applicable),
198  * release VFU lock, and send message (if applicable).
199  */
200  ctrl = ( ( ( ctrl & INTELVF_MBCTRL_PFSTS ) ?
201  INTELVF_MBCTRL_ACK : 0 ) |
202  ( ( ctrl & INTELVF_MBCTRL_VFU ) ?
203  INTELVF_MBCTRL_REQ : 0 ) );
204  writel ( ctrl, intel->regs + mbox->ctrl );
205 
206  /* Exit successfully if we have received a response */
207  if ( msg->hdr & INTELVF_MSG_RESPONSE ) {
208 
209  /* Sanity check */
210  assert ( seen & INTELVF_MBCTRL_VFU );
211  assert ( seen & INTELVF_MBCTRL_PFACK );
212  assert ( seen & INTELVF_MBCTRL_PFSTS );
213 
214  return 0;
215  }
216 
217  /* Delay */
218  mdelay ( 1 );
219  }
220 
221  DBGC ( intel, "INTEL %p timed out waiting for mailbox (seen %08x)\n",
222  intel, seen );
223  return -ETIMEDOUT;
224 }
void * regs
Registers.
Definition: intel.h:292
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
static void intelvf_mbox_write(struct intel_nic *intel, const union intelvf_msg *msg)
Write message to mailbox.
Definition: intelvf.c:54
struct intel_mailbox mbox
Mailbox.
Definition: intel.h:310
#define EPIPE
Broken pipe.
Definition: errno.h:620
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define DBGC(...)
Definition: compiler.h:505
#define INTELVF_MBCTRL_PFACK
PF acknowledged message.
Definition: intelvf.h:25
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
Definition: golan.c:120
#define INTELVF_MBCTRL_REQ
Request for PF ready.
Definition: intelvf.h:20
#define INTELVF_MBCTRL_PFSTS
PF wrote a message.
Definition: intelvf.h:24
An Intel virtual function mailbox.
Definition: intel.h:267
#define INTELVF_MBCTRL_ACK
PF message received.
Definition: intelvf.h:21
#define INTELVF_MSG_RESPONSE
Message is a response.
Definition: intelvf.h:57
unsigned int uint32_t
Definition: stdint.h:12
#define INTELVF_MBCTRL_RSTI
PF reset in progress.
Definition: intelvf.h:26
#define INTELVF_MBCTRL_VFU
Buffer taken by VF.
Definition: intelvf.h:22
#define INTELVF_MBOX_MAX_WAIT_MS
Maximum time to wait for mailbox message.
Definition: intelvf.h:149
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:79
static void intelvf_mbox_read(struct intel_nic *intel, union intelvf_msg *msg)
Read message from mailbox.
Definition: intelvf.c:75
uint8_t ctrl
Ring control.
Definition: dwmac.h:18
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:670

References assert(), ctrl, DBGC, EPIPE, ETIMEDOUT, INTELVF_MBCTRL_ACK, INTELVF_MBCTRL_PFACK, INTELVF_MBCTRL_PFSTS, INTELVF_MBCTRL_REQ, INTELVF_MBCTRL_RSTI, INTELVF_MBCTRL_VFU, INTELVF_MBOX_MAX_WAIT_MS, intelvf_mbox_read(), intelvf_mbox_write(), INTELVF_MSG_RESPONSE, intel_nic::mbox, mdelay(), msg(), readl(), intel_nic::regs, and writel().

Referenced by intelvf_mbox_reset(), intelvf_mbox_set_mac(), intelvf_mbox_set_mtu(), intelxvf_mbox_queues(), and intelxvf_mbox_version().

◆ intelvf_mbox_reset()

int intelvf_mbox_reset ( struct intel_nic intel,
uint8_t hw_addr 
)

Send reset message and get initial MAC address.

Parameters
intelIntel device
hw_addrHardware address to fill in, or NULL
Return values
rcReturn status code

Definition at line 233 of file intelvf.c.

233  {
234  union intelvf_msg msg;
235  int rc;
236 
237  /* Send reset message */
238  memset ( &msg, 0, sizeof ( msg ) );
240  if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
241  DBGC ( intel, "INTEL %p reset failed: %s\n",
242  intel, strerror ( rc ) );
243  return rc;
244  }
245 
246  /* Check response */
247  if ( ( msg.hdr & INTELVF_MSG_TYPE_MASK ) != INTELVF_MSG_TYPE_RESET ) {
248  DBGC ( intel, "INTEL %p reset unexpected response:\n", intel );
249  DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
250  return -EPROTO;
251  }
252 
253  /* Fill in MAC address, if applicable */
254  if ( hw_addr ) {
255  if ( msg.hdr & INTELVF_MSG_ACK ) {
256  memcpy ( hw_addr, msg.mac.mac, sizeof ( msg.mac.mac ) );
257  DBGC ( intel, "INTEL %p reset assigned MAC address "
258  "%s\n", intel, eth_ntoa ( hw_addr ) );
259  } else {
260  eth_random_addr ( hw_addr );
261  DBGC ( intel, "INTEL %p reset generated MAC address "
262  "%s\n", intel, eth_ntoa ( hw_addr ) );
263  }
264  }
265 
266  return 0;
267 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
#define DBGC(...)
Definition: compiler.h:505
Mailbox message.
Definition: intelvf.h:130
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define DBGC_HDA(...)
Definition: compiler.h:506
#define EPROTO
Protocol error.
Definition: errno.h:625
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
#define INTELVF_MSG_ACK
Message ACK flag.
Definition: intelvf.h:54
int intelvf_mbox_msg(struct intel_nic *intel, union intelvf_msg *msg)
Send/receive mailbox message.
Definition: intelvf.c:152
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:176
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition: intelvf.h:48
#define INTELVF_MSG_TYPE_RESET
Reset mailbox message.
Definition: intelvf.h:33
void eth_random_addr(void *hw_addr)
Generate random Ethernet address.
Definition: ethernet.c:160
void * memset(void *dest, int character, size_t len) __nonnull

References DBGC, DBGC_HDA, EPROTO, eth_ntoa(), eth_random_addr(), intelvf_mbox_msg(), INTELVF_MSG_ACK, INTELVF_MSG_TYPE_MASK, INTELVF_MSG_TYPE_RESET, memcpy(), memset(), msg(), rc, and strerror().

Referenced by intelxvf_open(), and intelxvf_probe().

◆ intelvf_mbox_set_mac()

int intelvf_mbox_set_mac ( struct intel_nic intel,
const uint8_t ll_addr 
)

Send set MAC address message.

Parameters
intelIntel device
ll_addrLink-layer address
Return values
rcReturn status code

Definition at line 276 of file intelvf.c.

276  {
277  union intelvf_msg msg;
278  int rc;
279 
280  /* Send set MAC address message */
281  memset ( &msg, 0, sizeof ( msg ) );
283  memcpy ( msg.mac.mac, ll_addr, sizeof ( msg.mac.mac ) );
284  if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
285  DBGC ( intel, "INTEL %p set MAC address failed: %s\n",
286  intel, strerror ( rc ) );
287  return rc;
288  }
289 
290  /* Check response */
292  DBGC ( intel, "INTEL %p set MAC address unexpected response:\n",
293  intel );
294  DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
295  return -EPROTO;
296  }
297 
298  /* Check that we were allowed to set the MAC address */
299  if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
300  DBGC ( intel, "INTEL %p set MAC address refused\n", intel );
301  return -EPERM;
302  }
303 
304  return 0;
305 }
#define INTELVF_MSG_TYPE_SET_MAC
Set MAC address mailbox message.
Definition: intelvf.h:36
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
#define DBGC(...)
Definition: compiler.h:505
Mailbox message.
Definition: intelvf.h:130
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define DBGC_HDA(...)
Definition: compiler.h:506
#define EPROTO
Protocol error.
Definition: errno.h:625
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
#define INTELVF_MSG_ACK
Message ACK flag.
Definition: intelvf.h:54
int intelvf_mbox_msg(struct intel_nic *intel, union intelvf_msg *msg)
Send/receive mailbox message.
Definition: intelvf.c:152
#define EPERM
Operation not permitted.
Definition: errno.h:615
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition: intelvf.h:48
void * memset(void *dest, int character, size_t len) __nonnull

References DBGC, DBGC_HDA, EPERM, EPROTO, intelvf_mbox_msg(), INTELVF_MSG_ACK, INTELVF_MSG_TYPE_MASK, INTELVF_MSG_TYPE_SET_MAC, memcpy(), memset(), msg(), rc, and strerror().

Referenced by intelxvf_open().

◆ intelvf_mbox_set_mtu()

int intelvf_mbox_set_mtu ( struct intel_nic intel,
size_t  mtu 
)

Send set MTU message.

Parameters
intelIntel device
mtuMaximum packet size
Return values
rcReturn status code

Definition at line 314 of file intelvf.c.

314  {
315  union intelvf_msg msg;
316  int rc;
317 
318  /* Send set MTU message */
319  memset ( &msg, 0, sizeof ( msg ) );
321  msg.mtu.mtu = mtu;
322  if ( ( rc = intelvf_mbox_msg ( intel, &msg ) ) != 0 ) {
323  DBGC ( intel, "INTEL %p set MTU failed: %s\n",
324  intel, strerror ( rc ) );
325  return rc;
326  }
327 
328  /* Check response */
330  DBGC ( intel, "INTEL %p set MTU unexpected response:\n",
331  intel );
332  DBGC_HDA ( intel, 0, &msg, sizeof ( msg ) );
333  return -EPROTO;
334  }
335 
336  /* Check that we were allowed to set the MTU */
337  if ( ! ( msg.hdr & INTELVF_MSG_ACK ) ) {
338  DBGC ( intel, "INTEL %p set MTU refused\n", intel );
339  return -EPERM;
340  }
341 
342  return 0;
343 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
#define DBGC(...)
Definition: compiler.h:505
Mailbox message.
Definition: intelvf.h:130
#define DBGC_HDA(...)
Definition: compiler.h:506
#define EPROTO
Protocol error.
Definition: errno.h:625
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
#define INTELVF_MSG_ACK
Message ACK flag.
Definition: intelvf.h:54
int intelvf_mbox_msg(struct intel_nic *intel, union intelvf_msg *msg)
Send/receive mailbox message.
Definition: intelvf.c:152
#define INTELVF_MSG_TYPE_SET_MTU
Set MTU mailbox message.
Definition: intelvf.h:39
#define EPERM
Operation not permitted.
Definition: errno.h:615
#define INTELVF_MSG_TYPE_MASK
Message type mask.
Definition: intelvf.h:48
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
void * memset(void *dest, int character, size_t len) __nonnull

References DBGC, DBGC_HDA, EPERM, EPROTO, intelvf_mbox_msg(), INTELVF_MSG_ACK, INTELVF_MSG_TYPE_MASK, INTELVF_MSG_TYPE_SET_MTU, memset(), msg(), mtu, rc, and strerror().

Referenced by intelxvf_open().