| # SPDX-License-Identifier: GPL-2.0+ | |
| # Copyright 2022 Google LLC | |
| # | |
| """Bintool implementation for fdtgrep | |
| fdtgrepprovides a way to grep devicetree-binary files to extract or remove | |
| certain elements. | |
| Usage: fdtgrep - extract portions from device tree | |
| Usage: | |
| fdtgrep <options> <dt file>|- | |
| Output formats are: | |
| dts - device tree soure text | |
| dtb - device tree blob (sets -Hmt automatically) | |
| bin - device tree fragment (may not be a valid .dtb) | |
| Options: -[haAc:b:C:defg:G:HIlLmn:N:o:O:p:P:rRsStTvhV] | |
| -a, --show-address Display address | |
| -A, --colour Show all nodes/tags, colour those that match | |
| -b, --include-node-with-prop <arg> Include contains containing property | |
| -c, --include-compat <arg> Compatible nodes to include in grep | |
| -C, --exclude-compat <arg> Compatible nodes to exclude in grep | |
| -d, --diff Diff: Mark matching nodes with +, others with - | |
| -e, --enter-node Enter direct subnode names of matching nodes | |
| -f, --show-offset Display offset | |
| -g, --include-match <arg> Node/property/compatible string to include in grep | |
| -G, --exclude-match <arg> Node/property/compatible string to exclude in grep | |
| -H, --show-header Output a header | |
| -I, --show-version Put "/dts-v1/;" on first line of dts output | |
| -l, --list-regions Output a region list | |
| -L, --list-strings List strings in string table | |
| -m, --include-mem Include mem_rsvmap section in binary output | |
| -n, --include-node <arg> Node to include in grep | |
| -N, --exclude-node <arg> Node to exclude in grep | |
| -p, --include-prop <arg> Property to include in grep | |
| -P, --exclude-prop <arg> Property to exclude in grep | |
| -r, --remove-strings Remove unused strings from string table | |
| -R, --include-root Include root node and all properties | |
| -s, --show-subnodes Show all subnodes matching nodes | |
| -S, --skip-supernodes Don't include supernodes of matching nodes | |
| -t, --show-stringtab Include string table in binary output | |
| -T, --show-aliases Include matching aliases in output | |
| -o, --out <arg> -o <output file> | |
| -O, --out-format <arg> -O <output format> | |
| -v, --invert-match Invert the sense of matching (select non-matching lines) | |
| -h, --help Print this help and exit | |
| -V, --version Print version and exit | |
| """ | |
| import tempfile | |
| from u_boot_pylib import tools | |
| from binman import bintool | |
| class Bintoolfdtgrep(bintool.Bintool): | |
| """Handles the 'fdtgrep' tool | |
| This bintool supports running `fdtgrep` with parameters suitable for | |
| producing SPL devicetrees from the main one. | |
| """ | |
| def __init__(self, name): | |
| super().__init__(name, 'Grep devicetree files') | |
| def create_for_phase(self, infile, phase, outfile, remove_props): | |
| """Create the FDT for a particular phase | |
| Args: | |
| infile (str): Input filename containing the full FDT contents (with | |
| all nodes and properties) | |
| phase (str): Phase to generate for ('tpl', 'vpl', 'spl') | |
| outfile (str): Output filename to write the grepped FDT contents to | |
| (with only neceesary nodes and properties) | |
| Returns: | |
| str or bytes: Resulting stdout from the bintool | |
| """ | |
| if phase == 'tpl': | |
| tag = 'bootph-pre-sram' | |
| elif phase == 'vpl': | |
| tag = 'bootph-verify' | |
| elif phase == 'spl': | |
| tag = 'bootph-pre-ram' | |
| else: | |
| raise ValueError(f"Invalid U-Boot phase '{phase}': Use tpl/vpl/spl") | |
| # These args mirror those in cmd_fdtgrep in scripts/Makefile.lib | |
| # First do the first stage | |
| with tempfile.NamedTemporaryFile(prefix='fdtgrep.tmp', | |
| dir=tools.get_output_dir()) as tmp: | |
| args = [ | |
| infile, | |
| '-o', tmp.name, | |
| '-b', 'bootph-all', | |
| '-b', tag, | |
| '-u', | |
| '-RT', | |
| '-n', '/chosen', | |
| '-n', '/config', | |
| '-O', 'dtb', | |
| ] | |
| self.run_cmd(*args) | |
| args = [ | |
| tmp.name, | |
| '-o', outfile, | |
| '-r', | |
| '-O', 'dtb', | |
| '-P', 'bootph-all', | |
| '-P', 'bootph-pre-ram', | |
| '-P', 'bootph-pre-sram', | |
| '-P', 'bootph-verify', | |
| ] | |
| for prop_name in remove_props: | |
| args += ['-P', prop_name] | |
| return self.run_cmd(*args) | |
| def fetch(self, method): | |
| """Fetch handler for fdtgrep | |
| This installs fdtgrep using the apt utility, which assumes that it is | |
| packaged in u-boot tools, which it is not. | |
| Args: | |
| method (FETCH_...): Method to use | |
| Returns: | |
| True if the file was fetched and now installed, None if a method | |
| other than FETCH_BIN was requested | |
| Raises: | |
| Valuerror: Fetching could not be completed | |
| """ | |
| if method != bintool.FETCH_BIN: | |
| return None | |
| return self.apt_install('u-boot-tools') |