diff --git a/repos/os/src/drivers/platform/device_component.cc b/repos/os/src/drivers/platform/device_component.cc index ada0187cf6..81c76d7214 100644 --- a/repos/os/src/drivers/platform/device_component.cc +++ b/repos/os/src/drivers/platform/device_component.cc @@ -238,7 +238,8 @@ Device_component::Device_component(Registry & registry, auto add_range_fn = [&] (Driver::Io_mmu::Domain & domain) { _reserved_mem_registry.for_each([&] (Io_mem & iomem) { - domain.add_range(iomem.range, iomem.io_mem->dataspace()); + domain.add_range(iomem.range, iomem.range.start, + iomem.io_mem->dataspace()); }); }; diff --git a/repos/os/src/drivers/platform/device_pd.cc b/repos/os/src/drivers/platform/device_pd.cc index 2d3a730c3f..3f62f8860f 100644 --- a/repos/os/src/drivers/platform/device_pd.cc +++ b/repos/os/src/drivers/platform/device_pd.cc @@ -70,6 +70,7 @@ void Device_pd::Region_map_client::upgrade_caps() void Device_pd::add_range(Io_mmu::Range const & range, + addr_t const, Dataspace_capability const cap) { using namespace Genode; @@ -156,5 +157,5 @@ Device_pd::Device_pd(Env & env, _pd.ref_account(env.pd_session_cap()); buffer_registry.for_each([&] (Dma_buffer const & buf) { - add_range({ buf.dma_addr, buf.size }, buf.cap); }); + add_range({ buf.dma_addr, buf.size }, buf.phys_addr, buf.cap); }); } diff --git a/repos/os/src/drivers/platform/device_pd.h b/repos/os/src/drivers/platform/device_pd.h index 6acee7bcbd..049dc389b6 100644 --- a/repos/os/src/drivers/platform/device_pd.h +++ b/repos/os/src/drivers/platform/device_pd.h @@ -87,7 +87,9 @@ class Driver::Device_pd : public Io_mmu::Domain Allocator & md_alloc, Registry const & buffer_registry); - void add_range(Io_mmu::Range const &, Dataspace_capability const) override; + void add_range(Io_mmu::Range const &, + addr_t const, + Dataspace_capability const) override; void remove_range(Io_mmu::Range const &) override; void enable_pci_device(Io_mem_dataspace_capability const, diff --git a/repos/os/src/drivers/platform/dma_allocator.cc b/repos/os/src/drivers/platform/dma_allocator.cc index 13a05bf348..2b99ee0c81 100644 --- a/repos/os/src/drivers/platform/dma_allocator.cc +++ b/repos/os/src/drivers/platform/dma_allocator.cc @@ -87,7 +87,8 @@ Dma_buffer & Dma_allocator::alloc_buffer(Ram_dataspace_capability cap, addr_t dma_addr = _alloc_dma_addr(phys_addr, size, false); try { - return * new (_md_alloc) Dma_buffer(_registry, *this, cap, dma_addr, size); + return * new (_md_alloc) Dma_buffer(_registry, *this, cap, dma_addr, size, + phys_addr); } catch (Out_of_ram) { _free_dma_addr(dma_addr); throw; diff --git a/repos/os/src/drivers/platform/dma_allocator.h b/repos/os/src/drivers/platform/dma_allocator.h index 1a6ea21828..4dc8bb8d5e 100644 --- a/repos/os/src/drivers/platform/dma_allocator.h +++ b/repos/os/src/drivers/platform/dma_allocator.h @@ -30,6 +30,7 @@ struct Driver::Dma_buffer : Registry::Element { Ram_dataspace_capability const cap; addr_t dma_addr; + addr_t phys_addr; size_t size; Dma_allocator & dma_alloc; @@ -37,9 +38,11 @@ struct Driver::Dma_buffer : Registry::Element Dma_allocator & dma_alloc, Ram_dataspace_capability const cap, addr_t dma_addr, - size_t size) + size_t size, + addr_t phys_addr) : Registry::Element(registry, *this), - cap(cap), dma_addr(dma_addr), size(size), dma_alloc(dma_alloc) + cap(cap), dma_addr(dma_addr), phys_addr(phys_addr), + size(size), dma_alloc(dma_alloc) { } ~Dma_buffer(); diff --git a/repos/os/src/drivers/platform/io_mmu.h b/repos/os/src/drivers/platform/io_mmu.h index 821c4e7f9a..692bd3a717 100644 --- a/repos/os/src/drivers/platform/io_mmu.h +++ b/repos/os/src/drivers/platform/io_mmu.h @@ -84,7 +84,9 @@ class Driver::Io_mmu : private Io_mmu_devices::Element Pci::Bdf const) = 0; /* interface for adding/removing DMA buffers */ - virtual void add_range(Range const &, Dataspace_capability const) = 0; + virtual void add_range(Range const &, + addr_t const, + Dataspace_capability const) = 0; virtual void remove_range(Range const &) = 0; Domain(Io_mmu & io_mmu, diff --git a/repos/os/src/drivers/platform/session_component.cc b/repos/os/src/drivers/platform/session_component.cc index acc8f5493d..44be7d96fa 100644 --- a/repos/os/src/drivers/platform/session_component.cc +++ b/repos/os/src/drivers/platform/session_component.cc @@ -346,7 +346,7 @@ Session_component::alloc_dma_buffer(size_t const size, Cache cache) _env_ram.dataspace_size(ram_cap)); _domain_registry.for_each_domain([&] (Io_mmu::Domain & domain) { - domain.add_range({ buf.dma_addr, buf.size }, buf.cap); + domain.add_range({ buf.dma_addr, buf.size }, buf.phys_addr, buf.cap); }); } catch (Out_of_ram) { _env_ram.free(ram_cap);