1bbc53c7eSScott FeldmanRocker Network Switch Register Programming Guide 2*9ca6876dSPeter Maydell************************************************ 3*9ca6876dSPeter Maydell 4*9ca6876dSPeter Maydell.. 5bbc53c7eSScott Feldman Copyright (c) Scott Feldman <sfeldma@gmail.com> 6bbc53c7eSScott Feldman Copyright (c) Neil Horman <nhorman@tuxdriver.com> 7bbc53c7eSScott Feldman Version 0.11, 12/29/2014 8bbc53c7eSScott Feldman 9bbc53c7eSScott Feldman This program is free software; you can redistribute it and/or modify 10bbc53c7eSScott Feldman it under the terms of the GNU General Public License as published by 11bbc53c7eSScott Feldman the Free Software Foundation; either version 2 of the License, or 12bbc53c7eSScott Feldman (at your option) any later version. 13bbc53c7eSScott Feldman 14bbc53c7eSScott Feldman This program is distributed in the hope that it will be useful, 15bbc53c7eSScott Feldman but WITHOUT ANY WARRANTY; without even the implied warranty of 16bbc53c7eSScott Feldman MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17bbc53c7eSScott Feldman GNU General Public License for more details. 18bbc53c7eSScott Feldman 19*9ca6876dSPeter MaydellIntroduction 20*9ca6876dSPeter Maydell============ 21bbc53c7eSScott Feldman 22bbc53c7eSScott FeldmanOverview 23bbc53c7eSScott Feldman-------- 24bbc53c7eSScott Feldman 25bbc53c7eSScott FeldmanThis document describes the hardware/software interface for the Rocker switch 26bbc53c7eSScott Feldmandevice. The intended audience is authors of OS drivers and device emulation 27bbc53c7eSScott Feldmansoftware. 28bbc53c7eSScott Feldman 29bbc53c7eSScott FeldmanNotations and Conventions 30bbc53c7eSScott Feldman------------------------- 31bbc53c7eSScott Feldman 32*9ca6876dSPeter Maydell* In register descriptions, [n:m] indicates a range from bit n to bit m, 33bbc53c7eSScott Feldman inclusive. 34*9ca6876dSPeter Maydell* Use of leading 0x indicates a hexadecimal number. 35*9ca6876dSPeter Maydell* Use of leading 0b indicates a binary number. 36*9ca6876dSPeter Maydell* The use of RSVD or Reserved indicates that a bit or field is reserved for 37bbc53c7eSScott Feldman future use. 38*9ca6876dSPeter Maydell* Field width is in bytes, unless otherwise noted. 39*9ca6876dSPeter Maydell* Register are (R) read-only, (R/W) read/write, (W) write-only, or (COR) clear 40bbc53c7eSScott Feldman on read 41*9ca6876dSPeter Maydell* TLV values in network-byte-order are designated with (N). 42bbc53c7eSScott Feldman 43bbc53c7eSScott Feldman 44*9ca6876dSPeter MaydellPCI Configuration Registers 45*9ca6876dSPeter Maydell=========================== 46bbc53c7eSScott Feldman 47bbc53c7eSScott FeldmanPCI Configuration Space 48bbc53c7eSScott Feldman----------------------- 49bbc53c7eSScott Feldman 50*9ca6876dSPeter MaydellEach switch instance registers as a PCI device with PCI configuration space:: 51bbc53c7eSScott Feldman 52bbc53c7eSScott Feldman offset width description value 53bbc53c7eSScott Feldman --------------------------------------------- 54bbc53c7eSScott Feldman 0x0 2 Vendor ID 0x1b36 55bbc53c7eSScott Feldman 0x2 2 Device ID 0x0006 56bbc53c7eSScott Feldman 0x4 4 Command/Status 57bbc53c7eSScott Feldman 0x8 1 Revision ID 0x01 58bbc53c7eSScott Feldman 0x9 3 Class code 0x2800 59bbc53c7eSScott Feldman 0xC 1 Cache line size 60bbc53c7eSScott Feldman 0xD 1 Latency timer 61bbc53c7eSScott Feldman 0xE 1 Header type 62bbc53c7eSScott Feldman 0xF 1 Built-in self test 63bbc53c7eSScott Feldman 0x10 4 Base address low 64bbc53c7eSScott Feldman 0x14 4 Base address high 65bbc53c7eSScott Feldman 0x18-28 Reserved 66bbc53c7eSScott Feldman 0x2C 2 Subsystem vendor ID * 67bbc53c7eSScott Feldman 0x2E 2 Subsystem ID * 68bbc53c7eSScott Feldman 0x30-38 Reserved 69bbc53c7eSScott Feldman 0x3C 1 Interrupt line 70bbc53c7eSScott Feldman 0x3D 1 Interrupt pin 0x00 71bbc53c7eSScott Feldman 0x3E 1 Min grant 0x00 72bbc53c7eSScott Feldman 0x3D 1 Max latency 0x00 73bbc53c7eSScott Feldman 0x40 1 TRDY timeout 74bbc53c7eSScott Feldman 0x41 1 Retry count 75bbc53c7eSScott Feldman 0x42 2 Reserved 76bbc53c7eSScott Feldman 77bbc53c7eSScott Feldman * Assigned by sub-system implementation 78bbc53c7eSScott Feldman 79*9ca6876dSPeter MaydellMemory-Mapped Register Space 80*9ca6876dSPeter Maydell============================ 81bbc53c7eSScott Feldman 82bbc53c7eSScott FeldmanThere are two memory-mapped BARs. BAR0 maps device register space and is 83bbc53c7eSScott Feldman0x2000 in size. BAR1 maps MSI-X vector and PBA tables and is also 0x2000 in 84bbc53c7eSScott Feldmansize, allowing for 256 MSI-X vectors. 85bbc53c7eSScott Feldman 86bbc53c7eSScott FeldmanAll registers are 4 or 8 bytes long. It is assumed host software will access 4 87bbc53c7eSScott Feldmanbyte registers with one 4-byte access, and 8 byte registers with either two 88bbc53c7eSScott Feldman4-byte accesses or a single 8-byte access. In the case of two 4-byte accesses, 89bbc53c7eSScott Feldmanaccess must be lower and then upper 4-bytes, in that order. 90bbc53c7eSScott Feldman 91*9ca6876dSPeter MaydellBAR0 device register space is organized as follows:: 92bbc53c7eSScott Feldman 93bbc53c7eSScott Feldman offset description 94bbc53c7eSScott Feldman ------------------------------------------------------ 95bbc53c7eSScott Feldman 0x0000-0x000f Bogus registers to catch misbehaving 96bbc53c7eSScott Feldman drivers. Writes do nothing. Reads 97bbc53c7eSScott Feldman back as 0xDEADBABE. 98bbc53c7eSScott Feldman 0x0010-0x00ff Test registers 99bbc53c7eSScott Feldman 0x0300-0x03ff General purpose registers 100bbc53c7eSScott Feldman 0x1000-0x1fff Descriptor control 101bbc53c7eSScott Feldman 102bbc53c7eSScott FeldmanHoles in register space are reserved. Writes to reserved registers do nothing. 103bbc53c7eSScott FeldmanReads to reserved registers read back as 0. 104bbc53c7eSScott Feldman 105bbc53c7eSScott FeldmanNo fancy stuff like write-combining is enabled on any of the registers. 106bbc53c7eSScott Feldman 107*9ca6876dSPeter MaydellBAR1 MSI-X register space is organized as follows:: 108bbc53c7eSScott Feldman 109bbc53c7eSScott Feldman offset description 110bbc53c7eSScott Feldman ------------------------------------------------------ 111bbc53c7eSScott Feldman 0x0000-0x0fff MSI-X vector table (256 vectors total) 112bbc53c7eSScott Feldman 0x1000-0x1fff MSI-X PBA table 113bbc53c7eSScott Feldman 114bbc53c7eSScott Feldman 115*9ca6876dSPeter MaydellInterrupts, DMA, and Endianness 116*9ca6876dSPeter Maydell=============================== 117bbc53c7eSScott Feldman 118bbc53c7eSScott FeldmanPCI Interrupts 119bbc53c7eSScott Feldman-------------- 120bbc53c7eSScott Feldman 121bbc53c7eSScott FeldmanThe device supports only MSI-X interrupts. BAR1 memory-mapped region contains 122bbc53c7eSScott Feldmanthe MSI-X vector and PBA tables, with support for up to 256 MSI-X vectors. 123bbc53c7eSScott Feldman 124*9ca6876dSPeter MaydellThe vector assignment is:: 125bbc53c7eSScott Feldman 126bbc53c7eSScott Feldman vector description 127bbc53c7eSScott Feldman ----------------------------------------------------- 128bbc53c7eSScott Feldman 0 Command descriptor ring completion 129bbc53c7eSScott Feldman 1 Event descriptor ring completion 130bbc53c7eSScott Feldman 2 Test operation completion 131bbc53c7eSScott Feldman 3 RSVD 132bbc53c7eSScott Feldman 4-255 Tx and Rx descriptor ring completion 133bbc53c7eSScott Feldman Tx vector is even 134bbc53c7eSScott Feldman Rx vector is odd 135bbc53c7eSScott Feldman 136*9ca6876dSPeter MaydellA MSI-X vector table entry is 16 bytes:: 137bbc53c7eSScott Feldman 138bbc53c7eSScott Feldman field offset width description 139bbc53c7eSScott Feldman ------------------------------------------------------------- 140bbc53c7eSScott Feldman lower_addr 0x0 4 [31:2] message address[31:2] 141bbc53c7eSScott Feldman [1:0] Rsvd (4 byte alignment 142bbc53c7eSScott Feldman required) 143bbc53c7eSScott Feldman upper_addr 0x4 4 [31:19] Rsvd 144bbc53c7eSScott Feldman [14:0] message address[46:32] 145bbc53c7eSScott Feldman data 0x8 4 message data[31:0] 146bbc53c7eSScott Feldman control 0xc 4 [31:1] Rsvd 147bbc53c7eSScott Feldman [0] mask (0 = enable, 148bbc53c7eSScott Feldman 1 = masked) 149bbc53c7eSScott Feldman 150bbc53c7eSScott FeldmanSoftware should install the Interrupt Service Routine (ISR) before any ports 151bbc53c7eSScott Feldmanare enabled or any commands are issued on the command ring. 152bbc53c7eSScott Feldman 153bbc53c7eSScott FeldmanDMA Operations 154bbc53c7eSScott Feldman-------------- 155bbc53c7eSScott Feldman 156bbc53c7eSScott FeldmanDMA operations are used for packet DMA to/from the CPU, command and event 157bbc53c7eSScott Feldmanprocessing. Command processing includes statistical counters and table dumps, 158bbc53c7eSScott Feldmantable insertion/deletion, and more. Event processing provides an async 159bbc53c7eSScott Feldmannotification method for device-originating events. Each DMA operation has a 160bbc53c7eSScott Feldmanset of control registers to manage a descriptor ring. The descriptor rings are 161bbc53c7eSScott Feldmanallocated from contiguous host DMA-able memory and registers specify the rings 162bbc53c7eSScott Feldmanbase address, size and current head and tail indices. Software always writes 163bbc53c7eSScott Feldmanthe head, and hardware always writes the tail. 164bbc53c7eSScott Feldman 165bbc53c7eSScott FeldmanThe higher-order bit of DMA_DESC_COMP_ERR is used to mark hardware completion 166bbc53c7eSScott Feldmanof a descriptor. Software will clear this bit when posting a descriptor to the 167bbc53c7eSScott Feldmanring, and hardware will set this bit when the descriptor is complete. 168bbc53c7eSScott Feldman 169bbc53c7eSScott FeldmanDescriptor ring sizes must be a power of 2 and range from 2 to 64K entries. 170bbc53c7eSScott FeldmanDescriptor rings' base address must be 8-byte aligned. Descriptors must be 171bbc53c7eSScott Feldmanpacked within ring. Each descriptor in each ring must also be aligned on an 8 172*9ca6876dSPeter Maydellbyte boundary. Each descriptor ring will have these registers:: 173bbc53c7eSScott Feldman 174bbc53c7eSScott Feldman DMA_DESC_xxx_BASE_ADDR, offset 0x1000 + (x * 32), 64-bit, (R/W) 175bbc53c7eSScott Feldman DMA_DESC_xxx_SIZE, offset 0x1008 + (x * 32), 32-bit, (R/W) 176bbc53c7eSScott Feldman DMA_DESC_xxx_HEAD, offset 0x100c + (x * 32), 32-bit, (R/W) 177bbc53c7eSScott Feldman DMA_DESC_xxx_TAIL, offset 0x1010 + (x * 32), 32-bit, (R) 178bbc53c7eSScott Feldman DMA_DESC_xxx_CTRL, offset 0x1014 + (x * 32), 32-bit, (W) 179bbc53c7eSScott Feldman DMA_DESC_xxx_CREDITS, offset 0x1018 + (x * 32), 32-bit, (R/W) 180bbc53c7eSScott Feldman DMA_DESC_xxx_RSVD1, offset 0x101c + (x * 32), 32-bit, (R/W) 181bbc53c7eSScott Feldman 182*9ca6876dSPeter MaydellWhere x is descriptor ring index:: 183bbc53c7eSScott Feldman 184bbc53c7eSScott Feldman index ring 185bbc53c7eSScott Feldman -------------------- 186bbc53c7eSScott Feldman 0 CMD 187bbc53c7eSScott Feldman 1 EVENT 188bbc53c7eSScott Feldman 2 TX (port 0) 189bbc53c7eSScott Feldman 3 RX (port 0) 190bbc53c7eSScott Feldman 4 TX (port 1) 191bbc53c7eSScott Feldman 5 RX (port 1) 192bbc53c7eSScott Feldman . 193bbc53c7eSScott Feldman . 194bbc53c7eSScott Feldman . 195bbc53c7eSScott Feldman 124 TX (port 61) 196bbc53c7eSScott Feldman 125 RX (port 61) 197bbc53c7eSScott Feldman 126 Resv 198bbc53c7eSScott Feldman 127 Resv 199bbc53c7eSScott Feldman 200bbc53c7eSScott FeldmanWriting BASE_ADDR or SIZE will reset HEAD and TAIL to zero. HEAD cannot be 201bbc53c7eSScott Feldmanwritten past TAIL. To do so would wrap the ring. An empty ring is when HEAD 202bbc53c7eSScott Feldman== TAIL. A full ring is when HEAD is one position behind TAIL. Both HEAD and 203bbc53c7eSScott FeldmanTAIL increment and modulo wrap at the ring size. 204bbc53c7eSScott Feldman 205*9ca6876dSPeter MaydellCTRL register bits:: 206bbc53c7eSScott Feldman 207bbc53c7eSScott Feldman bit name description 208bbc53c7eSScott Feldman ------------------------------------------------------------------------ 209bbc53c7eSScott Feldman [0] CTRL_RESET Reset the descriptor ring 210bbc53c7eSScott Feldman [1:31] Reserved 211bbc53c7eSScott Feldman 212*9ca6876dSPeter MaydellAll descriptor types share some common fields:: 213bbc53c7eSScott Feldman 214bbc53c7eSScott Feldman field width description 215bbc53c7eSScott Feldman ------------------------------------------------------------------- 216bbc53c7eSScott Feldman DMA_DESC_BUF_ADDR 8 Phys addr of desc payload, 8-byte 217bbc53c7eSScott Feldman aligned 218bbc53c7eSScott Feldman DMA_DESC_COOKIE 8 Desc cookie for completion matching, 219bbc53c7eSScott Feldman upper-most bit is reserved 220bbc53c7eSScott Feldman DMA_DESC_BUF_SIZE 2 Desc payload size in bytes 221bbc53c7eSScott Feldman DMA_DESC_TLV_SIZE 2 Desc payload total size in bytes 222bbc53c7eSScott Feldman used for TLVs. Must be <= 223bbc53c7eSScott Feldman DMA_DESC_BUF_SIZE. 224bbc53c7eSScott Feldman DMA_DESC_COMP_ERR 2 Completion status of associated 225bbc53c7eSScott Feldman desc payload. High order bit is 226bbc53c7eSScott Feldman clear on new descs, toggled by 227bbc53c7eSScott Feldman hw for completed items. 228bbc53c7eSScott Feldman 229bbc53c7eSScott FeldmanTo support forward- and backward-compatibility, descriptor and completion 230bbc53c7eSScott Feldmanpayloads are specified in TLV format. Fields are packed with Type=field name, 231bbc53c7eSScott FeldmanLength=field length, and Value=field value. Software will ignore unknown fields 232bbc53c7eSScott Feldmanfilled in by the switch. Likewise, the switch will ignore unknown fields 233bbc53c7eSScott Feldmanfilled in by software. 234bbc53c7eSScott Feldman 235bbc53c7eSScott FeldmanDescriptor payload buffer is 8-byte aligned and TLVs are 8-byte aligned. The 236*9ca6876dSPeter Maydellvalue within a TLV is also 8-byte aligned. The (packed, 8 byte) TLV header is:: 237bbc53c7eSScott Feldman 238bbc53c7eSScott Feldman field width description 239bbc53c7eSScott Feldman ----------------------------- 240bbc53c7eSScott Feldman type 4 TLV type 241bbc53c7eSScott Feldman len 2 TLV value length 242bbc53c7eSScott Feldman pad 2 Reserved 243bbc53c7eSScott Feldman 244bbc53c7eSScott FeldmanThe alignment requirements for descriptors and TLVs are to avoid unaligned 245bbc53c7eSScott Feldmanaccess exceptions in software. Note that the payload for each TLV is also 246bbc53c7eSScott Feldman8 byte aligned. 247bbc53c7eSScott Feldman 248*9ca6876dSPeter MaydellFigure 1 shows an example descriptor buffer with two TLVs:: 249bbc53c7eSScott Feldman 250bbc53c7eSScott Feldman <------- 8 bytes -------> 251bbc53c7eSScott Feldman 252bbc53c7eSScott Feldman 8-byte +––––+ +–––––––––––+–––––+–––––+ +–+ 253bbc53c7eSScott Feldman align | type | len | pad | TLV#1 hdr | 254bbc53c7eSScott Feldman +–––––––––––+–––––+–––––+ (len=22) | 255bbc53c7eSScott Feldman | | | 256bbc53c7eSScott Feldman | value | TVL#1 value | 257bbc53c7eSScott Feldman | | (padded to 8-byte | 258bbc53c7eSScott Feldman | +–––––+ alignment) | 259bbc53c7eSScott Feldman | |/////| | 260bbc53c7eSScott Feldman 8-byte +––––+ +–––––––––––+–––––––––––+ | 261bbc53c7eSScott Feldman align | type | len | pad | TLV#2 hdr DESC_BUF_SIZE 262bbc53c7eSScott Feldman +–––––+–––––+–––––+–––––+ (len=2) | 263bbc53c7eSScott Feldman |value|/////////////////| TLV#2 value | 264bbc53c7eSScott Feldman +–––––+/////////////////| | 265bbc53c7eSScott Feldman |///////////////////////| | 266bbc53c7eSScott Feldman |///////////////////////| | 267bbc53c7eSScott Feldman |///////////////////////| | 268bbc53c7eSScott Feldman |////////unused/////////| | 269bbc53c7eSScott Feldman |////////space//////////| | 270bbc53c7eSScott Feldman |///////////////////////| | 271bbc53c7eSScott Feldman |///////////////////////| | 272bbc53c7eSScott Feldman |///////////////////////| | 273bbc53c7eSScott Feldman +–––––––––––––––––––––––+ +–+ 274bbc53c7eSScott Feldman 275bbc53c7eSScott Feldman fig. 1 276bbc53c7eSScott Feldman 277bbc53c7eSScott FeldmanTLVs can be nested within the NEST TLV type. 278bbc53c7eSScott Feldman 279bbc53c7eSScott FeldmanInterrupt credits 280bbc53c7eSScott Feldman^^^^^^^^^^^^^^^^^ 281bbc53c7eSScott Feldman 282bbc53c7eSScott FeldmanMSI-X vectors used for descriptor ring completions use a credit mechanism for 283bbc53c7eSScott Feldmanefficient device, PCIe bus, OS and driver operations. Each descriptor ring has 284bbc53c7eSScott Feldmana credit count which represents the number of outstanding descriptors to be 285bbc53c7eSScott Feldmanprocessed by the driver. As the device marks descriptors complete, the credit 286bbc53c7eSScott Feldmancount is incremented. As the driver processes those outstanding descriptors, 287bbc53c7eSScott Feldmanit returns credits back to the device. This way, the device knows the driver's 288bbc53c7eSScott Feldmanprogress and can make decisions about when to fire the next interrupt or not. 289bbc53c7eSScott FeldmanWhen the credit count is zero, and the first descriptors are posted for the 290bbc53c7eSScott Feldmandriver, a single interrupt is fired. Once the interrupt is fired, the 291bbc53c7eSScott Feldmaninterrupt is disabled (auto-masked*). In response to the interrupt, the driver 292bbc53c7eSScott Feldmanwill process descriptors and PIO write a returned credit value for that 293bbc53c7eSScott Feldmandescriptor ring. If the driver returns all credits (the driver caught up with 294bbc53c7eSScott Feldmanthe device and there is no outstanding work), then the interrupt is unmasked, 295bbc53c7eSScott Feldmanbut not fired. If only partial credits are returned, the interrupt remains 296bbc53c7eSScott Feldmanmasked but the device generates an interrupt, signaling the driver that more 297bbc53c7eSScott Feldmanoutstanding work is available. 298bbc53c7eSScott Feldman 299b6af0975SDaniel P. Berrange(* this masking is unrelated to the MSI-X interrupt mask register) 300bbc53c7eSScott Feldman 301bbc53c7eSScott FeldmanEndianness 302bbc53c7eSScott Feldman---------- 303bbc53c7eSScott Feldman 304bbc53c7eSScott FeldmanDevice registers are hard-coded to little-endian (LE). The driver should 305cb8d4c8fSStefan Weilconvert to/from host endianness to LE for device register accesses. 306bbc53c7eSScott Feldman 307bbc53c7eSScott FeldmanDescriptors are LE. Descriptor buffer TLVs will have LE type and length 308bbc53c7eSScott Feldmanfields, but the value field can either be LE or network-byte-order, depending 309bbc53c7eSScott Feldmanon context. TLV values containing network packet data will be in network-byte 310bbc53c7eSScott Feldmanorder. A TLV value containing a field or mask used to compare against network 311bbc53c7eSScott Feldmanpacket data is network-byte order. For example, flow match fields (and masks) 312bbc53c7eSScott Feldmanare network-byte-order since they're matched directly, byte-by-byte, against 313bbc53c7eSScott Feldmannetwork packet data. All non-network-packet TLV multi-byte values will be LE. 314bbc53c7eSScott Feldman 315bbc53c7eSScott FeldmanTLV values in network-byte-order are designated with (N). 316bbc53c7eSScott Feldman 317bbc53c7eSScott Feldman 318*9ca6876dSPeter MaydellTest Registers 319*9ca6876dSPeter Maydell============== 320bbc53c7eSScott Feldman 321bbc53c7eSScott FeldmanRocker has several test registers to support troubleshooting register access, 322*9ca6876dSPeter Maydellinterrupt generation, and DMA operations:: 323bbc53c7eSScott Feldman 324bbc53c7eSScott Feldman TEST_REG, offset 0x0010, 32-bit (R/W) 325bbc53c7eSScott Feldman TEST_REG64, offset 0x0018, 64-bit (R/W) 326bbc53c7eSScott Feldman TEST_IRQ, offset 0x0020, 32-bit (R/W) 327bbc53c7eSScott Feldman TEST_DMA_ADDR, offset 0x0028, 64-bit (R/W) 328bbc53c7eSScott Feldman TEST_DMA_SIZE, offset 0x0030, 32-bit (R/W) 329bbc53c7eSScott Feldman TEST_DMA_CTRL, offset 0x0034, 32-bit (R/W) 330bbc53c7eSScott Feldman 331bbc53c7eSScott FeldmanReads to TEST_REG and TEST_REG64 will read a value equal to twice the last 332bbc53c7eSScott Feldmanvalue written to the register. The 32-bit and 64-bit versions are for testing 333bbc53c7eSScott Feldman32-bit and 64-bit host accesses. 334bbc53c7eSScott Feldman 335bbc53c7eSScott FeldmanA vector can be written to TEST_IRQ and the device will generate an interrupt 336bbc53c7eSScott Feldmanfor that vector. 337bbc53c7eSScott Feldman 338bbc53c7eSScott FeldmanTo test basic DMA operations, allocate a DMA-able host buffer and put the 339bbc53c7eSScott Feldmanbuffer address into TEST_DMA_ADDR and size into TEST_DMA_SIZE. Then, write to 340*9ca6876dSPeter MaydellTEST_DMA_CTRL to manipulate the buffer contents. TEST_DMA_CTRL operations are:: 341bbc53c7eSScott Feldman 342bbc53c7eSScott Feldman operation value description 343bbc53c7eSScott Feldman ----------------------------------------------------------- 344bbc53c7eSScott Feldman TEST_DMA_CTRL_CLEAR 1 clear buffer 345bbc53c7eSScott Feldman TEST_DMA_CTRL_FILL 2 fill buffer bytes with 0x96 346bbc53c7eSScott Feldman TEST_DMA_CTRL_INVERT 4 invert bytes in buffer 347bbc53c7eSScott Feldman 348bbc53c7eSScott FeldmanVarious buffer address and sizes should be tested to verify no address boundary 349bbc53c7eSScott Feldmanissue exists. In particular, buffers that start on odd-8-byte boundary and/or 350bbc53c7eSScott Feldmanspan multiple PAGE sizes should be tested. 351bbc53c7eSScott Feldman 352bbc53c7eSScott Feldman 353*9ca6876dSPeter MaydellPorts 354*9ca6876dSPeter Maydell===== 355bbc53c7eSScott Feldman 356bbc53c7eSScott FeldmanPhysical and Logical Ports 357bbc53c7eSScott Feldman------------------------------------ 358bbc53c7eSScott Feldman 359bbc53c7eSScott FeldmanThe switch supports up to 62 physical (front-panel) ports. Register 360*9ca6876dSPeter MaydellPORT_PHYS_COUNT returns the actual number of physical ports available:: 361bbc53c7eSScott Feldman 362bbc53c7eSScott Feldman PORT_PHYS_COUNT, offset 0x0304, 32-bit, (R) 363bbc53c7eSScott Feldman 364bbc53c7eSScott FeldmanIn addition to front-panel ports, the switch supports logical ports for 365bbc53c7eSScott Feldmantunnels. 366bbc53c7eSScott Feldman 367bbc53c7eSScott FeldmanFront-panel ports and logical tunnel ports are mapped into a single 32-bit port 368bbc53c7eSScott Feldmanspace. A special CPU port is assigned port 0. The front-panel ports are 369bbc53c7eSScott Feldmanmapped to ports 1-62. A special loopback port is assigned port 63. Logical 370bbc53c7eSScott Feldmantunnel ports are assigned ports 0x0001000-0x0001ffff. 371*9ca6876dSPeter MaydellTo summarize the port assignments:: 372bbc53c7eSScott Feldman 373bbc53c7eSScott Feldman port mapping 374bbc53c7eSScott Feldman ------------------------------------------------------- 375bbc53c7eSScott Feldman 0 CPU port (for packets to/from host CPU) 376bbc53c7eSScott Feldman 1-62 front-panel physical ports 377bbc53c7eSScott Feldman 63 loopback port 378bbc53c7eSScott Feldman 64-0x0000ffff RSVD 379bbc53c7eSScott Feldman 0x00010000-0x0001ffff logical tunnel ports 380bbc53c7eSScott Feldman 0x00020000-0xffffffff RSVD 381bbc53c7eSScott Feldman 382bbc53c7eSScott FeldmanPhysical Port Mode 383bbc53c7eSScott Feldman------------------ 384bbc53c7eSScott Feldman 385bbc53c7eSScott FeldmanSwitch front-panel ports operate in a mode. Currently, the only mode is 386bbc53c7eSScott FeldmanOF-DPA. OF-DPA[1] mode is based on OpenFlow Data Plane Abstraction (OF-DPA) 387bbc53c7eSScott FeldmanAbstract Switch Specification, Version 1.0, from Broadcom Corporation. To 388bbc53c7eSScott Feldmanset/get the mode for front-panel ports, see port settings, below. 389bbc53c7eSScott Feldman 390bbc53c7eSScott FeldmanPort Settings 391bbc53c7eSScott Feldman------------- 392bbc53c7eSScott Feldman 393*9ca6876dSPeter MaydellLink status for all front-panel ports is available via PORT_PHYS_LINK_STATUS:: 394bbc53c7eSScott Feldman 395bbc53c7eSScott Feldman PORT_PHYS_LINK_STATUS, offset 0x0310, 64-bit, (R) 396bbc53c7eSScott Feldman 397bbc53c7eSScott Feldman Value is port bitmap. Bits 0 and 63 always read 0. Bits 1-62 398bbc53c7eSScott Feldman read 1 for link UP and 0 for link DOWN for respective front-panel ports. 399bbc53c7eSScott Feldman 400*9ca6876dSPeter MaydellOther properties for front-panel ports are available via DMA CMD descriptors:: 401bbc53c7eSScott Feldman 402bbc53c7eSScott Feldman Get PORT_SETTINGS descriptor: 403bbc53c7eSScott Feldman 404bbc53c7eSScott Feldman field width description 405bbc53c7eSScott Feldman ---------------------------------------------- 406bbc53c7eSScott Feldman PORT_SETTINGS 2 CMD_GET 407bbc53c7eSScott Feldman PPORT 4 Physical port # 408bbc53c7eSScott Feldman 409bbc53c7eSScott Feldman Get PORT_SETTINGS completion: 410bbc53c7eSScott Feldman 411bbc53c7eSScott Feldman field width description 412bbc53c7eSScott Feldman ---------------------------------------------- 413bbc53c7eSScott Feldman PPORT 4 Physical port # 414bbc53c7eSScott Feldman SPEED 4 Current port interface speed, in Mbps 415bbc53c7eSScott Feldman DUPLEX 1 1 = Full, 0 = Half 416bbc53c7eSScott Feldman AUTONEG 1 1 = enabled, 0 = disabled 417bbc53c7eSScott Feldman MACADDR 6 Port MAC address 418bbc53c7eSScott Feldman MODE 1 0 = OF-DPA 419bbc53c7eSScott Feldman LEARNING 1 MAC address learning on port 420bbc53c7eSScott Feldman 1 = enabled 421bbc53c7eSScott Feldman 0 = disabled 42277349536SDavid Ahern PHYS_NAME <var> Physical port name (string) 423bbc53c7eSScott Feldman 424bbc53c7eSScott Feldman Set PORT_SETTINGS descriptor: 425bbc53c7eSScott Feldman 426bbc53c7eSScott Feldman field width description 427bbc53c7eSScott Feldman ---------------------------------------------- 428bbc53c7eSScott Feldman PORT_SETTINGS 2 CMD_SET 429bbc53c7eSScott Feldman PPORT 4 Physical port # 430bbc53c7eSScott Feldman SPEED 4 Port interface speed, in Mbps 431bbc53c7eSScott Feldman DUPLEX 1 1 = Full, 0 = Half 432bbc53c7eSScott Feldman AUTONEG 1 1 = enabled, 0 = disabled 433bbc53c7eSScott Feldman MACADDR 6 Port MAC address 434bbc53c7eSScott Feldman MODE 1 0 = OF-DPA 435bbc53c7eSScott Feldman 436bbc53c7eSScott FeldmanPort Enable 437bbc53c7eSScott Feldman----------- 438bbc53c7eSScott Feldman 439bbc53c7eSScott FeldmanFront-panel ports are initially disabled, which means port ingress and egress 440*9ca6876dSPeter Maydellpackets will be dropped. To enable or disable a port, use PORT_PHYS_ENABLE:: 441bbc53c7eSScott Feldman 442bbc53c7eSScott Feldman PORT_PHYS_ENABLE: offset 0x0318, 64-bit, (R/W) 443bbc53c7eSScott Feldman 444bbc53c7eSScott Feldman Value is bitmap of first 64 ports. Bits 0 and 63 are ignored 445bbc53c7eSScott Feldman and always read as 0. Write 1 to enable port; write 0 to disable it. 446bbc53c7eSScott Feldman Default is 0. 447bbc53c7eSScott Feldman 448bbc53c7eSScott Feldman 449*9ca6876dSPeter MaydellSwitch Control 450*9ca6876dSPeter Maydell============== 451bbc53c7eSScott Feldman 452bbc53c7eSScott FeldmanThis section covers switch-wide register settings. 453bbc53c7eSScott Feldman 454bbc53c7eSScott FeldmanControl 455bbc53c7eSScott Feldman------- 456bbc53c7eSScott Feldman 457*9ca6876dSPeter MaydellThis register is used for low level control of the switch:: 458bbc53c7eSScott Feldman 459bbc53c7eSScott Feldman CONTROL: offset 0x0300, 32-bit, (W) 460bbc53c7eSScott Feldman 461bbc53c7eSScott Feldman bit name description 462bbc53c7eSScott Feldman ------------------------------------------------------------------------ 463bbc53c7eSScott Feldman [0] CONTROL_RESET If set, device will perform reset 464bbc53c7eSScott Feldman [1:31] Reserved 465bbc53c7eSScott Feldman 466bbc53c7eSScott FeldmanSwitch ID 467bbc53c7eSScott Feldman--------- 468bbc53c7eSScott Feldman 469bbc53c7eSScott FeldmanThe switch has a SWITCH_ID to be used by software to uniquely identify the 470*9ca6876dSPeter Maydellswitch:: 471bbc53c7eSScott Feldman 472bbc53c7eSScott Feldman SWITCH_ID: offset 0x0320, 64-bit, (R) 473bbc53c7eSScott Feldman 474bbc53c7eSScott Feldman Value is opaque to switch software and no special encoding is implied. 475bbc53c7eSScott Feldman 476bbc53c7eSScott Feldman 477*9ca6876dSPeter MaydellEvents 478*9ca6876dSPeter Maydell====== 479bbc53c7eSScott Feldman 480bbc53c7eSScott FeldmanNon-I/O asynchronous events from the device are notified to the host using the 481*9ca6876dSPeter Maydellevent ring. The TLV structure for events is:: 482bbc53c7eSScott Feldman 483bbc53c7eSScott Feldman field width description 484bbc53c7eSScott Feldman --------------------------------------------------- 485bbc53c7eSScott Feldman TYPE 4 Event type, one of: 486bbc53c7eSScott Feldman 1: LINK_CHANGED 487bbc53c7eSScott Feldman 2: MAC_VLAN_SEEN 488bbc53c7eSScott Feldman INFO <nest> Event info (details below) 489bbc53c7eSScott Feldman 490bbc53c7eSScott FeldmanLink Changed Event 491bbc53c7eSScott Feldman------------------ 492bbc53c7eSScott Feldman 493*9ca6876dSPeter MaydellWhen link status changes on a physical port, this event is generated:: 494bbc53c7eSScott Feldman 495bbc53c7eSScott Feldman field width description 496bbc53c7eSScott Feldman --------------------------------------------------- 497bbc53c7eSScott Feldman INFO <nest> 498bbc53c7eSScott Feldman PPORT 4 Physical port 499bbc53c7eSScott Feldman LINKUP 1 Link status: 500bbc53c7eSScott Feldman 0: down 501bbc53c7eSScott Feldman 1: up 502bbc53c7eSScott Feldman 503bbc53c7eSScott FeldmanMAC VLAN Seen Event 504bbc53c7eSScott Feldman------------------- 505bbc53c7eSScott Feldman 506bbc53c7eSScott FeldmanWhen a packet ingresses on a port and the source MAC/VLAN isn't known to the 507bbc53c7eSScott Feldmandevice, the device will generate this event. In response to the event, the 508bbc53c7eSScott Feldmandriver should install to the device the MAC/VLAN on the port into the bridge 509bbc53c7eSScott Feldmantable. Once installed, the MAC/VLAN is known on the port and this event will 510bbc53c7eSScott Feldmanno longer be generated. 511bbc53c7eSScott Feldman 512*9ca6876dSPeter Maydell:: 513*9ca6876dSPeter Maydell 514bbc53c7eSScott Feldman field width description 515bbc53c7eSScott Feldman --------------------------------------------------- 516bbc53c7eSScott Feldman INFO <nest> 517bbc53c7eSScott Feldman PPORT 4 Physical port 518bbc53c7eSScott Feldman MAC 6 MAC address 519bbc53c7eSScott Feldman VLAN 2 VLAN ID 520bbc53c7eSScott Feldman 521bbc53c7eSScott Feldman 522*9ca6876dSPeter MaydellCPU Packet Processing 523*9ca6876dSPeter Maydell===================== 524bbc53c7eSScott Feldman 525bbc53c7eSScott FeldmanIngress packets directed to the host CPU for further processing are delivered 526bbc53c7eSScott Feldmanin the DMA RX ring. Likewise, host CPU originating packets destined to egress 527bbc53c7eSScott Feldmanon switch ports are scheduled by software using the DMA TX ring. 528bbc53c7eSScott Feldman 529bbc53c7eSScott FeldmanTx Packet Processing 530bbc53c7eSScott Feldman-------------------- 531bbc53c7eSScott Feldman 532bbc53c7eSScott FeldmanSoftware schedules packets for egress on switch ports using the DMA TX ring. A 533bbc53c7eSScott FeldmanTX descriptor buffer describes the packet location and size in host DMA-able 534bbc53c7eSScott Feldmanmemory, the destination port, and any hardware-offload functions (such as L3 535bbc53c7eSScott Feldmanpayload checksum offload). Software then bumps the descriptor head to signal 536bbc53c7eSScott Feldmanhardware of new Tx work. In response, hardware will DMA read Tx descriptors up 537bbc53c7eSScott Feldmanto head, DMA read descriptor buffer and packet data, perform offloading 538bbc53c7eSScott Feldmanfunctions, and finally frame packet on wire (network). Once packet processing 539bbc53c7eSScott Feldmanis complete, hardware will writeback status to descriptor(s) to signal to 540bbc53c7eSScott Feldmansoftware that Tx is complete and software resources (e.g. skb) backing packet 541bbc53c7eSScott Feldmancan be released. 542bbc53c7eSScott Feldman 543bbc53c7eSScott FeldmanFigure 2 shows an example 3-fragment packet queued with one Tx descriptor. A 544*9ca6876dSPeter MaydellTLV is used for each packet fragment:: 545bbc53c7eSScott Feldman 546bbc53c7eSScott Feldman pkt frag 1 547bbc53c7eSScott Feldman +–––––––+ +–+ 548bbc53c7eSScott Feldman +–––+ | | 549bbc53c7eSScott Feldman desc buf | | | | 550bbc53c7eSScott Feldman +––––––––+ | | | | 551bbc53c7eSScott Feldman Tx ring +–––+ +–––––+ | | | 552bbc53c7eSScott Feldman +–––––––––+ | | TLVs | +–––––––+ | 553bbc53c7eSScott Feldman | +–––+ +––––––––+ pkt frag 2 | 554bbc53c7eSScott Feldman | desc 0 | | +–––––+ +–––––––+ | 555bbc53c7eSScott Feldman +–––––––––+ | TLVs | +–––+ | | 556bbc53c7eSScott Feldman head+–+ | +––––––––+ | | | 557bbc53c7eSScott Feldman | desc 1 | | +–––––+ +–––––––+ |pkt 558bbc53c7eSScott Feldman +–––––––––+ | TLVs | | | 559bbc53c7eSScott Feldman | | +––––––––+ | pkt frag 3 | 560bbc53c7eSScott Feldman | | | +–––––––+ | 561bbc53c7eSScott Feldman +–––––––––+ +–––+ | | 562bbc53c7eSScott Feldman | | | | | 563bbc53c7eSScott Feldman | | | | | 564bbc53c7eSScott Feldman +–––––––––+ | | | 565bbc53c7eSScott Feldman | | | | | 566bbc53c7eSScott Feldman | | | | | 567bbc53c7eSScott Feldman +–––––––––+ | | | 568bbc53c7eSScott Feldman | | +–––––––+ +–+ 569bbc53c7eSScott Feldman | | 570bbc53c7eSScott Feldman +–––––––––+ 571bbc53c7eSScott Feldman 572bbc53c7eSScott Feldman fig 2. 573bbc53c7eSScott Feldman 574*9ca6876dSPeter MaydellThe TLVs for Tx descriptor buffer are:: 575bbc53c7eSScott Feldman 576bbc53c7eSScott Feldman field width description 577bbc53c7eSScott Feldman --------------------------------------------------------------------- 578bbc53c7eSScott Feldman PPORT 4 Destination physical port # 579bbc53c7eSScott Feldman TX_OFFLOAD 1 Hardware offload modes: 580bbc53c7eSScott Feldman 0: no offload 581bbc53c7eSScott Feldman 1: insert IP csum (ipv4 only) 582bbc53c7eSScott Feldman 2: insert TCP/UDP csum 583bbc53c7eSScott Feldman 3: L3 csum calc and insert 584bbc53c7eSScott Feldman into csum offset (TX_L3_CSUM_OFF) 585bbc53c7eSScott Feldman 16-bit 1's complement csum value. 586bbc53c7eSScott Feldman IPv4 pseudo-header and IP 587bbc53c7eSScott Feldman already calculated by OS 588bbc53c7eSScott Feldman and inserted. 589bbc53c7eSScott Feldman 4: TSO (TCP Segmentation Offload) 590bbc53c7eSScott Feldman TX_L3_CSUM_OFF 2 For L3 csum offload mode, the offset, 591bbc53c7eSScott Feldman from the beginning of the packet, 592bbc53c7eSScott Feldman of the csum field in the L3 header 593bbc53c7eSScott Feldman TX_TSO_MSS 2 For TSO offload mode, the 594bbc53c7eSScott Feldman Maximum Segment Size in bytes 595bbc53c7eSScott Feldman TX_TSO_HDR_LEN 2 For TSO offload mode, the 596bbc53c7eSScott Feldman length of ethernet, IP, and 597bbc53c7eSScott Feldman TCP/UDP headers, including IP 598bbc53c7eSScott Feldman and TCP options. 599bbc53c7eSScott Feldman TX_FRAGS <array> Packet fragments 600bbc53c7eSScott Feldman TX_FRAG <nest> Packet fragment 601bbc53c7eSScott Feldman TX_FRAG_ADDR 8 DMA address of packet fragment 602bbc53c7eSScott Feldman TX_FRAG_LEN 2 Packet fragment length 603bbc53c7eSScott Feldman 604*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are:: 605bbc53c7eSScott Feldman 606bbc53c7eSScott Feldman DESC_COMP_ERR reason 607bbc53c7eSScott Feldman -------------------------------------------------------------------- 608bbc53c7eSScott Feldman 0 OK 609bbc53c7eSScott Feldman -ROCKER_ENXIO address or data read err on desc buf or packet 610bbc53c7eSScott Feldman fragment 611bbc53c7eSScott Feldman -ROCKER_EINVAL bad pport or TSO or csum offloading error 612bbc53c7eSScott Feldman -ROCKER_ENOMEM no memory for internal staging tx fragment 613bbc53c7eSScott Feldman 614bbc53c7eSScott FeldmanRx Packet Processing 615bbc53c7eSScott Feldman-------------------- 616bbc53c7eSScott Feldman 617bbc53c7eSScott FeldmanFor packets ingressing on switch ports that are not forwarded by the switch but 618bbc53c7eSScott Feldmanrather directed to the host CPU for further processing are delivered in the DMA 619bbc53c7eSScott FeldmanRX ring. Rx descriptor buffers are allocated by software and placed on the 620bbc53c7eSScott Feldmanring. Hardware will fill Rx descriptor buffers with packet data, write the 621bbc53c7eSScott Feldmancompletion, and signal to software that a new packet is ready. Since Rx packet 622bbc53c7eSScott Feldmansize is not known a-priori, the Rx descriptor buffer must be allocated for 623bbc53c7eSScott Feldmanworst-case packet size. A single Rx descriptor will contain the entire Rx 624bbc53c7eSScott Feldmanpacket data in one RX_FRAG. Other Rx TLVs describe and hardware offloads 625bbc53c7eSScott Feldmanperformed on the packet, such as checksum validation. 626bbc53c7eSScott Feldman 627*9ca6876dSPeter MaydellThe TLVs for Rx descriptor buffer are:: 628bbc53c7eSScott Feldman 629bbc53c7eSScott Feldman field width description 630bbc53c7eSScott Feldman --------------------------------------------------- 631bbc53c7eSScott Feldman PPORT 4 Source physical port # 632bbc53c7eSScott Feldman RX_FLAGS 2 Packet parsing flags: 633bbc53c7eSScott Feldman (1 << 0): IPv4 packet 634bbc53c7eSScott Feldman (1 << 1): IPv6 packet 635bbc53c7eSScott Feldman (1 << 2): csum calculated 636bbc53c7eSScott Feldman (1 << 3): IPv4 csum good 637bbc53c7eSScott Feldman (1 << 4): IP fragment 638bbc53c7eSScott Feldman (1 << 5): TCP packet 639bbc53c7eSScott Feldman (1 << 6): UDP packet 640bbc53c7eSScott Feldman (1 << 7): TCP/UDP csum good 641d0d25558SScott Feldman (1 << 8): Offload forward 642bbc53c7eSScott Feldman RX_CSUM 2 IP calculated checksum: 643bbc53c7eSScott Feldman IPv4: IP payload csum 644bbc53c7eSScott Feldman IPv6: header and payload csum 645bbc53c7eSScott Feldman (Only valid is RX_FLAGS:csum calc is set) 646bbc53c7eSScott Feldman RX_FRAG_ADDR 8 DMA address of packet fragment 647bbc53c7eSScott Feldman RX_FRAG_MAX_LEN 2 Packet maximum fragment length 648bbc53c7eSScott Feldman RX_FRAG_LEN 2 Actual packet fragment length after receive 649bbc53c7eSScott Feldman 650d0d25558SScott FeldmanOffload forward RX_FLAG indicates the device has already forwarded the packet 651d0d25558SScott Feldmanso the host CPU should not also forward the packet. 652d0d25558SScott Feldman 653*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are:: 654bbc53c7eSScott Feldman 655bbc53c7eSScott Feldman DESC_COMP_ERR reason 656bbc53c7eSScott Feldman -------------------------------------------------------------------- 657bbc53c7eSScott Feldman 0 OK 658bbc53c7eSScott Feldman -ROCKER_ENXIO address or data read err on desc buf 659bbc53c7eSScott Feldman -ROCKER_ENOMEM no memory for internal staging desc buf 660bbc53c7eSScott Feldman -ROCKER_EMSGSIZE Rx descriptor buffer wasn't big enough to contain 661bbc53c7eSScott Feldman packet data TLV and other TLVs. 662bbc53c7eSScott Feldman 663bbc53c7eSScott Feldman 664*9ca6876dSPeter MaydellOF-DPA Mode 665*9ca6876dSPeter Maydell=========== 666bbc53c7eSScott Feldman 667bbc53c7eSScott FeldmanOF-DPA mode allows the switch to offload flow packet processing functions to 668bbc53c7eSScott Feldmanhardware. An OpenFlow controller would communicate with an OpenFlow agent 669bbc53c7eSScott Feldmaninstalled on the switch. The OpenFlow agent would (directly or indirectly) 670bbc53c7eSScott Feldmancommunicate with the Rocker switch driver, which in turn would program switch 671*9ca6876dSPeter Maydellhardware with flow functionality, as defined in OF-DPA. The block diagram is:: 672bbc53c7eSScott Feldman 673bbc53c7eSScott Feldman +–––––––––––––––----–––+ 674bbc53c7eSScott Feldman | OF | 675bbc53c7eSScott Feldman | Remote Controller | 676bbc53c7eSScott Feldman +––––––––+––----–––––––+ 677bbc53c7eSScott Feldman | 678bbc53c7eSScott Feldman | 679bbc53c7eSScott Feldman +––––––––+–––––––––+ 680bbc53c7eSScott Feldman | OF | 681bbc53c7eSScott Feldman | Local Agent | 682bbc53c7eSScott Feldman +––––––––––––––––––+ 683bbc53c7eSScott Feldman | | 684bbc53c7eSScott Feldman | Rocker Driver | 685bbc53c7eSScott Feldman +––––––––––––––––––+ 686bbc53c7eSScott Feldman <this spec> 687bbc53c7eSScott Feldman +––––––––––––––––––+ 688bbc53c7eSScott Feldman | | 689bbc53c7eSScott Feldman | Rocker Switch | 690bbc53c7eSScott Feldman +––––––––––––––––––+ 691bbc53c7eSScott Feldman 692bbc53c7eSScott FeldmanTo participate in flow functions, ports must be configure for OF-DPA mode 693bbc53c7eSScott Feldmanduring switch initialization. 694bbc53c7eSScott Feldman 695bbc53c7eSScott FeldmanOF-DPA Flow Table Interface 696bbc53c7eSScott Feldman--------------------------- 697bbc53c7eSScott Feldman 698bbc53c7eSScott FeldmanThere are commands to add, modify, delete, and get stats of flow table entries. 699bbc53c7eSScott FeldmanThe commands are issued using the DMA CMD descriptor ring. The following 700*9ca6876dSPeter Maydellcommands are defined:: 701bbc53c7eSScott Feldman 702bbc53c7eSScott Feldman CMD_ADD: add an entry to flow table 703bbc53c7eSScott Feldman CMD_MOD: modify an entry in flow table 704bbc53c7eSScott Feldman CMD_DEL: delete an entry from flow table 705bbc53c7eSScott Feldman CMD_GET_STATS: get stats for flow entry 706bbc53c7eSScott Feldman 707*9ca6876dSPeter MaydellTLVs for add and modify commands are:: 708bbc53c7eSScott Feldman 709bbc53c7eSScott Feldman field width description 710bbc53c7eSScott Feldman ---------------------------------------------------- 711bbc53c7eSScott Feldman OF_DPA_CMD 2 CMD_[ADD|MOD] 712bbc53c7eSScott Feldman OF_DPA_TBL 2 Flow table ID 713bbc53c7eSScott Feldman 0: ingress port 714bbc53c7eSScott Feldman 10: vlan 715bbc53c7eSScott Feldman 20: termination mac 716bbc53c7eSScott Feldman 30: unicast routing 717bbc53c7eSScott Feldman 40: multicast routing 718bbc53c7eSScott Feldman 50: bridging 719bbc53c7eSScott Feldman 60: ACL policy 720bbc53c7eSScott Feldman OF_DPA_PRIORITY 4 Flow priority 721bbc53c7eSScott Feldman OF_DPA_HARDTIME 4 Hard timeout for flow 722bbc53c7eSScott Feldman OF_DPA_IDLETIME 4 Idle timeout for flow 723bbc53c7eSScott Feldman OF_DPA_COOKIE 8 Cookie 724bbc53c7eSScott Feldman 725bbc53c7eSScott FeldmanAdditional TLVs based on flow table ID: 726bbc53c7eSScott Feldman 727*9ca6876dSPeter MaydellTable ID 0: ingress port:: 728bbc53c7eSScott Feldman 729bbc53c7eSScott Feldman field width description 730bbc53c7eSScott Feldman ---------------------------------------------------- 731bbc53c7eSScott Feldman OF_DPA_IN_PPORT 4 ingress physical port number 732bbc53c7eSScott Feldman OF_DPA_GOTO_TBL 2 goto table ID; zero to drop 733bbc53c7eSScott Feldman 734*9ca6876dSPeter MaydellTable ID 10: vlan:: 735bbc53c7eSScott Feldman 736bbc53c7eSScott Feldman field width description 737bbc53c7eSScott Feldman ---------------------------------------------------- 738bbc53c7eSScott Feldman OF_DPA_IN_PPORT 4 ingress physical port number 739bbc53c7eSScott Feldman OF_DPA_VLAN_ID 2 (N) vlan ID 740bbc53c7eSScott Feldman OF_DPA_VLAN_ID_MASK 2 (N) vlan ID mask 741bbc53c7eSScott Feldman OF_DPA_GOTO_TBL 2 goto table ID; zero to drop 742bbc53c7eSScott Feldman OF_DPA_NEW_VLAN_ID 2 (N) new vlan ID 743bbc53c7eSScott Feldman 744*9ca6876dSPeter MaydellTable ID 20: termination mac:: 745bbc53c7eSScott Feldman 746bbc53c7eSScott Feldman field width description 747bbc53c7eSScott Feldman ---------------------------------------------------- 748bbc53c7eSScott Feldman OF_DPA_IN_PPORT 4 ingress physical port number 749bbc53c7eSScott Feldman OF_DPA_IN_PPORT_MASK 4 ingress physical port number mask 750bbc53c7eSScott Feldman OF_DPA_ETHERTYPE 2 (N) must be either 0x0800 or 0x86dd 751bbc53c7eSScott Feldman OF_DPA_DST_MAC 6 (N) destination MAC 752bbc53c7eSScott Feldman OF_DPA_DST_MAC_MASK 6 (N) destination MAC mask 753bbc53c7eSScott Feldman OF_DPA_VLAN_ID 2 (N) vlan ID 754bbc53c7eSScott Feldman OF_DPA_VLAN_ID_MASK 2 (N) vlan ID mask 755bbc53c7eSScott Feldman OF_DPA_GOTO_TBL 2 only acceptable values are 756bbc53c7eSScott Feldman unicast or multicast routing 757bbc53c7eSScott Feldman table IDs 758bbc53c7eSScott Feldman OF_DPA_OUT_PPORT 2 if specified, must be 759bbc53c7eSScott Feldman controller, set zero otherwise 760bbc53c7eSScott Feldman 761*9ca6876dSPeter MaydellTable ID 30: unicast routing:: 762bbc53c7eSScott Feldman 763bbc53c7eSScott Feldman field width description 764bbc53c7eSScott Feldman ---------------------------------------------------- 765bbc53c7eSScott Feldman OF_DPA_ETHERTYPE 2 (N) must be either 0x0800 or 0x86dd 766bbc53c7eSScott Feldman OF_DPA_DST_IP 4 (N) destination IPv4 address. 767bbc53c7eSScott Feldman Must be unicast address 768bbc53c7eSScott Feldman OF_DPA_DST_IP_MASK 4 (N) IP mask. Must be prefix mask 769bbc53c7eSScott Feldman OF_DPA_DST_IPV6 16 (N) destination IPv6 address. 770bbc53c7eSScott Feldman Must be unicast address 771bbc53c7eSScott Feldman OF_DPA_DST_IPV6_MASK 16 (N) IPv6 mask. Must be prefix mask 772bbc53c7eSScott Feldman OF_DPA_GOTO_TBL 2 goto table ID; zero to drop 773bbc53c7eSScott Feldman OF_DPA_GROUP_ID 4 data for GROUP action must 774bbc53c7eSScott Feldman be an L3 Unicast group entry 775bbc53c7eSScott Feldman 776*9ca6876dSPeter MaydellTable ID 40: multicast routing:: 777bbc53c7eSScott Feldman 778bbc53c7eSScott Feldman field width description 779bbc53c7eSScott Feldman ---------------------------------------------------- 780bbc53c7eSScott Feldman OF_DPA_ETHERTYPE 2 (N) must be either 0x0800 or 0x86dd 781bbc53c7eSScott Feldman OF_DPA_VLAN_ID 2 (N) vlan ID 782bbc53c7eSScott Feldman OF_DPA_SRC_IP 4 (N) source IPv4. Optional, 783bbc53c7eSScott Feldman can contain IPv4 address, 784bbc53c7eSScott Feldman must be completely masked 785bbc53c7eSScott Feldman if not used 786bbc53c7eSScott Feldman OF_DPA_SRC_IP_MASK 4 (N) IP Mask 787bbc53c7eSScott Feldman OF_DPA_DST_IP 4 (N) destination IPv4 address. 788bbc53c7eSScott Feldman Must be multicast address 789bbc53c7eSScott Feldman OF_DPA_SRC_IPV6 16 (N) source IPv6 Address. Optional. 790bbc53c7eSScott Feldman Can contain IPv6 address, 791bbc53c7eSScott Feldman must be completely masked 792bbc53c7eSScott Feldman if not used 793bbc53c7eSScott Feldman OF_DPA_SRC_IPV6_MASK 16 (N) IPv6 mask. 794bbc53c7eSScott Feldman OF_DPA_DST_IPV6 16 (N) destination IPv6 Address. Must 795bbc53c7eSScott Feldman be multicast address 796bbc53c7eSScott Feldman Must be multicast address 797bbc53c7eSScott Feldman OF_DPA_GOTO_TBL 2 goto table ID; zero to drop 798bbc53c7eSScott Feldman OF_DPA_GROUP_ID 4 data for GROUP action must 799bbc53c7eSScott Feldman be an L3 multicast group entry 800bbc53c7eSScott Feldman 801*9ca6876dSPeter MaydellTable ID 50: bridging:: 802bbc53c7eSScott Feldman 803bbc53c7eSScott Feldman field width description 804bbc53c7eSScott Feldman ---------------------------------------------------- 805bbc53c7eSScott Feldman OF_DPA_VLAN_ID 2 (N) vlan ID 806bbc53c7eSScott Feldman OF_DPA_TUNNEL_ID 4 tunnel ID 807bbc53c7eSScott Feldman OF_DPA_DST_MAC 6 (N) destination MAC 808bbc53c7eSScott Feldman OF_DPA_DST_MAC_MASK 6 (N) destination MAC mask 809bbc53c7eSScott Feldman OF_DPA_GOTO_TBL 2 goto table ID; zero to drop 810bbc53c7eSScott Feldman OF_DPA_GROUP_ID 4 data for GROUP action must 811bbc53c7eSScott Feldman be a L2 Interface, L2 812bbc53c7eSScott Feldman Multicast, L2 Flood, 813bbc53c7eSScott Feldman or L2 Overlay group entry 814bbc53c7eSScott Feldman as appropriate 815bbc53c7eSScott Feldman OF_DPA_TUNNEL_LPORT 4 unicast Tenant Bridging 816bbc53c7eSScott Feldman flows specify a tunnel 817bbc53c7eSScott Feldman logical port ID 818bbc53c7eSScott Feldman OF_DPA_OUT_PPORT 2 data for OUTPUT action, 819bbc53c7eSScott Feldman restricted to CONTROLLER, 820bbc53c7eSScott Feldman set to 0 otherwise 821bbc53c7eSScott Feldman 822*9ca6876dSPeter MaydellTable ID 60: acl policy:: 823bbc53c7eSScott Feldman 824bbc53c7eSScott Feldman field width description 825bbc53c7eSScott Feldman ---------------------------------------------------- 826bbc53c7eSScott Feldman OF_DPA_IN_PPORT 4 ingress physical port number 827bbc53c7eSScott Feldman OF_DPA_IN_PPORT_MASK 4 ingress physical port number mask 828bbc53c7eSScott Feldman OF_DPA_ETHERTYPE 2 (N) ethertype 829bbc53c7eSScott Feldman OF_DPA_VLAN_ID 2 (N) vlan ID 830bbc53c7eSScott Feldman OF_DPA_VLAN_ID_MASK 2 (N) vlan ID mask 831bbc53c7eSScott Feldman OF_DPA_VLAN_PCP 2 (N) vlan Priority Code Point 832bbc53c7eSScott Feldman OF_DPA_VLAN_PCP_MASK 2 (N) vlan Priority Code Point mask 833bbc53c7eSScott Feldman OF_DPA_SRC_MAC 6 (N) source MAC 834bbc53c7eSScott Feldman OF_DPA_SRC_MAC_MASK 6 (N) source MAC mask 835bbc53c7eSScott Feldman OF_DPA_DST_MAC 6 (N) destination MAC 836bbc53c7eSScott Feldman OF_DPA_DST_MAC_MASK 6 (N) destination MAC mask 837bbc53c7eSScott Feldman OF_DPA_TUNNEL_ID 4 tunnel ID 838bbc53c7eSScott Feldman OF_DPA_SRC_IP 4 (N) source IPv4. Optional, 839bbc53c7eSScott Feldman can contain IPv4 address, 840bbc53c7eSScott Feldman must be completely masked 841bbc53c7eSScott Feldman if not used 842bbc53c7eSScott Feldman OF_DPA_SRC_IP_MASK 4 (N) IP Mask 843bbc53c7eSScott Feldman OF_DPA_DST_IP 4 (N) destination IPv4 address. 844bbc53c7eSScott Feldman Must be multicast address 845bbc53c7eSScott Feldman OF_DPA_DST_IP_MASK 4 (N) IP Mask 846bbc53c7eSScott Feldman OF_DPA_SRC_IPV6 16 (N) source IPv6 Address. Optional. 847bbc53c7eSScott Feldman Can contain IPv6 address, 848bbc53c7eSScott Feldman must be completely masked 849bbc53c7eSScott Feldman if not used 850bbc53c7eSScott Feldman OF_DPA_SRC_IPV6_MASK 16 (N) IPv6 mask 851bbc53c7eSScott Feldman OF_DPA_DST_IPV6 16 (N) destination IPv6 Address. Must 852bbc53c7eSScott Feldman be multicast address. 853bbc53c7eSScott Feldman OF_DPA_DST_IPV6_MASK 16 (N) IPv6 mask 854bbc53c7eSScott Feldman OF_DPA_SRC_ARP_IP 4 (N) source IPv4 address in the ARP 855bbc53c7eSScott Feldman payload. Only used if ethertype 856bbc53c7eSScott Feldman == 0x0806. 857bbc53c7eSScott Feldman OF_DPA_SRC_ARP_IP_MASK 4 (N) IP Mask 858bbc53c7eSScott Feldman OF_DPA_IP_PROTO 1 IP protocol 859bbc53c7eSScott Feldman OF_DPA_IP_PROTO_MASK 1 IP protocol mask 860bbc53c7eSScott Feldman OF_DPA_IP_DSCP 1 DSCP 861bbc53c7eSScott Feldman OF_DPA_IP_DSCP_MASK 1 DSCP mask 862bbc53c7eSScott Feldman OF_DPA_IP_ECN 1 ECN 863bbc53c7eSScott Feldman OF_DPA_IP_ECN_MASK 1 ECN mask 864bbc53c7eSScott Feldman OF_DPA_L4_SRC_PORT 2 (N) L4 source port, only for 865bbc53c7eSScott Feldman TCP, UDP, or SCTP 866bbc53c7eSScott Feldman OF_DPA_L4_SRC_PORT_MASK 2 (N) L4 source port mask 867bbc53c7eSScott Feldman OF_DPA_L4_DST_PORT 2 (N) L4 source port, only for 868bbc53c7eSScott Feldman TCP, UDP, or SCTP 869bbc53c7eSScott Feldman OF_DPA_L4_DST_PORT_MASK 2 (N) L4 source port mask 870bbc53c7eSScott Feldman OF_DPA_ICMP_TYPE 1 ICMP type, only if IP 871bbc53c7eSScott Feldman protocol is 1 872bbc53c7eSScott Feldman OF_DPA_ICMP_TYPE_MASK 1 ICMP type mask 873bbc53c7eSScott Feldman OF_DPA_ICMP_CODE 1 ICMP code 874bbc53c7eSScott Feldman OF_DPA_ICMP_CODE_MASK 1 ICMP code mask 875bbc53c7eSScott Feldman OF_DPA_IPV6_LABEL 4 (N) IPv6 flow label 876bbc53c7eSScott Feldman OF_DPA_IPV6_LABEL_MASK 4 (N) IPv6 flow label mask 877bbc53c7eSScott Feldman OF_DPA_GROUP_ID 4 data for GROUP action 878bbc53c7eSScott Feldman OF_DPA_QUEUE_ID_ACTION 1 write the queue ID 879bbc53c7eSScott Feldman OF_DPA_NEW_QUEUE_ID 1 queue ID 880bbc53c7eSScott Feldman OF_DPA_VLAN_PCP_ACTION 1 write the VLAN priority 881bbc53c7eSScott Feldman OF_DPA_NEW_VLAN_PCP 1 VLAN priority 882bbc53c7eSScott Feldman OF_DPA_IP_DSCP_ACTION 1 write the DSCP 883bbc53c7eSScott Feldman OF_DPA_NEW_IP_DSCP 1 new DSCP 884bbc53c7eSScott Feldman OF_DPA_TUNNEL_LPORT 4 restrct to valid tunnel 885bbc53c7eSScott Feldman logical port, set to 0 886bbc53c7eSScott Feldman otherwise. 887bbc53c7eSScott Feldman OF_DPA_OUT_PPORT 2 data for OUTPUT action, 888bbc53c7eSScott Feldman restricted to CONTROLLER, 889bbc53c7eSScott Feldman set to 0 otherwise 890bbc53c7eSScott Feldman OF_DPA_CLEAR_ACTIONS 4 if 1 packets matching flow are 891bbc53c7eSScott Feldman dropped (all other instructions 892bbc53c7eSScott Feldman ignored) 893bbc53c7eSScott Feldman 894*9ca6876dSPeter MaydellTLVs for flow delete and get stats command are:: 895bbc53c7eSScott Feldman 896bbc53c7eSScott Feldman field width description 897bbc53c7eSScott Feldman --------------------------------------------------- 898bbc53c7eSScott Feldman OF_DPA_CMD 2 CMD_[DEL|GET_STATS] 899bbc53c7eSScott Feldman OF_DPA_COOKIE 8 Cookie 900bbc53c7eSScott Feldman 901bbc53c7eSScott FeldmanOn completion of get stats command, the descriptor buffer is written back with 902*9ca6876dSPeter Maydellthe following TLVs:: 903bbc53c7eSScott Feldman 904bbc53c7eSScott Feldman field width description 905bbc53c7eSScott Feldman --------------------------------------------------- 906bbc53c7eSScott Feldman OF_DPA_STAT_DURATION 4 Flow duration 907bbc53c7eSScott Feldman OF_DPA_STAT_RX_PKTS 8 Received packets 908bbc53c7eSScott Feldman OF_DPA_STAT_TX_PKTS 8 Transmit packets 909bbc53c7eSScott Feldman 910*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are:: 911bbc53c7eSScott Feldman 912bbc53c7eSScott Feldman DESC_COMP_ERR command reason 913bbc53c7eSScott Feldman -------------------------------------------------------------------- 914bbc53c7eSScott Feldman 0 all OK 915bbc53c7eSScott Feldman -ROCKER_EFAULT all head or tail index outside 916bbc53c7eSScott Feldman of ring 917bbc53c7eSScott Feldman -ROCKER_ENXIO all address or data read err on 918bbc53c7eSScott Feldman desc buf 919bbc53c7eSScott Feldman -ROCKER_EMSGSIZE GET_STATS cmd descriptor buffer wasn't 920bbc53c7eSScott Feldman big enough to contain write-back 921bbc53c7eSScott Feldman TLVs 922bbc53c7eSScott Feldman -ROCKER_EINVAL all invalid parameters passed in 923bbc53c7eSScott Feldman -ROCKER_EEXIST ADD entry already exists 924bbc53c7eSScott Feldman -ROCKER_ENOSPC ADD no space left in flow table 925bbc53c7eSScott Feldman -ROCKER_ENOENT MOD|DEL|GET_STATS cookie invalid 926bbc53c7eSScott Feldman 927bbc53c7eSScott FeldmanGroup Table Interface 928bbc53c7eSScott Feldman--------------------- 929bbc53c7eSScott Feldman 930bbc53c7eSScott FeldmanThere are commands to add, modify, delete, and get stats of group table 931bbc53c7eSScott Feldmanentries. The commands are issued using the DMA CMD descriptor ring. The 932*9ca6876dSPeter Maydellfollowing commands are defined:: 933bbc53c7eSScott Feldman 934bbc53c7eSScott Feldman CMD_ADD: add an entry to group table 935bbc53c7eSScott Feldman CMD_MOD: modify an entry in group table 936bbc53c7eSScott Feldman CMD_DEL: delete an entry from group table 937bbc53c7eSScott Feldman CMD_GET_STATS: get stats for group entry 938bbc53c7eSScott Feldman 939*9ca6876dSPeter MaydellTLVs for add and modify commands are:: 940bbc53c7eSScott Feldman 941bbc53c7eSScott Feldman field width description 942bbc53c7eSScott Feldman ----------------------------------------------------------- 943bbc53c7eSScott Feldman FLOW_GROUP_CMD 2 CMD_[ADD|MOD] 944bbc53c7eSScott Feldman FLOW_GROUP_ID 2 Flow group ID 945bbc53c7eSScott Feldman FLOW_GROUP_TYPE 1 Group type: 946bbc53c7eSScott Feldman 0: L2 interface 947bbc53c7eSScott Feldman 1: L2 rewrite 948bbc53c7eSScott Feldman 2: L3 unicast 949bbc53c7eSScott Feldman 3: L2 multicast 950bbc53c7eSScott Feldman 4: L2 flood 951bbc53c7eSScott Feldman 5: L3 interface 952bbc53c7eSScott Feldman 6: L3 multicast 953bbc53c7eSScott Feldman 7: L3 ECMP 954bbc53c7eSScott Feldman 8: L2 overlay 955bbc53c7eSScott Feldman FLOW_VLAN_ID 2 Vlan ID (types 0, 3, 4, 6) 956bbc53c7eSScott Feldman FLOW_L2_PORT 2 Port (types 0) 957bbc53c7eSScott Feldman FLOW_INDEX 4 Index (all types but 0) 958bbc53c7eSScott Feldman FLOW_OVERLAY_TYPE 1 Overlay sub-type (type 8): 959bbc53c7eSScott Feldman 0: Flood unicast tunnel 960bbc53c7eSScott Feldman 1: Flood multicast tunnel 961bbc53c7eSScott Feldman 2: Multicast unicast tunnel 962bbc53c7eSScott Feldman 3: Multicast multicast tunnel 963bbc53c7eSScott Feldman FLOW_GROUP_ACTION nest 964bbc53c7eSScott Feldman FLOW_GROUP_ID 2 next group ID in chain (all 965bbc53c7eSScott Feldman types except 0) 966bbc53c7eSScott Feldman FLOW_OUT_PORT 4 egress port (types 0, 8) 967bbc53c7eSScott Feldman FLOW_POP_VLAN_TAG 1 strip outer VLAN tag (type 1 968bbc53c7eSScott Feldman only) 969bbc53c7eSScott Feldman FLOW_VLAN_ID 2 (types 1, 5) 970bbc53c7eSScott Feldman FLOW_SRC_MAC 6 (types 1, 2, 5) 971bbc53c7eSScott Feldman FLOW_DST_MAC 6 (types 1, 2) 972bbc53c7eSScott Feldman 973*9ca6876dSPeter MaydellTLVs for flow delete and get stats command are:: 974bbc53c7eSScott Feldman 975bbc53c7eSScott Feldman field width description 976bbc53c7eSScott Feldman ----------------------------------------------------------- 977bbc53c7eSScott Feldman FLOW_GROUP_CMD 2 CMD_[DEL|GET_STATS] 978bbc53c7eSScott Feldman FLOW_GROUP_ID 2 Flow group ID 979bbc53c7eSScott Feldman 980bbc53c7eSScott FeldmanOn completion of get stats command, the descriptor buffer is written back with 981*9ca6876dSPeter Maydellthe following TLVs:: 982bbc53c7eSScott Feldman 983bbc53c7eSScott Feldman field width description 984bbc53c7eSScott Feldman --------------------------------------------------- 985bbc53c7eSScott Feldman FLOW_GROUP_ID 2 Flow group ID 986bbc53c7eSScott Feldman FLOW_STAT_DURATION 4 Flow duration 987bbc53c7eSScott Feldman FLOW_STAT_REF_COUNT 4 Flow reference count 988bbc53c7eSScott Feldman FLOW_STAT_BUCKET_COUNT 4 Flow bucket count 989bbc53c7eSScott Feldman 990*9ca6876dSPeter MaydellPossible status return codes in descriptor on completion are:: 991bbc53c7eSScott Feldman 992bbc53c7eSScott Feldman DESC_COMP_ERR command reason 993bbc53c7eSScott Feldman -------------------------------------------------------------------- 994bbc53c7eSScott Feldman 0 all OK 995bbc53c7eSScott Feldman -ROCKER_EFAULT all head or tail index outside 996bbc53c7eSScott Feldman of ring 997bbc53c7eSScott Feldman -ROCKER_ENXIO all address or data read err on 998bbc53c7eSScott Feldman desc buf 999bbc53c7eSScott Feldman -ROCKER_ENOSPC GET_STATS cmd descriptor buffer wasn't 1000bbc53c7eSScott Feldman big enough to contain write-back 1001bbc53c7eSScott Feldman TLVs 1002bbc53c7eSScott Feldman -ROCKER_EINVAL ADD|MOD invalid parameters passed in 1003bbc53c7eSScott Feldman -ROCKER_EEXIST ADD entry already exists 1004bbc53c7eSScott Feldman -ROCKER_ENOSPC ADD no space left in flow table 1005bbc53c7eSScott Feldman -ROCKER_ENOENT MOD|DEL|GET_STATS group ID invalid 1006bbc53c7eSScott Feldman -ROCKER_EBUSY DEL group reference count non-zero 1007bbc53c7eSScott Feldman -ROCKER_ENODEV ADD next group ID doesn't exist 1008bbc53c7eSScott Feldman 1009bbc53c7eSScott Feldman 1010bbc53c7eSScott Feldman 1011bbc53c7eSScott FeldmanReferences 1012bbc53c7eSScott Feldman========== 1013bbc53c7eSScott Feldman 1014bbc53c7eSScott Feldman[1] OpenFlow Data Plane Abstraction (OF-DPA) Abstract Switch Specification, 1015bbc53c7eSScott FeldmanVersion 1.0, from Broadcom Corporation, February 21, 2014. 1016