Commit cb310444 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

i40e: fetch indirect data for admin tx commands

parent be3fe299
......@@ -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)
{
cmd_run(desc, idx, nullptr);
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);
}
}
void queue_admin_tx::data_fetched(void *desc, uint32_t idx, void *data)
{
cmd_run(desc, idx, data);
}
void queue_admin_tx::reg_updated()
......
......@@ -32,6 +32,18 @@ class queue_base {
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 {
protected:
queue_base &queue;
......@@ -63,12 +75,15 @@ class queue_base {
size_t desc_len;
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_indirect(const void *desc, uint32_t idx,
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;
// 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);
public:
......@@ -98,6 +113,8 @@ class queue_admin_tx : public queue_base {
// called by base class when a descriptor has been fetched
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;
uint32_t &reg_len;
......
......@@ -36,6 +36,20 @@ void queue_base::trigger_fetch()
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()
{
if (!enabled)
......@@ -100,6 +114,29 @@ void queue_base::dma_fetch::done()
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(queue_)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment