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
e3b6b9f3
Commit
e3b6b9f3
authored
Aug 30, 2020
by
Antoine Kaufmann
Browse files
i40e: draft for hmc fetch for direct access
parent
04400c02
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
93 additions
and
3 deletions
+93
-3
i40e_bm/i40e_bm.h
i40e_bm/i40e_bm.h
+10
-1
i40e_bm/i40e_hmc.cc
i40e_bm/i40e_hmc.cc
+83
-2
No files found.
i40e_bm/i40e_bm.h
View file @
e3b6b9f3
...
@@ -130,7 +130,7 @@ class host_mem_cache {
...
@@ -130,7 +130,7 @@ class host_mem_cache {
static
const
uint16_t
MAX_SEGMENTS
=
0x1000
;
static
const
uint16_t
MAX_SEGMENTS
=
0x1000
;
struct
segment
{
struct
segment
{
uint64_t
pdir_
addr
;
uint64_t
addr
;
uint16_t
pgcount
;
uint16_t
pgcount
;
bool
valid
;
bool
valid
;
bool
direct
;
bool
direct
;
...
@@ -138,9 +138,18 @@ class host_mem_cache {
...
@@ -138,9 +138,18 @@ class host_mem_cache {
i40e_bm
&
dev
;
i40e_bm
&
dev
;
segment
segs
[
MAX_SEGMENTS
];
segment
segs
[
MAX_SEGMENTS
];
public:
public:
class
mem_op
:
public
dma_base
{
public:
bool
failed
;
};
host_mem_cache
(
i40e_bm
&
dev
);
host_mem_cache
(
i40e_bm
&
dev
);
void
reg_updated
(
uint64_t
addr
);
void
reg_updated
(
uint64_t
addr
);
// issue a hmc memory operation (address is in the context
void
issue_mem_op
(
mem_op
&
op
);
};
};
...
...
i40e_bm/i40e_hmc.cc
View file @
e3b6b9f3
...
@@ -15,7 +15,7 @@ host_mem_cache::host_mem_cache(i40e_bm &dev_)
...
@@ -15,7 +15,7 @@ host_mem_cache::host_mem_cache(i40e_bm &dev_)
:
dev
(
dev_
)
:
dev
(
dev_
)
{
{
for
(
size_t
i
=
0
;
i
<
MAX_SEGMENTS
;
i
++
)
{
for
(
size_t
i
=
0
;
i
<
MAX_SEGMENTS
;
i
++
)
{
segs
[
i
].
pdir_
addr
=
0
;
segs
[
i
].
addr
=
0
;
segs
[
i
].
pgcount
=
0
;
segs
[
i
].
pgcount
=
0
;
segs
[
i
].
valid
=
false
;
segs
[
i
].
valid
=
false
;
segs
[
i
].
direct
=
false
;
segs
[
i
].
direct
=
false
;
...
@@ -24,5 +24,86 @@ host_mem_cache::host_mem_cache(i40e_bm &dev_)
...
@@ -24,5 +24,86 @@ host_mem_cache::host_mem_cache(i40e_bm &dev_)
void
host_mem_cache
::
reg_updated
(
uint64_t
addr
)
void
host_mem_cache
::
reg_updated
(
uint64_t
addr
)
{
{
std
::
cerr
<<
"hmc reg updated "
<<
addr
<<
std
::
endl
;
if
(
addr
==
I40E_PFHMC_SDCMD
)
{
// read/write command for descriptor
uint32_t
cmd
=
dev
.
regs
.
pfhmc_sdcmd
;
uint16_t
idx
=
(
cmd
&
I40E_PFHMC_SDCMD_PMSDIDX_MASK
)
>>
I40E_PFHMC_SDCMD_PMSDIDX_SHIFT
;
uint32_t
lo
=
dev
.
regs
.
pfhmc_sddatalow
;
uint32_t
hi
=
dev
.
regs
.
pfhmc_sddatahigh
;
if
((
cmd
&
I40E_PFHMC_SDCMD_PMSDWR_MASK
))
{
// write
std
::
cerr
<<
"hmc: writing descriptor "
<<
idx
<<
std
::
endl
;
segs
[
idx
].
addr
=
((
lo
&
I40E_PFHMC_SDDATALOW_PMSDDATALOW_MASK
)
>>
I40E_PFHMC_SDDATALOW_PMSDDATALOW_SHIFT
)
<<
12
;
segs
[
idx
].
addr
|=
((
uint64_t
)
hi
)
<<
32
;
segs
[
idx
].
pgcount
=
(
lo
&
I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_MASK
)
>>
I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_SHIFT
;
segs
[
idx
].
valid
=
!!
(
lo
&
I40E_PFHMC_SDDATALOW_PMSDVALID_MASK
);
segs
[
idx
].
direct
=
!!
(
lo
&
I40E_PFHMC_SDDATALOW_PMSDTYPE_MASK
);
std
::
cerr
<<
" addr="
<<
segs
[
idx
].
addr
<<
" pgcount="
<<
segs
[
idx
].
pgcount
<<
" valid="
<<
segs
[
idx
].
valid
<<
" direct="
<<
segs
[
idx
].
direct
<<
std
::
endl
;
}
else
{
// read
std
::
cerr
<<
"hmc: reading descriptor "
<<
idx
<<
std
::
endl
;
dev
.
regs
.
pfhmc_sddatalow
=
((
segs
[
idx
].
addr
>>
12
)
<<
I40E_PFHMC_SDDATALOW_PMSDDATALOW_SHIFT
)
&
I40E_PFHMC_SDDATALOW_PMSDDATALOW_MASK
;
dev
.
regs
.
pfhmc_sddatalow
|=
(
segs
[
idx
].
pgcount
<<
I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_SHIFT
)
&
I40E_PFHMC_SDDATALOW_PMSDBPCOUNT_MASK
;
if
(
segs
[
idx
].
valid
)
dev
.
regs
.
pfhmc_sddatalow
|=
I40E_PFHMC_SDDATALOW_PMSDVALID_MASK
;
if
(
segs
[
idx
].
direct
)
dev
.
regs
.
pfhmc_sddatalow
|=
I40E_PFHMC_SDDATALOW_PMSDTYPE_MASK
;
dev
.
regs
.
pfhmc_sddatahigh
=
segs
[
idx
].
addr
>>
32
;
}
}
}
void
host_mem_cache
::
issue_mem_op
(
mem_op
&
op
)
{
uint64_t
addr
=
op
.
dma_addr
;
uint16_t
seg_idx
=
addr
>>
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
];
if
(
seg_idx
>=
MAX_SEGMENTS
)
{
std
::
cerr
<<
"hmc issue_mem_op: seg index too high "
<<
seg_idx
<<
std
::
endl
;
abort
();
}
if
(
!
seg
->
valid
)
{
// TODO: errorinfo and data registers
std
::
cerr
<<
"hmc issue_mem_op: segment invalid addr="
<<
addr
<<
std
::
endl
;
op
.
failed
=
true
;
return
;
}
if
(
seg_idx
!=
seg_idx_last
)
{
std
::
cerr
<<
"hmc issue_mem_op: operation crosses segs addr="
<<
addr
<<
" len="
<<
op
.
len
<<
std
::
endl
;
abort
();
}
if
(
!
seg
->
direct
)
{
std
::
cerr
<<
"hmc issue_mem_op: TODO paged ops addr="
<<
addr
<<
std
::
endl
;
abort
();
}
op
.
failed
=
false
;
op
.
dma_addr
=
seg
->
addr
+
dir_off
;
std
::
cerr
<<
"hmc issue_mem_op: hmc_addr="
<<
addr
<<
" dma_addr="
<<
op
.
dma_addr
<<
" len="
<<
op
.
len
<<
std
::
endl
;
runner
->
issue_dma
(
op
);
}
}
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