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
cb310444
Commit
cb310444
authored
Aug 29, 2020
by
Antoine Kaufmann
Browse files
i40e: fetch indirect data for admin tx commands
parent
be3fe299
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
70 additions
and
2 deletions
+70
-2
i40e_bm/i40e_adminq.cc
i40e_bm/i40e_adminq.cc
+15
-1
i40e_bm/i40e_bm.h
i40e_bm/i40e_bm.h
+18
-1
i40e_bm/i40e_queues.cc
i40e_bm/i40e_queues.cc
+37
-0
No files found.
i40e_bm/i40e_adminq.cc
View file @
cb310444
...
@@ -255,7 +255,21 @@ void queue_admin_tx::cmd_run(void *desc, uint32_t idx, void *data)
...
@@ -255,7 +255,21 @@ void queue_admin_tx::cmd_run(void *desc, uint32_t idx, void *data)
void
queue_admin_tx
::
desc_fetched
(
void
*
desc
,
uint32_t
idx
)
void
queue_admin_tx
::
desc_fetched
(
void
*
desc
,
uint32_t
idx
)
{
{
struct
i40e_aq_desc
*
d
=
reinterpret_cast
<
struct
i40e_aq_desc
*>
(
desc
);
if
((
d
->
flags
&
I40E_AQ_FLAG_RD
))
{
uint64_t
addr
=
d
->
params
.
external
.
addr_low
|
(((
uint64_t
)
d
->
params
.
external
.
addr_high
)
<<
32
);
std
::
cerr
<<
" desc with buffer opc="
<<
d
->
opcode
<<
" addr="
<<
addr
<<
std
::
endl
;
data_fetch
(
desc
,
idx
,
addr
,
d
->
datalen
);
}
else
{
cmd_run
(
desc
,
idx
,
nullptr
);
cmd_run
(
desc
,
idx
,
nullptr
);
}
}
void
queue_admin_tx
::
data_fetched
(
void
*
desc
,
uint32_t
idx
,
void
*
data
)
{
cmd_run
(
desc
,
idx
,
data
);
}
}
void
queue_admin_tx
::
reg_updated
()
void
queue_admin_tx
::
reg_updated
()
...
...
i40e_bm/i40e_bm.h
View file @
cb310444
...
@@ -32,6 +32,18 @@ class queue_base {
...
@@ -32,6 +32,18 @@ class queue_base {
virtual
void
done
();
virtual
void
done
();
};
};
class
dma_data_fetch
:
public
dma_base
{
protected:
queue_base
&
queue
;
public:
uint32_t
index
;
void
*
desc
;
dma_data_fetch
(
queue_base
&
queue_
,
size_t
len
,
const
void
*
desc
,
size_t
desc_len
);
virtual
~
dma_data_fetch
();
virtual
void
done
();
};
class
dma_wb
:
public
dma_base
{
class
dma_wb
:
public
dma_base
{
protected:
protected:
queue_base
&
queue
;
queue_base
&
queue
;
...
@@ -63,12 +75,15 @@ class queue_base {
...
@@ -63,12 +75,15 @@ class queue_base {
size_t
desc_len
;
size_t
desc_len
;
void
trigger_fetch
();
void
trigger_fetch
();
void
data_fetch
(
const
void
*
desc
,
uint32_t
idx
,
uint64_t
addr
,
size_t
len
);
void
desc_writeback
(
const
void
*
desc
,
uint32_t
idx
);
void
desc_writeback
(
const
void
*
desc
,
uint32_t
idx
);
void
desc_writeback_indirect
(
const
void
*
desc
,
uint32_t
idx
,
void
desc_writeback_indirect
(
const
void
*
desc
,
uint32_t
idx
,
uint64_t
data_addr
,
const
void
*
data
,
size_t
data_len
);
uint64_t
data_addr
,
const
void
*
data
,
size_t
data_len
);
/
**
called when a descriptor is fetched
*/
/
/
called when a descriptor is fetched
virtual
void
desc_fetched
(
void
*
desc
,
uint32_t
idx
)
=
0
;
virtual
void
desc_fetched
(
void
*
desc
,
uint32_t
idx
)
=
0
;
// called when data is fetched
virtual
void
data_fetched
(
void
*
desc
,
uint32_t
idx
,
void
*
data
)
=
0
;
virtual
void
desc_written_back
(
uint32_t
idx
);
virtual
void
desc_written_back
(
uint32_t
idx
);
public:
public:
...
@@ -98,6 +113,8 @@ class queue_admin_tx : public queue_base {
...
@@ -98,6 +113,8 @@ class queue_admin_tx : public queue_base {
// called by base class when a descriptor has been fetched
// called by base class when a descriptor has been fetched
virtual
void
desc_fetched
(
void
*
desc
,
uint32_t
idx
);
virtual
void
desc_fetched
(
void
*
desc
,
uint32_t
idx
);
// called by basee class when data for a descriptor has been fetched
virtual
void
data_fetched
(
void
*
desc
,
uint32_t
idx
,
void
*
data
);
uint64_t
&
reg_base
;
uint64_t
&
reg_base
;
uint32_t
&
reg_len
;
uint32_t
&
reg_len
;
...
...
i40e_bm/i40e_queues.cc
View file @
cb310444
...
@@ -36,6 +36,20 @@ void queue_base::trigger_fetch()
...
@@ -36,6 +36,20 @@ void queue_base::trigger_fetch()
fetch_head
=
(
fetch_head
+
1
)
%
len
;
fetch_head
=
(
fetch_head
+
1
)
%
len
;
}
}
void
queue_base
::
data_fetch
(
const
void
*
desc
,
uint32_t
idx
,
uint64_t
addr
,
size_t
len
)
{
dma_data_fetch
*
dma
=
new
dma_data_fetch
(
*
this
,
len
,
desc
,
desc_len
);
dma
->
write
=
false
;
dma
->
dma_addr
=
addr
;
dma
->
index
=
idx
;
std
::
cerr
<<
"fetching data idx="
<<
idx
<<
" addr="
<<
addr
<<
" len="
<<
len
<<
std
::
endl
;
std
::
cerr
<<
"dma = "
<<
dma
<<
std
::
endl
;
runner
->
issue_dma
(
*
dma
);
}
void
queue_base
::
reg_updated
()
void
queue_base
::
reg_updated
()
{
{
if
(
!
enabled
)
if
(
!
enabled
)
...
@@ -100,6 +114,29 @@ void queue_base::dma_fetch::done()
...
@@ -100,6 +114,29 @@ void queue_base::dma_fetch::done()
delete
this
;
delete
this
;
}
}
queue_base
::
dma_data_fetch
::
dma_data_fetch
(
queue_base
&
queue_
,
size_t
len_
,
const
void
*
desc_
,
size_t
desc_len
)
:
queue
(
queue_
)
{
uint8_t
*
buf
=
new
uint8_t
[
desc_len
+
len_
];
desc
=
buf
;
memcpy
(
desc
,
desc_
,
desc_len
);
data
=
buf
+
desc_len
;
len
=
len_
;
}
queue_base
::
dma_data_fetch
::~
dma_data_fetch
()
{
delete
[]
((
uint8_t
*
)
desc
);
}
void
queue_base
::
dma_data_fetch
::
done
()
{
queue
.
data_fetched
(
desc
,
index
,
data
);
delete
this
;
}
queue_base
::
dma_wb
::
dma_wb
(
queue_base
&
queue_
,
size_t
len_
)
queue_base
::
dma_wb
::
dma_wb
(
queue_base
&
queue_
,
size_t
len_
)
:
queue
(
queue_
)
:
queue
(
queue_
)
...
...
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