Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
W
wr-switch-sw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
white-rabbit
wr-switch-sw
Commits
f5c1a361
Commit
f5c1a361
authored
Mar 22, 2016
by
Maciej Lipinski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tools/rtu_stat: aded configuration of HP-related stuff
not the best way, but works for the tests
parent
c893bc7f
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
224 additions
and
0 deletions
+224
-0
rtu_stat.c
userspace/tools/rtu_stat.c
+224
-0
No files found.
userspace/tools/rtu_stat.c
View file @
f5c1a361
...
...
@@ -26,7 +26,10 @@
#include <unistd.h>
#include <libwr/util.h>
#include "regs/rtu-regs.h"
#include <libwr/switch_hw.h>
#include "fpga_io.h"
#include <libwr/shmem.h>
#include <libwr/hal_shmem.h>
#include <libwr/rtu_shmem.h>
...
...
@@ -288,6 +291,191 @@ int open_rtu_shm(void)
return
0
;
}
////////////////////////////////////////////////////////////////////////////////////////////
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define rtu_rd(reg) \
_fpga_readl(FPGA_BASE_RTU + offsetof(struct RTU_WB, reg))
#define rtu_wr(reg, val) \
_fpga_writel(FPGA_BASE_RTU + offsetof(struct RTU_WB, reg), val)
void
rtux_disp_ctrl
(
void
)
{
uint32_t
mask
;
mask
=
rtu_rd
(
RX_CTR
);
fprintf
(
stderr
,
"RTU eXtension features (read):
\n
"
);
if
(
RTU_RX_CTR_MR_ENA
&
mask
)
{
fprintf
(
stderr
,
"
\t
(1 ) Port Mirroring - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(1 ) Port Mirroring - disabled
\n
"
);}
if
(
RTU_RX_CTR_FF_MAC_PTP
&
mask
)
{
fprintf
(
stderr
,
"
\t
(2 ) PTP fast forward - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(2 ) PTP fast forward - disabled
\n
"
);}
if
(
RTU_RX_CTR_FF_MAC_LL
&
mask
)
{
fprintf
(
stderr
,
"
\t
(4 ) Link-limited traffic (BPDU) fast forward - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(4 ) Link-limited traffic (BPDU) fast forward - disabled
\n
"
);}
if
(
RTU_RX_CTR_FF_MAC_SINGLE
&
mask
)
{
fprintf
(
stderr
,
"
\t
(8 ) Single configured MACs fast forward - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(8 ) Single configured MACs fast forward - disabled
\n
"
);}
if
(
RTU_RX_CTR_FF_MAC_RANGE
&
mask
)
{
fprintf
(
stderr
,
"
\t
(16) Range of configured MACs fast forward - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(16) Range of configured MACs fast forward - disabled
\n
"
);}
if
(
RTU_RX_CTR_FF_MAC_BR
&
mask
)
{
fprintf
(
stderr
,
"
\t
(32) Broadcast fast forward - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(32) Broadcast fast forward - disabled
\n
"
);}
if
(
RTU_RX_CTR_AT_FMATCH_TOO_SLOW
&
mask
)
{
fprintf
(
stderr
,
"
\t
(64) When fast match engine too slow - braodcast processed frame
\n
"
);}
else
{
fprintf
(
stderr
,
"
\t
(64) When fast match engine too slow - drop processed frame
\n
"
);
}
}
void
rtux_disp_fw_to_CPU
()
{
uint32_t
mask
;
mask
=
rtu_rd
(
RX_CTR
);
fprintf
(
stderr
,
"RTU eXtension features (read):
\n
"
);
if
(
RTU_RX_CTR_HP_FW_CPU_ENA
&
mask
)
{
fprintf
(
stderr
,
"
\t
(1 ) HP forwarding to CPU - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(1 ) HP forwarding to CPU - disabled
\n
"
);
}
if
(
RTU_RX_CTR_UREC_FW_CPU_ENA
&
mask
)
{
fprintf
(
stderr
,
"
\t
(2 ) Unrec broadcast forwarding to CPU - enabled
\n
"
);
}
else
{
fprintf
(
stderr
,
"
\t
(2 ) Unrec broadcast forwarding to CPU - disabled
\n
"
);
}
}
void
rtux_read_cpu_port
()
{
uint32_t
mask
;
mask
=
rtu_rd
(
CPU_PORT
);
fprintf
(
stderr
,
"RTU eXtension: reading mask indicating which (virtual) port is connected"
"to CPU mask=0x%x
\n
"
,
RTU_CPU_PORT_MASK_R
(
mask
));
}
void
rtux_read_hp_prio_mask
()
{
uint32_t
mask
;
mask
=
rtu_rd
(
RX_CTR
);
fprintf
(
stderr
,
"RTU eXtension: hp priorities (for which priorities traffic is "
"considered HP), mask=0x%x
\n
"
,
RTU_RX_CTR_PRIO_MASK_R
(
mask
)
);
}
void
rtux_set_hp_prio_mask
(
uint8_t
hp_prio_mask
)
{
uint32_t
mask
;
mask
=
rtu_rd
(
RX_CTR
);
mask
=
(
~
RTU_RX_CTR_PRIO_MASK_MASK
)
&
mask
;
// clear
mask
=
RTU_RX_CTR_PRIO_MASK_W
(
hp_prio_mask
)
|
mask
;
rtu_wr
(
RX_CTR
,
mask
);
rtux_read_hp_prio_mask
();
}
static
uint32_t
get_mac_lo
(
uint8_t
mac
[
ETH_ALEN
])
{
return
((
0xFF
&
mac
[
2
])
<<
24
)
|
((
0xFF
&
mac
[
3
])
<<
16
)
|
((
0xFF
&
mac
[
4
])
<<
8
)
|
((
0xFF
&
mac
[
5
])
)
;
}
static
uint32_t
get_mac_hi
(
uint8_t
mac
[
ETH_ALEN
])
{
return
((
0xFF
&
mac
[
0
])
<<
8
)
|
((
0xFF
&
mac
[
1
])
)
;
}
void
rtux_add_ff_mac_range
(
int
mac_id
,
int
valid
,
uint8_t
mac_lower
[
ETH_ALEN
],
uint8_t
mac_upper
[
ETH_ALEN
])
{
uint32_t
mac_hi
,
mac_lo
;
uint32_t
m_mac_id
;
// modified mac id
// writting lower boundary of the mac range
m_mac_id
=
(
~
(
1
<<
7
)
)
&
mac_id
;
// lower range (highest bit is low)
mac_lo
=
RTU_RX_FF_MAC_R0_LO_W
(
get_mac_lo
(
mac_lower
))
;
mac_hi
=
RTU_RX_FF_MAC_R1_HI_ID_W
(
get_mac_hi
(
mac_lower
))
|
RTU_RX_FF_MAC_R1_ID_W
(
m_mac_id
)
|
RTU_RX_FF_MAC_R1_TYPE
|
// type = 1
RTU_RX_FF_MAC_R1_VALID
;
rtu_wr
(
RX_FF_MAC_R0
,
mac_lo
);
rtu_wr
(
RX_FF_MAC_R1
,
mac_hi
);
// writting upper boundary of the mac range
m_mac_id
=
(
1
<<
7
)
|
mac_id
;
// upper range high (highest bit is low)
mac_lo
=
RTU_RX_FF_MAC_R0_LO_W
(
get_mac_lo
(
mac_upper
))
;
mac_hi
=
RTU_RX_FF_MAC_R1_HI_ID_W
(
get_mac_hi
(
mac_upper
))
|
RTU_RX_FF_MAC_R1_ID_W
(
m_mac_id
)
|
RTU_RX_FF_MAC_R1_TYPE
|
// type = 1
RTU_RX_FF_MAC_R1_VALID
;
rtu_wr
(
RX_FF_MAC_R0
,
mac_lo
);
rtu_wr
(
RX_FF_MAC_R1
,
mac_hi
);
fprintf
(
stderr
,
"RTU eXtension: set fast forward mac range: (id=%d, valid=%d):
\n
"
,
mac_id
,
valid
);
fprintf
(
stderr
,
"
\t
lower_mac = %x:%x:%x:%x:%x:%x
\n
"
,
mac_lower
[
0
],
mac_lower
[
1
],
mac_lower
[
2
],
mac_lower
[
3
],
mac_lower
[
4
],
mac_lower
[
5
]);
fprintf
(
stderr
,
"
\t
upper_mac = %x:%x:%x:%x:%x:%x
\n
"
,
mac_upper
[
0
],
mac_upper
[
1
],
mac_upper
[
2
],
mac_upper
[
3
],
mac_upper
[
4
],
mac_upper
[
5
]);
}
void
rtux_feature_ctrl
(
int
mr
,
int
mac_ptp
,
int
mac_ll
,
int
mac_single
,
int
mac_range
,
int
mac_br
,
int
at_fm
)
{
uint32_t
mask
;
mask
=
rtu_rd
(
RX_CTR
);
mask
=
0xFFFFFFC0
&
mask
;
if
(
mr
)
mask
=
RTU_RX_CTR_MR_ENA
|
mask
;
if
(
mac_ptp
)
mask
=
RTU_RX_CTR_FF_MAC_PTP
|
mask
;
if
(
mac_ll
)
mask
=
RTU_RX_CTR_FF_MAC_LL
|
mask
;
if
(
mac_single
)
mask
=
RTU_RX_CTR_FF_MAC_SINGLE
|
mask
;
if
(
mac_range
)
mask
=
RTU_RX_CTR_FF_MAC_RANGE
|
mask
;
if
(
mac_br
)
mask
=
RTU_RX_CTR_FF_MAC_BR
|
mask
;
if
(
at_fm
)
mask
=
RTU_RX_CTR_AT_FMATCH_TOO_SLOW
|
mask
;
rtu_wr
(
RX_CTR
,
mask
);
rtux_disp_ctrl
();
}
void
rtux_fw_to_CPU
(
int
arg
)
{
uint32_t
mask
;
int
hp
=
0x1
&
(
arg
>>
0
);
int
unrec
=
0x1
&
(
arg
>>
1
);
mask
=
rtu_rd
(
RX_CTR
);
mask
=
0xFFF0FFFF
&
mask
;
if
(
hp
)
mask
=
RTU_RX_CTR_HP_FW_CPU_ENA
|
mask
;
if
(
unrec
)
mask
=
RTU_RX_CTR_UREC_FW_CPU_ENA
|
mask
;
rtu_wr
(
RX_CTR
,
mask
);
rtux_disp_fw_to_CPU
();
}
////////////////////////////////////////////////////////////////////////////////////////////
int
main
(
int
argc
,
char
**
argv
)
{
int
i
,
isok
;
...
...
@@ -341,6 +529,42 @@ int main(int argc, char **argv)
else
printf
(
"Could not %s entry for %s
\n
"
,
argv
[
2
],
argv
[
3
]);
exit
(
1
);
}
else
if
(
strcmp
(
argv
[
1
],
"rtux"
)
==
0
)
{
if
(
shw_fpga_mmap_init
()
<
0
)
{
printf
(
"Can't access device memory
\n
"
);
exit
(
1
);
}
printf
(
"managed to map FPGA mem
\n
"
);
if
((
argc
>
3
)
&&
(
strcmp
(
argv
[
2
],
"HPprio"
)
==
0
))
{
rtux_set_hp_prio_mask
(
1
<<
atoi
(
argv
[
3
]));
isok
=
1
;
}
else
if
((
argc
>
3
)
&&
(
strcmp
(
argv
[
2
],
"ctrl"
)
==
0
))
{
rtux_feature_ctrl
((
atoi
(
argv
[
3
])
>>
0
)
&
0x1
,
//mr
(
atoi
(
argv
[
3
])
>>
1
)
&
0x1
,
//mac_pto
(
atoi
(
argv
[
3
])
>>
2
)
&
0x1
,
//mac_ll
(
atoi
(
argv
[
3
])
>>
3
)
&
0x1
,
//mac_single
(
atoi
(
argv
[
3
])
>>
4
)
&
0x1
,
//mac_range
(
atoi
(
argv
[
3
])
>>
5
)
&
0x1
,
//mac_br
(
atoi
(
argv
[
3
])
>>
6
)
&
0x1
//at_fm
);
isok
=
1
;
}
else
if
(((
argc
>
2
)
&&
(
strcmp
(
argv
[
2
],
"dump"
)
==
0
))
||
(
argc
==
2
))
{
rtux_disp_ctrl
();
rtux_disp_fw_to_CPU
();
rtux_read_cpu_port
();
rtux_read_hp_prio_mask
();
}
else
printf
(
"Could not %s entry for %s
\n
"
,
argv
[
2
],
argv
[
3
]);
exit
(
1
);
}
else
if
(
strcmp
(
argv
[
1
],
"list"
)
==
0
)
isok
=
1
;
//Does not continue
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment