1232809Sjmallett/***********************license start***************
2232809Sjmallett * Copyright (c) 2010  Cavium Inc. (support@cavium.com). All rights
3232809Sjmallett * reserved.
4232809Sjmallett *
5232809Sjmallett *
6232809Sjmallett * Redistribution and use in source and binary forms, with or without
7232809Sjmallett * modification, are permitted provided that the following conditions are
8232809Sjmallett * met:
9232809Sjmallett *
10232809Sjmallett *   * Redistributions of source code must retain the above copyright
11232809Sjmallett *     notice, this list of conditions and the following disclaimer.
12232809Sjmallett *
13232809Sjmallett *   * Redistributions in binary form must reproduce the above
14232809Sjmallett *     copyright notice, this list of conditions and the following
15232809Sjmallett *     disclaimer in the documentation and/or other materials provided
16232809Sjmallett *     with the distribution.
17232809Sjmallett
18232809Sjmallett *   * Neither the name of Cavium Inc. nor the names of
19232809Sjmallett *     its contributors may be used to endorse or promote products
20232809Sjmallett *     derived from this software without specific prior written
21232809Sjmallett *     permission.
22232809Sjmallett
23232809Sjmallett * This Software, including technical data, may be subject to U.S. export  control
24232809Sjmallett * laws, including the U.S. Export Administration Act and its  associated
25232809Sjmallett * regulations, and may be subject to export or import  regulations in other
26232809Sjmallett * countries.
27232809Sjmallett
28232809Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
29232809Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
30232809Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31232809Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32232809Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33232809Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34232809Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35232809Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36232809Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37232809Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38232809Sjmallett ***********************license end**************************************/
39232809Sjmallett
40232809Sjmallett/**
41232809Sjmallett * @file
42232809Sjmallett *
43232809Sjmallett * Functions for ILK initialization, configuration,
44232809Sjmallett * and monitoring.
45232809Sjmallett *
46232809Sjmallett * <hr>$Revision: 41586 $<hr>
47232809Sjmallett */
48232809Sjmallett
49232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
50232809Sjmallett#include <linux/module.h>
51232809Sjmallett
52232809Sjmallett#include <asm/octeon/cvmx.h>
53232809Sjmallett#include <asm/octeon/cvmx-config.h>
54232809Sjmallett#include <asm/octeon/cvmx-helper.h>
55232809Sjmallett#include <asm/octeon/cvmx-helper-cfg.h>
56232809Sjmallett#include <asm/octeon/cvmx-ilk.h>
57232809Sjmallett#include <asm/octeon/cvmx-bootmem.h>
58232809Sjmallett#include <asm/octeon/cvmx-pko.h>
59232809Sjmallett#include <asm/octeon/cvmx-qlm.h>
60232809Sjmallett#include <asm/octeon/cvmx-ilk-defs.h>
61232809Sjmallett#else
62232812Sjmallett#if !defined(__FreeBSD__) || !defined(_KERNEL)
63232809Sjmallett#include "executive-config.h"
64232809Sjmallett#include "cvmx-config.h"
65232812Sjmallett#endif
66232809Sjmallett#include "cvmx.h"
67232809Sjmallett#include "cvmx-helper.h"
68232809Sjmallett#include "cvmx-helper-cfg.h"
69232809Sjmallett#include "cvmx-ilk.h"
70232809Sjmallett#include "cvmx-bootmem.h"
71232809Sjmallett#include "cvmx-pko.h"
72232809Sjmallett#include "cvmx-qlm.h"
73232809Sjmallett#endif
74232809Sjmallett
75232809Sjmallett#ifdef CVMX_ENABLE_PKO_FUNCTIONS
76232809Sjmallett
77232809Sjmallettint __cvmx_helper_ilk_enumerate(int interface)
78232809Sjmallett{
79232809Sjmallett    interface -= CVMX_ILK_GBL_BASE;
80232809Sjmallett    return cvmx_ilk_chans[interface];
81232809Sjmallett}
82232809Sjmallett
83232809Sjmallett/**
84232809Sjmallett * @INTERNAL
85232809Sjmallett * Probe a ILK interface and determine the number of ports
86232809Sjmallett * connected to it. The ILK interface should still be down
87232809Sjmallett * after this call.
88232809Sjmallett *
89232809Sjmallett * @param interface Interface to probe
90232809Sjmallett *
91232809Sjmallett * @return Number of ports on the interface. Zero to disable.
92232809Sjmallett */
93232809Sjmallettint __cvmx_helper_ilk_probe(int interface)
94232809Sjmallett{
95232809Sjmallett    int i, j, res = -1;
96232809Sjmallett    static int pipe_base = 0, pknd_base = 0;
97232809Sjmallett    static cvmx_ilk_pipe_chan_t *pch = NULL, *tmp;
98232809Sjmallett    static cvmx_ilk_chan_pknd_t *chpknd = NULL, *tmp1;
99232809Sjmallett    static cvmx_ilk_cal_entry_t *calent = NULL, *tmp2;
100232809Sjmallett
101232809Sjmallett    if (!OCTEON_IS_MODEL(OCTEON_CN68XX))
102232809Sjmallett        return 0;
103232809Sjmallett
104232809Sjmallett    interface -= CVMX_ILK_GBL_BASE;
105232809Sjmallett    if (interface >= CVMX_NUM_ILK_INTF)
106232809Sjmallett        return 0;
107232809Sjmallett
108232809Sjmallett    /* the configuration should be done only once */
109232809Sjmallett    if (cvmx_ilk_get_intf_ena (interface))
110232809Sjmallett        return cvmx_ilk_chans[interface];
111232809Sjmallett
112232809Sjmallett    /* configure lanes and enable the link */
113232809Sjmallett    res = cvmx_ilk_start_interface (interface, cvmx_ilk_lane_mask[interface]);
114232809Sjmallett    if (res < 0)
115232809Sjmallett        return 0;
116232809Sjmallett
117232809Sjmallett    /* set up the group of pipes available to ilk */
118232809Sjmallett    if (pipe_base == 0)
119232809Sjmallett        pipe_base = __cvmx_pko_get_pipe (interface + CVMX_ILK_GBL_BASE, 0);
120232809Sjmallett
121232809Sjmallett    if (pipe_base == -1)
122232809Sjmallett    {
123232809Sjmallett        pipe_base = 0;
124232809Sjmallett        return 0;
125232809Sjmallett    }
126232809Sjmallett
127232809Sjmallett    res = cvmx_ilk_set_pipe (interface, pipe_base, cvmx_ilk_chans[interface]);
128232809Sjmallett    if (res < 0)
129232809Sjmallett        return 0;
130232809Sjmallett
131232809Sjmallett    /* set up pipe to channel mapping */
132232809Sjmallett    i = pipe_base;
133232809Sjmallett    if (pch == NULL)
134232809Sjmallett    {
135232809Sjmallett        pch = (cvmx_ilk_pipe_chan_t *)
136232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
137232809Sjmallett        kmalloc(CVMX_MAX_ILK_CHANS * sizeof(cvmx_ilk_pipe_chan_t), GFP_KERNEL);
138232809Sjmallett#else
139232809Sjmallett        cvmx_bootmem_alloc (CVMX_MAX_ILK_CHANS * sizeof(cvmx_ilk_pipe_chan_t),
140232809Sjmallett                            sizeof(cvmx_ilk_pipe_chan_t));
141232809Sjmallett#endif
142232809Sjmallett        if (pch == NULL)
143232809Sjmallett            return 0;
144232809Sjmallett    }
145232809Sjmallett
146232809Sjmallett    memset (pch, 0, CVMX_MAX_ILK_CHANS * sizeof(cvmx_ilk_pipe_chan_t));
147232809Sjmallett    tmp = pch;
148232809Sjmallett    for (j = 0; j < cvmx_ilk_chans[interface]; j++)
149232809Sjmallett    {
150232809Sjmallett        tmp->pipe = i++;
151232809Sjmallett        tmp->chan = cvmx_ilk_chan_map[interface][j];
152232809Sjmallett        tmp++;
153232809Sjmallett    }
154232809Sjmallett    res = cvmx_ilk_tx_set_channel (interface, pch, cvmx_ilk_chans[interface]);
155232809Sjmallett    if (res < 0)
156232809Sjmallett    {
157232809Sjmallett        res = 0;
158232809Sjmallett        goto err_free_pch;
159232809Sjmallett    }
160232809Sjmallett    pipe_base += cvmx_ilk_chans[interface];
161232809Sjmallett
162232809Sjmallett    /* set up channel to pkind mapping */
163232809Sjmallett    if (pknd_base == 0)
164232809Sjmallett        pknd_base = cvmx_helper_get_pknd (interface + CVMX_ILK_GBL_BASE, 0);
165232809Sjmallett
166232809Sjmallett    i = pknd_base;
167232809Sjmallett    if (chpknd == NULL)
168232809Sjmallett    {
169232809Sjmallett        chpknd = (cvmx_ilk_chan_pknd_t *)
170232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
171232809Sjmallett        kmalloc(CVMX_MAX_ILK_PKNDS * sizeof(cvmx_ilk_chan_pknd_t), GFP_KERNEL);
172232809Sjmallett#else
173232809Sjmallett        cvmx_bootmem_alloc (CVMX_MAX_ILK_PKNDS * sizeof(cvmx_ilk_chan_pknd_t),
174232809Sjmallett                            sizeof(cvmx_ilk_chan_pknd_t));
175232809Sjmallett#endif
176232809Sjmallett        if (chpknd == NULL)
177232809Sjmallett        {
178232809Sjmallett            pipe_base -= cvmx_ilk_chans[interface];
179232809Sjmallett            res = 0;
180232809Sjmallett            goto err_free_pch;
181232809Sjmallett        }
182232809Sjmallett    }
183232809Sjmallett
184232809Sjmallett    memset (chpknd, 0, CVMX_MAX_ILK_PKNDS * sizeof(cvmx_ilk_chan_pknd_t));
185232809Sjmallett    tmp1 = chpknd;
186232809Sjmallett    for (j = 0; j < cvmx_ilk_chans[interface]; j++)
187232809Sjmallett    {
188232809Sjmallett        tmp1->chan = cvmx_ilk_chan_map[interface][j];
189232809Sjmallett        tmp1->pknd = i++;
190232809Sjmallett        tmp1++;
191232809Sjmallett    }
192232809Sjmallett    res = cvmx_ilk_rx_set_pknd (interface, chpknd, cvmx_ilk_chans[interface]);
193232809Sjmallett    if (res < 0)
194232809Sjmallett    {
195232809Sjmallett        pipe_base -= cvmx_ilk_chans[interface];
196232809Sjmallett        res = 0;
197232809Sjmallett        goto err_free_chpknd;
198232809Sjmallett    }
199232809Sjmallett    pknd_base += cvmx_ilk_chans[interface];
200232809Sjmallett
201232809Sjmallett    /* Set up tx calendar */
202232809Sjmallett    if (calent == NULL)
203232809Sjmallett    {
204232809Sjmallett        calent = (cvmx_ilk_cal_entry_t *)
205232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
206232809Sjmallett        kmalloc(CVMX_MAX_ILK_PIPES * sizeof(cvmx_ilk_cal_entry_t), GFP_KERNEL);
207232809Sjmallett#else
208232809Sjmallett        cvmx_bootmem_alloc (CVMX_MAX_ILK_PIPES * sizeof(cvmx_ilk_cal_entry_t),
209232809Sjmallett                            sizeof(cvmx_ilk_cal_entry_t));
210232809Sjmallett#endif
211232809Sjmallett        if (calent == NULL)
212232809Sjmallett        {
213232809Sjmallett            pipe_base -= cvmx_ilk_chans[interface];
214232809Sjmallett            pknd_base -= cvmx_ilk_chans[interface];
215232809Sjmallett            res = 0;
216232809Sjmallett            goto err_free_chpknd;
217232809Sjmallett        }
218232809Sjmallett    }
219232809Sjmallett
220232809Sjmallett    memset (calent, 0, CVMX_MAX_ILK_PIPES * sizeof(cvmx_ilk_cal_entry_t));
221232809Sjmallett    tmp1 = chpknd;
222232809Sjmallett    tmp2 = calent;
223232809Sjmallett    for (j = 0; j < cvmx_ilk_chans[interface]; j++)
224232809Sjmallett    {
225232809Sjmallett        tmp2->pipe_bpid = tmp1->pknd;
226232809Sjmallett        tmp2->ent_ctrl = PIPE_BPID;
227232809Sjmallett        tmp1++;
228232809Sjmallett        tmp2++;
229232809Sjmallett    }
230232809Sjmallett    res = cvmx_ilk_cal_setup_tx (interface, cvmx_ilk_chans[interface],
231232809Sjmallett                                 calent, 1);
232232809Sjmallett    if (res < 0)
233232809Sjmallett    {
234232809Sjmallett        pipe_base -= cvmx_ilk_chans[interface];
235232809Sjmallett        pknd_base -= cvmx_ilk_chans[interface];
236232809Sjmallett        res = 0;
237232809Sjmallett        goto err_free_calent;
238232809Sjmallett    }
239232809Sjmallett
240232809Sjmallett    /* set up rx calendar. allocated memory can be reused.
241232809Sjmallett     * this is because max pkind is always less than max pipe */
242232809Sjmallett    memset (calent, 0, CVMX_MAX_ILK_PIPES * sizeof(cvmx_ilk_cal_entry_t));
243232809Sjmallett    tmp = pch;
244232809Sjmallett    tmp2 = calent;
245232809Sjmallett    for (j = 0; j < cvmx_ilk_chans[interface]; j++)
246232809Sjmallett    {
247232809Sjmallett        tmp2->pipe_bpid = tmp->pipe;
248232809Sjmallett        tmp2->ent_ctrl = PIPE_BPID;
249232809Sjmallett        tmp++;
250232809Sjmallett        tmp2++;
251232809Sjmallett    }
252232809Sjmallett    res = cvmx_ilk_cal_setup_rx (interface, cvmx_ilk_chans[interface],
253232809Sjmallett                                 calent, CVMX_ILK_RX_FIFO_WM, 1);
254232809Sjmallett    if (res < 0)
255232809Sjmallett    {
256232809Sjmallett        pipe_base -= cvmx_ilk_chans[interface];
257232809Sjmallett        pknd_base -= cvmx_ilk_chans[interface];
258232809Sjmallett        res = 0;
259232809Sjmallett        goto err_free_calent;
260232809Sjmallett    }
261232809Sjmallett    res = __cvmx_helper_ilk_enumerate(interface + CVMX_ILK_GBL_BASE);
262232809Sjmallett
263232809Sjmallett    goto out;
264232809Sjmallett
265232809Sjmalletterr_free_calent:
266232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
267232809Sjmallett    kfree (calent);
268232809Sjmallett#else
269232809Sjmallett    /* no free() for cvmx_bootmem_alloc() */
270232809Sjmallett#endif
271232809Sjmallett
272232809Sjmalletterr_free_chpknd:
273232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
274232809Sjmallett    kfree (chpknd);
275232809Sjmallett#else
276232809Sjmallett    /* no free() for cvmx_bootmem_alloc() */
277232809Sjmallett#endif
278232809Sjmallett
279232809Sjmalletterr_free_pch:
280232809Sjmallett#ifdef CVMX_BUILD_FOR_LINUX_KERNEL
281232809Sjmallett    kfree (pch);
282232809Sjmallett#else
283232809Sjmallett    /* no free() for cvmx_bootmem_alloc() */
284232809Sjmallett#endif
285232809Sjmallettout:
286232809Sjmallett    return res;
287232809Sjmallett}
288232809Sjmallett
289232809Sjmallett/**
290232809Sjmallett * @INTERNAL
291232809Sjmallett * Bringup and enable ILK interface. After this call packet
292232809Sjmallett * I/O should be fully functional. This is called with IPD
293232809Sjmallett * enabled but PKO disabled.
294232809Sjmallett *
295232809Sjmallett * @param interface Interface to bring up
296232809Sjmallett *
297232809Sjmallett * @return Zero on success, negative on failure
298232809Sjmallett */
299232809Sjmallettint __cvmx_helper_ilk_enable(int interface)
300232809Sjmallett{
301232809Sjmallett    interface -= CVMX_ILK_GBL_BASE;
302232809Sjmallett    return cvmx_ilk_enable(interface);
303232809Sjmallett}
304232809Sjmallett
305232809Sjmallett/**
306232809Sjmallett * @INTERNAL
307232809Sjmallett * Return the link state of an IPD/PKO port as returned by ILK link status.
308232809Sjmallett *
309232809Sjmallett * @param ipd_port IPD/PKO port to query
310232809Sjmallett *
311232809Sjmallett * @return Link state
312232809Sjmallett */
313232809Sjmallettcvmx_helper_link_info_t __cvmx_helper_ilk_link_get(int ipd_port)
314232809Sjmallett{
315232809Sjmallett    cvmx_helper_link_info_t result;
316232809Sjmallett    int interface = cvmx_helper_get_interface_num(ipd_port);
317232809Sjmallett    int retry_count = 0;
318232809Sjmallett    cvmx_ilk_rxx_cfg1_t ilk_rxx_cfg1;
319232809Sjmallett    cvmx_ilk_rxx_int_t ilk_rxx_int;
320232809Sjmallett    int lanes = 0;
321232809Sjmallett
322232809Sjmallett    result.u64 = 0;
323232809Sjmallett    interface -= CVMX_ILK_GBL_BASE;
324232809Sjmallett
325232809Sjmallettretry:
326232809Sjmallett    retry_count++;
327232809Sjmallett    if (retry_count > 10)
328232809Sjmallett        goto out;
329232809Sjmallett
330232809Sjmallett    ilk_rxx_cfg1.u64 = cvmx_read_csr (CVMX_ILK_RXX_CFG1(interface));
331232809Sjmallett    ilk_rxx_int.u64 = cvmx_read_csr (CVMX_ILK_RXX_INT(interface));
332232809Sjmallett
333232809Sjmallett    /* Clear all RX status bits */
334232809Sjmallett    if (ilk_rxx_int.u64)
335232809Sjmallett        cvmx_write_csr(CVMX_ILK_RXX_INT(interface), ilk_rxx_int.u64);
336232809Sjmallett
337232809Sjmallett    if (ilk_rxx_cfg1.s.rx_bdry_lock_ena == 0)
338232809Sjmallett    {
339232809Sjmallett        /* We need to start looking for work boundary lock */
340232809Sjmallett        ilk_rxx_cfg1.s.rx_bdry_lock_ena = cvmx_ilk_get_intf_ln_msk(interface);
341232809Sjmallett        ilk_rxx_cfg1.s.rx_align_ena = 0;
342232809Sjmallett        cvmx_write_csr(CVMX_ILK_RXX_CFG1(interface), ilk_rxx_cfg1.u64);
343232809Sjmallett        //cvmx_dprintf("ILK%d: Looking for word boundary lock\n", interface);
344232809Sjmallett        goto retry;
345232809Sjmallett    }
346232809Sjmallett
347232809Sjmallett    if (ilk_rxx_cfg1.s.rx_align_ena == 0)
348232809Sjmallett    {
349232809Sjmallett        if (ilk_rxx_int.s.word_sync_done)
350232809Sjmallett        {
351232809Sjmallett            ilk_rxx_cfg1.s.rx_align_ena = 1;
352232809Sjmallett            cvmx_write_csr(CVMX_ILK_RXX_CFG1(interface), ilk_rxx_cfg1.u64);
353232809Sjmallett            //printf("ILK%d: Looking for lane alignment\n", interface);
354232809Sjmallett            goto retry;
355232809Sjmallett        }
356232809Sjmallett        goto out;
357232809Sjmallett    }
358232809Sjmallett
359232809Sjmallett    if (ilk_rxx_int.s.lane_align_fail)
360232809Sjmallett    {
361232809Sjmallett        ilk_rxx_cfg1.s.rx_bdry_lock_ena = 0;
362232809Sjmallett        ilk_rxx_cfg1.s.rx_align_ena = 0;
363232809Sjmallett        cvmx_write_csr(CVMX_ILK_RXX_CFG1(interface), ilk_rxx_cfg1.u64);
364232809Sjmallett        cvmx_dprintf("ILK%d: Lane alignment failed\n", interface);
365232809Sjmallett        goto out;
366232809Sjmallett    }
367232809Sjmallett
368232809Sjmallett    if (ilk_rxx_int.s.lane_align_done)
369232809Sjmallett    {
370232809Sjmallett        //cvmx_dprintf("ILK%d: Lane alignment complete\n", interface);
371232809Sjmallett    }
372232809Sjmallett
373232809Sjmallett    lanes = cvmx_pop(ilk_rxx_cfg1.s.rx_bdry_lock_ena);
374232809Sjmallett
375232809Sjmallett    result.s.link_up = 1;
376232809Sjmallett    result.s.full_duplex = 1;
377232809Sjmallett    result.s.speed = cvmx_qlm_get_gbaud_mhz(1+interface) * 64 / 67;
378232809Sjmallett    result.s.speed *= lanes;
379232809Sjmallett
380232809Sjmallettout:
381232809Sjmallett    /* If the link is down we will force disable the RX path. If it up, we'll
382232809Sjmallett        set it to match the TX state set by the if_enable call */
383232809Sjmallett    if (result.s.link_up)
384232809Sjmallett    {
385232809Sjmallett        cvmx_ilk_txx_cfg1_t ilk_txx_cfg1;
386232809Sjmallett        ilk_txx_cfg1.u64 = cvmx_read_csr(CVMX_ILK_TXX_CFG1(interface));
387232809Sjmallett        ilk_rxx_cfg1.s.pkt_ena = ilk_txx_cfg1.s.pkt_ena;
388232809Sjmallett        cvmx_write_csr(CVMX_ILK_RXX_CFG1(interface), ilk_rxx_cfg1.u64);
389232809Sjmallett        //cvmx_dprintf("ILK%d: link up, %d Mbps, Full duplex mode, %d lanes\n", interface, result.s.speed, lanes);
390232809Sjmallett    }
391232809Sjmallett    else
392232809Sjmallett    {
393232809Sjmallett        ilk_rxx_cfg1.s.pkt_ena = 0;
394232809Sjmallett        cvmx_write_csr(CVMX_ILK_RXX_CFG1(interface), ilk_rxx_cfg1.u64);
395232809Sjmallett        //cvmx_dprintf("ILK link down\n");
396232809Sjmallett    }
397232809Sjmallett    return result;
398232809Sjmallett}
399232809Sjmallett
400232809Sjmallett/**
401232809Sjmallett * @INTERNAL
402232809Sjmallett * Set the link state of an IPD/PKO port.
403232809Sjmallett *
404232809Sjmallett * @param ipd_port  IPD/PKO port to configure
405232809Sjmallett * @param link_info The new link state
406232809Sjmallett *
407232809Sjmallett * @return Zero on success, negative on failure
408232809Sjmallett */
409232809Sjmallettint __cvmx_helper_ilk_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
410232809Sjmallett{
411232809Sjmallett    /* nothing to do */
412232809Sjmallett
413232809Sjmallett    return 0;
414232809Sjmallett}
415232809Sjmallett
416232809Sjmallett/**
417232809Sjmallett * Display ilk interface statistics.
418232809Sjmallett *
419232809Sjmallett */
420232809Sjmallettvoid __cvmx_helper_ilk_show_stats (void)
421232809Sjmallett{
422232809Sjmallett    int i, j;
423232809Sjmallett    unsigned char *pchans, num_chans;
424232809Sjmallett    unsigned int chan_tmp[CVMX_MAX_ILK_CHANS];
425232809Sjmallett    cvmx_ilk_stats_ctrl_t ilk_stats_ctrl;
426232809Sjmallett
427232809Sjmallett    for (i = 0; i < CVMX_NUM_ILK_INTF; i++)
428232809Sjmallett    {
429232809Sjmallett        cvmx_ilk_get_chan_info (i, &pchans, &num_chans);
430232809Sjmallett
431232809Sjmallett        memset (chan_tmp, 0, CVMX_MAX_ILK_CHANS * sizeof (int));
432232809Sjmallett        for (j = 0; j < num_chans; j++)
433232809Sjmallett            chan_tmp[j] = pchans[j];
434232809Sjmallett
435232809Sjmallett        ilk_stats_ctrl.chan_list = chan_tmp;
436232809Sjmallett        ilk_stats_ctrl.num_chans = num_chans;
437232809Sjmallett        ilk_stats_ctrl.clr_on_rd = 0;
438232809Sjmallett        cvmx_ilk_show_stats (i, &ilk_stats_ctrl);
439232809Sjmallett    }
440232809Sjmallett}
441232809Sjmallett
442232809Sjmallett#endif /* CVMX_ENABLE_PKO_FUNCTIONS */
443