diff --git a/dde_ipxe/src/lib/dde_ipxe/dde_support.cc b/dde_ipxe/src/lib/dde_ipxe/dde_support.cc
index 6005a80a9..2a4d2d19c 100644
--- a/dde_ipxe/src/lib/dde_ipxe/dde_support.cc
+++ b/dde_ipxe/src/lib/dde_ipxe/dde_support.cc
@@ -14,64 +14,59 @@
#include
#include
#include
-#include
#include
#include
extern "C" {
-#include
+#include
#include "dde_support.h"
}
using namespace Genode;
-/*******************************************
- ** Support for aligned memory allocation **
- *******************************************/
+/***************************************************
+ ** Support for aligned and DMA memory allocation **
+ ***************************************************/
enum { BACKING_STORE_SIZE = 1024 * 1024 };
-Allocator_avl *allocator()
+static Allocator_avl& allocator()
{
static Allocator_avl _avl(env()->heap());
- return &_avl;
+ return _avl;
}
-
-void __attribute__((constructor)) init()
+extern "C" int dde_mem_init(int bus, int dev, int func)
{
try {
- Dataspace_capability ds_cap = env()->ram_session()->alloc(BACKING_STORE_SIZE);
- addr_t base = (addr_t)env()->rm_session()->attach(ds_cap);
-
+ addr_t base = dde_kit_pci_alloc_dma_buffer(bus, dev, func,
+ BACKING_STORE_SIZE);
/* add to allocator */
- allocator()->add_range(base, BACKING_STORE_SIZE);
-
- /* add to DDE-kit page tables */
- addr_t phys = Dataspace_client(ds_cap).phys_addr();
- dde_kit_pgtab_set_region_with_size((void *)base, phys, BACKING_STORE_SIZE);
+ allocator().add_range(base, BACKING_STORE_SIZE);
} catch (...) {
- PERR("Initialization of block memory failed!");
+ return false;
}
+
+ return true;
}
-
-extern "C" void *dde_alloc_memblock(dde_kit_size_t size, dde_kit_size_t align, dde_kit_size_t offset)
+extern "C" void *dde_alloc_memblock(dde_kit_size_t size, dde_kit_size_t align,
+ dde_kit_size_t offset)
{
void *ptr;
- if (allocator()->alloc_aligned(size, &ptr, log2(align)).is_error()) {
- PERR("memory allocation failed in alloc_memblock (size=%zd, align=%zx, offset=%zx)",
- size, align, offset);
+ if (allocator().alloc_aligned(size, &ptr, log2(align)).is_error()) {
+ PERR("memory allocation failed in alloc_memblock (size=%zd, align=%zx,"
+ " offset=%zx)", size, align, offset);
return 0;
- };
+ }
return ptr;
}
extern "C" void dde_free_memblock(void *p, dde_kit_size_t size)
{
- allocator()->free(p, size);
+ allocator().free(p, size);
}
@@ -84,8 +79,8 @@ extern "C" void dde_timer2_udelay(unsigned long usecs)
/*
* This function is called only once during rdtsc calibration (usecs will be
* 10000, see dde.c 'udelay'. We do not use DDE timers here, since Genode's
- * timer connection is the precised one around.
+ * timer connection is the most precise one around.
*/
Timer::Connection timer;
- timer.msleep(usecs / 1000);
+ timer.usleep(usecs);
}
diff --git a/dde_ipxe/src/lib/dde_ipxe/dde_support.h b/dde_ipxe/src/lib/dde_ipxe/dde_support.h
index eb5c03b52..7061248cf 100644
--- a/dde_ipxe/src/lib/dde_ipxe/dde_support.h
+++ b/dde_ipxe/src/lib/dde_ipxe/dde_support.h
@@ -17,8 +17,10 @@
#include
-void *dde_alloc_memblock(dde_kit_size_t size, dde_kit_size_t align, dde_kit_size_t offset);
+void *dde_alloc_memblock(dde_kit_size_t size, dde_kit_size_t align,
+ dde_kit_size_t offset);
void dde_free_memblock(void *p, dde_kit_size_t size);
void dde_timer2_udelay(unsigned long usecs);
+int dde_mem_init(int bus, int dev, int func);
#endif /* _DDE_SUPPORT_H_ */
diff --git a/dde_ipxe/src/lib/dde_ipxe/nic.c b/dde_ipxe/src/lib/dde_ipxe/nic.c
index 5f40d1d5e..57a58e1f9 100644
--- a/dde_ipxe/src/lib/dde_ipxe/nic.c
+++ b/dde_ipxe/src/lib/dde_ipxe/nic.c
@@ -27,6 +27,7 @@
#include
#include "local.h"
+#include "dde_support.h"
/**
* DDE iPXE mutual exclusion lock
@@ -310,8 +311,18 @@ int dde_ipxe_nic_init(void)
if (location == NO_DEVICE_FOUND)
return 0;
- /* find and open iPXE NIC device */
+ /* find iPXE NIC device */
net_dev = find_netdev_by_location(BUS_TYPE_PCI, location);
+
+ /* initialize memory backend allocator for nic driver */
+ if (!dde_mem_init(PCI_BUS(net_dev->dev->desc.location),
+ PCI_SLOT(net_dev->dev->desc.location),
+ PCI_FUNC(net_dev->dev->desc.location))) {
+ LOG("initialization of block memory failed!");
+ return 0;
+ }
+
+ /* open iPXE NIC device */
if (netdev_open(net_dev)) {
LOG("opening device " FMT_BUSDEVFN " failed",
PCI_BUS(net_dev->dev->desc.location),