pci_decode: calculate 64bit BAR size

Issue #4949.
This commit is contained in:
Josef Söntgen 2023-06-29 21:12:07 +00:00 committed by Norman Feske
parent 02209e5455
commit 70c57a3be3
2 changed files with 12 additions and 5 deletions

View File

@ -142,10 +142,17 @@ struct Pci::Config : Genode::Mmio
bool prefetchable() {
return Bar_32bit::Memory_prefetchable::get(_conf()); }
Genode::size_t size()
Genode::uint64_t size()
{
return 1 + (memory() ? ~Bar_32bit::Memory_base::masked(_conf())
: ~Bar_32bit::Io_base::masked(_conf()));
if (memory()) {
Genode::uint64_t size = 1 + ~Bar_32bit::Memory_base::masked(_conf());
if (bit64())
size += ((Genode::uint64_t)~_get_and_set<Upper_bits>(read<Upper_bits>()))<<32;
return size;
}
else
return 1 + ~Bar_32bit::Io_base::masked(_conf());
}
Genode::uint64_t addr()

View File

@ -139,7 +139,7 @@ bus_t Main::parse_pci_function(Bdf bdf,
}
});
cfg.for_each_bar([&] (uint64_t addr, size_t size,
cfg.for_each_bar([&] (uint64_t addr, uint64_t size,
unsigned bar, bool pf)
{
gen.node("io_mem", [&]
@ -149,7 +149,7 @@ bus_t Main::parse_pci_function(Bdf bdf,
gen.attribute("size", string(size));
if (pf) gen.attribute("prefetchable", true);
});
}, [&] (uint64_t addr, size_t size, unsigned bar) {
}, [&] (uint64_t addr, uint64_t size, unsigned bar) {
gen.node("io_port_range", [&]
{
gen.attribute("pci_bar", bar);