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