From owner-svn-src-all@FreeBSD.ORG Wed Mar 16 08:51:36 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C6235106566C; Wed, 16 Mar 2011 08:51:36 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B2F6B8FC1A; Wed, 16 Mar 2011 08:51:36 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2G8paZt075058; Wed, 16 Mar 2011 08:51:36 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2G8paIJ075054; Wed, 16 Mar 2011 08:51:36 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201103160851.p2G8paIJ075054@svn.freebsd.org> From: Juli Mallett Date: Wed, 16 Mar 2011 08:51:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219694 - in head/sys: contrib/octeon-sdk mips/cavium/octe X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Mar 2011 08:51:36 -0000 Author: jmallett Date: Wed Mar 16 08:51:36 2011 New Revision: 219694 URL: http://svn.freebsd.org/changeset/base/219694 Log: o) Clean up FPA pools on module unload. o) Allocate output buffer pool based on available output queues. Submitted by: Bhanu Prakash (with modifications) Modified: head/sys/contrib/octeon-sdk/cvmx-fpa.h head/sys/mips/cavium/octe/ethernet.c head/sys/mips/cavium/octe/wrapper-cvmx-includes.h Modified: head/sys/contrib/octeon-sdk/cvmx-fpa.h ============================================================================== --- head/sys/contrib/octeon-sdk/cvmx-fpa.h Wed Mar 16 08:22:29 2011 (r219693) +++ head/sys/contrib/octeon-sdk/cvmx-fpa.h Wed Mar 16 08:51:36 2011 (r219694) @@ -154,6 +154,19 @@ static inline void cvmx_fpa_enable(void) } /** + * Reset FPA to disable. Make sure buffers from all FPA pools are freed + * before disabling FPA. + */ +static inline void cvmx_fpa_disable(void) +{ + cvmx_fpa_ctl_status_t status; + + status.u64 = cvmx_read_csr(CVMX_FPA_CTL_STATUS); + status.s.reset = 1; + cvmx_write_csr(CVMX_FPA_CTL_STATUS, status.u64); +} + +/** * Get a new block from the FPA * * @param pool Pool to get the block from Modified: head/sys/mips/cavium/octe/ethernet.c ============================================================================== --- head/sys/mips/cavium/octe/ethernet.c Wed Mar 16 08:22:29 2011 (r219693) +++ head/sys/mips/cavium/octe/ethernet.c Wed Mar 16 08:51:36 2011 (r219694) @@ -98,6 +98,11 @@ struct ifnet *cvm_oct_device[TOTAL_NUMBE */ static struct taskqueue *cvm_oct_link_taskq; +/* + * Number of buffers in output buffer pool. + */ +static int cvm_oct_num_output_buffers; + /** * Function to update link status. */ @@ -185,13 +190,13 @@ static void cvm_do_timer(void *arg) } } - /** * Configure common hardware for all interfaces */ static void cvm_oct_configure_common_hw(device_t bus) { struct octebus_softc *sc; + int pko_queues; int error; int rid; @@ -199,13 +204,34 @@ static void cvm_oct_configure_common_hw( /* Setup the FPA */ cvmx_fpa_enable(); - cvm_oct_mem_fill_fpa(CVMX_FPA_PACKET_POOL, CVMX_FPA_PACKET_POOL_SIZE, num_packet_buffers); - cvm_oct_mem_fill_fpa(CVMX_FPA_WQE_POOL, CVMX_FPA_WQE_POOL_SIZE, num_packet_buffers); - if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL) - cvm_oct_mem_fill_fpa(CVMX_FPA_OUTPUT_BUFFER_POOL, CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 128); + cvm_oct_mem_fill_fpa(CVMX_FPA_PACKET_POOL, CVMX_FPA_PACKET_POOL_SIZE, + num_packet_buffers); + cvm_oct_mem_fill_fpa(CVMX_FPA_WQE_POOL, CVMX_FPA_WQE_POOL_SIZE, + num_packet_buffers); + if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL) { + /* + * If the FPA uses different pools for output buffers and + * packets, size the output buffer pool based on the number + * of PKO queues. + */ + if (OCTEON_IS_MODEL(OCTEON_CN38XX)) + pko_queues = 128; + else if (OCTEON_IS_MODEL(OCTEON_CN3XXX)) + pko_queues = 32; + else if (OCTEON_IS_MODEL(OCTEON_CN50XX)) + pko_queues = 32; + else + pko_queues = 256; + + cvm_oct_num_output_buffers = 4 * pko_queues; + cvm_oct_mem_fill_fpa(CVMX_FPA_OUTPUT_BUFFER_POOL, + CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, + cvm_oct_num_output_buffers); + } if (USE_RED) - cvmx_helper_setup_red(num_packet_buffers/4, num_packet_buffers/8); + cvmx_helper_setup_red(num_packet_buffers/4, + num_packet_buffers/8); /* Enable the MII interface */ if (!octeon_is_simulation()) @@ -303,11 +329,13 @@ int cvm_oct_init_module(device_t bus) int num_ports = cvmx_helper_ports_on_interface(interface); int port; - for (port = cvmx_helper_get_ipd_port(interface, 0); port < cvmx_helper_get_ipd_port(interface, num_ports); port++) { + for (port = 0; port < num_ports; port++) { cvmx_pip_prt_tagx_t pip_prt_tagx; - pip_prt_tagx.u64 = cvmx_read_csr(CVMX_PIP_PRT_TAGX(port)); + int pkind = cvmx_helper_get_ipd_port(interface, port); + + pip_prt_tagx.u64 = cvmx_read_csr(CVMX_PIP_PRT_TAGX(pkind)); pip_prt_tagx.s.grp = pow_receive_group; - cvmx_write_csr(CVMX_PIP_PRT_TAGX(port), pip_prt_tagx.u64); + cvmx_write_csr(CVMX_PIP_PRT_TAGX(pkind), pip_prt_tagx.u64); } } @@ -475,4 +503,13 @@ void cvm_oct_cleanup_module(void) cvm_oct_device[port] = NULL; } } + /* Free the HW pools */ + cvm_oct_mem_empty_fpa(CVMX_FPA_PACKET_POOL, CVMX_FPA_PACKET_POOL_SIZE, num_packet_buffers); + cvm_oct_mem_empty_fpa(CVMX_FPA_WQE_POOL, CVMX_FPA_WQE_POOL_SIZE, num_packet_buffers); + + if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL) + cvm_oct_mem_empty_fpa(CVMX_FPA_OUTPUT_BUFFER_POOL, CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, cvm_oct_num_output_buffers); + + /* Disable FPA, all buffers are free, not done by helper shutdown. */ + cvmx_fpa_disable(); } Modified: head/sys/mips/cavium/octe/wrapper-cvmx-includes.h ============================================================================== --- head/sys/mips/cavium/octe/wrapper-cvmx-includes.h Wed Mar 16 08:22:29 2011 (r219693) +++ head/sys/mips/cavium/octe/wrapper-cvmx-includes.h Wed Mar 16 08:51:36 2011 (r219694) @@ -45,5 +45,6 @@ AND WITH ALL FAULTS AND CAVIUM NETWORKS #include #include #include +#include #endif