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

i40e: 8B reg reads/writes

parent d5256fe8
...@@ -51,41 +51,54 @@ void i40e_bm::eth_rx(uint8_t port, const void *data, size_t len) ...@@ -51,41 +51,54 @@ void i40e_bm::eth_rx(uint8_t port, const void *data, size_t len)
void i40e_bm::reg_read(uint8_t bar, uint64_t addr, void *dest, size_t len) void i40e_bm::reg_read(uint8_t bar, uint64_t addr, void *dest, size_t len)
{ {
uint32_t val32 = 0; uint32_t *dest_p = reinterpret_cast <uint32_t *> (dest);
if (len != 4) { if (len == 4) {
std::cerr << "currently we only support 4B reads (got " << len << ")" dest_p[0] = reg_read32(bar, addr);
} else if (len == 8) {
dest_p[0] = reg_read32(bar, addr);
dest_p[1] = reg_read32(bar, addr + 4);
} else {
std::cerr << "currently we only support 4/8B reads (got " << len << ")"
<< std::endl; << std::endl;
abort(); abort();
} }
}
uint32_t i40e_bm::reg_read32(uint8_t bar, uint64_t addr)
{
if (bar == BAR_REGS) { if (bar == BAR_REGS) {
val32 = reg_mem_read32(addr); return reg_mem_read32(addr);
} else if (bar == BAR_IO) { } else if (bar == BAR_IO) {
val32 = reg_io_read(addr); return reg_io_read(addr);
} else { } else {
std::cerr << "invalid BAR " << (int) bar << std::endl; std::cerr << "invalid BAR " << (int) bar << std::endl;
abort(); abort();
} }
*(uint32_t *) dest = val32;
} }
void i40e_bm::reg_write(uint8_t bar, uint64_t addr, const void *src, size_t len) void i40e_bm::reg_write(uint8_t bar, uint64_t addr, const void *src, size_t len)
{ {
uint32_t val32 = 0; const uint32_t *src_p = reinterpret_cast<const uint32_t *> (src);
if (len != 4) { if (len == 4) {
std::cerr << "currently we only support 4B writes (got " << len << ")" reg_write32(bar, addr, src_p[0]);
} else if (len == 8) {
reg_write32(bar, addr, src_p[0]);
reg_write32(bar, addr + 4, src_p[1]);
} else {
std::cerr << "currently we only support 4/8B writes (got " << len << ")"
<< std::endl; << std::endl;
abort(); abort();
} }
val32 = *(const uint32_t *) src; }
void i40e_bm::reg_write32(uint8_t bar, uint64_t addr, uint32_t val)
{
if (bar == BAR_REGS) { if (bar == BAR_REGS) {
reg_mem_write32(addr, val32); reg_mem_write32(addr, val);
} else if (bar == BAR_IO) { } else if (bar == BAR_IO) {
reg_io_write(addr, val32); reg_io_write(addr, val);
} else { } else {
std::cerr << "invalid BAR " << (int) bar << std::endl; std::cerr << "invalid BAR " << (int) bar << std::endl;
abort(); abort();
......
...@@ -368,8 +368,10 @@ public: ...@@ -368,8 +368,10 @@ public:
virtual void setup_intro(struct cosim_pcie_proto_dev_intro &di); virtual void setup_intro(struct cosim_pcie_proto_dev_intro &di);
virtual void reg_read(uint8_t bar, uint64_t addr, void *dest, size_t len); virtual void reg_read(uint8_t bar, uint64_t addr, void *dest, size_t len);
virtual uint32_t reg_read32(uint8_t bar, uint64_t addr);
virtual void reg_write(uint8_t bar, uint64_t addr, const void *src, virtual void reg_write(uint8_t bar, uint64_t addr, const void *src,
size_t len); size_t len);
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);
......
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