octeon: native driver for Marvell Octeon SoC
[vpp.git] / src / plugins / dev_octeon / format.c
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright (c) 2023 Cisco Systems, Inc.
3  */
4
5 #include "vlib/pci/pci.h"
6 #include "vnet/error.h"
7 #include "vppinfra/error.h"
8 #include <vnet/vnet.h>
9 #include <vnet/dev/dev.h>
10 #include <dev_octeon/octeon.h>
11
12 u8 *
13 format_oct_port_status (u8 *s, va_list *args)
14 {
15   return s;
16 }
17
18 u8 *
19 format_oct_nix_rx_cqe_desc (u8 *s, va_list *args)
20 {
21   oct_nix_rx_cqe_desc_t *d = va_arg (*args, oct_nix_rx_cqe_desc_t *);
22   u32 indent = format_get_indent (s);
23   typeof (d->hdr) *h = &d->hdr;
24   typeof (d->parse.f) *p = &d->parse.f;
25   typeof (d->sg0) *sg0 = &d->sg0;
26   typeof (d->sg0) *sg1 = &d->sg1;
27
28   s = format (s, "hdr: cqe_type %u nude %u q %u tag 0x%x", h->cqe_type,
29               h->node, h->q, h->tag);
30   s = format (s, "\n%Uparse:", format_white_space, indent);
31 #define _(n, f) s = format (s, " " #n " " f, p->n)
32   _ (chan, "%u");
33   _ (errcode, "%u");
34   _ (errlev, "%u");
35   _ (desc_sizem1, "%u");
36   _ (pkt_lenm1, "%u");
37   _ (pkind, "%u");
38   s = format (s, "\n%U ", format_white_space, indent);
39   _ (nix_idx, "%u");
40   _ (color, "%u");
41   _ (flow_key_alg, "%u");
42   _ (eoh_ptr, "%u");
43   _ (match_id, "0x%x");
44   s = format (s, "\n%U ", format_white_space, indent);
45   _ (wqe_aura, "0x%x");
46   _ (pb_aura, "0x%x");
47   _ (imm_copy, "%u");
48   _ (express, "%u");
49   _ (wqwd, "%u");
50   _ (l2m, "%u");
51   _ (l2b, "%u");
52   _ (l3m, "%u");
53   _ (l3b, "%u");
54 #undef _
55   s = format (s, "\n%U  ", format_white_space, indent);
56   s = format (s, "layer:     a    b    c    d    e    f    g    h");
57   s = format (s, "\n%U  ", format_white_space, indent);
58   s = format (s, "type:    %3u  %3u  %3u  %3u  %3u  %3u  %3u  %3u", p->latype,
59               p->lbtype, p->lctype, p->ldtype, p->letype, p->lftype, p->lgtype,
60               p->lhtype);
61   s = format (s, "\n%U  ", format_white_space, indent);
62   s = format (
63     s, "flags:  0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x",
64     p->laflags, p->lbflags, p->lcflags, p->ldflags, p->leflags, p->lfflags,
65     p->lgflags, p->lhflags);
66   s = format (s, "\n%U  ", format_white_space, indent);
67   s = format (s, "ptr:     %3u  %3u  %3u  %3u  %3u  %3u  %3u  %3u", p->laptr,
68               p->lbptr, p->lcptr, p->ldptr, p->leptr, p->lfptr, p->lgptr,
69               p->lhptr);
70
71   if (sg0->subdc != 0x4)
72     return format (s, "\n%Usg0: unexpected subdc %x", format_white_space,
73                    indent, sg0->subdc);
74
75   s = format (s,
76               "\n%Usg0: segs %u seg1_sz %u seg2_sz %u seg3_sz %u seg1 "
77               "%p seg2 %p seg3 %p",
78               format_white_space, indent, sg0->segs, sg0->seg1_size,
79               sg0->seg2_size, sg0->seg3_size, d->segs0[0], d->segs0[1],
80               d->segs0[2]);
81
82   if (sg1->subdc != 0x4 && sg1->subdc != 0)
83     return format (s, "\n%Usg1: unexpected subdc %x", format_white_space,
84                    indent, sg1->subdc);
85
86   if (sg1->subdc == 4)
87     s = format (s,
88                 "\n%Usg1: segs %u seg1_sz %u seg2_sz %u seg3_sz %u seg1 "
89                 "%p seg2 %p seg3 %p",
90                 format_white_space, indent, sg1->segs, sg1->seg1_size,
91                 sg1->seg2_size, sg1->seg3_size, d->segs1[0], d->segs1[1],
92                 d->segs1[2]);
93
94   return s;
95 }
96
97 u8 *
98 format_oct_rx_trace (u8 *s, va_list *args)
99 {
100   vlib_main_t *vm = va_arg (*args, vlib_main_t *);
101   vlib_node_t *node = va_arg (*args, vlib_node_t *);
102   oct_rx_trace_t *t = va_arg (*args, oct_rx_trace_t *);
103   u32 indent = format_get_indent (s);
104
105   s = format (s, "octeon-rx: next-node %U sw_if_index %u",
106               format_vlib_next_node_name, vm, node->index, t->next_index,
107               t->sw_if_index);
108   s = format (s, "\n%U%U", format_white_space, indent + 2,
109               format_oct_nix_rx_cqe_desc, &t->desc);
110   return s;
111 }
112
113 u8 *
114 format_oct_tx_trace (u8 *s, va_list *args)
115 {
116   va_arg (*args, vlib_main_t *);
117   va_arg (*args, vlib_node_t *);
118   oct_tx_trace_t *t = va_arg (*args, oct_tx_trace_t *);
119   u32 indent = format_get_indent (s);
120
121   s = format (s, "octeon-tx: sw_if_index %u", t->sw_if_index);
122   s = format (s, "\n%Uhdr[0]:", format_white_space, indent + 2);
123 #define _(n, f) s = format (s, " " #n " " f, t->desc.hdr_w0.n)
124   _ (total, "%u");
125   _ (df, "%u");
126   _ (aura, "0x%x");
127   _ (sizem1, "%u");
128   _ (pnc, "%u");
129   _ (sq, "%u");
130 #undef _
131   s = format (s, "\n%Uhdr[1]:", format_white_space, indent + 2);
132 #define _(n, f) s = format (s, " " #n " " f, t->desc.hdr_w1.n)
133   _ (ol3ptr, "%u");
134   _ (ol4ptr, "%u");
135   _ (il3ptr, "%u");
136   _ (il4ptr, "%u");
137   _ (ol3type, "%u");
138   _ (ol4type, "%u");
139   _ (il3type, "%u");
140   _ (il4type, "%u");
141   _ (sqe_id, "%u");
142 #undef _
143
144   foreach_int (j, 0, 4)
145     {
146       s = format (s, "\n%Usg[%u]:", format_white_space, indent + 2, j);
147 #define _(n, f) s = format (s, " " #n " " f, t->desc.sg[j].n)
148       _ (subdc, "%u");
149       _ (segs, "%u");
150       _ (seg1_size, "%u");
151       _ (seg2_size, "%u");
152       _ (seg3_size, "%u");
153       _ (i1, "%u");
154       _ (i2, "%u");
155       _ (i3, "%u");
156       _ (ld_type, "%u");
157 #undef _
158       for (int i = 1; i < 4; i++)
159         s = format (s, "\n%Usg[%u]: %p", format_white_space, indent + 2, i + j,
160                     t->desc.sg[i + j]);
161     }
162
163   return s;
164 }