linux/arch/mips/cavium-octeon/executive/cvmx-helper-npi.c
<<
>>
Prefs
   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 */
  49int __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 */
  87int __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