Add qemu 2.4.0
[kvmfornfv.git] / qemu / docs / specs / rocker.txt
diff --git a/qemu/docs/specs/rocker.txt b/qemu/docs/specs/rocker.txt
new file mode 100644 (file)
index 0000000..1c74351
--- /dev/null
@@ -0,0 +1,1014 @@
+Rocker Network Switch Register Programming Guide
+Copyright (c) Scott Feldman <sfeldma@gmail.com>
+Copyright (c) Neil Horman <nhorman@tuxdriver.com>
+Version 0.11, 12/29/2014
+
+LICENSE
+=======
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+SECTION 1: Introduction
+=======================
+
+Overview
+--------
+
+This document describes the hardware/software interface for the Rocker switch
+device.  The intended audience is authors of OS drivers and device emulation
+software.
+
+Notations and Conventions
+-------------------------
+
+o In register descriptions, [n:m] indicates a range from bit n to bit m,
+inclusive.
+o Use of leading 0x indicates a hexadecimal number.
+o Use of leading 0b indicates a binary number.
+o The use of RSVD or Reserved indicates that a bit or field is reserved for
+future use.
+o Field width is in bytes, unless otherwise noted.
+o Register are (R) read-only, (R/W) read/write, (W) write-only, or (COR) clear
+on read
+o TLV values in network-byte-order are designated with (N).
+
+
+SECTION 2: PCI Configuration Registers
+======================================
+
+PCI Configuration Space
+-----------------------
+
+Each switch instance registers as a PCI device with PCI configuration space:
+
+       offset  width   description             value
+       ---------------------------------------------
+       0x0     2       Vendor ID               0x1b36
+       0x2     2       Device ID               0x0006
+       0x4     4       Command/Status
+       0x8     1       Revision ID             0x01
+       0x9     3       Class code              0x2800
+       0xC     1       Cache line size
+       0xD     1       Latency timer
+       0xE     1       Header type
+       0xF     1       Built-in self test
+       0x10    4       Base address low
+       0x14    4       Base address high
+       0x18-28         Reserved
+       0x2C    2       Subsystem vendor ID     *
+       0x2E    2       Subsystem ID            *
+       0x30-38         Reserved
+       0x3C    1       Interrupt line
+       0x3D    1       Interrupt pin           0x00
+       0x3E    1       Min grant               0x00
+       0x3D    1       Max latency             0x00
+       0x40    1       TRDY timeout
+       0x41    1       Retry count
+       0x42    2       Reserved
+
+
+* Assigned by sub-system implementation
+
+SECTION 3: Memory-Mapped Register Space
+=======================================
+
+There are two memory-mapped BARs.  BAR0 maps device register space and is
+0x2000 in size.  BAR1 maps MSI-X vector and PBA tables and is also 0x2000 in
+size, allowing for 256 MSI-X vectors.
+
+All registers are 4 or 8 bytes long.  It is assumed host software will access 4
+byte registers with one 4-byte access, and 8 byte registers with either two
+4-byte accesses or a single 8-byte access.  In the case of two 4-byte accesses,
+access must be lower and then upper 4-bytes, in that order.
+
+BAR0 device register space is organized as follows:
+
+       offset          description
+       ------------------------------------------------------
+       0x0000-0x000f   Bogus registers to catch misbehaving
+                       drivers.  Writes do nothing.  Reads
+                       back as 0xDEADBABE.
+       0x0010-0x00ff   Test registers
+       0x0300-0x03ff   General purpose registers
+       0x1000-0x1fff   Descriptor control
+
+Holes in register space are reserved.  Writes to reserved registers do nothing.
+Reads to reserved registers read back as 0.
+
+No fancy stuff like write-combining is enabled on any of the registers.
+
+BAR1 MSI-X register space is organized as follows:
+
+       offset          description
+       ------------------------------------------------------
+       0x0000-0x0fff   MSI-X vector table (256 vectors total)
+       0x1000-0x1fff   MSI-X PBA table
+
+
+SECTION 4: Interrupts, DMA, and Endianness
+==========================================
+
+PCI Interrupts
+--------------
+
+The device supports only MSI-X interrupts.  BAR1 memory-mapped region contains
+the MSI-X vector and PBA tables, with support for up to 256 MSI-X vectors.
+
+The vector assignment is:
+
+       vector          description
+       -----------------------------------------------------
+       0               Command descriptor ring completion
+       1               Event descriptor ring completion
+       2               Test operation completion
+       3               RSVD
+       4-255           Tx and Rx descriptor ring completion
+                         Tx vector is even
+                         Rx vector is odd
+
+A MSI-X vector table entry is 16 bytes:
+
+       field           offset  width   description
+       -------------------------------------------------------------
+       lower_addr      0x0     4       [31:2] message address[31:2]
+                                       [1:0] Rsvd (4 byte alignment
+                                                   required)
+       upper_addr      0x4     4       [31:19] Rsvd
+                                       [14:0] message address[46:32]
+       data            0x8     4       message data[31:0]
+       control         0xc     4       [31:1] Rsvd
+                                       [0] mask (0 = enable,
+                                                 1 = masked)
+
+Software should install the Interrupt Service Routine (ISR) before any ports
+are enabled or any commands are issued on the command ring.
+
+DMA Operations
+--------------
+
+DMA operations are used for packet DMA to/from the CPU, command and event
+processing.  Command processing includes statistical counters and table dumps,
+table insertion/deletion, and more.  Event processing provides an async
+notification method for device-originating events.  Each DMA operation has a
+set of control registers to manage a descriptor ring.  The descriptor rings are
+allocated from contiguous host DMA-able memory and registers specify the rings
+base address, size and current head and tail indices.  Software always writes
+the head, and hardware always writes the tail.
+
+The higher-order bit of DMA_DESC_COMP_ERR is used to mark hardware completion
+of a descriptor.  Software will clear this bit when posting a descriptor to the
+ring, and hardware will set this bit when the descriptor is complete.
+
+Descriptor ring sizes must be a power of 2 and range from 2 to 64K entries.
+Descriptor rings' base address must be 8-byte aligned.  Descriptors must be
+packed within ring.  Each descriptor in each ring must also be aligned on an 8
+byte boundary.  Each descriptor ring will have these registers:
+
+       DMA_DESC_xxx_BASE_ADDR, offset 0x1000 + (x * 32), 64-bit, (R/W)
+       DMA_DESC_xxx_SIZE, offset 0x1008 + (x * 32), 32-bit, (R/W)
+       DMA_DESC_xxx_HEAD, offset 0x100c + (x * 32), 32-bit, (R/W)
+       DMA_DESC_xxx_TAIL, offset 0x1010 + (x * 32), 32-bit, (R)
+       DMA_DESC_xxx_CTRL, offset 0x1014 + (x * 32), 32-bit, (W)
+       DMA_DESC_xxx_CREDITS, offset 0x1018 + (x * 32), 32-bit, (R/W)
+       DMA_DESC_xxx_RSVD1, offset 0x101c + (x * 32), 32-bit, (R/W)
+
+Where x is descriptor ring index:
+
+       index           ring
+       --------------------
+       0               CMD
+       1               EVENT
+       2               TX (port 0)
+       3               RX (port 0)
+       4               TX (port 1)
+       5               RX (port 1)
+       .
+       .
+       .
+       124             TX (port 61)
+       125             RX (port 61)
+       126             Resv
+       127             Resv
+
+Writing BASE_ADDR or SIZE will reset HEAD and TAIL to zero.  HEAD cannot be
+written past TAIL.  To do so would wrap the ring.  An empty ring is when HEAD
+== TAIL.  A full ring is when HEAD is one position behind TAIL.  Both HEAD and
+TAIL increment and modulo wrap at the ring size.
+
+CTRL register bits:
+
+       bit     name            description
+       ------------------------------------------------------------------------
+       [0]     CTRL_RESET      Reset the descriptor ring
+       [1:31]  Reserved
+
+All descriptor types share some common fields:
+
+       field                   width   description
+       -------------------------------------------------------------------
+       DMA_DESC_BUF_ADDR       8       Phys addr of desc payload, 8-byte
+                                       aligned
+       DMA_DESC_COOKIE         8       Desc cookie for completion matching,
+                                       upper-most bit is reserved
+       DMA_DESC_BUF_SIZE       2       Desc payload size in bytes
+       DMA_DESC_TLV_SIZE       2       Desc payload total size in bytes
+                                       used for TLVs.  Must be <=
+                                       DMA_DESC_BUF_SIZE.
+       DMA_DESC_COMP_ERR       2       Completion status of associated
+                                       desc payload.  High order bit is
+                                       clear on new descs, toggled by
+                                       hw for completed items.
+
+To support forward- and backward-compatibility, descriptor and completion
+payloads are specified in TLV format.  Fields are packed with Type=field name,
+Length=field length, and Value=field value.  Software will ignore unknown fields
+filled in by the switch.  Likewise, the switch will ignore unknown fields
+filled in by software.
+
+Descriptor payload buffer is 8-byte aligned and TLVs are 8-byte aligned.  The
+value within a TLV is also 8-byte aligned.  The (packed, 8 byte) TLV header is:
+
+       field   width   description
+       -----------------------------
+       type    4       TLV type
+       len     2       TLV value length
+       pad     2       Reserved
+
+The alignment requirements for descriptors and TLVs are to avoid unaligned
+access exceptions in software.  Note that the payload for each TLV is also
+8 byte aligned.
+
+Figure 1 shows an example descriptor buffer with two TLVs.
+
+                  <------- 8 bytes ------->
+
+  8-byte  +––––+  +–––––––––––+–––––+–––––+                     +–+
+  align           |   type    | len | pad |    TLV#1 hdr          |
+                  +–––––––––––+–––––+–––––+    (len=22)           |
+                  |                       |                       |
+                  |  value                |    TVL#1 value        |
+                  |                       |    (padded to 8-byte  |
+                  |                 +–––––+     alignment)        |
+                  |                 |/////|                       |
+   8-byte +––––+  +–––––––––––+–––––––––––+                       |
+   align          |   type    | len | pad |    TLV#2 hdr    DESC_BUF_SIZE
+                  +–––––+–––––+–––––+–––––+    (len=2)            |
+                  |value|/////////////////|    TLV#2 value        |
+                  +–––––+/////////////////|                       |
+                  |///////////////////////|                       |
+                  |///////////////////////|                       |
+                  |///////////////////////|                       |
+                  |////////unused/////////|                       |
+                  |////////space//////////|                       |
+                  |///////////////////////|                       |
+                  |///////////////////////|                       |
+                  |///////////////////////|                       |
+                  +–––––––––––––––––––––––+                     +–+
+
+                               fig. 1
+
+TLVs can be nested within the NEST TLV type.
+
+Interrupt credits
+^^^^^^^^^^^^^^^^^
+
+MSI-X vectors used for descriptor ring completions use a credit mechanism for
+efficient device, PCIe bus, OS and driver operations.  Each descriptor ring has
+a credit count which represents the number of outstanding descriptors to be
+processed by the driver.  As the device marks descriptors complete, the credit
+count is incremented.  As the driver processes those outstanding descriptors,
+it returns credits back to the device.  This way, the device knows the driver's
+progress and can make decisions about when to fire the next interrupt or not.
+When the credit count is zero, and the first descriptors are posted for the
+driver, a single interrupt is fired.  Once the interrupt is fired, the
+interrupt is disabled (auto-masked*).  In response to the interrupt, the driver
+will process descriptors and PIO write a returned credit value for that
+descriptor ring.  If the driver returns all credits (the driver caught up with
+the device and there is no outstanding work), then the interrupt is unmasked,
+but not fired.  If only partial credits are returned, the interrupt remains
+masked but the device generates an interrupt, signaling the driver that more
+outstanding work is available.
+
+(* this masking is unrelated to to the MSI-X interrupt mask register)
+
+Endianness
+----------
+
+Device registers are hard-coded to little-endian (LE).  The driver should
+convert to/from host endianess to LE for device register accesses.
+
+Descriptors are LE.  Descriptor buffer TLVs will have LE type and length
+fields, but the value field can either be LE or network-byte-order, depending
+on context.  TLV values containing network packet data will be in network-byte
+order.  A TLV value containing a field or mask used to compare against network
+packet data is network-byte order.  For example, flow match fields (and masks)
+are network-byte-order since they're matched directly, byte-by-byte, against
+network packet data.  All non-network-packet TLV multi-byte values will be LE.
+
+TLV values in network-byte-order are designated with (N).
+
+
+SECTION 5: Test Registers
+=========================
+
+Rocker has several test registers to support troubleshooting register access,
+interrupt generation, and DMA operations:
+
+       TEST_REG, offset 0x0010, 32-bit (R/W)
+       TEST_REG64, offset 0x0018, 64-bit (R/W)
+       TEST_IRQ, offset 0x0020, 32-bit (R/W)
+       TEST_DMA_ADDR, offset 0x0028, 64-bit (R/W)
+       TEST_DMA_SIZE, offset 0x0030, 32-bit (R/W)
+       TEST_DMA_CTRL, offset 0x0034, 32-bit (R/W)
+
+Reads to TEST_REG and TEST_REG64 will read a value equal to twice the last
+value written to the register.  The 32-bit and 64-bit versions are for testing
+32-bit and 64-bit host accesses.
+
+A vector can be written to TEST_IRQ and the device will generate an interrupt
+for that vector.
+
+To test basic DMA operations, allocate a DMA-able host buffer and put the
+buffer address into TEST_DMA_ADDR and size into TEST_DMA_SIZE.  Then, write to
+TEST_DMA_CTRL to manipulate the buffer contents.  TEST_DMA_CTRL operations are:
+
+       operation               value   description
+       -----------------------------------------------------------
+       TEST_DMA_CTRL_CLEAR     1       clear buffer
+       TEST_DMA_CTRL_FILL      2       fill buffer bytes with 0x96
+       TEST_DMA_CTRL_INVERT    4       invert bytes in buffer
+
+Various buffer address and sizes should be tested to verify no address boundary
+issue exists.  In particular, buffers that start on odd-8-byte boundary and/or
+span multiple PAGE sizes should be tested.
+
+
+SECTION 6: Ports
+================
+
+Physical and Logical Ports
+------------------------------------
+
+The switch supports up to 62 physical (front-panel) ports.  Register
+PORT_PHYS_COUNT returns the actual number of physical ports available:
+
+       PORT_PHYS_COUNT, offset 0x0304, 32-bit, (R)
+
+In addition to front-panel ports, the switch supports logical ports for
+tunnels.
+
+Front-panel ports and logical tunnel ports are mapped into a single 32-bit port
+space.  A special CPU port is assigned port 0.  The front-panel ports are
+mapped to ports 1-62.  A special loopback port is assigned port 63.  Logical
+tunnel ports are assigned ports 0x0001000-0x0001ffff.
+To summarize the port assignments:
+
+       port                    mapping
+       -------------------------------------------------------
+       0                       CPU port (for packets to/from host CPU)
+       1-62                    front-panel physical ports
+       63                      loopback port
+       64-0x0000ffff           RSVD
+       0x00010000-0x0001ffff   logical tunnel ports
+       0x00020000-0xffffffff   RSVD
+
+Physical Port Mode
+------------------
+
+Switch front-panel ports operate in a mode.  Currently, the only mode is
+OF-DPA.  OF-DPA[1] mode is based on OpenFlow Data Plane Abstraction (OF-DPA)
+Abstract Switch Specification, Version 1.0, from Broadcom Corporation.  To
+set/get the mode for front-panel ports, see port settings, below.
+
+Port Settings
+-------------
+
+Link status for all front-panel ports is available via PORT_PHYS_LINK_STATUS:
+
+       PORT_PHYS_LINK_STATUS, offset 0x0310, 64-bit, (R)
+
+       Value is port bitmap.  Bits 0 and 63 always read 0.  Bits 1-62
+       read 1 for link UP and 0 for link DOWN for respective front-panel ports.
+
+Other properties for front-panel ports are available via DMA CMD descriptors:
+
+       Get PORT_SETTINGS descriptor:
+
+               field           width   description
+               ----------------------------------------------
+               PORT_SETTINGS   2       CMD_GET
+               PPORT           4       Physical port #
+
+       Get PORT_SETTINGS completion:
+
+               field           width   description
+               ----------------------------------------------
+               PPORT           4       Physical port #
+               SPEED           4       Current port interface speed, in Mbps
+               DUPLEX          1       1 = Full, 0 = Half
+               AUTONEG         1       1 = enabled, 0 = disabled
+               MACADDR         6       Port MAC address
+               MODE            1       0 = OF-DPA
+               LEARNING        1       MAC address learning on port
+                                               1 = enabled
+                                               0 = disabled
+               PHYS_NAME       <var>   Physical port name (string)
+
+       Set PORT_SETTINGS descriptor:
+
+               field           width   description
+               ----------------------------------------------
+               PORT_SETTINGS   2       CMD_SET
+               PPORT           4       Physical port #
+               SPEED           4       Port interface speed, in Mbps
+               DUPLEX          1       1 = Full, 0 = Half
+               AUTONEG         1       1 = enabled, 0 = disabled
+               MACADDR         6       Port MAC address
+               MODE            1       0 = OF-DPA
+
+Port Enable
+-----------
+
+Front-panel ports are initially disabled, which means port ingress and egress
+packets will be dropped.  To enable or disable a port, use PORT_PHYS_ENABLE:
+
+       PORT_PHYS_ENABLE: offset 0x0318, 64-bit, (R/W)
+
+       Value is bitmap of first 64 ports.  Bits 0 and 63 are ignored
+       and always read as 0.  Write 1 to enable port; write 0 to disable it.
+       Default is 0.
+
+
+SECTION 7: Switch Control
+=========================
+
+This section covers switch-wide register settings.
+
+Control
+-------
+
+This register is used for low level control of the switch.
+
+       CONTROL: offset 0x0300, 32-bit, (W)
+
+       bit     name            description
+       ------------------------------------------------------------------------
+       [0]     CONTROL_RESET   If set, device will perform reset
+       [1:31]  Reserved
+
+Switch ID
+---------
+
+The switch has a SWITCH_ID to be used by software to uniquely identify the
+switch:
+
+       SWITCH_ID: offset 0x0320, 64-bit, (R)
+
+       Value is opaque to switch software and no special encoding is implied.
+
+
+SECTION 8: Events
+=================
+
+Non-I/O asynchronous events from the device are notified to the host using the
+event ring.  The TLV structure for events is:
+
+       field           width   description
+       ---------------------------------------------------
+       TYPE            4       Event type, one of:
+                                       1: LINK_CHANGED
+                                       2: MAC_VLAN_SEEN
+       INFO            <nest>  Event info (details below)
+
+Link Changed Event
+------------------
+
+When link status changes on a physical port, this event is generated.
+
+       field           width   description
+       ---------------------------------------------------
+       INFO            <nest>
+         PPORT         4       Physical port
+         LINKUP        1       Link status:
+                                       0: down
+                                       1: up
+
+MAC VLAN Seen Event
+-------------------
+
+When a packet ingresses on a port and the source MAC/VLAN isn't known to the
+device, the device will generate this event.  In response to the event, the
+driver should install to the device the MAC/VLAN on the port into the bridge
+table.  Once installed, the MAC/VLAN is known on the port and this event will
+no longer be generated.
+
+       field           width   description
+       ---------------------------------------------------
+       INFO            <nest>
+         PPORT         4       Physical port
+         MAC           6       MAC address
+         VLAN          2       VLAN ID
+
+
+SECTION 9: CPU Packet Processing
+================================
+
+Ingress packets directed to the host CPU for further processing are delivered
+in the DMA RX ring.  Likewise, host CPU originating packets destined to egress
+on switch ports are scheduled by software using the DMA TX ring.
+
+Tx Packet Processing
+--------------------
+
+Software schedules packets for egress on switch ports using the DMA TX ring.  A
+TX descriptor buffer describes the packet location and size in host DMA-able
+memory, the destination port, and any hardware-offload functions (such as L3
+payload checksum offload).  Software then bumps the descriptor head to signal
+hardware of new Tx work.  In response, hardware will DMA read Tx descriptors up
+to head, DMA read descriptor buffer and packet data, perform offloading
+functions, and finally frame packet on wire (network).  Once packet processing
+is complete, hardware will writeback status to descriptor(s) to signal to
+software that Tx is complete and software resources (e.g. skb) backing packet
+can be released.
+
+Figure 2 shows an example 3-fragment packet queued with one Tx descriptor.  A
+TLV is used for each packet fragment.
+
+                                                  pkt frag 1
+                                                  +–––––––+  +–+
+                                              +–––+       |    |
+                                desc buf      |   |       |    |
+                               +––––––––+     |   |       |    |
+               Tx ring     +–––+        +–––––+   |       |    |
+             +–––––––––+   |   |  TLVs  |         +–––––––+    |
+             |         +–––+   +––––––––+         pkt frag 2   |
+             | desc 0  |       |        +–––––+   +–––––––+    |
+             +–––––––––+       |  TLVs  |     +–––+       |    |
+       head+–+         |       +––––––––+         |       |    |
+             | desc 1  |       |        +–––––+   +–––––––+    |pkt
+             +–––––––––+       |  TLVs  |     |                |
+             |         |       +––––––––+     |   pkt frag 3   |
+             |         |                      |   +–––––––+    |
+             +–––––––––+                      +–––+       |    |
+             |         |                          |       |    |
+             |         |                          |       |    |
+             +–––––––––+                          |       |    |
+             |         |                          |       |    |
+             |         |                          |       |    |
+             +–––––––––+                          |       |    |
+             |         |                          +–––––––+  +–+
+             |         |
+             +–––––––––+
+
+                               fig 2.
+
+The TLVs for Tx descriptor buffer are:
+
+       field                   width   description
+       ---------------------------------------------------------------------
+       PPORT                   4       Destination physical port #
+       TX_OFFLOAD              1       Hardware offload modes:
+                                         0: no offload
+                                         1: insert IP csum (ipv4 only)
+                                         2: insert TCP/UDP csum
+                                         3: L3 csum calc and insert
+                                            into csum offset (TX_L3_CSUM_OFF)
+                                           16-bit 1's complement csum value.
+                                            IPv4 pseudo-header and IP
+                                            already calculated by OS
+                                          and inserted.
+                                         4: TSO (TCP Segmentation Offload)
+       TX_L3_CSUM_OFF          2       For L3 csum offload mode, the offset,
+                                       from the beginning of the packet,
+                                       of the csum field in the L3 header
+       TX_TSO_MSS              2       For TSO offload mode, the
+                                       Maximum Segment Size in bytes
+        TX_TSO_HDR_LEN         2       For TSO offload mode, the
+                                       length of ethernet, IP, and
+                                       TCP/UDP headers, including IP
+                                       and TCP options.
+       TX_FRAGS                <array> Packet fragments
+         TX_FRAG               <nest>  Packet fragment
+           TX_FRAG_ADDR        8       DMA address of packet fragment
+           TX_FRAG_LEN         2       Packet fragment length
+
+Possible status return codes in descriptor on completion are:
+
+       DESC_COMP_ERR   reason
+       --------------------------------------------------------------------
+       0               OK
+       -ROCKER_ENXIO   address or data read err on desc buf or packet
+                       fragment
+       -ROCKER_EINVAL  bad pport or TSO or csum offloading error
+       -ROCKER_ENOMEM  no memory for internal staging tx fragment
+
+Rx Packet Processing
+--------------------
+
+For packets ingressing on switch ports that are not forwarded by the switch but
+rather directed to the host CPU for further processing are delivered in the DMA
+RX ring.  Rx descriptor buffers are allocated by software and placed on the
+ring.  Hardware will fill Rx descriptor buffers with packet data, write the
+completion, and signal to software that a new packet is ready.  Since Rx packet
+size is not known a-priori, the Rx descriptor buffer must be allocated for
+worst-case packet size.  A single Rx descriptor will contain the entire Rx
+packet data in one RX_FRAG.  Other Rx TLVs describe and hardware offloads
+performed on the packet, such as checksum validation.
+
+The TLVs for Rx descriptor buffer are:
+
+       field           width   description
+       ---------------------------------------------------
+       PPORT           4       Source physical port #
+       RX_FLAGS        2       Packet parsing flags:
+                                 (1 << 0): IPv4 packet
+                                 (1 << 1): IPv6 packet
+                                 (1 << 2): csum calculated
+                                 (1 << 3): IPv4 csum good
+                                 (1 << 4): IP fragment
+                                 (1 << 5): TCP packet
+                                 (1 << 6): UDP packet
+                                 (1 << 7): TCP/UDP csum good
+                                 (1 << 8): Offload forward
+       RX_CSUM         2       IP calculated checksum:
+                                 IPv4: IP payload csum
+                                 IPv6: header and payload csum
+                               (Only valid is RX_FLAGS:csum calc is set)
+       RX_FRAG_ADDR    8       DMA address of packet fragment
+       RX_FRAG_MAX_LEN 2       Packet maximum fragment length
+       RX_FRAG_LEN     2       Actual packet fragment length after receive
+
+Offload forward RX_FLAG indicates the device has already forwarded the packet
+so the host CPU should not also forward the packet.
+
+Possible status return codes in descriptor on completion are:
+
+       DESC_COMP_ERR   reason
+       --------------------------------------------------------------------
+       0               OK
+       -ROCKER_ENXIO   address or data read err on desc buf
+       -ROCKER_ENOMEM  no memory for internal staging desc buf
+       -ROCKER_EMSGSIZE Rx descriptor buffer wasn't big enough to contain
+                       packet data TLV and other TLVs.
+
+
+SECTION 10: OF-DPA Mode
+======================
+
+OF-DPA mode allows the switch to offload flow packet processing functions to
+hardware.  An OpenFlow controller would communicate with an OpenFlow agent
+installed on the switch.  The OpenFlow agent would (directly or indirectly)
+communicate with the Rocker switch driver, which in turn would program switch
+hardware with flow functionality, as defined in OF-DPA.  The block diagram is:
+
+               +–––––––––––––––----–––+
+               |        OF            |
+               |  Remote Controller   |
+               +––––––––+––----–––––––+
+                        |
+                        |
+               +––––––––+–––––––––+
+               |       OF         |
+               |   Local Agent    |
+               +––––––––––––––––––+
+               |                  |
+               |   Rocker Driver  |
+               +––––––––––––––––––+
+                   <this spec>
+               +––––––––––––––––––+
+               |                  |
+               |   Rocker Switch  |
+               +––––––––––––––––––+
+
+To participate in flow functions, ports must be configure for OF-DPA mode
+during switch initialization.
+
+OF-DPA Flow Table Interface
+---------------------------
+
+There are commands to add, modify, delete, and get stats of flow table entries.
+The commands are issued using the DMA CMD descriptor ring.  The following
+commands are defined:
+
+       CMD_ADD:                add an entry to flow table
+       CMD_MOD:                modify an entry in flow table
+       CMD_DEL:                delete an entry from flow table
+       CMD_GET_STATS:          get stats for flow entry
+
+TLVs for add and modify commands are:
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_CMD              2       CMD_[ADD|MOD]
+       OF_DPA_TBL              2       Flow table ID
+                                         0: ingress port
+                                         10: vlan
+                                         20: termination mac
+                                         30: unicast routing
+                                         40: multicast routing
+                                         50: bridging
+                                         60: ACL policy
+       OF_DPA_PRIORITY         4       Flow priority
+       OF_DPA_HARDTIME         4       Hard timeout for flow
+       OF_DPA_IDLETIME         4       Idle timeout for flow
+       OF_DPA_COOKIE           8       Cookie
+
+Additional TLVs based on flow table ID:
+
+Table ID 0: ingress port
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_IN_PPORT         4       ingress physical port number
+       OF_DPA_GOTO_TBL         2       goto table ID; zero to drop
+
+Table ID 10: vlan
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_IN_PPORT         4       ingress physical port number
+       OF_DPA_VLAN_ID          2 (N)   vlan ID
+       OF_DPA_VLAN_ID_MASK     2 (N)   vlan ID mask
+       OF_DPA_GOTO_TBL         2       goto table ID; zero to drop
+       OF_DPA_NEW_VLAN_ID      2 (N)   new vlan ID
+
+Table ID 20: termination mac
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_IN_PPORT         4       ingress physical port number
+       OF_DPA_IN_PPORT_MASK    4       ingress physical port number mask
+       OF_DPA_ETHERTYPE        2 (N)   must be either 0x0800 or 0x86dd
+       OF_DPA_DST_MAC          6 (N)   destination MAC
+       OF_DPA_DST_MAC_MASK     6 (N)   destination MAC mask
+       OF_DPA_VLAN_ID          2 (N)   vlan ID
+       OF_DPA_VLAN_ID_MASK     2 (N)   vlan ID mask
+       OF_DPA_GOTO_TBL         2       only acceptable values are
+                                       unicast or multicast routing
+                                       table IDs
+       OF_DPA_OUT_PPORT        2       if specified, must be
+                                       controller, set zero otherwise
+
+Table ID 30: unicast routing
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_ETHERTYPE        2 (N)   must be either 0x0800 or 0x86dd
+       OF_DPA_DST_IP           4 (N)   destination IPv4 address.
+                                       Must be unicast address
+       OF_DPA_DST_IP_MASK      4 (N)   IP mask.  Must be prefix mask
+       OF_DPA_DST_IPV6         16 (N)  destination IPv6 address.
+                                       Must be unicast address
+       OF_DPA_DST_IPV6_MASK    16 (N)  IPv6 mask. Must be prefix mask
+       OF_DPA_GOTO_TBL         2       goto table ID; zero to drop
+       OF_DPA_GROUP_ID         4       data for GROUP action must
+                                       be an L3 Unicast group entry
+
+Table ID 40: multicast routing
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_ETHERTYPE        2 (N)   must be either 0x0800 or 0x86dd
+       OF_DPA_VLAN_ID          2 (N)   vlan ID
+       OF_DPA_SRC_IP           4 (N)   source IPv4. Optional,
+                                       can contain IPv4 address,
+                                       must be completely masked
+                                       if not used
+       OF_DPA_SRC_IP_MASK      4 (N)   IP Mask
+       OF_DPA_DST_IP           4 (N)   destination IPv4 address.
+                                       Must be multicast address
+       OF_DPA_SRC_IPV6         16 (N)  source IPv6 Address. Optional.
+                                       Can contain IPv6 address,
+                                       must be completely masked
+                                       if not used
+       OF_DPA_SRC_IPV6_MASK    16 (N)  IPv6 mask.
+       OF_DPA_DST_IPV6         16 (N)  destination IPv6 Address. Must
+                                       be multicast address
+                                       Must be multicast address
+       OF_DPA_GOTO_TBL         2       goto table ID; zero to drop
+       OF_DPA_GROUP_ID         4       data for GROUP action must
+                                       be an L3 multicast group entry
+
+Table ID 50: bridging
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_VLAN_ID          2 (N)   vlan ID
+       OF_DPA_TUNNEL_ID        4       tunnel ID
+       OF_DPA_DST_MAC          6 (N)   destination MAC
+       OF_DPA_DST_MAC_MASK     6 (N)   destination MAC mask
+       OF_DPA_GOTO_TBL         2       goto table ID; zero to drop
+       OF_DPA_GROUP_ID         4       data for GROUP action must
+                                       be a L2 Interface, L2
+                                       Multicast, L2 Flood,
+                                       or L2 Overlay group entry
+                                       as appropriate
+       OF_DPA_TUNNEL_LPORT     4       unicast Tenant Bridging
+                                       flows specify a tunnel
+                                       logical port ID
+       OF_DPA_OUT_PPORT        2       data for OUTPUT action,
+                                       restricted to CONTROLLER,
+                                       set to 0 otherwise
+
+Table ID 60: acl policy
+
+       field                   width   description
+       ----------------------------------------------------
+       OF_DPA_IN_PPORT         4       ingress physical port number
+       OF_DPA_IN_PPORT_MASK    4       ingress physical port number mask
+       OF_DPA_ETHERTYPE        2 (N)   ethertype
+       OF_DPA_VLAN_ID          2 (N)   vlan ID
+       OF_DPA_VLAN_ID_MASK     2 (N)   vlan ID mask
+       OF_DPA_VLAN_PCP         2 (N)   vlan Priority Code Point
+       OF_DPA_VLAN_PCP_MASK    2 (N)   vlan Priority Code Point mask
+       OF_DPA_SRC_MAC          6 (N)   source MAC
+       OF_DPA_SRC_MAC_MASK     6 (N)   source MAC mask
+       OF_DPA_DST_MAC          6 (N)   destination MAC
+       OF_DPA_DST_MAC_MASK     6 (N)   destination MAC mask
+       OF_DPA_TUNNEL_ID        4       tunnel ID
+       OF_DPA_SRC_IP           4 (N)   source IPv4. Optional,
+                                       can contain IPv4 address,
+                                       must be completely masked
+                                       if not used
+       OF_DPA_SRC_IP_MASK      4 (N)   IP Mask
+       OF_DPA_DST_IP           4 (N)   destination IPv4 address.
+                                       Must be multicast address
+       OF_DPA_DST_IP_MASK      4 (N)   IP Mask
+       OF_DPA_SRC_IPV6         16 (N)  source IPv6 Address. Optional.
+                                       Can contain IPv6 address,
+                                       must be completely masked
+                                       if not used
+       OF_DPA_SRC_IPV6_MASK    16 (N)  IPv6 mask
+       OF_DPA_DST_IPV6         16 (N)  destination IPv6 Address. Must
+                                       be multicast address.
+       OF_DPA_DST_IPV6_MASK    16 (N)  IPv6 mask
+       OF_DPA_SRC_ARP_IP       4 (N)   source IPv4 address in the ARP
+                                       payload.  Only used if ethertype
+                                       == 0x0806.
+       OF_DPA_SRC_ARP_IP_MASK  4 (N)   IP Mask
+       OF_DPA_IP_PROTO         1       IP protocol
+       OF_DPA_IP_PROTO_MASK    1       IP protocol mask
+       OF_DPA_IP_DSCP          1       DSCP
+       OF_DPA_IP_DSCP_MASK     1       DSCP mask
+       OF_DPA_IP_ECN           1       ECN
+       OF_DPA_IP_ECN_MASK              1       ECN mask
+       OF_DPA_L4_SRC_PORT      2 (N)   L4 source port, only for
+                                       TCP, UDP, or SCTP
+       OF_DPA_L4_SRC_PORT_MASK 2 (N)   L4 source port mask
+       OF_DPA_L4_DST_PORT      2 (N)   L4 source port, only for
+                                       TCP, UDP, or SCTP
+       OF_DPA_L4_DST_PORT_MASK 2 (N)   L4 source port mask
+       OF_DPA_ICMP_TYPE        1       ICMP type, only if IP
+                                       protocol is 1
+       OF_DPA_ICMP_TYPE_MASK   1       ICMP type mask
+       OF_DPA_ICMP_CODE        1       ICMP code
+       OF_DPA_ICMP_CODE_MASK   1       ICMP code mask
+       OF_DPA_IPV6_LABEL       4 (N)   IPv6 flow label
+       OF_DPA_IPV6_LABEL_MASK  4 (N)   IPv6 flow label mask
+       OF_DPA_GROUP_ID         4       data for GROUP action
+       OF_DPA_QUEUE_ID_ACTION  1       write the queue ID
+       OF_DPA_NEW_QUEUE_ID     1       queue ID
+       OF_DPA_VLAN_PCP_ACTION  1       write the VLAN priority
+       OF_DPA_NEW_VLAN_PCP     1       VLAN priority
+       OF_DPA_IP_DSCP_ACTION   1       write the DSCP
+       OF_DPA_NEW_IP_DSCP      1       new DSCP
+       OF_DPA_TUNNEL_LPORT     4       restrct to valid tunnel
+                                       logical port, set to 0
+                                       otherwise.
+       OF_DPA_OUT_PPORT        2       data for OUTPUT action,
+                                       restricted to CONTROLLER,
+                                       set to 0 otherwise
+       OF_DPA_CLEAR_ACTIONS    4       if 1 packets matching flow are
+                                       dropped (all other instructions
+                                       ignored)
+
+TLVs for flow delete and get stats command are:
+
+       field                   width   description
+       ---------------------------------------------------
+       OF_DPA_CMD              2       CMD_[DEL|GET_STATS]
+       OF_DPA_COOKIE           8       Cookie
+
+On completion of get stats command, the descriptor buffer is written back with
+the following TLVs:
+
+       field                   width   description
+       ---------------------------------------------------
+       OF_DPA_STAT_DURATION    4       Flow duration
+       OF_DPA_STAT_RX_PKTS     8       Received packets
+       OF_DPA_STAT_TX_PKTS     8       Transmit packets
+
+Possible status return codes in descriptor on completion are:
+
+       DESC_COMP_ERR   command                 reason
+       --------------------------------------------------------------------
+       0               all                     OK
+       -ROCKER_EFAULT  all                     head or tail index outside
+                                               of ring
+       -ROCKER_ENXIO   all                     address or data read err on
+                                               desc buf
+       -ROCKER_EMSGSIZE GET_STATS              cmd descriptor buffer wasn't
+                                               big enough to contain write-back
+                                               TLVs
+       -ROCKER_EINVAL  all                     invalid parameters passed in
+       -ROCKER_EEXIST  ADD                     entry already exists
+       -ROCKER_ENOSPC  ADD                     no space left in flow table
+       -ROCKER_ENOENT  MOD|DEL|GET_STATS       cookie invalid
+
+Group Table Interface
+---------------------
+
+There are commands to add, modify, delete, and get stats of group table
+entries.  The commands are issued using the DMA CMD descriptor ring.  The
+following commands are defined:
+
+       CMD_ADD:                add an entry to group table
+       CMD_MOD:                modify an entry in group table
+       CMD_DEL:                delete an entry from group table
+       CMD_GET_STATS:          get stats for group entry
+
+TLVs for add and modify commands are:
+
+       field                   width   description
+       -----------------------------------------------------------
+       FLOW_GROUP_CMD          2       CMD_[ADD|MOD]
+       FLOW_GROUP_ID           2       Flow group ID
+       FLOW_GROUP_TYPE         1       Group type:
+                                         0: L2 interface
+                                         1: L2 rewrite
+                                         2: L3 unicast
+                                         3: L2 multicast
+                                         4: L2 flood
+                                         5: L3 interface
+                                         6: L3 multicast
+                                         7: L3 ECMP
+                                         8: L2 overlay
+       FLOW_VLAN_ID            2       Vlan ID (types 0, 3, 4, 6)
+       FLOW_L2_PORT            2       Port (types 0)
+       FLOW_INDEX              4       Index (all types but 0)
+       FLOW_OVERLAY_TYPE       1       Overlay sub-type (type 8):
+                                         0: Flood unicast tunnel
+                                         1: Flood multicast tunnel
+                                         2: Multicast unicast tunnel
+                                         3: Multicast multicast tunnel
+       FLOW_GROUP_ACTION               nest
+         FLOW_GROUP_ID         2       next group ID in chain (all
+                                       types except 0)
+         FLOW_OUT_PORT         4       egress port (types 0, 8)
+         FLOW_POP_VLAN_TAG     1       strip outer VLAN tag (type 1
+                                       only)
+         FLOW_VLAN_ID          2       (types 1, 5)
+         FLOW_SRC_MAC          6       (types 1, 2, 5)
+         FLOW_DST_MAC          6       (types 1, 2)
+
+TLVs for flow delete and get stats command are:
+
+       field                   width   description
+       -----------------------------------------------------------
+       FLOW_GROUP_CMD          2       CMD_[DEL|GET_STATS]
+       FLOW_GROUP_ID           2       Flow group ID
+
+On completion of get stats command, the descriptor buffer is written back with
+the following TLVs:
+
+       field                   width   description
+       ---------------------------------------------------
+       FLOW_GROUP_ID           2       Flow group ID
+       FLOW_STAT_DURATION      4       Flow duration
+       FLOW_STAT_REF_COUNT     4       Flow reference count
+       FLOW_STAT_BUCKET_COUNT  4       Flow bucket count
+
+Possible status return codes in descriptor on completion are:
+
+       DESC_COMP_ERR   command                 reason
+       --------------------------------------------------------------------
+       0               all                     OK
+       -ROCKER_EFAULT  all                     head or tail index outside
+                                               of ring
+       -ROCKER_ENXIO   all                     address or data read err on
+                                               desc buf
+       -ROCKER_ENOSPC  GET_STATS               cmd descriptor buffer wasn't
+                                               big enough to contain write-back
+                                               TLVs
+       -ROCKER_EINVAL  ADD|MOD                 invalid parameters passed in
+       -ROCKER_EEXIST  ADD                     entry already exists
+       -ROCKER_ENOSPC  ADD                     no space left in flow table
+       -ROCKER_ENOENT  MOD|DEL|GET_STATS       group ID invalid
+       -ROCKER_EBUSY   DEL                     group reference count non-zero
+       -ROCKER_ENODEV  ADD                     next group ID doesn't exist
+
+
+
+References
+==========
+
+[1] OpenFlow Data Plane Abstraction (OF-DPA) Abstract Switch Specification,
+Version 1.0, from Broadcom Corporation, February 21, 2014.