1/***********************license start*************** 2 * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 3 * reserved. 4 * 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * * Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following 15 * disclaimer in the documentation and/or other materials provided 16 * with the distribution. 17 18 * * Neither the name of Cavium Inc. nor the names of 19 * its contributors may be used to endorse or promote products 20 * derived from this software without specific prior written 21 * permission. 22 23 * This Software, including technical data, may be subject to U.S. export control 24 * laws, including the U.S. Export Administration Act and its associated 25 * regulations, and may be subject to export or import regulations in other 26 * countries. 27 28 * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 29 * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 30 * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 31 * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 32 * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 33 * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 34 * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 35 * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 36 * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 37 * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 38 ***********************license end**************************************/ 39 40 41 42 43 44 45 46/** 47 * @file 48 * 49 * Functions for NPI initialization, configuration, 50 * and monitoring. 51 * 52 * <hr>$Revision: 70030 $<hr> 53 */ 54#ifdef CVMX_BUILD_FOR_LINUX_KERNEL 55#include <asm/octeon/cvmx.h> 56#include <asm/octeon/cvmx-config.h> 57#ifdef CVMX_ENABLE_PKO_FUNCTIONS 58#include <asm/octeon/cvmx-helper.h> 59#include <asm/octeon/cvmx-pko.h> 60#include <asm/octeon/cvmx-pexp-defs.h> 61#include <asm/octeon/cvmx-sli-defs.h> 62#endif 63#include <asm/octeon/cvmx-pip-defs.h> 64#else 65#if !defined(__FreeBSD__) || !defined(_KERNEL) 66#include "executive-config.h" 67#include "cvmx-config.h" 68#include "cvmx.h" 69#include "cvmx-pko.h" 70#ifdef CVMX_ENABLE_PKO_FUNCTIONS 71#include "cvmx-helper.h" 72#endif 73#else 74#include "cvmx.h" 75#include "cvmx-pko.h" 76#include "cvmx-helper.h" 77#endif 78#endif 79 80#ifdef CVMX_ENABLE_PKO_FUNCTIONS 81 82/** 83 * @INTERNAL 84 * Probe a NPI interface and determine the number of ports 85 * connected to it. The NPI interface should still be down 86 * after this call. 87 * 88 * @param interface Interface to probe 89 * 90 * @return Number of ports on the interface. Zero to disable. 91 */ 92int __cvmx_helper_npi_probe(int interface) 93{ 94#if CVMX_PKO_QUEUES_PER_PORT_PCI > 0 95 if (OCTEON_IS_MODEL(OCTEON_CN68XX)) 96 return 32; 97#if 0 98 /* Technically CN30XX, CN31XX, and CN50XX contain packet engines, but 99 nobody ever uses them. Since this is the case, we disable them here */ 100 else if (OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN50XX)) 101 return 2; 102 else if (OCTEON_IS_MODEL(OCTEON_CN30XX)) 103 return 1; 104#endif 105 else if (!(OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X) || OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X) || OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN50XX) || OCTEON_IS_MODEL(OCTEON_CN30XX))) 106 return 4; /* The packet engines didn't exist before cn56xx pass 2 */ 107#endif 108 return 0; 109} 110 111 112/** 113 * @INTERNAL 114 * Bringup and enable a NPI interface. After this call packet 115 * I/O should be fully functional. This is called with IPD 116 * enabled but PKO disabled. 117 * 118 * @param interface Interface to bring up 119 * 120 * @return Zero on success, negative on failure 121 */ 122int __cvmx_helper_npi_enable(int interface) 123{ 124 int num_ports = cvmx_helper_ports_on_interface(interface); 125 126 /* On CN50XX, CN52XX, and CN56XX we need to disable length checking 127 so packet < 64 bytes and jumbo frames don't get errors */ 128 if (!OCTEON_IS_MODEL(OCTEON_CN3XXX) && !OCTEON_IS_MODEL(OCTEON_CN58XX)) 129 { 130 int port; 131 for (port=0; port<num_ports; port++) 132 { 133 cvmx_pip_prt_cfgx_t port_cfg; 134 int ipd_port = (OCTEON_IS_MODEL(OCTEON_CN68XX)) ? 135 cvmx_helper_get_pknd(interface, port) : 136 cvmx_helper_get_ipd_port(interface, port); 137 port_cfg.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port)); 138 port_cfg.s.lenerr_en = 0; 139 port_cfg.s.maxerr_en = 0; 140 port_cfg.s.minerr_en = 0; 141 cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port), port_cfg.u64); 142 143 if (OCTEON_IS_MODEL(OCTEON_CN68XX)) 144 { 145 /* 146 * Set up pknd and bpid 147 */ 148 cvmx_sli_portx_pkind_t config; 149 config.u64 = cvmx_read_csr(CVMX_PEXP_SLI_PORTX_PKIND(port)); 150 config.s.bpkind = cvmx_helper_get_bpid(interface, port); 151 config.s.pkind = cvmx_helper_get_pknd(interface, port); 152 cvmx_write_csr(CVMX_PEXP_SLI_PORTX_PKIND(port), config.u64); 153 } 154 } 155 } 156 157 if (OCTEON_IS_MODEL(OCTEON_CN68XX)) 158 { 159 /* 160 * Set up pko pipes. 161 */ 162 cvmx_sli_tx_pipe_t config; 163 config.u64 = cvmx_read_csr(CVMX_PEXP_SLI_TX_PIPE); 164 config.s.base = __cvmx_pko_get_pipe (interface, 0); 165#ifdef CVMX_HELPER_NPI_MAX_PIPES 166 config.s.nump = CVMX_HELPER_NPI_MAX_PIPES; 167#else 168 config.s.nump = num_ports; 169#endif 170 cvmx_write_csr(CVMX_PEXP_SLI_TX_PIPE, config.u64); 171 } 172 173 174 /* Enables are controlled by the remote host, so nothing to do here */ 175 return 0; 176} 177 178#endif /* CVMX_ENABLE_PKO_FUNCTIONS */ 179 180