diff --git a/repos/dde_linux/src/lib/lx_kit/device.cc b/repos/dde_linux/src/lib/lx_kit/device.cc index 42b68f4346..88e54b1dd4 100644 --- a/repos/dde_linux/src/lib/lx_kit/device.cc +++ b/repos/dde_linux/src/lib/lx_kit/device.cc @@ -122,8 +122,7 @@ void * Device::io_mem_local_addr(addr_t phys_addr, size_t size) if (!io.io_mem.constructed()) io.io_mem.construct(*_pdev, io.idx); - ret = (void*)((addr_t)io.io_mem->local_addr() - + (phys_addr - io.addr)); + ret = (void*)((addr_t)io.io_mem->local_addr() + phys_addr - io.addr); }); return ret; } diff --git a/repos/dde_linux/src/lib/lx_kit/spec/x86/platform.cc b/repos/dde_linux/src/lib/lx_kit/spec/x86/platform.cc index 7e0a3351f7..c1ea9d3fbb 100644 --- a/repos/dde_linux/src/lib/lx_kit/spec/x86/platform.cc +++ b/repos/dde_linux/src/lib/lx_kit/spec/x86/platform.cc @@ -103,15 +103,22 @@ static Str create_device_node(Xml_generator &xml, bool const memory = r.type() == R::MEMORY; - xml.node(memory ? "io_mem" : "io_port", [&] () { - xml.attribute("phys_addr", - to_string(Hex(memory ? mmio_phys_addr : r.bar()))); - xml.attribute("size", to_string(Hex(r.size()))); - xml.attribute("bar", id); - }); + if (memory) { + xml.node("io_mem", [&] () { + xml.attribute("phys_addr", to_string(Hex(mmio_phys_addr))); + xml.attribute("size", to_string(Hex(r.size()))); + xml.attribute("bar", id); + }); - if (memory) mmio_phys_addr += align_addr(r.size(), 12); + } else { + + xml.node("io_port", [&] () { + xml.attribute("phys_addr", to_string(Hex(r.bar()))); + xml.attribute("size", to_string(Hex(r.size()))); + xml.attribute("bar", id); + }); + } }); }); @@ -439,6 +446,9 @@ void *Platform::Device::Mmio::_local_addr() if (device.resource(phys_bar_id).prefetchable()) cache = Cache::WRITE_COMBINED; + + auto const r = device.resource(phys_bar_id); + Range::start = (r.base() & 0xfffu); } Io_mem_session_capability io_mem_cap = @@ -450,7 +460,7 @@ void *Platform::Device::Mmio::_local_addr() io_mem_client.dataspace()); } - return _attached_ds->local_addr(); + return (void*)(_attached_ds->local_addr() + Range::start); }