Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ycai
simbricks
Commits
c7e904bf
Commit
c7e904bf
authored
Feb 15, 2021
by
Antoine Kaufmann
Browse files
lib/nicbm: refactor identifier names for google style
parent
78f27099
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
325 additions
and
325 deletions
+325
-325
lib/simbricks/nicbm/nicbm.cc
lib/simbricks/nicbm/nicbm.cc
+119
-119
lib/simbricks/nicbm/nicbm.h
lib/simbricks/nicbm/nicbm.h
+57
-57
sims/nic/corundum_bm/corundum_bm.cc
sims/nic/corundum_bm/corundum_bm.cc
+45
-45
sims/nic/corundum_bm/corundum_bm.h
sims/nic/corundum_bm/corundum_bm.h
+6
-6
sims/nic/i40e_bm/i40e_adminq.cc
sims/nic/i40e_bm/i40e_adminq.cc
+1
-1
sims/nic/i40e_bm/i40e_bm.cc
sims/nic/i40e_bm/i40e_bm.cc
+28
-28
sims/nic/i40e_bm/i40e_bm.h
sims/nic/i40e_bm/i40e_bm.h
+11
-11
sims/nic/i40e_bm/i40e_hmc.cc
sims/nic/i40e_bm/i40e_hmc.cc
+5
-5
sims/nic/i40e_bm/i40e_lan.cc
sims/nic/i40e_bm/i40e_lan.cc
+13
-13
sims/nic/i40e_bm/i40e_queues.cc
sims/nic/i40e_bm/i40e_queues.cc
+39
-39
sims/nic/i40e_bm/logger.cc
sims/nic/i40e_bm/logger.cc
+1
-1
No files found.
lib/simbricks/nicbm/nicbm.cc
View file @
c7e904bf
...
...
@@ -57,97 +57,97 @@ static void sigusr1_handler(int dummy) {
fprintf
(
stderr
,
"main_time = %lu
\n
"
,
main_time
);
}
volatile
union
SimbricksProtoPcieD2H
*
Runner
::
d2h_a
lloc
(
void
)
{
volatile
union
SimbricksProtoPcieD2H
*
Runner
::
D2HA
lloc
()
{
volatile
union
SimbricksProtoPcieD2H
*
msg
;
while
((
msg
=
SimbricksNicIfD2HAlloc
(
&
nsparams
,
main_time
))
==
NULL
)
{
fprintf
(
stderr
,
"
d2h_a
lloc: no entry available
\n
"
);
while
((
msg
=
SimbricksNicIfD2HAlloc
(
&
nsparams
_
,
main_time
))
==
NULL
)
{
fprintf
(
stderr
,
"
D2HA
lloc: no entry available
\n
"
);
}
return
msg
;
}
volatile
union
SimbricksProtoNetD2N
*
Runner
::
d2n_a
lloc
(
void
)
{
volatile
union
SimbricksProtoNetD2N
*
Runner
::
D2NA
lloc
()
{
volatile
union
SimbricksProtoNetD2N
*
msg
;
while
((
msg
=
SimbricksNicIfD2NAlloc
(
&
nsparams
,
main_time
))
==
NULL
)
{
fprintf
(
stderr
,
"
d2n_a
lloc: no entry available
\n
"
);
while
((
msg
=
SimbricksNicIfD2NAlloc
(
&
nsparams
_
,
main_time
))
==
NULL
)
{
fprintf
(
stderr
,
"
D2NA
lloc: no entry available
\n
"
);
}
return
msg
;
}
void
Runner
::
i
ssue
_d
ma
(
DMAOp
&
op
)
{
if
(
dma_pending
<
DMA_MAX_PENDING
)
{
void
Runner
::
I
ssue
D
ma
(
DMAOp
&
op
)
{
if
(
dma_pending
_
<
DMA_MAX_PENDING
)
{
// can directly issue
#ifdef DEBUG_NICBM
printf
(
"nicbm: issuing dma op %p addr %lx len %zu pending %zu
\n
"
,
&
op
,
op
.
dma_addr
,
op
.
len
,
dma_pending
);
#endif
d
ma
_d
o
(
op
);
D
ma
D
o
(
op
);
}
else
{
#ifdef DEBUG_NICBM
printf
(
"nicbm: enqueuing dma op %p addr %lx len %zu pending %zu
\n
"
,
&
op
,
op
.
dma_addr
,
op
.
len
,
dma_pending
);
#endif
dma_queue
.
push_back
(
&
op
);
dma_queue
_
.
push_back
(
&
op
);
}
}
void
Runner
::
d
ma
_t
rigger
()
{
if
(
dma_queue
.
empty
()
||
dma_pending
==
DMA_MAX_PENDING
)
void
Runner
::
D
ma
T
rigger
()
{
if
(
dma_queue
_
.
empty
()
||
dma_pending
_
==
DMA_MAX_PENDING
)
return
;
DMAOp
*
op
=
dma_queue
.
front
();
dma_queue
.
pop_front
();
DMAOp
*
op
=
dma_queue
_
.
front
();
dma_queue
_
.
pop_front
();
d
ma
_d
o
(
*
op
);
D
ma
D
o
(
*
op
);
}
void
Runner
::
d
ma
_d
o
(
DMAOp
&
op
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
=
d2h_a
lloc
();
dma_pending
++
;
void
Runner
::
D
ma
D
o
(
DMAOp
&
op
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
=
D2HA
lloc
();
dma_pending
_
++
;
#ifdef DEBUG_NICBM
printf
(
"nicbm: executing dma op %p addr %lx len %zu pending %zu
\n
"
,
&
op
,
op
.
dma_addr
,
op
.
len
,
dma_pending
);
op
.
dma_addr
_
,
op
.
len
_
,
dma_pending
_
);
#endif
if
(
op
.
write
)
{
if
(
op
.
write
_
)
{
volatile
struct
SimbricksProtoPcieD2HWrite
*
write
=
&
msg
->
write
;
if
(
dintro
.
d2h_elen
<
sizeof
(
*
write
)
+
op
.
len
)
{
if
(
dintro
_
.
d2h_elen
<
sizeof
(
*
write
)
+
op
.
len
_
)
{
fprintf
(
stderr
,
"issue_dma: write too big (%zu), can only fit up "
"to (%zu)
\n
"
,
op
.
len
,
dintro
.
d2h_elen
-
sizeof
(
*
write
));
op
.
len
_
,
dintro
_
.
d2h_elen
-
sizeof
(
*
write
));
abort
();
}
write
->
req_id
=
(
uintptr_t
)
&
op
;
write
->
offset
=
op
.
dma_addr
;
write
->
len
=
op
.
len
;
memcpy
((
void
*
)
write
->
data
,
(
void
*
)
op
.
data
,
op
.
len
);
write
->
offset
=
op
.
dma_addr
_
;
write
->
len
=
op
.
len
_
;
memcpy
((
void
*
)
write
->
data
,
(
void
*
)
op
.
data
_
,
op
.
len
_
);
// WMB();
write
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_WRITE
|
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
else
{
volatile
struct
SimbricksProtoPcieD2HRead
*
read
=
&
msg
->
read
;
if
(
dintro
.
h2d_elen
<
sizeof
(
struct
SimbricksProtoPcieH2DReadcomp
)
+
op
.
len
)
{
if
(
dintro
_
.
h2d_elen
<
sizeof
(
struct
SimbricksProtoPcieH2DReadcomp
)
+
op
.
len
_
)
{
fprintf
(
stderr
,
"issue_dma: write too big (%zu), can only fit up "
"to (%zu)
\n
"
,
op
.
len
,
dintro
.
h2d_elen
-
sizeof
(
struct
SimbricksProtoPcieH2DReadcomp
));
op
.
len
_
,
dintro
_
.
h2d_elen
-
sizeof
(
struct
SimbricksProtoPcieH2DReadcomp
));
abort
();
}
read
->
req_id
=
(
uintptr_t
)
&
op
;
read
->
offset
=
op
.
dma_addr
;
read
->
len
=
op
.
len
;
read
->
offset
=
op
.
dma_addr
_
;
read
->
len
=
op
.
len
_
;
// WMB();
read
->
own_type
=
SIMBRICKS_PROTO_PCIE_D2H_MSG_READ
|
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
}
void
Runner
::
m
si
_i
ssue
(
uint8_t
vec
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
=
d2h_a
lloc
();
void
Runner
::
M
si
I
ssue
(
uint8_t
vec
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
=
D2HA
lloc
();
#ifdef DEBUG_NICBM
printf
(
"nicbm: issue MSI interrupt vec %u
\n
"
,
vec
);
#endif
...
...
@@ -161,8 +161,8 @@ void Runner::msi_issue(uint8_t vec) {
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
void
Runner
::
m
si
x_i
ssue
(
uint8_t
vec
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
=
d2h_a
lloc
();
void
Runner
::
M
si
XI
ssue
(
uint8_t
vec
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
=
D2HA
lloc
();
#ifdef DEBUG_NICBM
printf
(
"nicbm: issue MSI-X interrupt vec %u
\n
"
,
vec
);
#endif
...
...
@@ -176,22 +176,22 @@ void Runner::msix_issue(uint8_t vec) {
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
void
Runner
::
e
vent
_s
chedule
(
TimedEvent
&
evt
)
{
events
.
insert
(
&
evt
);
void
Runner
::
E
vent
S
chedule
(
TimedEvent
&
evt
)
{
events
_
.
insert
(
&
evt
);
}
void
Runner
::
e
vent
_c
ancel
(
TimedEvent
&
evt
)
{
events
.
erase
(
&
evt
);
void
Runner
::
E
vent
C
ancel
(
TimedEvent
&
evt
)
{
events
_
.
erase
(
&
evt
);
}
void
Runner
::
h2d_r
ead
(
volatile
struct
SimbricksProtoPcieH2DRead
*
read
)
{
void
Runner
::
H2DR
ead
(
volatile
struct
SimbricksProtoPcieH2DRead
*
read
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
;
volatile
struct
SimbricksProtoPcieD2HReadcomp
*
rc
;
msg
=
d2h_a
lloc
();
msg
=
D2HA
lloc
();
rc
=
&
msg
->
readcomp
;
dev
.
reg_r
ead
(
read
->
bar
,
read
->
offset
,
(
void
*
)
rc
->
data
,
read
->
len
);
dev
_
.
RegR
ead
(
read
->
bar
,
read
->
offset
,
(
void
*
)
rc
->
data
,
read
->
len
);
rc
->
req_id
=
read
->
req_id
;
#ifdef DEBUG_NICBM
...
...
@@ -206,11 +206,11 @@ void Runner::h2d_read(volatile struct SimbricksProtoPcieH2DRead *read) {
SIMBRICKS_PROTO_PCIE_D2H_MSG_READCOMP
|
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
void
Runner
::
h2d_w
rite
(
volatile
struct
SimbricksProtoPcieH2DWrite
*
write
)
{
void
Runner
::
H2DW
rite
(
volatile
struct
SimbricksProtoPcieH2DWrite
*
write
)
{
volatile
union
SimbricksProtoPcieD2H
*
msg
;
volatile
struct
SimbricksProtoPcieD2HWritecomp
*
wc
;
msg
=
d2h_a
lloc
();
msg
=
D2HA
lloc
();
wc
=
&
msg
->
writecomp
;
#ifdef DEBUG_NICBM
...
...
@@ -219,7 +219,7 @@ void Runner::h2d_write(volatile struct SimbricksProtoPcieH2DWrite *write) {
printf
(
"nicbm: write(off=0x%lx, len=%u, val=0x%lx)
\n
"
,
write
->
offset
,
write
->
len
,
dbg_val
);
#endif
dev
.
reg_w
rite
(
write
->
bar
,
write
->
offset
,
(
void
*
)
write
->
data
,
write
->
len
);
dev
_
.
RegW
rite
(
write
->
bar
,
write
->
offset
,
(
void
*
)
write
->
data
,
write
->
len
);
wc
->
req_id
=
write
->
req_id
;
// WMB();
...
...
@@ -228,7 +228,7 @@ void Runner::h2d_write(volatile struct SimbricksProtoPcieH2DWrite *write) {
SIMBRICKS_PROTO_PCIE_D2H_OWN_HOST
;
}
void
Runner
::
h2d_r
eadcomp
(
volatile
struct
SimbricksProtoPcieH2DReadcomp
*
rc
)
{
void
Runner
::
H2DR
eadcomp
(
volatile
struct
SimbricksProtoPcieH2DReadcomp
*
rc
)
{
DMAOp
*
op
=
(
DMAOp
*
)(
uintptr_t
)
rc
->
req_id
;
#ifdef DEBUG_NICBM
...
...
@@ -236,14 +236,14 @@ void Runner::h2d_readcomp(volatile struct SimbricksProtoPcieH2DReadcomp *rc) {
op
->
len
);
#endif
memcpy
(
op
->
data
,
(
void
*
)
rc
->
data
,
op
->
len
);
dev
.
dma_c
omplete
(
*
op
);
memcpy
(
op
->
data
_
,
(
void
*
)
rc
->
data
,
op
->
len
_
);
dev
_
.
DmaC
omplete
(
*
op
);
dma_pending
--
;
d
ma
_t
rigger
();
dma_pending
_
--
;
D
ma
T
rigger
();
}
void
Runner
::
h2d_w
ritecomp
(
volatile
struct
SimbricksProtoPcieH2DWritecomp
*
wc
)
{
void
Runner
::
H2DW
ritecomp
(
volatile
struct
SimbricksProtoPcieH2DWritecomp
*
wc
)
{
DMAOp
*
op
=
(
DMAOp
*
)(
uintptr_t
)
wc
->
req_id
;
#ifdef DEBUG_NICBM
...
...
@@ -251,30 +251,30 @@ void Runner::h2d_writecomp(volatile struct SimbricksProtoPcieH2DWritecomp *wc) {
op
->
dma_addr
,
op
->
len
);
#endif
dev
.
dma_c
omplete
(
*
op
);
dev
_
.
DmaC
omplete
(
*
op
);
dma_pending
--
;
d
ma
_t
rigger
();
dma_pending
_
--
;
D
ma
T
rigger
();
}
void
Runner
::
h2d_d
evctrl
(
volatile
struct
SimbricksProtoPcieH2DDevctrl
*
dc
)
{
dev
.
d
evctrl
_u
pdate
(
*
(
struct
SimbricksProtoPcieH2DDevctrl
*
)
dc
);
void
Runner
::
H2DD
evctrl
(
volatile
struct
SimbricksProtoPcieH2DDevctrl
*
dc
)
{
dev
_
.
D
evctrl
U
pdate
(
*
(
struct
SimbricksProtoPcieH2DDevctrl
*
)
dc
);
}
void
Runner
::
e
th
_r
ecv
(
volatile
struct
SimbricksProtoNetN2DRecv
*
recv
)
{
void
Runner
::
E
th
R
ecv
(
volatile
struct
SimbricksProtoNetN2DRecv
*
recv
)
{
#ifdef DEBUG_NICBM
printf
(
"nicbm: eth rx: port %u len %u
\n
"
,
recv
->
port
,
recv
->
len
);
#endif
dev
.
eth_r
x
(
recv
->
port
,
(
void
*
)
recv
->
data
,
recv
->
len
);
dev
_
.
EthR
x
(
recv
->
port
,
(
void
*
)
recv
->
data
,
recv
->
len
);
}
void
Runner
::
e
th
_s
end
(
const
void
*
data
,
size_t
len
)
{
void
Runner
::
E
th
S
end
(
const
void
*
data
,
size_t
len
)
{
#ifdef DEBUG_NICBM
printf
(
"nicbm: eth tx: len %zu
\n
"
,
len
);
#endif
volatile
union
SimbricksProtoNetD2N
*
msg
=
d2n_a
lloc
();
volatile
union
SimbricksProtoNetD2N
*
msg
=
D2NA
lloc
();
volatile
struct
SimbricksProtoNetD2NSend
*
send
=
&
msg
->
send
;
send
->
port
=
0
;
// single port
send
->
len
=
len
;
...
...
@@ -283,9 +283,9 @@ void Runner::eth_send(const void *data, size_t len) {
SIMBRICKS_PROTO_NET_D2N_OWN_NET
;
}
void
Runner
::
p
oll
_h2d
()
{
void
Runner
::
P
oll
H2D
()
{
volatile
union
SimbricksProtoPcieH2D
*
msg
=
SimbricksNicIfH2DPoll
(
&
nsparams
,
main_time
);
SimbricksNicIfH2DPoll
(
&
nsparams
_
,
main_time
);
uint8_t
type
;
if
(
msg
==
NULL
)
...
...
@@ -294,23 +294,23 @@ void Runner::poll_h2d() {
type
=
msg
->
dummy
.
own_type
&
SIMBRICKS_PROTO_PCIE_H2D_MSG_MASK
;
switch
(
type
)
{
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_READ
:
h2d_r
ead
(
&
msg
->
read
);
H2DR
ead
(
&
msg
->
read
);
break
;
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_WRITE
:
h2d_w
rite
(
&
msg
->
write
);
H2DW
rite
(
&
msg
->
write
);
break
;
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_READCOMP
:
h2d_r
eadcomp
(
&
msg
->
readcomp
);
H2DR
eadcomp
(
&
msg
->
readcomp
);
break
;
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_WRITECOMP
:
h2d_w
ritecomp
(
&
msg
->
writecomp
);
H2DW
ritecomp
(
&
msg
->
writecomp
);
break
;
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_DEVCTRL
:
h2d_d
evctrl
(
&
msg
->
devctrl
);
H2DD
evctrl
(
&
msg
->
devctrl
);
break
;
case
SIMBRICKS_PROTO_PCIE_H2D_MSG_SYNC
:
...
...
@@ -324,9 +324,9 @@ void Runner::poll_h2d() {
SimbricksNicIfH2DNext
();
}
void
Runner
::
p
oll
_n2d
()
{
void
Runner
::
P
oll
N2D
()
{
volatile
union
SimbricksProtoNetN2D
*
msg
=
SimbricksNicIfN2DPoll
(
&
nsparams
,
main_time
);
SimbricksNicIfN2DPoll
(
&
nsparams
_
,
main_time
);
uint8_t
t
;
if
(
msg
==
NULL
)
...
...
@@ -335,7 +335,7 @@ void Runner::poll_n2d() {
t
=
msg
->
dummy
.
own_type
&
SIMBRICKS_PROTO_NET_N2D_MSG_MASK
;
switch
(
t
)
{
case
SIMBRICKS_PROTO_NET_N2D_MSG_RECV
:
e
th
_r
ecv
(
&
msg
->
recv
);
E
th
R
ecv
(
&
msg
->
recv
);
break
;
case
SIMBRICKS_PROTO_NET_N2D_MSG_SYNC
:
...
...
@@ -349,50 +349,50 @@ void Runner::poll_n2d() {
SimbricksNicIfN2DNext
();
}
uint64_t
Runner
::
t
ime
_p
s
()
const
{
uint64_t
Runner
::
T
ime
P
s
()
const
{
return
main_time
;
}
uint64_t
Runner
::
g
et
_mac_a
ddr
()
const
{
return
mac_addr
;
uint64_t
Runner
::
G
et
MacA
ddr
()
const
{
return
mac_addr
_
;
}
bool
Runner
::
e
vent
_n
ext
(
uint64_t
&
retval
)
{
if
(
events
.
empty
())
bool
Runner
::
E
vent
N
ext
(
uint64_t
&
retval
)
{
if
(
events
_
.
empty
())
return
false
;
retval
=
(
*
events
.
begin
())
->
time
;
retval
=
(
*
events
_
.
begin
())
->
time
_
;
return
true
;
}
void
Runner
::
e
vent
_t
rigger
()
{
auto
it
=
events
.
begin
();
if
(
it
==
events
.
end
())
void
Runner
::
E
vent
T
rigger
()
{
auto
it
=
events
_
.
begin
();
if
(
it
==
events
_
.
end
())
return
;
TimedEvent
*
ev
=
*
it
;
// event is in the future
if
(
ev
->
time
>
main_time
)
if
(
ev
->
time
_
>
main_time
)
return
;
events
.
erase
(
it
);
dev
.
t
imed
_event
(
*
ev
);
events
_
.
erase
(
it
);
dev
_
.
T
imed
(
*
ev
);
}
Runner
::
Runner
(
Device
&
dev
_
)
:
dev
(
dev
_
),
events
(
e
vent
_c
mp
())
{
Runner
::
Runner
(
Device
&
dev
)
:
dev
_
(
dev
),
events
_
(
E
vent
C
mp
())
{
// mac_addr = lrand48() & ~(3ULL << 46);
dma_pending
=
0
;
dma_pending
_
=
0
;
srand48
(
time
(
NULL
)
^
getpid
());
mac_addr
=
lrand48
();
mac_addr
<<=
16
;
mac_addr
^=
lrand48
();
mac_addr
&=
~
3ULL
;
mac_addr
_
=
lrand48
();
mac_addr
_
<<=
16
;
mac_addr
_
^=
lrand48
();
mac_addr
_
&=
~
3ULL
;
std
::
cerr
<<
std
::
hex
<<
mac_addr
<<
std
::
endl
;
std
::
cerr
<<
std
::
hex
<<
mac_addr
_
<<
std
::
endl
;
}
int
Runner
::
r
unMain
(
int
argc
,
char
*
argv
[])
{
int
Runner
::
R
unMain
(
int
argc
,
char
*
argv
[])
{
uint64_t
next_ts
;
uint64_t
max_step
=
10000
;
uint64_t
sync_period
=
100
*
1000ULL
;
...
...
@@ -421,42 +421,42 @@ int Runner::runMain(int argc, char *argv[]) {
signal
(
SIGINT
,
sigint_handler
);
signal
(
SIGUSR1
,
sigusr1_handler
);
memset
(
&
dintro
,
0
,
sizeof
(
dintro
));
dev
.
s
etup
_i
ntro
(
dintro
);
nsparams
.
sync_pci
=
1
;
nsparams
.
sync_eth
=
1
;
nsparams
.
pci_socket_path
=
argv
[
1
];
nsparams
.
eth_socket_path
=
argv
[
2
];
nsparams
.
shm_path
=
argv
[
3
];
nsparams
.
pci_latency
=
pci_latency
;
nsparams
.
eth_latency
=
eth_latency
;
nsparams
.
sync_delay
=
sync_period
;
memset
(
&
dintro
_
,
0
,
sizeof
(
dintro
_
));
dev
_
.
S
etup
I
ntro
(
dintro
_
);
nsparams
_
.
sync_pci
=
1
;
nsparams
_
.
sync_eth
=
1
;
nsparams
_
.
pci_socket_path
=
argv
[
1
];
nsparams
_
.
eth_socket_path
=
argv
[
2
];
nsparams
_
.
shm_path
=
argv
[
3
];
nsparams
_
.
pci_latency
=
pci_latency
;
nsparams
_
.
eth_latency
=
eth_latency
;
nsparams
_
.
sync_delay
=
sync_period
;
assert
(
sync_mode
==
SIMBRICKS_PROTO_SYNC_SIMBRICKS
||
sync_mode
==
SIMBRICKS_PROTO_SYNC_BARRIER
);
nsparams
.
sync_mode
=
sync_mode
;
nsparams
_
.
sync_mode
=
sync_mode
;
if
(
SimbricksNicIfInit
(
&
nsparams
,
&
dintro
))
{
if
(
SimbricksNicIfInit
(
&
nsparams
_
,
&
dintro
_
))
{
return
EXIT_FAILURE
;
}
fprintf
(
stderr
,
"sync_pci=%d sync_eth=%d
\n
"
,
nsparams
.
sync_pci
,
nsparams
.
sync_eth
);
fprintf
(
stderr
,
"sync_pci=%d sync_eth=%d
\n
"
,
nsparams
_
.
sync_pci
,
nsparams
_
.
sync_eth
);
bool
is_sync
=
nsparams
.
sync_pci
||
nsparams
.
sync_eth
;
bool
is_sync
=
nsparams
_
.
sync_pci
||
nsparams
_
.
sync_eth
;
while
(
!
exiting
)
{
while
(
SimbricksNicIfSync
(
&
nsparams
,
main_time
))
{
while
(
SimbricksNicIfSync
(
&
nsparams
_
,
main_time
))
{
fprintf
(
stderr
,
"warn: SimbricksNicIfSync failed (t=%lu)
\n
"
,
main_time
);
}
SimbricksNicIfAdvanceEpoch
(
&
nsparams
,
main_time
);
SimbricksNicIfAdvanceEpoch
(
&
nsparams
_
,
main_time
);
do
{
p
oll
_h2d
();
p
oll
_n2d
();
e
vent
_t
rigger
();
P
oll
H2D
();
P
oll
N2D
();
E
vent
T
rigger
();
if
(
is_sync
)
{
next_ts
=
SimbricksNicIfNextTimestamp
(
&
nsparams
);
next_ts
=
SimbricksNicIfNextTimestamp
(
&
nsparams
_
);
if
(
next_ts
>
main_time
+
max_step
)
next_ts
=
main_time
+
max_step
;
}
else
{
...
...
@@ -464,10 +464,10 @@ int Runner::runMain(int argc, char *argv[]) {
}
uint64_t
ev_ts
;
if
(
e
vent
_n
ext
(
ev_ts
)
&&
ev_ts
<
next_ts
)
if
(
E
vent
N
ext
(
ev_ts
)
&&
ev_ts
<
next_ts
)
next_ts
=
ev_ts
;
}
while
(
next_ts
<=
main_time
&&
!
exiting
);
main_time
=
SimbricksNicIfAdvanceTime
(
&
nsparams
,
next_ts
);
main_time
=
SimbricksNicIfAdvanceTime
(
&
nsparams
_
,
next_ts
);
}
fprintf
(
stderr
,
"exit main_time: %lu
\n
"
,
main_time
);
...
...
@@ -475,14 +475,14 @@ int Runner::runMain(int argc, char *argv[]) {
return
0
;
}
void
Runner
::
Device
::
t
imed
_event
(
TimedEvent
&
te
)
{
void
Runner
::
Device
::
T
imed
(
TimedEvent
&
te
)
{
}
void
Runner
::
Device
::
d
evctrl
_u
pdate
(
void
Runner
::
Device
::
D
evctrl
U
pdate
(
struct
SimbricksProtoPcieH2DDevctrl
&
devctrl
)
{
int_intx_en
=
devctrl
.
flags
&
SIMBRICKS_PROTO_PCIE_CTRL_INTX_EN
;
int_msi_en
=
devctrl
.
flags
&
SIMBRICKS_PROTO_PCIE_CTRL_MSI_EN
;
int_msix_en
=
devctrl
.
flags
&
SIMBRICKS_PROTO_PCIE_CTRL_MSIX_EN
;
int_intx_en
_
=
devctrl
.
flags
&
SIMBRICKS_PROTO_PCIE_CTRL_INTX_EN
;
int_msi_en
_
=
devctrl
.
flags
&
SIMBRICKS_PROTO_PCIE_CTRL_MSI_EN
;
int_msix_en
_
=
devctrl
.
flags
&
SIMBRICKS_PROTO_PCIE_CTRL_MSIX_EN
;
}
}
// namespace nicbm
lib/simbricks/nicbm/nicbm.h
View file @
c7e904bf
...
...
@@ -36,23 +36,23 @@ extern "C" {
namespace
nicbm
{
static
const
size_t
MAX_DMA_LEN
=
2048
;
static
const
size_t
kMaxDmaLen
=
2048
;
class
DMAOp
{
public:
virtual
~
DMAOp
()
{
}
bool
write
;
uint64_t
dma_addr
;
size_t
len
;
void
*
data
;
bool
write
_
;
uint64_t
dma_addr
_
;
size_t
len
_
;
void
*
data
_
;
};
class
TimedEvent
{
public:
virtual
~
TimedEvent
()
{
}
uint64_t
time
;
uint64_t
time
_
;
};
/**
...
...
@@ -65,104 +65,104 @@ class Runner {
public:
class
Device
{
protected:
bool
int_intx_en
;
bool
int_msi_en
;
bool
int_msix_en
;
bool
int_intx_en
_
;
bool
int_msi_en
_
;
bool
int_msix_en
_
;
public:
/**
* Initialize device specific parameters (pci dev/vendor id,
* BARs etc. in intro struct.
*/
virtual
void
s
etup
_i
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
=
0
;
virtual
void
S
etup
I
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
=
0
;
/**
* execute a register read from `bar`:`addr` of length `len`.
* Should store result in `dest`.
*/
virtual
void
r
eg
_r
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
virtual
void
R
eg
R
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
size_t
len
)
=
0
;
/**
* execute a register write to `bar`:`addr` of length `len`,
* with the data in `src`.
*/
virtual
void
r
eg
_w
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
virtual
void
R
eg
W
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
size_t
len
)
=
0
;
/**
* the previously issued DMA operation `op` completed.
*/
virtual
void
d
ma
_c
omplete
(
DMAOp
&
op
)
=
0
;
virtual
void
D
ma
C
omplete
(
DMAOp
&
op
)
=
0
;
/**
* A packet has arrived on the wire, of length `len` with
* payload `data`.
*/
virtual
void
e
th
_r
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
=
0
;
virtual
void
E
th
R
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
=
0
;
/**
* A timed event is due.
*/
virtual
void
t
imed
_event
(
TimedEvent
&
ev
);
virtual
void
T
imed
(
TimedEvent
&
ev
);
/**
* Device control update
*/
virtual
void
d
evctrl
_u
pdate
(
struct
SimbricksProtoPcieH2DDevctrl
&
devctrl
);
virtual
void
D
evctrl
U
pdate
(
struct
SimbricksProtoPcieH2DDevctrl
&
devctrl
);
};
protected:
struct
e
vent
_c
mp
{
struct
E
vent
C
mp
{
bool
operator
()(
TimedEvent
*
a
,
TimedEvent
*
b
)
{
return
a
->
time
<
b
->
time
;
return
a
->
time
_
<
b
->
time
_
;
}
};
Device
&
dev
;
std
::
set
<
TimedEvent
*
,
e
vent
_c
mp
>
events
;
std
::
deque
<
DMAOp
*>
dma_queue
;
size_t
dma_pending
;
uint64_t
mac_addr
;
struct
SimbricksNicIfParams
nsparams
;
struct
SimbricksProtoPcieDevIntro
dintro
;
Device
&
dev
_
;
std
::
set
<
TimedEvent
*
,
E
vent
C
mp
>
events
_
;
std
::
deque
<
DMAOp
*>
dma_queue
_
;
size_t
dma_pending
_
;
uint64_t
mac_addr
_
;
struct
SimbricksNicIfParams
nsparams
_
;
struct
SimbricksProtoPcieDevIntro
dintro
_
;
volatile
union
SimbricksProtoPcieD2H
*
d2h_a
lloc
(
void
);
volatile
union
SimbricksProtoNetD2N
*
d2n_a
lloc
(
void
);
volatile
union
SimbricksProtoPcieD2H
*
D2HA
lloc
();
volatile
union
SimbricksProtoNetD2N
*
D2NA
lloc
();
void
h2d_r
ead
(
volatile
struct
SimbricksProtoPcieH2DRead
*
read
);
void
h2d_w
rite
(
volatile
struct
SimbricksProtoPcieH2DWrite
*
write
);
void
h2d_r
eadcomp
(
volatile
struct
SimbricksProtoPcieH2DReadcomp
*
rc
);
void
h2d_w
ritecomp
(
volatile
struct
SimbricksProtoPcieH2DWritecomp
*
wc
);
void
h2d_d
evctrl
(
volatile
struct
SimbricksProtoPcieH2DDevctrl
*
dc
);
void
p
oll
_h2d
();
void
H2DR
ead
(
volatile
struct
SimbricksProtoPcieH2DRead
*
read
);
void
H2DW
rite
(
volatile
struct
SimbricksProtoPcieH2DWrite
*
write
);
void
H2DR
eadcomp
(
volatile
struct
SimbricksProtoPcieH2DReadcomp
*
rc
);
void
H2DW
ritecomp
(
volatile
struct
SimbricksProtoPcieH2DWritecomp
*
wc
);
void
H2DD
evctrl
(
volatile
struct
SimbricksProtoPcieH2DDevctrl
*
dc
);
void
P
oll
H2D
();
void
e
th
_r
ecv
(
volatile
struct
SimbricksProtoNetN2DRecv
*
recv
);
void
p
oll
_n2d
();
void
E
th
R
ecv
(
volatile
struct
SimbricksProtoNetN2DRecv
*
recv
);
void
P
oll
N2D
();
bool
e
vent
_n
ext
(
uint64_t
&
retval
);
void
e
vent
_t
rigger
();
bool
E
vent
N
ext
(
uint64_t
&
retval
);
void
E
vent
T
rigger
();
void
d
ma
_d
o
(
DMAOp
&
op
);
void
d
ma
_t
rigger
();
void
D
ma
D
o
(
DMAOp
&
op
);
void
D
ma
T
rigger
();
public:
Runner
(
Device
&
dev_
);
/** Run the simulation */
int
r
unMain
(
int
argc
,
char
*
argv
[]);
int
R
unMain
(
int
argc
,
char
*
argv
[]);
/* these three are for `Runner::Device`. */
void
i
ssue
_d
ma
(
DMAOp
&
op
);
void
m
si
_i
ssue
(
uint8_t
vec
);
void
m
si
x_i
ssue
(
uint8_t
vec
);
void
e
th
_s
end
(
const
void
*
data
,
size_t
len
);
void
I
ssue
D
ma
(
DMAOp
&
op
);
void
M
si
I
ssue
(
uint8_t
vec
);
void
M
si
XI
ssue
(
uint8_t
vec
);
void
E
th
S
end
(
const
void
*
data
,
size_t
len
);
void
e
vent
_s
chedule
(
TimedEvent
&
evt
);
void
e
vent
_c
ancel
(
TimedEvent
&
evt
);
void
E
vent
S
chedule
(
TimedEvent
&
evt
);
void
E
vent
C
ancel
(
TimedEvent
&
evt
);
uint64_t
t
ime
_p
s
()
const
;
uint64_t
g
et
_mac_a
ddr
()
const
;
uint64_t
T
ime
P
s
()
const
;
uint64_t
G
et
MacA
ddr
()
const
;
};
/**
...
...
@@ -171,21 +171,21 @@ class Runner {
template
<
class
TReg
=
uint32_t
>
class
SimpleDevice
:
public
Runner
::
Device
{
public:
virtual
TReg
r
eg
_r
ead
(
uint8_t
bar
,
uint64_t
addr
)
=
0
;
virtual
void
r
eg
_w
rite
(
uint8_t
bar
,
uint64_t
addr
,
TReg
val
)
=
0
;
virtual
TReg
R
eg
R
ead
(
uint8_t
bar
,
uint64_t
addr
)
=
0
;
virtual
void
R
eg
W
rite
(
uint8_t
bar
,
uint64_t
addr
,
TReg
val
)
=
0
;
virtual
void
r
eg
_r
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
size_t
len
)
{
void
R
eg
R
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
size_t
len
)
override
{
assert
(
len
==
sizeof
(
TReg
));
TReg
r
=
r
eg
_r
ead
(
bar
,
addr
);
TReg
r
=
R
eg
R
ead
(
bar
,
addr
);
memcpy
(
dest
,
&
r
,
sizeof
(
r
));
}
virtual
void
r
eg
_w
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
size_t
len
)
{
void
R
eg
W
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
size_t
len
)
override
{
assert
(
len
==
sizeof
(
TReg
));
TReg
r
;
memcpy
(
&
r
,
src
,
sizeof
(
r
));
r
eg
_w
rite
(
bar
,
addr
,
r
);
R
eg
W
rite
(
bar
,
addr
,
r
);
}
};
}
// namespace nicbm
...
...
sims/nic/corundum_bm/corundum_bm.cc
View file @
c7e904bf
...
...
@@ -152,11 +152,11 @@ EventRing::~EventRing() {
}
void
EventRing
::
dmaDone
(
DMAOp
*
op
)
{
assert
(
op
->
write
);
assert
(
op
->
write
_
);
switch
(
op
->
type
)
{
case
DMA_TYPE_EVENT
:
if
(
updatePtr
((
ptr_t
)
op
->
tag
,
true
))
{
runner
->
m
si
_i
ssue
(
0
);
runner
->
M
si
I
ssue
(
0
);
}
delete
op
;
break
;
...
...
@@ -178,16 +178,16 @@ void EventRing::issueEvent(unsigned type, unsigned source) {
/* Issue DMA write */
DMAOp
*
op
=
new
DMAOp
;
op
->
type
=
DMA_TYPE_EVENT
;
op
->
dma_addr
=
dma_addr
;
op
->
len
=
EVENT_SIZE
;
op
->
dma_addr
_
=
dma_addr
;
op
->
len
_
=
EVENT_SIZE
;
op
->
ring
=
this
;
op
->
tag
=
this
->
_currHead
;
op
->
write
=
true
;
Event
*
event
=
(
Event
*
)
op
->
data
;
op
->
write
_
=
true
;
Event
*
event
=
(
Event
*
)
op
->
data
_
;
memset
(
event
,
0
,
sizeof
(
Event
));
event
->
type
=
type
;
event
->
source
=
source
;
runner
->
i
ssue
_d
ma
(
*
op
);
runner
->
I
ssue
D
ma
(
*
op
);
this
->
_currHead
++
;
this
->
armed
=
false
;
}
...
...
@@ -200,7 +200,7 @@ CplRing::~CplRing() {
}
void
CplRing
::
dmaDone
(
DMAOp
*
op
)
{
assert
(
op
->
write
);
assert
(
op
->
write
_
);
switch
(
op
->
type
)
{
case
DMA_TYPE_TX_CPL
:
case
DMA_TYPE_RX_CPL
:
{
...
...
@@ -231,17 +231,17 @@ void CplRing::complete(unsigned index, size_t len, bool tx) {
/* Issue DMA write */
DMAOp
*
op
=
new
DMAOp
;
op
->
type
=
data
.
tx
?
DMA_TYPE_TX_CPL
:
DMA_TYPE_RX_CPL
;
op
->
dma_addr
=
dma_addr
;
op
->
len
=
CPL_SIZE
;
op
->
dma_addr
_
=
dma_addr
;
op
->
len
_
=
CPL_SIZE
;
op
->
ring
=
this
;
op
->
tag
=
this
->
_currHead
;
op
->
write
=
true
;
Cpl
*
cpl
=
(
Cpl
*
)
op
->
data
;
op
->
write
_
=
true
;
Cpl
*
cpl
=
(
Cpl
*
)
op
->
data
_
;
memset
(
cpl
,
0
,
sizeof
(
Cpl
));
cpl
->
index
=
data
.
index
;
cpl
->
len
=
data
.
len
;
this
->
pending
.
pop_front
();
runner
->
i
ssue
_d
ma
(
*
op
);
runner
->
I
ssue
D
ma
(
*
op
);
this
->
_currHead
++
;
}
}
...
...
@@ -260,12 +260,12 @@ void TxRing::setHeadPtr(ptr_t ptr) {
/* Issue DMA read */
DMAOp
*
op
=
new
DMAOp
;
op
->
type
=
DMA_TYPE_DESC
;
op
->
dma_addr
=
dma_addr
;
op
->
len
=
DESC_SIZE
;
op
->
dma_addr
_
=
dma_addr
;
op
->
len
_
=
DESC_SIZE
;
op
->
ring
=
this
;
op
->
tag
=
this
->
_currTail
;
op
->
write
=
false
;
runner
->
i
ssue
_d
ma
(
*
op
);
op
->
write
_
=
false
;
runner
->
I
ssue
D
ma
(
*
op
);
this
->
_currTail
++
;
}
}
...
...
@@ -273,20 +273,20 @@ void TxRing::setHeadPtr(ptr_t ptr) {
void
TxRing
::
dmaDone
(
DMAOp
*
op
)
{
switch
(
op
->
type
)
{
case
DMA_TYPE_DESC
:
{
assert
(
!
op
->
write
);
Desc
*
desc
=
(
Desc
*
)
op
->
data
;
assert
(
!
op
->
write
_
);
Desc
*
desc
=
(
Desc
*
)
op
->
data
_
;
op
->
type
=
DMA_TYPE_MEM
;
op
->
dma_addr
=
desc
->
addr
;
op
->
len
=
desc
->
len
;
op
->
write
=
false
;
runner
->
i
ssue
_d
ma
(
*
op
);
op
->
dma_addr
_
=
desc
->
addr
;
op
->
len
_
=
desc
->
len
;
op
->
write
_
=
false
;
runner
->
I
ssue
D
ma
(
*
op
);
break
;
}
case
DMA_TYPE_MEM
:
assert
(
!
op
->
write
);
runner
->
e
th
_s
end
(
op
->
data
,
op
->
len
);
assert
(
!
op
->
write
_
);
runner
->
E
th
S
end
(
op
->
data
_
,
op
->
len
_
);
updatePtr
((
ptr_t
)
op
->
tag
,
false
);
this
->
txCplRing
->
complete
(
op
->
tag
,
op
->
len
,
true
);
this
->
txCplRing
->
complete
(
op
->
tag
,
op
->
len
_
,
true
);
delete
op
;
break
;
default:
...
...
@@ -304,21 +304,21 @@ RxRing::~RxRing() {
void
RxRing
::
dmaDone
(
DMAOp
*
op
)
{
switch
(
op
->
type
)
{
case
DMA_TYPE_DESC
:
{
assert
(
!
op
->
write
);
Desc
*
desc
=
(
Desc
*
)
op
->
data
;
assert
(
!
op
->
write
_
);
Desc
*
desc
=
(
Desc
*
)
op
->
data
_
;
op
->
type
=
DMA_TYPE_MEM
;
op
->
dma_addr
=
desc
->
addr
;
op
->
len
=
op
->
rx_data
->
len
;
memcpy
((
void
*
)
op
->
data
,
(
void
*
)
op
->
rx_data
->
data
,
op
->
len
);
op
->
dma_addr
_
=
desc
->
addr
;
op
->
len
_
=
op
->
rx_data
->
len
;
memcpy
((
void
*
)
op
->
data
_
,
(
void
*
)
op
->
rx_data
->
data
,
op
->
len
_
);
delete
op
->
rx_data
;
op
->
write
=
true
;
runner
->
i
ssue
_d
ma
(
*
op
);
op
->
write
_
=
true
;
runner
->
I
ssue
D
ma
(
*
op
);
break
;
}
case
DMA_TYPE_MEM
:
assert
(
op
->
write
);
assert
(
op
->
write
_
);
updatePtr
((
ptr_t
)
op
->
tag
,
false
);
this
->
rxCplRing
->
complete
(
op
->
tag
,
op
->
len
,
false
);
this
->
rxCplRing
->
complete
(
op
->
tag
,
op
->
len
_
,
false
);
delete
op
;
break
;
default:
...
...
@@ -337,13 +337,13 @@ void RxRing::rx(RxData *rx_data) {
/* Issue DMA read */
DMAOp
*
op
=
new
DMAOp
;
op
->
type
=
DMA_TYPE_DESC
;
op
->
dma_addr
=
dma_addr
;
op
->
len
=
DESC_SIZE
;
op
->
dma_addr
_
=
dma_addr
;
op
->
len
_
=
DESC_SIZE
;
op
->
ring
=
this
;
op
->
rx_data
=
rx_data
;
op
->
tag
=
this
->
_currTail
;
op
->
write
=
false
;
runner
->
i
ssue
_d
ma
(
*
op
);
op
->
write
_
=
false
;
runner
->
I
ssue
D
ma
(
*
op
);
this
->
_currTail
++
;
}
...
...
@@ -465,7 +465,7 @@ Corundum::Corundum()
Corundum
::~
Corundum
()
{
}
reg_t
Corundum
::
r
eg
_r
ead
(
uint8_t
bar
,
addr_t
addr
)
{
reg_t
Corundum
::
R
eg
R
ead
(
uint8_t
bar
,
addr_t
addr
)
{
switch
(
addr
)
{
case
REG_FW_ID
:
return
32
;
...
...
@@ -555,7 +555,7 @@ reg_t Corundum::reg_read(uint8_t bar, addr_t addr) {
}
}
void
Corundum
::
r
eg
_w
rite
(
uint8_t
bar
,
uint64_t
addr
,
reg_t
val
)
{
void
Corundum
::
R
eg
W
rite
(
uint8_t
bar
,
uint64_t
addr
,
reg_t
val
)
{
switch
(
addr
)
{
case
REG_FW_ID
:
case
REG_FW_VER
:
...
...
@@ -686,7 +686,7 @@ void Corundum::reg_write(uint8_t bar, uint64_t addr, reg_t val) {
}
}
void
Corundum
::
s
etup
_i
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
{
void
Corundum
::
S
etup
I
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
{
di
.
bars
[
0
].
len
=
1
<<
24
;
di
.
bars
[
0
].
flags
=
SIMBRICKS_PROTO_PCIE_BAR_64
;
di
.
pci_vendor_id
=
0x5543
;
...
...
@@ -697,12 +697,12 @@ void Corundum::setup_intro(struct SimbricksProtoPcieDevIntro &di) {
di
.
pci_msi_nvecs
=
32
;
}
void
Corundum
::
d
ma
_c
omplete
(
nicbm
::
DMAOp
&
op
)
{
void
Corundum
::
D
ma
C
omplete
(
nicbm
::
DMAOp
&
op
)
{
DMAOp
*
op_
=
reinterpret_cast
<
DMAOp
*>
(
&
op
);
op_
->
ring
->
dmaDone
(
op_
);
}
void
Corundum
::
e
th
_r
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
{
void
Corundum
::
E
th
R
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
{
RxData
*
rx_data
=
new
RxData
;
memcpy
((
void
*
)
rx_data
->
data
,
data
,
len
);
rx_data
->
len
=
len
;
...
...
@@ -714,5 +714,5 @@ void Corundum::eth_rx(uint8_t port, const void *data, size_t len) {
int
main
(
int
argc
,
char
*
argv
[])
{
corundum
::
Corundum
dev
;
runner
=
new
nicbm
::
Runner
(
dev
);
return
runner
->
r
unMain
(
argc
,
argv
);
return
runner
->
R
unMain
(
argc
,
argv
);
}
sims/nic/corundum_bm/corundum_bm.h
View file @
c7e904bf
...
...
@@ -178,7 +178,7 @@ struct RxData {
struct
DMAOp
:
public
nicbm
::
DMAOp
{
DMAOp
()
{
data
=
databuf
;
data
_
=
databuf
;
}
uint8_t
type
;
...
...
@@ -323,11 +323,11 @@ class Corundum : public nicbm::SimpleDevice<reg_t> {
Corundum
();
~
Corundum
();
virtual
void
s
etup
_i
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
);
virtual
reg_t
r
eg
_r
ead
(
uint8_t
bar
,
addr_t
addr
);
virtual
void
r
eg
_w
rite
(
uint8_t
bar
,
addr_t
addr
,
reg_t
val
);
virtual
void
d
ma
_c
omplete
(
nicbm
::
DMAOp
&
op
);
virtual
void
e
th
_r
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
);
void
S
etup
I
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
override
;
reg_t
R
eg
R
ead
(
uint8_t
bar
,
addr_t
addr
)
override
;
void
R
eg
W
rite
(
uint8_t
bar
,
addr_t
addr
,
reg_t
val
)
override
;
void
D
ma
C
omplete
(
nicbm
::
DMAOp
&
op
)
override
;
void
E
th
R
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
override
;
private:
EventRing
eventRing
;
...
...
sims/nic/i40e_bm/i40e_adminq.cc
View file @
c7e904bf
...
...
@@ -226,7 +226,7 @@ void queue_admin_tx::admin_desc_ctx::process() {
reinterpret_cast
<
struct
i40e_aqc_mac_address_read
*>
(
d
->
params
.
raw
);
struct
i40e_aqc_mac_address_read_data
ard
;
uint64_t
mac
=
runner
->
g
et
_mac_a
ddr
();
uint64_t
mac
=
runner
->
G
et
MacA
ddr
();
#ifdef DEBUG_ADMINQ
queue
.
log
<<
" mac = "
<<
mac
<<
logger
::
endl
;
#endif
...
...
sims/nic/i40e_bm/i40e_bm.cc
View file @
c7e904bf
...
...
@@ -48,7 +48,7 @@ i40e_bm::i40e_bm()
i40e_bm
::~
i40e_bm
()
{
}
void
i40e_bm
::
s
etup
_i
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
{
void
i40e_bm
::
S
etup
I
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
{
di
.
bars
[
BAR_REGS
].
len
=
4
*
1024
*
1024
;
di
.
bars
[
BAR_REGS
].
flags
=
SIMBRICKS_PROTO_PCIE_BAR_64
;
di
.
bars
[
BAR_IO
].
len
=
32
;
...
...
@@ -72,7 +72,7 @@ void i40e_bm::setup_intro(struct SimbricksProtoPcieDevIntro &di) {
di
.
psi_msix_cap_offset
=
0x70
;
}
void
i40e_bm
::
d
ma
_c
omplete
(
nicbm
::
DMAOp
&
op
)
{
void
i40e_bm
::
D
ma
C
omplete
(
nicbm
::
DMAOp
&
op
)
{
dma_base
&
dma
=
dynamic_cast
<
dma_base
&>
(
op
);
#ifdef DEBUG_DEV
log
<<
"dma_complete("
<<
&
op
<<
")"
<<
logger
::
endl
;
...
...
@@ -80,21 +80,21 @@ void i40e_bm::dma_complete(nicbm::DMAOp &op) {
dma
.
done
();
}
void
i40e_bm
::
e
th
_r
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
{
void
i40e_bm
::
E
th
R
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
{
#ifdef DEBUG_DEV
log
<<
"i40e: received packet len="
<<
len
<<
logger
::
endl
;
#endif
lanmgr
.
packet_received
(
data
,
len
);
}
void
i40e_bm
::
r
eg
_r
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
size_t
len
)
{
void
i40e_bm
::
R
eg
R
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
size_t
len
)
{
uint32_t
*
dest_p
=
reinterpret_cast
<
uint32_t
*>
(
dest
);
if
(
len
==
4
)
{
dest_p
[
0
]
=
r
eg
_r
ead32
(
bar
,
addr
);
dest_p
[
0
]
=
R
eg
R
ead32
(
bar
,
addr
);
}
else
if
(
len
==
8
)
{
dest_p
[
0
]
=
r
eg
_r
ead32
(
bar
,
addr
);
dest_p
[
1
]
=
r
eg
_r
ead32
(
bar
,
addr
+
4
);
dest_p
[
0
]
=
R
eg
R
ead32
(
bar
,
addr
);
dest_p
[
1
]
=
R
eg
R
ead32
(
bar
,
addr
+
4
);
}
else
{
log
<<
"currently we only support 4/8B reads (got "
<<
len
<<
")"
<<
logger
::
endl
;
...
...
@@ -102,7 +102,7 @@ void i40e_bm::reg_read(uint8_t bar, uint64_t addr, void *dest, size_t len) {
}
}
uint32_t
i40e_bm
::
r
eg
_r
ead32
(
uint8_t
bar
,
uint64_t
addr
)
{
uint32_t
i40e_bm
::
R
eg
R
ead32
(
uint8_t
bar
,
uint64_t
addr
)
{
if
(
bar
==
BAR_REGS
)
{
return
reg_mem_read32
(
addr
);
}
else
if
(
bar
==
BAR_IO
)
{
...
...
@@ -113,15 +113,15 @@ uint32_t i40e_bm::reg_read32(uint8_t bar, uint64_t addr) {
}
}
void
i40e_bm
::
r
eg
_w
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
void
i40e_bm
::
R
eg
W
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
size_t
len
)
{
const
uint32_t
*
src_p
=
reinterpret_cast
<
const
uint32_t
*>
(
src
);
if
(
len
==
4
)
{
r
eg
_w
rite32
(
bar
,
addr
,
src_p
[
0
]);
R
eg
W
rite32
(
bar
,
addr
,
src_p
[
0
]);
}
else
if
(
len
==
8
)
{
r
eg
_w
rite32
(
bar
,
addr
,
src_p
[
0
]);
r
eg
_w
rite32
(
bar
,
addr
+
4
,
src_p
[
1
]);
R
eg
W
rite32
(
bar
,
addr
,
src_p
[
0
]);
R
eg
W
rite32
(
bar
,
addr
+
4
,
src_p
[
1
]);
}
else
{
log
<<
"currently we only support 4/8B writes (got "
<<
len
<<
")"
<<
logger
::
endl
;
...
...
@@ -129,7 +129,7 @@ void i40e_bm::reg_write(uint8_t bar, uint64_t addr, const void *src,
}
}
void
i40e_bm
::
r
eg
_w
rite32
(
uint8_t
bar
,
uint64_t
addr
,
uint32_t
val
)
{
void
i40e_bm
::
R
eg
W
rite32
(
uint8_t
bar
,
uint64_t
addr
,
uint32_t
val
)
{
if
(
bar
==
BAR_REGS
)
{
reg_mem_write32
(
addr
,
val
);
}
else
if
(
bar
==
BAR_IO
)
{
...
...
@@ -246,7 +246,7 @@ uint32_t i40e_bm::reg_mem_read32(uint64_t addr) {
break
;
case
I40E_GLVFGEN_TIMER
:
val
=
runner
->
t
ime
_p
s
()
/
1000000
;
val
=
runner
->
T
ime
P
s
()
/
1000000
;
break
;
case
I40E_PFINT_LNKLST0
:
...
...
@@ -651,7 +651,7 @@ void i40e_bm::reg_mem_write32(uint64_t addr, uint32_t val) {
}
}
void
i40e_bm
::
t
imed
_event
(
nicbm
::
TimedEvent
&
ev
)
{
void
i40e_bm
::
T
imed
(
nicbm
::
TimedEvent
&
ev
)
{
int_ev
&
iev
=
*
((
int_ev
*
)
&
ev
);
#ifdef DEBUG_DEV
log
<<
"timed_event: triggering interrupt ("
<<
iev
.
vec
<<
")"
...
...
@@ -659,17 +659,17 @@ void i40e_bm::timed_event(nicbm::TimedEvent &ev) {
#endif
iev
.
armed
=
false
;
if
(
int_msix_en
)
{
runner
->
m
si
x_i
ssue
(
iev
.
vec
);
if
(
int_msix_en
_
)
{
runner
->
M
si
XI
ssue
(
iev
.
vec
);
}
else
if
(
iev
.
vec
>
0
)
{
log
<<
"timed_event: MSI-X disabled, but vec != 0"
<<
logger
::
endl
;
abort
();
}
else
{
runner
->
m
si
_i
ssue
(
0
);
runner
->
M
si
I
ssue
(
0
);
}
}
void
i40e_bm
::
s
ignal
_i
nterrupt
(
uint16_t
vec
,
uint8_t
itr
)
{
void
i40e_bm
::
S
ignal
I
nterrupt
(
uint16_t
vec
,
uint8_t
itr
)
{
int_ev
&
iev
=
intevs
[
vec
];
uint64_t
mindelay
;
...
...
@@ -688,9 +688,9 @@ void i40e_bm::signal_interrupt(uint16_t vec, uint8_t itr) {
abort
();
}
uint64_t
curtime
=
runner
->
t
ime
_p
s
();
uint64_t
curtime
=
runner
->
T
ime
P
s
();
uint64_t
newtime
=
curtime
+
mindelay
;
if
(
iev
.
armed
&&
iev
.
time
<=
newtime
)
{
if
(
iev
.
armed
&&
iev
.
time
_
<=
newtime
)
{
// already armed and this is not scheduled sooner
#ifdef DEBUG_DEV
log
<<
"signal_interrupt: vec "
<<
vec
<<
" already scheduled"
...
...
@@ -699,18 +699,18 @@ void i40e_bm::signal_interrupt(uint16_t vec, uint8_t itr) {
return
;
}
else
if
(
iev
.
armed
)
{
// need to reschedule
runner
->
e
vent
_c
ancel
(
iev
);
runner
->
E
vent
C
ancel
(
iev
);
}
iev
.
armed
=
true
;
iev
.
time
=
newtime
;
iev
.
time
_
=
newtime
;
#ifdef DEBUG_DEV
log
<<
"signal_interrupt: scheduled vec "
<<
vec
<<
" for time="
<<
newtime
<<
" (itr "
<<
itr
<<
")"
<<
logger
::
endl
;
#endif
runner
->
e
vent
_s
chedule
(
iev
);
runner
->
E
vent
S
chedule
(
iev
);
}
void
i40e_bm
::
reset
(
bool
indicate_done
)
{
...
...
@@ -729,10 +729,10 @@ void i40e_bm::reset(bool indicate_done) {
for
(
uint16_t
i
=
0
;
i
<
NUM_PFINTS
;
i
++
)
{
intevs
[
i
].
vec
=
i
;
if
(
intevs
[
i
].
armed
)
{
runner
->
e
vent
_c
ancel
(
intevs
[
i
]);
runner
->
E
vent
C
ancel
(
intevs
[
i
]);
intevs
[
i
].
armed
=
false
;
}
intevs
[
i
].
time
=
0
;
intevs
[
i
].
time
_
=
0
;
}
// add default hash key
...
...
@@ -821,7 +821,7 @@ void shadow_ram::write(uint16_t addr, uint16_t val) {
int_ev
::
int_ev
()
{
armed
=
false
;
time
=
0
;
time
_
=
0
;
}
}
// namespace i40e
...
...
@@ -831,5 +831,5 @@ using namespace i40e;
int
main
(
int
argc
,
char
*
argv
[])
{
i40e_bm
dev
;
runner
=
new
nicbm
::
Runner
(
dev
);
return
runner
->
r
unMain
(
argc
,
argv
);
return
runner
->
R
unMain
(
argc
,
argv
);
}
sims/nic/i40e_bm/i40e_bm.h
View file @
c7e904bf
...
...
@@ -583,17 +583,17 @@ class i40e_bm : public nicbm::Runner::Device {
i40e_bm
();
~
i40e_bm
();
virtual
void
s
etup
_i
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
);
virtual
void
r
eg
_r
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
size_t
len
);
virtual
uint32_t
r
eg
_r
ead32
(
uint8_t
bar
,
uint64_t
addr
);
virtual
void
r
eg
_w
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
size_t
len
)
;
virtual
void
r
eg
_w
rite32
(
uint8_t
bar
,
uint64_t
addr
,
uint32_t
val
);
virtual
void
d
ma
_c
omplete
(
nicbm
::
DMAOp
&
op
);
virtual
void
e
th
_r
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
);
virtual
void
t
imed
_event
(
nicbm
::
TimedEvent
&
ev
);
void
s
ignal
_i
nterrupt
(
uint16_t
vector
,
uint8_t
itr
);
void
S
etup
I
ntro
(
struct
SimbricksProtoPcieDevIntro
&
di
)
override
;
void
R
eg
R
ead
(
uint8_t
bar
,
uint64_t
addr
,
void
*
dest
,
size_t
len
)
override
;
virtual
uint32_t
R
eg
R
ead32
(
uint8_t
bar
,
uint64_t
addr
);
void
R
eg
W
rite
(
uint8_t
bar
,
uint64_t
addr
,
const
void
*
src
,
size_t
len
)
override
;
virtual
void
R
eg
W
rite32
(
uint8_t
bar
,
uint64_t
addr
,
uint32_t
val
);
void
D
ma
C
omplete
(
nicbm
::
DMAOp
&
op
)
override
;
void
E
th
R
x
(
uint8_t
port
,
const
void
*
data
,
size_t
len
)
override
;
void
T
imed
(
nicbm
::
TimedEvent
&
ev
)
override
;
virtual
void
S
ignal
I
nterrupt
(
uint16_t
vector
,
uint8_t
itr
);
protected:
logger
log
;
...
...
sims/nic/i40e_bm/i40e_hmc.cc
View file @
c7e904bf
...
...
@@ -100,9 +100,9 @@ void host_mem_cache::reg_updated(uint64_t addr) {
}
void
host_mem_cache
::
issue_mem_op
(
mem_op
&
op
)
{
uint64_t
addr
=
op
.
dma_addr
;
uint64_t
addr
=
op
.
dma_addr
_
;
uint16_t
seg_idx
=
addr
>>
21
;
uint16_t
seg_idx_last
=
(
addr
+
op
.
len
-
1
)
>>
21
;
uint16_t
seg_idx_last
=
(
addr
+
op
.
len
_
-
1
)
>>
21
;
uint32_t
dir_off
=
addr
&
((
1
<<
21
)
-
1
);
struct
segment
*
seg
=
&
segs
[
seg_idx
];
...
...
@@ -121,7 +121,7 @@ void host_mem_cache::issue_mem_op(mem_op &op) {
if
(
seg_idx
!=
seg_idx_last
)
{
std
::
cerr
<<
"hmc issue_mem_op: operation crosses segs addr="
<<
addr
<<
" len="
<<
op
.
len
<<
std
::
endl
;
<<
" len="
<<
op
.
len
_
<<
std
::
endl
;
abort
();
}
...
...
@@ -131,11 +131,11 @@ void host_mem_cache::issue_mem_op(mem_op &op) {
}
op
.
failed
=
false
;
op
.
dma_addr
=
seg
->
addr
+
dir_off
;
op
.
dma_addr
_
=
seg
->
addr
+
dir_off
;
#ifdef DEBUG_HMC
std
::
cerr
<<
"hmc issue_mem_op: hmc_addr="
<<
addr
<<
" dma_addr="
<<
op
.
dma_addr
<<
" len="
<<
op
.
len
<<
std
::
endl
;
#endif
runner
->
i
ssue
_d
ma
(
op
);
runner
->
I
ssue
D
ma
(
op
);
}
sims/nic/i40e_bm/i40e_lan.cc
View file @
c7e904bf
...
...
@@ -167,13 +167,13 @@ void lan_queue_base::enable() {
enabling
=
true
;
qctx_fetch
*
qf
=
new
qctx_fetch
(
*
this
);
qf
->
write
=
false
;
qf
->
dma_addr
=
((
fpm_basereg
&
I40E_GLHMC_LANTXBASE_FPMLANTXBASE_MASK
)
>>
qf
->
write
_
=
false
;
qf
->
dma_addr
_
=
((
fpm_basereg
&
I40E_GLHMC_LANTXBASE_FPMLANTXBASE_MASK
)
>>
I40E_GLHMC_LANTXBASE_FPMLANTXBASE_SHIFT
)
*
512
;
qf
->
dma_addr
+=
ctx_size
*
idx
;
qf
->
len
=
ctx_size
;
qf
->
data
=
ctx
;
qf
->
dma_addr
_
+=
ctx_size
*
idx
;
qf
->
len
_
=
ctx_size
;
qf
->
data
_
=
ctx
;
lanmgr
.
dev
.
hmc
.
issue_mem_op
(
*
qf
);
}
...
...
@@ -233,7 +233,7 @@ void lan_queue_base::interrupt() {
uint8_t
itr
=
(
qctl
&
I40E_QINT_TQCTL_ITR_INDX_MASK
)
>>
I40E_QINT_TQCTL_ITR_INDX_SHIFT
;
lanmgr
.
dev
.
s
ignal
_i
nterrupt
(
msix_idx
,
itr
);
lanmgr
.
dev
.
S
ignal
I
nterrupt
(
msix_idx
,
itr
);
}
lan_queue_base
::
qctx_fetch
::
qctx_fetch
(
lan_queue_base
&
lq_
)
:
lq
(
lq_
)
{
...
...
@@ -427,12 +427,12 @@ void lan_queue_tx::do_writeback(uint32_t first_idx, uint32_t first_pos,
}
else
{
// else we just need to write the index back
dma_hwb
*
dma
=
new
dma_hwb
(
*
this
,
first_pos
,
cnt
,
(
first_idx
+
cnt
)
%
len
);
dma
->
dma_addr
=
hwb_addr
;
dma
->
dma_addr
_
=
hwb_addr
;
#ifdef DEBUG_LAN
log
<<
" hwb="
<<
*
((
uint32_t
*
)
dma
->
data
)
<<
logger
::
endl
;
#endif
runner
->
i
ssue
_d
ma
(
*
dma
);
runner
->
I
ssue
D
ma
(
*
dma
);
}
}
...
...
@@ -593,7 +593,7 @@ bool lan_queue_tx::trigger_tx_packet() {
xsum_tcp
(
pktbuf
+
tcp_off
,
tso_len
-
tcp_off
);
}
runner
->
e
th
_s
end
(
pktbuf
,
tso_len
);
runner
->
E
th
S
end
(
pktbuf
,
tso_len
);
}
else
{
#ifdef DEBUG_LAN
log
<<
" tso packet off="
<<
tso_off
<<
" len="
<<
tso_len
...
...
@@ -610,7 +610,7 @@ bool lan_queue_tx::trigger_tx_packet() {
xsum_tcpip_tso
(
pktbuf
+
maclen
,
iplen
,
l4len
,
tso_paylen
);
runner
->
e
th
_s
end
(
pktbuf
,
tso_len
);
runner
->
E
th
S
end
(
pktbuf
,
tso_len
);
tso_postupdate_header
(
pktbuf
+
maclen
,
iplen
,
l4len
,
tso_paylen
);
...
...
@@ -693,9 +693,9 @@ void lan_queue_tx::tx_desc_ctx::processed() {
lan_queue_tx
::
dma_hwb
::
dma_hwb
(
lan_queue_tx
&
queue_
,
uint32_t
pos_
,
uint32_t
cnt_
,
uint32_t
nh_
)
:
queue
(
queue_
),
pos
(
pos_
),
cnt
(
cnt_
),
next_head
(
nh_
)
{
data
=
&
next_head
;
len
=
4
;
write
=
true
;
data
_
=
&
next_head
;
len
_
=
4
;
write
_
=
true
;
}
lan_queue_tx
::
dma_hwb
::~
dma_hwb
()
{
...
...
sims/nic/i40e_bm/i40e_queues.cc
View file @
c7e904bf
...
...
@@ -98,13 +98,13 @@ void queue_base::trigger_fetch() {
// prepare & issue dma
dma_fetch
*
dma
=
new
dma_fetch
(
*
this
,
desc_len
*
fetch_cnt
);
dma
->
write
=
false
;
dma
->
dma_addr
=
base
+
next_idx
*
desc_len
;
dma
->
write
_
=
false
;
dma
->
dma_addr
_
=
base
+
next_idx
*
desc_len
;
dma
->
pos
=
first_pos
;
#ifdef DEBUG_QUEUES
log
<<
" dma = "
<<
dma
<<
logger
::
endl
;
#endif
runner
->
i
ssue
_d
ma
(
*
dma
);
runner
->
I
ssue
D
ma
(
*
dma
);
}
void
queue_base
::
trigger_process
()
{
...
...
@@ -219,18 +219,18 @@ void queue_base::interrupt() {
void
queue_base
::
do_writeback
(
uint32_t
first_idx
,
uint32_t
first_pos
,
uint32_t
cnt
)
{
dma_wb
*
dma
=
new
dma_wb
(
*
this
,
desc_len
*
cnt
);
dma
->
write
=
true
;
dma
->
dma_addr
=
base
+
first_idx
*
desc_len
;
dma
->
write
_
=
true
;
dma
->
dma_addr
_
=
base
+
first_idx
*
desc_len
;
dma
->
pos
=
first_pos
;
uint8_t
*
buf
=
reinterpret_cast
<
uint8_t
*>
(
dma
->
data
);
uint8_t
*
buf
=
reinterpret_cast
<
uint8_t
*>
(
dma
->
data
_
);
for
(
uint32_t
i
=
0
;
i
<
cnt
;
i
++
)
{
desc_ctx
&
ctx
=
*
desc_ctxs
[(
first_pos
+
i
)
%
MAX_ACTIVE_DESCS
];
assert
(
ctx
.
state
==
desc_ctx
::
DESC_WRITING_BACK
);
memcpy
(
buf
+
i
*
desc_len
,
ctx
.
desc
,
desc_len
);
}
runner
->
i
ssue
_d
ma
(
*
dma
);
runner
->
I
ssue
D
ma
(
*
dma
);
}
void
queue_base
::
writeback_done
(
uint32_t
first_pos
,
uint32_t
cnt
)
{
...
...
@@ -327,15 +327,15 @@ void queue_base::desc_ctx::data_fetch(uint64_t addr, size_t data_len) {
new
dma_data_fetch
(
*
this
,
std
::
min
(
data_len
,
MAX_DMA_SIZE
),
data
);
dma
->
part_offset
=
0
;
dma
->
total_len
=
data_len
;
dma
->
write
=
false
;
dma
->
dma_addr
=
addr
;
dma
->
write
_
=
false
;
dma
->
dma_addr
_
=
addr
;
#ifdef DEBUG_QUEUES
queue
.
log
<<
"fetching data idx="
<<
index
<<
" addr="
<<
addr
<<
" len="
<<
data_len
<<
logger
::
endl
;
queue
.
log
<<
" dma = "
<<
dma
<<
" data="
<<
data
<<
logger
::
endl
;
#endif
runner
->
i
ssue
_d
ma
(
*
dma
);
runner
->
I
ssue
D
ma
(
*
dma
);
}
void
queue_base
::
desc_ctx
::
data_fetched
(
uint64_t
addr
,
size_t
len
)
{
...
...
@@ -349,11 +349,11 @@ void queue_base::desc_ctx::data_write(uint64_t addr, size_t data_len,
<<
logger
::
endl
;
#endif
dma_data_wb
*
data_dma
=
new
dma_data_wb
(
*
this
,
data_len
);
data_dma
->
write
=
true
;
data_dma
->
dma_addr
=
addr
;
memcpy
(
data_dma
->
data
,
buf
,
data_len
);
data_dma
->
write
_
=
true
;
data_dma
->
dma_addr
_
=
addr
;
memcpy
(
data_dma
->
data
_
,
buf
,
data_len
);
runner
->
i
ssue
_d
ma
(
*
data_dma
);
runner
->
I
ssue
D
ma
(
*
data_dma
);
}
void
queue_base
::
desc_ctx
::
data_written
(
uint64_t
addr
,
size_t
len
)
{
...
...
@@ -364,19 +364,19 @@ void queue_base::desc_ctx::data_written(uint64_t addr, size_t len) {
processed
();
}
queue_base
::
dma_fetch
::
dma_fetch
(
queue_base
&
queue_
,
size_t
len
_
)
queue_base
::
dma_fetch
::
dma_fetch
(
queue_base
&
queue_
,
size_t
len
)
:
queue
(
queue_
)
{
data
=
new
char
[
len
_
];
len
=
len
_
;
data
_
=
new
char
[
len
];
len
_
=
len
;
}
queue_base
::
dma_fetch
::~
dma_fetch
()
{
delete
[]((
char
*
)
data
);
delete
[]((
char
*
)
data
_
);
}
void
queue_base
::
dma_fetch
::
done
()
{
uint8_t
*
buf
=
reinterpret_cast
<
uint8_t
*>
(
data
);
for
(
uint32_t
i
=
0
;
i
<
len
/
queue
.
desc_len
;
i
++
)
{
uint8_t
*
buf
=
reinterpret_cast
<
uint8_t
*>
(
data
_
);
for
(
uint32_t
i
=
0
;
i
<
len
_
/
queue
.
desc_len
;
i
++
)
{
desc_ctx
&
ctx
=
*
queue
.
desc_ctxs
[(
pos
+
i
)
%
queue
.
MAX_ACTIVE_DESCS
];
memcpy
(
ctx
.
desc
,
buf
+
queue
.
desc_len
*
i
,
queue
.
desc_len
);
...
...
@@ -390,60 +390,60 @@ void queue_base::dma_fetch::done() {
delete
this
;
}
queue_base
::
dma_data_fetch
::
dma_data_fetch
(
desc_ctx
&
ctx_
,
size_t
len
_
,
queue_base
::
dma_data_fetch
::
dma_data_fetch
(
desc_ctx
&
ctx_
,
size_t
len
,
void
*
buffer
)
:
ctx
(
ctx_
)
{
data
=
buffer
;
len
=
len
_
;
data
_
=
buffer
;
len
_
=
len
;
}
queue_base
::
dma_data_fetch
::~
dma_data_fetch
()
{
}
void
queue_base
::
dma_data_fetch
::
done
()
{
part_offset
+=
len
;
dma_addr
+=
len
;
data
=
(
uint8_t
*
)
data
+
len
;
part_offset
+=
len
_
;
dma_addr
_
+=
len
_
;
data
_
=
(
uint8_t
*
)
data
_
+
len
_
;
if
(
part_offset
<
total_len
)
{
#ifdef DEBUG_QUEUES
ctx
.
queue
.
log
<<
" dma_fetch: next part of multi part dma"
<<
logger
::
endl
;
#endif
len
=
std
::
min
(
total_len
-
part_offset
,
MAX_DMA_SIZE
);
runner
->
i
ssue
_d
ma
(
*
this
);
len
_
=
std
::
min
(
total_len
-
part_offset
,
MAX_DMA_SIZE
);
runner
->
I
ssue
D
ma
(
*
this
);
return
;
}
ctx
.
data_fetched
(
dma_addr
-
part_offset
,
total_len
);
ctx
.
data_fetched
(
dma_addr
_
-
part_offset
,
total_len
);
ctx
.
queue
.
trigger
();
delete
this
;
}
queue_base
::
dma_wb
::
dma_wb
(
queue_base
&
queue_
,
size_t
len
_
)
:
queue
(
queue_
)
{
data
=
new
char
[
len
_
];
len
=
len
_
;
queue_base
::
dma_wb
::
dma_wb
(
queue_base
&
queue_
,
size_t
len
)
:
queue
(
queue_
)
{
data
_
=
new
char
[
len
];
len
_
=
len
;
}
queue_base
::
dma_wb
::~
dma_wb
()
{
delete
[]((
char
*
)
data
);
delete
[]((
char
*
)
data
_
);
}
void
queue_base
::
dma_wb
::
done
()
{
queue
.
writeback_done
(
pos
,
len
/
queue
.
desc_len
);
queue
.
writeback_done
(
pos
,
len
_
/
queue
.
desc_len
);
queue
.
trigger
();
delete
this
;
}
queue_base
::
dma_data_wb
::
dma_data_wb
(
desc_ctx
&
ctx_
,
size_t
len
_
)
:
ctx
(
ctx_
)
{
data
=
new
char
[
len
_
];
len
=
len
_
;
queue_base
::
dma_data_wb
::
dma_data_wb
(
desc_ctx
&
ctx_
,
size_t
len
)
:
ctx
(
ctx_
)
{
data
_
=
new
char
[
len
];
len
_
=
len
;
}
queue_base
::
dma_data_wb
::~
dma_data_wb
()
{
delete
[]((
char
*
)
data
);
delete
[]((
char
*
)
data
_
);
}
void
queue_base
::
dma_data_wb
::
done
()
{
ctx
.
data_written
(
dma_addr
,
len
);
ctx
.
data_written
(
dma_addr
_
,
len
_
);
ctx
.
queue
.
trigger
();
delete
this
;
}
sims/nic/i40e_bm/logger.cc
View file @
c7e904bf
...
...
@@ -36,7 +36,7 @@ logger::logger(const std::string &label_) : label(label_) {
logger
&
logger
::
operator
<<
(
char
c
)
{
if
(
c
==
endl
)
{
std
::
cerr
<<
runner
->
t
ime
_p
s
()
<<
" "
<<
label
<<
": "
<<
ss
.
str
()
std
::
cerr
<<
runner
->
T
ime
P
s
()
<<
" "
<<
label
<<
": "
<<
ss
.
str
()
<<
std
::
endl
;
ss
.
str
(
std
::
string
());
ss
<<
std
::
hex
;
...
...
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