poe.h revision 330897
1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2003-2012 Broadcom Corporation 5 * All Rights Reserved 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY BROADCOM ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 25 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 27 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 28 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * $FreeBSD: stable/11/sys/mips/nlm/hal/poe.h 330897 2018-03-14 03:19:51Z eadler $ 31 */ 32 33#ifndef __NLM_POE_H__ 34#define __NLM_POE_H__ 35 36/** 37* @file_name poe.h 38* @author Netlogic Microsystems 39* @brief Basic definitions of XLP Packet Order Engine 40*/ 41 42/* POE specific registers */ 43#define POE_CL0_ENQ_SPILL_BASE_LO 0x0 44#define POE_CL1_ENQ_SPILL_BASE_LO 0x2 45#define POE_CL2_ENQ_SPILL_BASE_LO 0x4 46#define POE_CL3_ENQ_SPILL_BASE_LO 0x6 47#define POE_CL4_ENQ_SPILL_BASE_LO 0x8 48#define POE_CL5_ENQ_SPILL_BASE_LO 0xa 49#define POE_CL6_ENQ_SPILL_BASE_LO 0xc 50#define POE_CL7_ENQ_SPILL_BASE_LO 0xe 51#define POE_CL0_ENQ_SPILL_BASE_HI 0x1 52#define POE_CL1_ENQ_SPILL_BASE_HI 0x3 53#define POE_CL2_ENQ_SPILL_BASE_HI 0x5 54#define POE_CL3_ENQ_SPILL_BASE_HI 0x7 55#define POE_CL4_ENQ_SPILL_BASE_HI 0x9 56#define POE_CL5_ENQ_SPILL_BASE_HI 0xb 57#define POE_CL6_ENQ_SPILL_BASE_HI 0xd 58#define POE_CL7_ENQ_SPILL_BASE_HI 0xf 59#define POE_CL0_DEQ_SPILL_BASE_LO 0x10 60#define POE_CL1_DEQ_SPILL_BASE_LO 0x12 61#define POE_CL2_DEQ_SPILL_BASE_LO 0x14 62#define POE_CL3_DEQ_SPILL_BASE_LO 0x16 63#define POE_CL4_DEQ_SPILL_BASE_LO 0x18 64#define POE_CL5_DEQ_SPILL_BASE_LO 0x1a 65#define POE_CL6_DEQ_SPILL_BASE_LO 0x1c 66#define POE_CL7_DEQ_SPILL_BASE_LO 0x1e 67#define POE_CL0_DEQ_SPILL_BASE_HI 0x11 68#define POE_CL1_DEQ_SPILL_BASE_HI 0x13 69#define POE_CL2_DEQ_SPILL_BASE_HI 0x15 70#define POE_CL3_DEQ_SPILL_BASE_HI 0x17 71#define POE_CL4_DEQ_SPILL_BASE_HI 0x19 72#define POE_CL5_DEQ_SPILL_BASE_HI 0x1b 73#define POE_CL6_DEQ_SPILL_BASE_HI 0x1d 74#define POE_CL7_DEQ_SPILL_BASE_HI 0x1f 75#define POE_MSG_STORAGE_BASE_ADDR_LO 0x20 76#define POE_MSG_STORAGE_BASE_ADDR_HI 0x21 77#define POE_FBP_BASE_ADDR_LO 0x22 78#define POE_FBP_BASE_ADDR_HI 0x23 79#define POE_CL0_ENQ_SPILL_MAXLINE_LO 0x24 80#define POE_CL1_ENQ_SPILL_MAXLINE_LO 0x25 81#define POE_CL2_ENQ_SPILL_MAXLINE_LO 0x26 82#define POE_CL3_ENQ_SPILL_MAXLINE_LO 0x27 83#define POE_CL4_ENQ_SPILL_MAXLINE_LO 0x28 84#define POE_CL5_ENQ_SPILL_MAXLINE_LO 0x29 85#define POE_CL6_ENQ_SPILL_MAXLINE_LO 0x2a 86#define POE_CL7_ENQ_SPILL_MAXLINE_LO 0x2b 87#define POE_CL0_ENQ_SPILL_MAXLINE_HI 0x2c 88#define POE_CL1_ENQ_SPILL_MAXLINE_HI 0x2d 89#define POE_CL2_ENQ_SPILL_MAXLINE_HI 0x2e 90#define POE_CL3_ENQ_SPILL_MAXLINE_HI 0x2f 91#define POE_CL4_ENQ_SPILL_MAXLINE_HI 0x30 92#define POE_CL5_ENQ_SPILL_MAXLINE_HI 0x31 93#define POE_CL6_ENQ_SPILL_MAXLINE_HI 0x32 94#define POE_CL7_ENQ_SPILL_MAXLINE_HI 0x33 95#define POE_MAX_FLOW_MSG0 0x40 96#define POE_MAX_FLOW_MSG1 0x41 97#define POE_MAX_FLOW_MSG2 0x42 98#define POE_MAX_FLOW_MSG3 0x43 99#define POE_MAX_FLOW_MSG4 0x44 100#define POE_MAX_FLOW_MSG5 0x45 101#define POE_MAX_FLOW_MSG6 0x46 102#define POE_MAX_FLOW_MSG7 0x47 103#define POE_MAX_MSG_CL0 0x48 104#define POE_MAX_MSG_CL1 0x49 105#define POE_MAX_MSG_CL2 0x4a 106#define POE_MAX_MSG_CL3 0x4b 107#define POE_MAX_MSG_CL4 0x4c 108#define POE_MAX_MSG_CL5 0x4d 109#define POE_MAX_MSG_CL6 0x4e 110#define POE_MAX_MSG_CL7 0x4f 111#define POE_MAX_LOC_BUF_STG_CL0 0x50 112#define POE_MAX_LOC_BUF_STG_CL1 0x51 113#define POE_MAX_LOC_BUF_STG_CL2 0x52 114#define POE_MAX_LOC_BUF_STG_CL3 0x53 115#define POE_MAX_LOC_BUF_STG_CL4 0x54 116#define POE_MAX_LOC_BUF_STG_CL5 0x55 117#define POE_MAX_LOC_BUF_STG_CL6 0x56 118#define POE_MAX_LOC_BUF_STG_CL7 0x57 119#define POE_ENQ_MSG_COUNT0_SIZE 0x58 120#define POE_ENQ_MSG_COUNT1_SIZE 0x59 121#define POE_ENQ_MSG_COUNT2_SIZE 0x5a 122#define POE_ENQ_MSG_COUNT3_SIZE 0x5b 123#define POE_ENQ_MSG_COUNT4_SIZE 0x5c 124#define POE_ENQ_MSG_COUNT5_SIZE 0x5d 125#define POE_ENQ_MSG_COUNT6_SIZE 0x5e 126#define POE_ENQ_MSG_COUNT7_SIZE 0x5f 127#define POE_ERR_MSG_DESCRIP_LO0 0x60 128#define POE_ERR_MSG_DESCRIP_LO1 0x62 129#define POE_ERR_MSG_DESCRIP_LO2 0x64 130#define POE_ERR_MSG_DESCRIP_LO3 0x66 131#define POE_ERR_MSG_DESCRIP_HI0 0x61 132#define POE_ERR_MSG_DESCRIP_HI1 0x63 133#define POE_ERR_MSG_DESCRIP_HI2 0x65 134#define POE_ERR_MSG_DESCRIP_HI3 0x67 135#define POE_OOO_MSG_CNT_LO 0x68 136#define POE_IN_ORDER_MSG_CNT_LO 0x69 137#define POE_LOC_BUF_STOR_CNT_LO 0x6a 138#define POE_EXT_BUF_STOR_CNT_LO 0x6b 139#define POE_LOC_BUF_ALLOC_CNT_LO 0x6c 140#define POE_EXT_BUF_ALLOC_CNT_LO 0x6d 141#define POE_OOO_MSG_CNT_HI 0x6e 142#define POE_IN_ORDER_MSG_CNT_HI 0x6f 143#define POE_LOC_BUF_STOR_CNT_HI 0x70 144#define POE_EXT_BUF_STOR_CNT_HI 0x71 145#define POE_LOC_BUF_ALLOC_CNT_HI 0x72 146#define POE_EXT_BUF_ALLOC_CNT_HI 0x73 147#define POE_MODE_ERR_FLOW_ID 0x74 148#define POE_STATISTICS_ENABLE 0x75 149#define POE_MAX_SIZE_FLOW 0x76 150#define POE_MAX_SIZE 0x77 151#define POE_FBP_SP 0x78 152#define POE_FBP_SP_EN 0x79 153#define POE_LOC_ALLOC_EN 0x7a 154#define POE_EXT_ALLOC_EN 0x7b 155#define POE_DISTR_0_DROP_CNT 0xc0 156#define POE_DISTR_1_DROP_CNT 0xc1 157#define POE_DISTR_2_DROP_CNT 0xc2 158#define POE_DISTR_3_DROP_CNT 0xc3 159#define POE_DISTR_4_DROP_CNT 0xc4 160#define POE_DISTR_5_DROP_CNT 0xc5 161#define POE_DISTR_6_DROP_CNT 0xc6 162#define POE_DISTR_7_DROP_CNT 0xc7 163#define POE_DISTR_8_DROP_CNT 0xc8 164#define POE_DISTR_9_DROP_CNT 0xc9 165#define POE_DISTR_10_DROP_CNT 0xca 166#define POE_DISTR_11_DROP_CNT 0xcb 167#define POE_DISTR_12_DROP_CNT 0xcc 168#define POE_DISTR_13_DROP_CNT 0xcd 169#define POE_DISTR_14_DROP_CNT 0xce 170#define POE_DISTR_15_DROP_CNT 0xcf 171#define POE_CLASS_0_DROP_CNT 0xd0 172#define POE_CLASS_1_DROP_CNT 0xd1 173#define POE_CLASS_2_DROP_CNT 0xd2 174#define POE_CLASS_3_DROP_CNT 0xd3 175#define POE_CLASS_4_DROP_CNT 0xd4 176#define POE_CLASS_5_DROP_CNT 0xd5 177#define POE_CLASS_6_DROP_CNT 0xd6 178#define POE_CLASS_7_DROP_CNT 0xd7 179#define POE_DISTR_C0_DROP_CNT 0xd8 180#define POE_DISTR_C1_DROP_CNT 0xd9 181#define POE_DISTR_C2_DROP_CNT 0xda 182#define POE_DISTR_C3_DROP_CNT 0xdb 183#define POE_DISTR_C4_DROP_CNT 0xdc 184#define POE_DISTR_C5_DROP_CNT 0xdd 185#define POE_DISTR_C6_DROP_CNT 0xde 186#define POE_DISTR_C7_DROP_CNT 0xdf 187#define POE_CPU_DROP_CNT 0xe0 188#define POE_MAX_FLOW_DROP_CNT 0xe1 189#define POE_INTERRUPT_VEC 0x140 190#define POE_INTERRUPT_MASK 0x141 191#define POE_FATALERR_MASK 0x142 192#define POE_IDI_CFG 0x143 193#define POE_TIMEOUT_VALUE 0x144 194#define POE_CACHE_ALLOC_EN 0x145 195#define POE_FBP_ECC_ERR_CNT 0x146 196#define POE_MSG_STRG_ECC_ERR_CNT 0x147 197#define POE_FID_INFO_ECC_ERR_CNT 0x148 198#define POE_MSG_INFO_ECC_ERR_CNT 0x149 199#define POE_LL_ECC_ERR_CNT 0x14a 200#define POE_SIZE_ECC_ERR_CNT 0x14b 201#define POE_FMN_TXCR_ECC_ERR_CNT 0x14c 202#define POE_ENQ_INSPIL_ECC_ERR_CNT 0x14d 203#define POE_ENQ_OUTSPIL_ECC_ERR_CNT 0x14e 204#define POE_DEQ_OUTSPIL_ECC_ERR_CNT 0x14f 205#define POE_ENQ_MSG_SENT 0x150 206#define POE_ENQ_MSG_CNT 0x151 207#define POE_FID_RDATA 0x152 208#define POE_FID_WDATA 0x153 209#define POE_FID_CMD 0x154 210#define POE_FID_ADDR 0x155 211#define POE_MSG_INFO_CMD 0x156 212#define POE_MSG_INFO_ADDR 0x157 213#define POE_MSG_INFO_RDATA 0x158 214#define POE_LL_CMD 0x159 215#define POE_LL_ADDR 0x15a 216#define POE_LL_RDATA 0x15b 217#define POE_MSG_STG_CMD 0x15c 218#define POE_MSG_STG_ADDR 0x15d 219#define POE_MSG_STG_RDATA 0x15e 220#define POE_DISTR_THRESHOLD_0 0x1c0 221#define POE_DISTR_THRESHOLD_1 0x1c1 222#define POE_DISTR_THRESHOLD_2 0x1c2 223#define POE_DISTR_THRESHOLD_3 0x1c3 224#define POE_DISTR_THRESHOLD_4 0x1c4 225#define POE_DISTR_THRESHOLD(i) (0x1c0 + (i)) 226#define POE_DISTR_EN 0x1c5 227#define POE_ENQ_SPILL_THOLD 0x1c8 228#define POE_DEQ_SPILL_THOLD 0x1c9 229#define POE_DEQ_SPILL_TIMER 0x1ca 230#define POE_DISTR_CLASS_DROP_EN 0x1cb 231#define POE_DISTR_VEC_DROP_EN 0x1cc 232#define POE_DISTR_DROP_TIMER 0x1cd 233#define POE_ERROR_LOG_W0 0x1ce 234#define POE_ERROR_LOG_W1 0x1cf 235#define POE_ERROR_LOG_W2 0x1d0 236#define POE_ERR_INJ_CTRL0 0x1d1 237#define POE_TX_TIMER 0x1d4 238 239#define NUM_DIST_VEC 16 240#define NUM_WORDS_PER_DV 16 241#define MAX_DV_TBL_ENTRIES (NUM_DIST_VEC * NUM_WORDS_PER_DV) 242#define POE_DIST_THRESHOLD_VAL 0xa 243 244/* 245 * POE distribution vectors 246 * 247 * Each vector is 512 bit with msb indicating vc 512 and lsb indicating vc 0 248 * 512-bit-vector is specified as 16 32-bit words. 249 * Left most word has the vc range 511-479 right most word has vc range 31 - 0 250 * Each word has the MSB select higer vc number and LSB select lower vc num 251 */ 252#define POE_DISTVECT_BASE 0x100 253#define POE_DISTVECT(vec) (POE_DISTVECT_BASE + 16 * (vec)) 254#define POE_DISTVECT_OFFSET(node,cpu) (4 * (3 - (node)) + (3 - (cpu)/8)) 255#define POE_DISTVECT_SHIFT(node,cpu) (((cpu) % 8 ) * 4) 256 257#if !defined(LOCORE) && !defined(__ASSEMBLY__) 258 259#define nlm_read_poe_reg(b, r) nlm_read_reg(b, r) 260#define nlm_write_poe_reg(b, r, v) nlm_write_reg(b, r, v) 261#define nlm_read_poedv_reg(b, r) nlm_read_reg_xkphys(b, r) 262#define nlm_write_poedv_reg(b, r, v) nlm_write_reg_xkphys(b, r, v) 263#define nlm_get_poe_pcibase(node) \ 264 nlm_pcicfg_base(XLP_IO_POE_OFFSET(node)) 265#define nlm_get_poe_regbase(node) \ 266 (nlm_get_poe_pcibase(node) + XLP_IO_PCI_HDRSZ) 267#define nlm_get_poedv_regbase(node) \ 268 nlm_xkphys_map_pcibar0(nlm_get_poe_pcibase(node)) 269 270static __inline int 271nlm_poe_max_flows(uint64_t poe_pcibase) 272{ 273 return (nlm_read_reg(poe_pcibase, XLP_PCI_DEVINFO_REG0)); 274} 275 276/* 277 * Helper function, calculate the distribution vector 278 * cm0, cm1, cm2, cm3 : CPU masks for nodes 0..3 279 * thr_vcmask: destination VCs for a thread 280 */ 281static __inline void 282nlm_calc_poe_distvec(uint32_t cm0, uint32_t cm1, uint32_t cm2, uint32_t cm3, 283 uint32_t thr_vcmask, uint32_t *distvec) 284{ 285 uint32_t cpumask = 0, val; 286 int i, cpu, node, startcpu, index; 287 288 thr_vcmask &= 0xf; 289 for (node = 0; node < XLP_MAX_NODES; node++) { 290 switch (node) { 291 case 0: cpumask = cm0; break; 292 case 1: cpumask = cm1; break; 293 case 2: cpumask = cm2; break; 294 case 3: cpumask = cm3; break; 295 } 296 297 for (i = 0; i < 4; i++) { 298 val = 0; 299 startcpu = 31 - i * 8; 300 for (cpu = startcpu; cpu >= startcpu - 7; cpu--) { 301 val <<= 4; 302 if (cpumask & (1U << cpu)) 303 val |= thr_vcmask; 304 } 305 index = POE_DISTVECT_OFFSET(node, startcpu); 306 distvec[index] = val; 307 } 308 } 309} 310 311static __inline int 312nlm_write_poe_distvec(uint64_t poedv_base, int vec, uint32_t *distvec) 313{ 314 uint32_t reg; 315 int i; 316 317 if (vec < 0 || vec >= NUM_DIST_VEC) 318 return (-1); 319 320 for (i = 0; i < NUM_WORDS_PER_DV; i++) { 321 reg = POE_DISTVECT(vec) + i; 322 nlm_write_poedv_reg(poedv_base, reg, distvec[i]); 323 } 324 325 return (0); 326} 327 328static __inline void 329nlm_config_poe(uint64_t poe_base, uint64_t poedv_base) 330{ 331 uint32_t zerodv[NUM_WORDS_PER_DV]; 332 int i; 333 334 /* First disable distribution vector logic */ 335 nlm_write_poe_reg(poe_base, POE_DISTR_EN, 0); 336 337 memset(zerodv, 0, sizeof(zerodv)); 338 for (i = 0; i < NUM_DIST_VEC; i++) 339 nlm_write_poe_distvec(poedv_base, i, zerodv); 340 341 /* set the threshold */ 342 for (i = 0; i < 5; i++) 343 nlm_write_poe_reg(poe_base, POE_DISTR_THRESHOLD(i), 344 POE_DIST_THRESHOLD_VAL); 345 346 nlm_write_poe_reg(poe_base, POE_DISTR_EN, 1); 347 348 /* always enable local message store */ 349 nlm_write_poe_reg(poe_base, POE_LOC_ALLOC_EN, 1); 350 351 nlm_write_poe_reg(poe_base, POE_TX_TIMER, 0x3); 352} 353#endif /* !(LOCORE) && !(__ASSEMBLY__) */ 354#endif 355