1 /***********************license start*************** 2 * Author: Cavium Networks 3 * 4 * Contact: support@caviumnetworks.com 5 * This file is part of the OCTEON SDK 6 * 7 * Copyright (c) 2003-2008 Cavium Networks 8 * 9 * This file is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License, Version 2, as 11 * published by the Free Software Foundation. 12 * 13 * This file is distributed in the hope that it will be useful, but 14 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty 15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or 16 * NONINFRINGEMENT. See the GNU General Public License for more 17 * details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this file; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22 * or visit http://www.gnu.org/licenses/. 23 * 24 * This file may also be available under a different license from Cavium. 25 * Contact Cavium Networks for more information 26 ***********************license end**************************************/ 27 28 /* 29 * Functions for NPI initialization, configuration, 30 * and monitoring. 31 */ 32 #include <asm/octeon/octeon.h> 33 34 #include <asm/octeon/cvmx-config.h> 35 36 #include <asm/octeon/cvmx-helper.h> 37 38 #include <asm/octeon/cvmx-pip-defs.h> 39 40 /** 41 * Probe a NPI interface and determine the number of ports 42 * connected to it. The NPI interface should still be down 43 * after this call. 44 * 45 * @interface: Interface to probe 46 * 47 * Returns Number of ports on the interface. Zero to disable. 48 */ 49 int __cvmx_helper_npi_probe(int interface) 50 { 51 #if CVMX_PKO_QUEUES_PER_PORT_PCI > 0 52 if (OCTEON_IS_MODEL(OCTEON_CN38XX) || OCTEON_IS_MODEL(OCTEON_CN58XX)) 53 return 4; 54 else if (OCTEON_IS_MODEL(OCTEON_CN56XX) 55 && !OCTEON_IS_MODEL(OCTEON_CN56XX_PASS1_X)) 56 /* The packet engines didn't exist before pass 2 */ 57 return 4; 58 else if (OCTEON_IS_MODEL(OCTEON_CN52XX) 59 && !OCTEON_IS_MODEL(OCTEON_CN52XX_PASS1_X)) 60 /* The packet engines didn't exist before pass 2 */ 61 return 4; 62 #endif 63 return 0; 64 } 65 66 /** 67 * Bringup and enable a NPI interface. After this call packet 68 * I/O should be fully functional. This is called with IPD 69 * enabled but PKO disabled. 70 * 71 * @interface: Interface to bring up 72 * 73 * Returns Zero on success, negative on failure 74 */ 75 int __cvmx_helper_npi_enable(int interface) 76 { 77 /* 78 * On CN50XX, CN52XX, and CN56XX we need to disable length 79 * checking so packet < 64 bytes and jumbo frames don't get 80 * errors. 81 */ 82 if (!OCTEON_IS_MODEL(OCTEON_CN3XXX) && 83 !OCTEON_IS_MODEL(OCTEON_CN58XX)) { 84 int num_ports = cvmx_helper_ports_on_interface(interface); 85 int port; 86 for (port = 0; port < num_ports; port++) { 87 union cvmx_pip_prt_cfgx port_cfg; 88 int ipd_port = 89 cvmx_helper_get_ipd_port(interface, port); 90 port_cfg.u64 = 91 cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port)); 92 port_cfg.s.maxerr_en = 0; 93 port_cfg.s.minerr_en = 0; 94 cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port), 95 port_cfg.u64); 96 } 97 } 98 99 /* Enables are controlled by the remote host, so nothing to do here */ 100 return 0; 101 } 102