1*a99b5657SRoger Quadros /* SPDX-License-Identifier: GPL-2.0 */ 2*a99b5657SRoger Quadros 3*a99b5657SRoger Quadros /* Copyright (C) 2015-2021 Texas Instruments Incorporated - https://www.ti.com 4*a99b5657SRoger Quadros */ 5*a99b5657SRoger Quadros 6*a99b5657SRoger Quadros #ifndef __ICSS_SWITCH_H 7*a99b5657SRoger Quadros #define __ICSS_SWITCH_H 8*a99b5657SRoger Quadros 9*a99b5657SRoger Quadros /* Basic Switch Parameters 10*a99b5657SRoger Quadros * Used to auto compute offset addresses on L3 OCMC RAM. Do not modify these 11*a99b5657SRoger Quadros * without changing firmware accordingly 12*a99b5657SRoger Quadros */ 13*a99b5657SRoger Quadros #define SWITCH_BUFFER_SIZE (64 * 1024) /* L3 buffer */ 14*a99b5657SRoger Quadros #define ICSS_BLOCK_SIZE 32 /* data bytes per BD */ 15*a99b5657SRoger Quadros #define BD_SIZE 4 /* byte buffer descriptor */ 16*a99b5657SRoger Quadros #define NUM_QUEUES 4 /* Queues on Port 0/1/2 */ 17*a99b5657SRoger Quadros 18*a99b5657SRoger Quadros #define PORT_LINK_MASK 0x1 19*a99b5657SRoger Quadros #define PORT_IS_HD_MASK 0x2 20*a99b5657SRoger Quadros 21*a99b5657SRoger Quadros /* Physical Port queue size (number of BDs). Same for both ports */ 22*a99b5657SRoger Quadros #define QUEUE_1_SIZE 97 /* Network Management high */ 23*a99b5657SRoger Quadros #define QUEUE_2_SIZE 97 /* Network Management low */ 24*a99b5657SRoger Quadros #define QUEUE_3_SIZE 97 /* Protocol specific */ 25*a99b5657SRoger Quadros #define QUEUE_4_SIZE 97 /* NRT (IP,ARP, ICMP) */ 26*a99b5657SRoger Quadros 27*a99b5657SRoger Quadros /* Host queue size (number of BDs). Each BD points to data buffer of 32 bytes. 28*a99b5657SRoger Quadros * HOST PORT QUEUES can buffer up to 4 full sized frames per queue 29*a99b5657SRoger Quadros */ 30*a99b5657SRoger Quadros #define HOST_QUEUE_1_SIZE 194 /* Protocol and VLAN priority 7 & 6 */ 31*a99b5657SRoger Quadros #define HOST_QUEUE_2_SIZE 194 /* Protocol mid */ 32*a99b5657SRoger Quadros #define HOST_QUEUE_3_SIZE 194 /* Protocol low */ 33*a99b5657SRoger Quadros #define HOST_QUEUE_4_SIZE 194 /* NRT (IP, ARP, ICMP) */ 34*a99b5657SRoger Quadros 35*a99b5657SRoger Quadros #define COL_QUEUE_SIZE 0 36*a99b5657SRoger Quadros 37*a99b5657SRoger Quadros /* NRT Buffer descriptor definition 38*a99b5657SRoger Quadros * Each buffer descriptor points to a max 32 byte block and has 32 bit in size 39*a99b5657SRoger Quadros * to have atomic operation. 40*a99b5657SRoger Quadros * PRU can address bytewise into memory. 41*a99b5657SRoger Quadros * Definition of 32 bit descriptor is as follows 42*a99b5657SRoger Quadros * 43*a99b5657SRoger Quadros * Bits Name Meaning 44*a99b5657SRoger Quadros * ============================================================================= 45*a99b5657SRoger Quadros * 0..7 Index points to index in buffer queue, max 256 x 32 46*a99b5657SRoger Quadros * byte blocks can be addressed 47*a99b5657SRoger Quadros * 6 LookupSuccess For switch, FDB lookup was successful (source 48*a99b5657SRoger Quadros * MAC address found in FDB). 49*a99b5657SRoger Quadros * For RED, NodeTable lookup was successful. 50*a99b5657SRoger Quadros * 7 Flood Packet should be flooded (destination MAC 51*a99b5657SRoger Quadros * address found in FDB). For switch only. 52*a99b5657SRoger Quadros * 8..12 Block_length number of valid bytes in this specific block. 53*a99b5657SRoger Quadros * Will be <=32 bytes on last block of packet 54*a99b5657SRoger Quadros * 13 More "More" bit indicating that there are more blocks 55*a99b5657SRoger Quadros * 14 Shadow indicates that "index" is pointing into shadow 56*a99b5657SRoger Quadros * buffer 57*a99b5657SRoger Quadros * 15 TimeStamp indicates that this packet has time stamp in 58*a99b5657SRoger Quadros * separate buffer - only needed if PTP runs on 59*a99b5657SRoger Quadros * host 60*a99b5657SRoger Quadros * 16..17 Port different meaning for ingress and egress, 61*a99b5657SRoger Quadros * Ingress: Port = 0 indicates phy port 1 and 62*a99b5657SRoger Quadros * Port = 1 indicates phy port 2. 63*a99b5657SRoger Quadros * Egress: 0 sends on phy port 1 and 1 sends on 64*a99b5657SRoger Quadros * phy port 2. Port = 2 goes over MAC table 65*a99b5657SRoger Quadros * look-up 66*a99b5657SRoger Quadros * 18..28 Length 11 bit of total packet length which is put into 67*a99b5657SRoger Quadros * first BD only so that host access only one BD 68*a99b5657SRoger Quadros * 29 VlanTag indicates that packet has Length/Type field of 69*a99b5657SRoger Quadros * 0x08100 with VLAN tag in following byte 70*a99b5657SRoger Quadros * 30 Broadcast indicates that packet goes out on both physical 71*a99b5657SRoger Quadros * ports, there will be two bd but only one buffer 72*a99b5657SRoger Quadros * 31 Error indicates there was an error in the packet 73*a99b5657SRoger Quadros */ 74*a99b5657SRoger Quadros #define PRUETH_BD_START_FLAG_MASK BIT(0) 75*a99b5657SRoger Quadros #define PRUETH_BD_START_FLAG_SHIFT 0 76*a99b5657SRoger Quadros 77*a99b5657SRoger Quadros #define PRUETH_BD_HSR_FRAME_MASK BIT(4) 78*a99b5657SRoger Quadros #define PRUETH_BD_HSR_FRAME_SHIFT 4 79*a99b5657SRoger Quadros 80*a99b5657SRoger Quadros #define PRUETH_BD_SUP_HSR_FRAME_MASK BIT(5) 81*a99b5657SRoger Quadros #define PRUETH_BD_SUP_HSR_FRAME_SHIFT 5 82*a99b5657SRoger Quadros 83*a99b5657SRoger Quadros #define PRUETH_BD_LOOKUP_SUCCESS_MASK BIT(6) 84*a99b5657SRoger Quadros #define PRUETH_BD_LOOKUP_SUCCESS_SHIFT 6 85*a99b5657SRoger Quadros 86*a99b5657SRoger Quadros #define PRUETH_BD_SW_FLOOD_MASK BIT(7) 87*a99b5657SRoger Quadros #define PRUETH_BD_SW_FLOOD_SHIFT 7 88*a99b5657SRoger Quadros 89*a99b5657SRoger Quadros #define PRUETH_BD_SHADOW_MASK BIT(14) 90*a99b5657SRoger Quadros #define PRUETH_BD_SHADOW_SHIFT 14 91*a99b5657SRoger Quadros 92*a99b5657SRoger Quadros #define PRUETH_BD_TIMESTAMP_MASK BIT(15) 93*a99b5657SRoger Quadros #define PRUETH_BD_TIMESTAMP_SHIFT 15 94*a99b5657SRoger Quadros 95*a99b5657SRoger Quadros #define PRUETH_BD_PORT_MASK GENMASK(17, 16) 96*a99b5657SRoger Quadros #define PRUETH_BD_PORT_SHIFT 16 97*a99b5657SRoger Quadros 98*a99b5657SRoger Quadros #define PRUETH_BD_LENGTH_MASK GENMASK(28, 18) 99*a99b5657SRoger Quadros #define PRUETH_BD_LENGTH_SHIFT 18 100*a99b5657SRoger Quadros 101*a99b5657SRoger Quadros #define PRUETH_BD_BROADCAST_MASK BIT(30) 102*a99b5657SRoger Quadros #define PRUETH_BD_BROADCAST_SHIFT 30 103*a99b5657SRoger Quadros 104*a99b5657SRoger Quadros #define PRUETH_BD_ERROR_MASK BIT(31) 105*a99b5657SRoger Quadros #define PRUETH_BD_ERROR_SHIFT 31 106*a99b5657SRoger Quadros 107*a99b5657SRoger Quadros /* The following offsets indicate which sections of the memory are used 108*a99b5657SRoger Quadros * for EMAC internal tasks 109*a99b5657SRoger Quadros */ 110*a99b5657SRoger Quadros #define DRAM_START_OFFSET 0x1E98 111*a99b5657SRoger Quadros #define SRAM_START_OFFSET 0x400 112*a99b5657SRoger Quadros 113*a99b5657SRoger Quadros /* General Purpose Statistics 114*a99b5657SRoger Quadros * These are present on both PRU0 and PRU1 DRAM 115*a99b5657SRoger Quadros */ 116*a99b5657SRoger Quadros /* base statistics offset */ 117*a99b5657SRoger Quadros #define STATISTICS_OFFSET 0x1F00 118*a99b5657SRoger Quadros #define STAT_SIZE 0x98 119*a99b5657SRoger Quadros 120*a99b5657SRoger Quadros /* Offset for storing 121*a99b5657SRoger Quadros * 1. Storm Prevention Params 122*a99b5657SRoger Quadros * 2. PHY Speed Offset 123*a99b5657SRoger Quadros * 3. Port Status Offset 124*a99b5657SRoger Quadros * These are present on both PRU0 and PRU1 125*a99b5657SRoger Quadros */ 126*a99b5657SRoger Quadros /* 4 bytes */ 127*a99b5657SRoger Quadros #define STORM_PREVENTION_OFFSET_BC (STATISTICS_OFFSET + STAT_SIZE) 128*a99b5657SRoger Quadros /* 4 bytes */ 129*a99b5657SRoger Quadros #define PHY_SPEED_OFFSET (STATISTICS_OFFSET + STAT_SIZE + 4) 130*a99b5657SRoger Quadros /* 1 byte */ 131*a99b5657SRoger Quadros #define PORT_STATUS_OFFSET (STATISTICS_OFFSET + STAT_SIZE + 8) 132*a99b5657SRoger Quadros /* 1 byte */ 133*a99b5657SRoger Quadros #define COLLISION_COUNTER (STATISTICS_OFFSET + STAT_SIZE + 9) 134*a99b5657SRoger Quadros /* 4 bytes */ 135*a99b5657SRoger Quadros #define RX_PKT_SIZE_OFFSET (STATISTICS_OFFSET + STAT_SIZE + 10) 136*a99b5657SRoger Quadros /* 4 bytes */ 137*a99b5657SRoger Quadros #define PORT_CONTROL_ADDR (STATISTICS_OFFSET + STAT_SIZE + 14) 138*a99b5657SRoger Quadros /* 6 bytes */ 139*a99b5657SRoger Quadros #define PORT_MAC_ADDR (STATISTICS_OFFSET + STAT_SIZE + 18) 140*a99b5657SRoger Quadros /* 1 byte */ 141*a99b5657SRoger Quadros #define RX_INT_STATUS_OFFSET (STATISTICS_OFFSET + STAT_SIZE + 24) 142*a99b5657SRoger Quadros /* 4 bytes */ 143*a99b5657SRoger Quadros #define STORM_PREVENTION_OFFSET_MC (STATISTICS_OFFSET + STAT_SIZE + 25) 144*a99b5657SRoger Quadros /* 4 bytes */ 145*a99b5657SRoger Quadros #define STORM_PREVENTION_OFFSET_UC (STATISTICS_OFFSET + STAT_SIZE + 29) 146*a99b5657SRoger Quadros /* 4 bytes ? */ 147*a99b5657SRoger Quadros #define STP_INVALID_STATE_OFFSET (STATISTICS_OFFSET + STAT_SIZE + 33) 148*a99b5657SRoger Quadros 149*a99b5657SRoger Quadros /* DRAM Offsets for EMAC 150*a99b5657SRoger Quadros * Present on Both DRAM0 and DRAM1 151*a99b5657SRoger Quadros */ 152*a99b5657SRoger Quadros 153*a99b5657SRoger Quadros /* 4 queue descriptors for port tx = 32 bytes */ 154*a99b5657SRoger Quadros #define TX_CONTEXT_Q1_OFFSET_ADDR (PORT_QUEUE_DESC_OFFSET + 32) 155*a99b5657SRoger Quadros #define PORT_QUEUE_DESC_OFFSET (ICSS_EMAC_TTS_CYC_TX_SOF + 8) 156*a99b5657SRoger Quadros 157*a99b5657SRoger Quadros /* EMAC Time Triggered Send Offsets */ 158*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_CYC_TX_SOF (ICSS_EMAC_TTS_PREV_TX_SOF + 8) 159*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_PREV_TX_SOF \ 160*a99b5657SRoger Quadros (ICSS_EMAC_TTS_MISSED_CYCLE_CNT_OFFSET + 4) 161*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_MISSED_CYCLE_CNT_OFFSET (ICSS_EMAC_TTS_STATUS_OFFSET \ 162*a99b5657SRoger Quadros + 4) 163*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_STATUS_OFFSET (ICSS_EMAC_TTS_CFG_TIME_OFFSET + 4) 164*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_CFG_TIME_OFFSET (ICSS_EMAC_TTS_CYCLE_PERIOD_OFFSET + 4) 165*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_CYCLE_PERIOD_OFFSET \ 166*a99b5657SRoger Quadros (ICSS_EMAC_TTS_CYCLE_START_OFFSET + 8) 167*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_CYCLE_START_OFFSET ICSS_EMAC_TTS_BASE_OFFSET 168*a99b5657SRoger Quadros #define ICSS_EMAC_TTS_BASE_OFFSET DRAM_START_OFFSET 169*a99b5657SRoger Quadros 170*a99b5657SRoger Quadros /* Shared RAM offsets for EMAC */ 171*a99b5657SRoger Quadros 172*a99b5657SRoger Quadros /* Queue Descriptors */ 173*a99b5657SRoger Quadros 174*a99b5657SRoger Quadros /* 4 queue descriptors for port 0 (host receive). 32 bytes */ 175*a99b5657SRoger Quadros #define HOST_QUEUE_DESC_OFFSET (HOST_QUEUE_SIZE_ADDR + 16) 176*a99b5657SRoger Quadros 177*a99b5657SRoger Quadros /* table offset for queue size: 178*a99b5657SRoger Quadros * 3 ports * 4 Queues * 1 byte offset = 12 bytes 179*a99b5657SRoger Quadros */ 180*a99b5657SRoger Quadros #define HOST_QUEUE_SIZE_ADDR (HOST_QUEUE_OFFSET_ADDR + 8) 181*a99b5657SRoger Quadros /* table offset for queue: 182*a99b5657SRoger Quadros * 4 Queues * 2 byte offset = 8 bytes 183*a99b5657SRoger Quadros */ 184*a99b5657SRoger Quadros #define HOST_QUEUE_OFFSET_ADDR (HOST_QUEUE_DESCRIPTOR_OFFSET_ADDR + 8) 185*a99b5657SRoger Quadros /* table offset for Host queue descriptors: 186*a99b5657SRoger Quadros * 1 ports * 4 Queues * 2 byte offset = 8 bytes 187*a99b5657SRoger Quadros */ 188*a99b5657SRoger Quadros #define HOST_QUEUE_DESCRIPTOR_OFFSET_ADDR (HOST_Q4_RX_CONTEXT_OFFSET + 8) 189*a99b5657SRoger Quadros 190*a99b5657SRoger Quadros /* Host Port Rx Context */ 191*a99b5657SRoger Quadros #define HOST_Q4_RX_CONTEXT_OFFSET (HOST_Q3_RX_CONTEXT_OFFSET + 8) 192*a99b5657SRoger Quadros #define HOST_Q3_RX_CONTEXT_OFFSET (HOST_Q2_RX_CONTEXT_OFFSET + 8) 193*a99b5657SRoger Quadros #define HOST_Q2_RX_CONTEXT_OFFSET (HOST_Q1_RX_CONTEXT_OFFSET + 8) 194*a99b5657SRoger Quadros #define HOST_Q1_RX_CONTEXT_OFFSET (EMAC_PROMISCUOUS_MODE_OFFSET + 4) 195*a99b5657SRoger Quadros 196*a99b5657SRoger Quadros /* Promiscuous mode control */ 197*a99b5657SRoger Quadros #define EMAC_P1_PROMISCUOUS_BIT BIT(0) 198*a99b5657SRoger Quadros #define EMAC_P2_PROMISCUOUS_BIT BIT(1) 199*a99b5657SRoger Quadros #define EMAC_PROMISCUOUS_MODE_OFFSET (EMAC_RESERVED + 4) 200*a99b5657SRoger Quadros #define EMAC_RESERVED EOF_48K_BUFFER_BD 201*a99b5657SRoger Quadros 202*a99b5657SRoger Quadros /* allow for max 48k buffer which spans the descriptors up to 0x1800 6kB */ 203*a99b5657SRoger Quadros #define EOF_48K_BUFFER_BD (P0_BUFFER_DESC_OFFSET + HOST_BD_SIZE + \ 204*a99b5657SRoger Quadros PORT_BD_SIZE) 205*a99b5657SRoger Quadros 206*a99b5657SRoger Quadros #define HOST_BD_SIZE ((HOST_QUEUE_1_SIZE + \ 207*a99b5657SRoger Quadros HOST_QUEUE_2_SIZE + HOST_QUEUE_3_SIZE + \ 208*a99b5657SRoger Quadros HOST_QUEUE_4_SIZE) * BD_SIZE) 209*a99b5657SRoger Quadros #define PORT_BD_SIZE ((QUEUE_1_SIZE + QUEUE_2_SIZE + \ 210*a99b5657SRoger Quadros QUEUE_3_SIZE + QUEUE_4_SIZE) * 2 * BD_SIZE) 211*a99b5657SRoger Quadros 212*a99b5657SRoger Quadros #define END_OF_BD_POOL (P2_Q4_BD_OFFSET + QUEUE_4_SIZE * BD_SIZE) 213*a99b5657SRoger Quadros #define P2_Q4_BD_OFFSET (P2_Q3_BD_OFFSET + QUEUE_3_SIZE * BD_SIZE) 214*a99b5657SRoger Quadros #define P2_Q3_BD_OFFSET (P2_Q2_BD_OFFSET + QUEUE_2_SIZE * BD_SIZE) 215*a99b5657SRoger Quadros #define P2_Q2_BD_OFFSET (P2_Q1_BD_OFFSET + QUEUE_1_SIZE * BD_SIZE) 216*a99b5657SRoger Quadros #define P2_Q1_BD_OFFSET (P1_Q4_BD_OFFSET + QUEUE_4_SIZE * BD_SIZE) 217*a99b5657SRoger Quadros #define P1_Q4_BD_OFFSET (P1_Q3_BD_OFFSET + QUEUE_3_SIZE * BD_SIZE) 218*a99b5657SRoger Quadros #define P1_Q3_BD_OFFSET (P1_Q2_BD_OFFSET + QUEUE_2_SIZE * BD_SIZE) 219*a99b5657SRoger Quadros #define P1_Q2_BD_OFFSET (P1_Q1_BD_OFFSET + QUEUE_1_SIZE * BD_SIZE) 220*a99b5657SRoger Quadros #define P1_Q1_BD_OFFSET (P0_Q4_BD_OFFSET + HOST_QUEUE_4_SIZE * BD_SIZE) 221*a99b5657SRoger Quadros #define P0_Q4_BD_OFFSET (P0_Q3_BD_OFFSET + HOST_QUEUE_3_SIZE * BD_SIZE) 222*a99b5657SRoger Quadros #define P0_Q3_BD_OFFSET (P0_Q2_BD_OFFSET + HOST_QUEUE_2_SIZE * BD_SIZE) 223*a99b5657SRoger Quadros #define P0_Q2_BD_OFFSET (P0_Q1_BD_OFFSET + HOST_QUEUE_1_SIZE * BD_SIZE) 224*a99b5657SRoger Quadros #define P0_Q1_BD_OFFSET P0_BUFFER_DESC_OFFSET 225*a99b5657SRoger Quadros #define P0_BUFFER_DESC_OFFSET SRAM_START_OFFSET 226*a99b5657SRoger Quadros 227*a99b5657SRoger Quadros /* Memory Usage of L3 OCMC RAM */ 228*a99b5657SRoger Quadros 229*a99b5657SRoger Quadros /* L3 64KB Memory - mainly buffer Pool */ 230*a99b5657SRoger Quadros #define END_OF_BUFFER_POOL (P2_Q4_BUFFER_OFFSET + QUEUE_4_SIZE * \ 231*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 232*a99b5657SRoger Quadros #define P2_Q4_BUFFER_OFFSET (P2_Q3_BUFFER_OFFSET + QUEUE_3_SIZE * \ 233*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 234*a99b5657SRoger Quadros #define P2_Q3_BUFFER_OFFSET (P2_Q2_BUFFER_OFFSET + QUEUE_2_SIZE * \ 235*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 236*a99b5657SRoger Quadros #define P2_Q2_BUFFER_OFFSET (P2_Q1_BUFFER_OFFSET + QUEUE_1_SIZE * \ 237*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 238*a99b5657SRoger Quadros #define P2_Q1_BUFFER_OFFSET (P1_Q4_BUFFER_OFFSET + QUEUE_4_SIZE * \ 239*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 240*a99b5657SRoger Quadros #define P1_Q4_BUFFER_OFFSET (P1_Q3_BUFFER_OFFSET + QUEUE_3_SIZE * \ 241*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 242*a99b5657SRoger Quadros #define P1_Q3_BUFFER_OFFSET (P1_Q2_BUFFER_OFFSET + QUEUE_2_SIZE * \ 243*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 244*a99b5657SRoger Quadros #define P1_Q2_BUFFER_OFFSET (P1_Q1_BUFFER_OFFSET + QUEUE_1_SIZE * \ 245*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 246*a99b5657SRoger Quadros #define P1_Q1_BUFFER_OFFSET (P0_Q4_BUFFER_OFFSET + HOST_QUEUE_4_SIZE * \ 247*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 248*a99b5657SRoger Quadros #define P0_Q4_BUFFER_OFFSET (P0_Q3_BUFFER_OFFSET + HOST_QUEUE_3_SIZE * \ 249*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 250*a99b5657SRoger Quadros #define P0_Q3_BUFFER_OFFSET (P0_Q2_BUFFER_OFFSET + HOST_QUEUE_2_SIZE * \ 251*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 252*a99b5657SRoger Quadros #define P0_Q2_BUFFER_OFFSET (P0_Q1_BUFFER_OFFSET + HOST_QUEUE_1_SIZE * \ 253*a99b5657SRoger Quadros ICSS_BLOCK_SIZE) 254*a99b5657SRoger Quadros #define P0_COL_BUFFER_OFFSET 0xEE00 255*a99b5657SRoger Quadros #define P0_Q1_BUFFER_OFFSET 0x0000 256*a99b5657SRoger Quadros 257*a99b5657SRoger Quadros #endif /* __ICSS_SWITCH_H */ 258