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
c2ddff50
"examples/vscode:/vscode.git/clone" did not exist on "a3efa433eac5feba842350c38a1db29244963fb5"
Commit
c2ddff50
authored
Sep 16, 2020
by
Antoine Kaufmann
Browse files
i40e: support for interrupt moderation
parent
b6d44191
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
92 additions
and
3 deletions
+92
-3
i40e_bm/i40e_bm.cc
i40e_bm/i40e_bm.cc
+73
-0
i40e_bm/i40e_bm.h
i40e_bm/i40e_bm.h
+14
-2
i40e_bm/i40e_lan.cc
i40e_bm/i40e_lan.cc
+5
-1
No files found.
i40e_bm/i40e_bm.cc
View file @
c2ddff50
...
@@ -574,6 +574,64 @@ void i40e_bm::reg_mem_write32(uint64_t addr, uint32_t val)
...
@@ -574,6 +574,64 @@ void i40e_bm::reg_mem_write32(uint64_t addr, uint32_t val)
}
}
}
}
void
i40e_bm
::
timed_event
(
nicbm
::
TimedEvent
&
ev
)
{
int_ev
&
iev
=
*
((
int_ev
*
)
&
ev
);
#ifdef DEBUG_DEV
log
<<
"timed_event: triggering interrupt ("
<<
iev
.
vector
<<
")"
<<
logger
::
endl
;
#endif
iev
.
armed
=
false
;
runner
->
msi_issue
(
0
);
}
void
i40e_bm
::
signal_interrupt
(
uint16_t
vector
,
uint8_t
itr
)
{
if
(
vector
!=
0
)
{
log
<<
"signal_interrupt() only supports vector 0"
<<
logger
::
endl
;
abort
();
}
int_ev
&
iev
=
intevs
[
vector
];
uint64_t
mindelay
;
if
(
itr
<=
2
)
{
// itr 0-2
mindelay
=
regs
.
pfint_itr0
[
itr
];
mindelay
*=
2000000ULL
;
}
else
if
(
itr
==
3
)
{
// noitr
mindelay
=
0
;
}
else
{
log
<<
"signal_interrupt() invalid itr ("
<<
itr
<<
")"
<<
logger
::
endl
;
abort
();
}
uint64_t
curtime
=
runner
->
time_ps
();
uint64_t
newtime
=
curtime
+
mindelay
;
if
(
iev
.
armed
&&
iev
.
time
<=
newtime
)
{
// already armed and this is not scheduled sooner
#ifdef DEBUG_DEV
log
<<
"signal_interrupt: vector "
<<
vector
<<
" already scheduled"
<<
logger
::
endl
;
#endif
return
;
}
else
if
(
iev
.
armed
)
{
// need to reschedule
runner
->
event_cancel
(
iev
);
}
iev
.
armed
=
true
;
iev
.
time
=
newtime
;
#ifdef DEBUG_DEV
log
<<
"signal_interrupt: scheduled vector "
<<
vector
<<
" for time="
<<
newtime
<<
" (itr "
<<
itr
<<
")"
<<
logger
::
endl
;
#endif
runner
->
event_schedule
(
iev
);
}
void
i40e_bm
::
reset
(
bool
indicate_done
)
void
i40e_bm
::
reset
(
bool
indicate_done
)
{
{
#ifdef DEBUG_DEV
#ifdef DEBUG_DEV
...
@@ -587,6 +645,15 @@ void i40e_bm::reset(bool indicate_done)
...
@@ -587,6 +645,15 @@ void i40e_bm::reset(bool indicate_done)
memset
(
&
regs
,
0
,
sizeof
(
regs
));
memset
(
&
regs
,
0
,
sizeof
(
regs
));
if
(
indicate_done
)
if
(
indicate_done
)
regs
.
glnvm_srctl
=
I40E_GLNVM_SRCTL_DONE_MASK
;
regs
.
glnvm_srctl
=
I40E_GLNVM_SRCTL_DONE_MASK
;
for
(
uint16_t
i
=
0
;
i
<
NUM_PFINTS
;
i
++
)
{
intevs
[
i
].
vector
=
i
;
if
(
intevs
[
i
].
armed
)
{
runner
->
event_cancel
(
intevs
[
i
]);
intevs
[
i
].
armed
=
false
;
}
intevs
[
i
].
time
=
0
;
}
}
}
shadow_ram
::
shadow_ram
(
i40e_bm
&
dev_
)
shadow_ram
::
shadow_ram
(
i40e_bm
&
dev_
)
...
@@ -662,6 +729,12 @@ void shadow_ram::write(uint16_t addr, uint16_t val)
...
@@ -662,6 +729,12 @@ void shadow_ram::write(uint16_t addr, uint16_t val)
#endif
#endif
}
}
int_ev
::
int_ev
()
{
armed
=
false
;
time
=
0
;
}
}
//namespace i40e
}
//namespace i40e
using
namespace
i40e
;
using
namespace
i40e
;
...
...
i40e_bm/i40e_bm.h
View file @
c2ddff50
...
@@ -28,6 +28,15 @@ class dma_base : public nicbm::DMAOp {
...
@@ -28,6 +28,15 @@ class dma_base : public nicbm::DMAOp {
virtual
void
done
()
=
0
;
virtual
void
done
()
=
0
;
};
};
class
int_ev
:
public
nicbm
::
TimedEvent
{
public:
uint16_t
vector
;
bool
armed
;
int_ev
();
};
class
logger
:
public
std
::
ostream
{
class
logger
:
public
std
::
ostream
{
public:
public:
static
const
char
endl
=
'\n'
;
static
const
char
endl
=
'\n'
;
...
@@ -496,8 +505,6 @@ protected:
...
@@ -496,8 +505,6 @@ protected:
};
};
public:
public:
nicbm
::
Runner
*
runner
;
i40e_bm
();
i40e_bm
();
~
i40e_bm
();
~
i40e_bm
();
...
@@ -509,6 +516,9 @@ public:
...
@@ -509,6 +516,9 @@ public:
virtual
void
reg_write32
(
uint8_t
bar
,
uint64_t
addr
,
uint32_t
val
);
virtual
void
reg_write32
(
uint8_t
bar
,
uint64_t
addr
,
uint32_t
val
);
virtual
void
dma_complete
(
nicbm
::
DMAOp
&
op
);
virtual
void
dma_complete
(
nicbm
::
DMAOp
&
op
);
virtual
void
eth_rx
(
uint8_t
port
,
const
void
*
data
,
size_t
len
);
virtual
void
eth_rx
(
uint8_t
port
,
const
void
*
data
,
size_t
len
);
virtual
void
timed_event
(
nicbm
::
TimedEvent
&
ev
);
void
signal_interrupt
(
uint16_t
vector
,
uint8_t
itr
);
protected:
protected:
logger
log
;
logger
log
;
...
@@ -518,6 +528,8 @@ protected:
...
@@ -518,6 +528,8 @@ protected:
shadow_ram
shram
;
shadow_ram
shram
;
lan
lanmgr
;
lan
lanmgr
;
int_ev
intevs
[
NUM_PFINTS
];
/** Read from the I/O bar */
/** Read from the I/O bar */
virtual
uint32_t
reg_io_read
(
uint64_t
addr
);
virtual
uint32_t
reg_io_read
(
uint64_t
addr
);
/** Write to the I/O bar */
/** Write to the I/O bar */
...
...
i40e_bm/i40e_lan.cc
View file @
c2ddff50
...
@@ -171,7 +171,11 @@ void lan_queue_base::interrupt()
...
@@ -171,7 +171,11 @@ void lan_queue_base::interrupt()
#endif
#endif
lanmgr
.
dev
.
regs
.
pfint_icr0
|=
I40E_PFINT_ICR0_INTEVENT_MASK
|
lanmgr
.
dev
.
regs
.
pfint_icr0
|=
I40E_PFINT_ICR0_INTEVENT_MASK
|
(
1
<<
(
I40E_PFINT_ICR0_QUEUE_0_SHIFT
+
msix0_idx
));
(
1
<<
(
I40E_PFINT_ICR0_QUEUE_0_SHIFT
+
msix0_idx
));
runner
->
msi_issue
(
0
);
uint8_t
itr
=
(
qctl
&
I40E_QINT_TQCTL_ITR_INDX_MASK
)
>>
I40E_QINT_TQCTL_ITR_INDX_SHIFT
;
lanmgr
.
dev
.
signal_interrupt
(
0
,
itr
);
}
}
lan_queue_base
::
qctx_fetch
::
qctx_fetch
(
lan_queue_base
&
lq_
)
lan_queue_base
::
qctx_fetch
::
qctx_fetch
(
lan_queue_base
&
lq_
)
...
...
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