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