Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cvmx-helper-util.h
Go to the documentation of this file.
1 /***********************license start***************
2  * Author: Cavium Networks
3  *
4  * Contact: [email protected]
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  *
30  * Small helper utilities.
31  *
32  */
33 
34 #ifndef __CVMX_HELPER_UTIL_H__
35 #define __CVMX_HELPER_UTIL_H__
36 
44 extern const char
46 
53 extern int cvmx_helper_dump_packet(cvmx_wqe_t *work);
54 
67 extern int cvmx_helper_setup_red_queue(int queue, int pass_thresh,
68  int drop_thresh);
69 
81 extern int cvmx_helper_setup_red(int pass_thresh, int drop_thresh);
82 
89 extern const char *cvmx_helper_get_version(void);
90 
101 extern int __cvmx_helper_setup_gmx(int interface, int num_ports);
102 
112 extern int cvmx_helper_get_ipd_port(int interface, int port);
113 
122 static inline int cvmx_helper_get_first_ipd_port(int interface)
123 {
124  return cvmx_helper_get_ipd_port(interface, 0);
125 }
126 
135 static inline int cvmx_helper_get_last_ipd_port(int interface)
136 {
137  extern int cvmx_helper_ports_on_interface(int interface);
138 
139  return cvmx_helper_get_first_ipd_port(interface) +
140  cvmx_helper_ports_on_interface(interface) - 1;
141 }
142 
149 static inline void cvmx_helper_free_packet_data(cvmx_wqe_t *work)
150 {
151  uint64_t number_buffers;
152  union cvmx_buf_ptr buffer_ptr;
153  union cvmx_buf_ptr next_buffer_ptr;
154  uint64_t start_of_buffer;
155 
156  number_buffers = work->word2.s.bufs;
157  if (number_buffers == 0)
158  return;
159  buffer_ptr = work->packet_ptr;
160 
161  /*
162  * Since the number of buffers is not zero, we know this is
163  * not a dynamic short packet. We need to check if it is a
164  * packet received with IPD_CTL_STATUS[NO_WPTR]. If this is
165  * true, we need to free all buffers except for the first
166  * one. The caller doesn't expect their WQE pointer to be
167  * freed
168  */
169  start_of_buffer = ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
170  if (cvmx_ptr_to_phys(work) == start_of_buffer) {
171  next_buffer_ptr =
172  *(union cvmx_buf_ptr *) cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
173  buffer_ptr = next_buffer_ptr;
174  number_buffers--;
175  }
176 
177  while (number_buffers--) {
178  /*
179  * Remember the back pointer is in cache lines, not
180  * 64bit words
181  */
182  start_of_buffer =
183  ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
184  /*
185  * Read pointer to next buffer before we free the
186  * current buffer.
187  */
188  next_buffer_ptr =
189  *(union cvmx_buf_ptr *) cvmx_phys_to_ptr(buffer_ptr.s.addr - 8);
190  cvmx_fpa_free(cvmx_phys_to_ptr(start_of_buffer),
191  buffer_ptr.s.pool, 0);
192  buffer_ptr = next_buffer_ptr;
193  }
194 }
195 
203 extern int cvmx_helper_get_interface_num(int ipd_port);
204 
213 extern int cvmx_helper_get_interface_index_num(int ipd_port);
214 
215 #endif /* __CVMX_HELPER_H__ */