1#
2# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3#
4# SPDX-License-Identifier: GPL-2.0-only
5#
6
7''' generate a yaml file with memory region info from the device tree '''
8
9import argparse
10import yaml
11
12from hardware import config, fdt
13from hardware.utils import memory, rule
14
15
16def get_kernel_devices(tree: fdt.FdtParser, rules: rule.HardwareYaml):
17    kernel_devices = tree.get_kernel_devices()
18
19    groups = []
20    for dev in kernel_devices:
21        rule = rules.get_rule(dev)
22        groups += rule.get_regions(dev)
23
24    return groups
25
26
27def run(tree: fdt.FdtParser, hardware: rule.HardwareYaml, config: config.Config,
28        args: argparse.Namespace):
29    if not args.yaml_out:
30        raise ValueError('you need to provide a yaml-out to use the yaml output method')
31    phys_mem, reserved, _ = memory.get_physical_memory(tree, config)
32    kernel_devs = get_kernel_devices(tree, hardware)
33    dev_mem = memory.get_addrspace_exclude(list(reserved) + phys_mem + kernel_devs, config)
34
35    yaml.add_representer(int, lambda dumper, data: yaml.ScalarNode(
36        'tag:yaml.org,2002:int', hex(data)))
37    yaml_obj = {
38        'devices': [{'start': r.base, 'end': r.base + r.size} for r in dev_mem if r.size > 0],
39        'memory': [{'start': r.base, 'end': r.base + r.size} for r in phys_mem if r.size > 0]
40    }
41
42    yaml.dump(yaml_obj, args.yaml_out)
43    args.yaml_out.close()
44
45
46def add_args(parser):
47    parser.add_argument('--yaml-out', help='output file for memory yaml',
48                        type=argparse.FileType('w'))
49