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 #if 0 63 /* 64 * Technically CN30XX, CN31XX, and CN50XX contain packet 65 * engines, but nobody ever uses them. Since this is the case, 66 * we disable them here. 67 */ 68 else if (OCTEON_IS_MODEL(OCTEON_CN31XX) 69 || OCTEON_IS_MODEL(OCTEON_CN50XX)) 70 return 2; 71 else if (OCTEON_IS_MODEL(OCTEON_CN30XX)) 72 return 1; 73 #endif 74 #endif 75 return 0; 76 } 77 78 /** 79 * Bringup and enable a NPI interface. After this call packet 80 * I/O should be fully functional. This is called with IPD 81 * enabled but PKO disabled. 82 * 83 * @interface: Interface to bring up 84 * 85 * Returns Zero on success, negative on failure 86 */ 87 int __cvmx_helper_npi_enable(int interface) 88 { 89 /* 90 * On CN50XX, CN52XX, and CN56XX we need to disable length 91 * checking so packet < 64 bytes and jumbo frames don't get 92 * errors. 93 */ 94 if (!OCTEON_IS_MODEL(OCTEON_CN3XXX) && 95 !OCTEON_IS_MODEL(OCTEON_CN58XX)) { 96 int num_ports = cvmx_helper_ports_on_interface(interface); 97 int port; 98 for (port = 0; port < num_ports; port++) { 99 union cvmx_pip_prt_cfgx port_cfg; 100 int ipd_port = 101 cvmx_helper_get_ipd_port(interface, port); 102 port_cfg.u64 = 103 cvmx_read_csr(CVMX_PIP_PRT_CFGX(ipd_port)); 104 port_cfg.s.maxerr_en = 0; 105 port_cfg.s.minerr_en = 0; 106 cvmx_write_csr(CVMX_PIP_PRT_CFGX(ipd_port), 107 port_cfg.u64); 108 } 109 } 110 111 /* Enables are controlled by the remote host, so nothing to do here */ 112 return 0; 113 } 114