hardware_gen: Add support for /reserved-memory node

Parse the /reserved-memory node per the Linux spec[1].
Ignore regions marked as 'no-map', but keep other regions
as they should be OK to use as RAM.

[1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt?h=v5.0-rc6
This commit is contained in:
Simon Shields
2019-02-14 15:42:13 +11:00
parent 5cd3b7e317
commit ca53350a71

View File

@@ -614,12 +614,33 @@ def should_parse_regions(root, node):
except ValueError:
return False
def parse_reserved_memory(node, devices, cfg, by_phandle):
regions = []
for child in node.walk():
name = child[0]
child = child[1]
if not isinstance(child, pyfdt.pyfdt.FdtNode):
continue
dev = devices[child.path]
# reserved memory regions overlap with physical RAM.
# never expose them to userspace (even if they are mappable)
del devices[child.path]
if 'reg' in dev and 'no-map' in dev:
reg, _ = dev.regions(cfg, by_phandle)
for r in reg:
regions.append({'address': r.start, 'size': r.size})
return regions
def find_devices(dtb, cfg):
devices = {}
nodes = {}
by_phandle = {}
chosen = None
aliases = None
reserved_memory = []
root = dtb.get_rootnode()
root.path = '/'
devices[root.name] = Device(root, None, '/')
@@ -860,6 +881,11 @@ def main(args):
memory, user, kernel = set(), set(), set()
fdt = pyfdt.pyfdt.FdtBlobParse(args.dtb).to_fdt()
devices, by_phandle = find_devices(fdt, cfg)
rsvmem = []
if '/reserved-memory' in devices:
rsvmem = parse_reserved_memory(devices['/reserved-memory'].node, devices, cfg, by_phandle)
rsvmem += fdt.reserve_entries
kernel_irqs = set()
for d in devices.values():
kernel_irqs.update(d.get_interrupts(cfg, by_phandle))
@@ -867,7 +893,7 @@ def main(args):
m, _ = d.regions(cfg, by_phandle) # second set is always empty for memory
res = set()
for e in m:
res.update(set(e.remove_subregions(fdt.reserve_entries)))
res.update(set(e.remove_subregions(rsvmem)))
memory.update(res)
else:
(u, k) = d.regions(cfg, by_phandle)