xref: /rk3399_rockchip-uboot/tools/dtoc/dtoc.py (revision efefe1221bd779f319b810c5415e577c331edec8)
169f2ed77SSimon Glass#!/usr/bin/python
269f2ed77SSimon Glass#
369f2ed77SSimon Glass# Copyright (C) 2016 Google, Inc
469f2ed77SSimon Glass# Written by Simon Glass <sjg@chromium.org>
569f2ed77SSimon Glass#
669f2ed77SSimon Glass# SPDX-License-Identifier:	GPL-2.0+
769f2ed77SSimon Glass#
869f2ed77SSimon Glass
969f2ed77SSimon Glassimport copy
1069f2ed77SSimon Glassfrom optparse import OptionError, OptionParser
1169f2ed77SSimon Glassimport os
1269f2ed77SSimon Glassimport sys
1369f2ed77SSimon Glass
1469f2ed77SSimon Glassimport fdt_util
1569f2ed77SSimon Glass
1669f2ed77SSimon Glass# Bring in the patman libraries
1769f2ed77SSimon Glassour_path = os.path.dirname(os.path.realpath(__file__))
1869f2ed77SSimon Glasssys.path.append(os.path.join(our_path, '../patman'))
1969f2ed77SSimon Glass
2069f2ed77SSimon Glass# Bring in either the normal fdt library (which relies on libfdt) or the
2169f2ed77SSimon Glass# fallback one (which uses fdtget and is slower). Both provide the same
2269f2ed77SSimon Glass# interfface for this file to use.
2369f2ed77SSimon Glasstry:
2469f2ed77SSimon Glass    from fdt import Fdt
2569f2ed77SSimon Glass    import fdt
2669f2ed77SSimon Glass    have_libfdt = True
2769f2ed77SSimon Glassexcept ImportError:
2869f2ed77SSimon Glass    have_libfdt = False
2969f2ed77SSimon Glass    from fdt_fallback import Fdt
3069f2ed77SSimon Glass    import fdt_fallback as fdt
3169f2ed77SSimon Glass
3269f2ed77SSimon Glassimport struct
3369f2ed77SSimon Glass
3469f2ed77SSimon Glass# When we see these properties we ignore them - i.e. do not create a structure member
3569f2ed77SSimon GlassPROP_IGNORE_LIST = [
3669f2ed77SSimon Glass    '#address-cells',
3769f2ed77SSimon Glass    '#gpio-cells',
3869f2ed77SSimon Glass    '#size-cells',
3969f2ed77SSimon Glass    'compatible',
4069f2ed77SSimon Glass    'linux,phandle',
4169f2ed77SSimon Glass    "status",
4269f2ed77SSimon Glass    'phandle',
43*efefe122SSimon Glass    'u-boot,dm-pre-reloc',
4469f2ed77SSimon Glass]
4569f2ed77SSimon Glass
4669f2ed77SSimon Glass# C type declarations for the tyues we support
4769f2ed77SSimon GlassTYPE_NAMES = {
4869f2ed77SSimon Glass    fdt_util.TYPE_INT: 'fdt32_t',
4969f2ed77SSimon Glass    fdt_util.TYPE_BYTE: 'unsigned char',
5069f2ed77SSimon Glass    fdt_util.TYPE_STRING: 'const char *',
5169f2ed77SSimon Glass    fdt_util.TYPE_BOOL: 'bool',
5269f2ed77SSimon Glass};
5369f2ed77SSimon Glass
5469f2ed77SSimon GlassSTRUCT_PREFIX = 'dtd_'
5569f2ed77SSimon GlassVAL_PREFIX = 'dtv_'
5669f2ed77SSimon Glass
5769f2ed77SSimon Glassdef Conv_name_to_c(name):
5869f2ed77SSimon Glass    """Convert a device-tree name to a C identifier
5969f2ed77SSimon Glass
6069f2ed77SSimon Glass    Args:
6169f2ed77SSimon Glass        name:   Name to convert
6269f2ed77SSimon Glass    Return:
6369f2ed77SSimon Glass        String containing the C version of this name
6469f2ed77SSimon Glass    """
6569f2ed77SSimon Glass    str = name.replace('@', '_at_')
6669f2ed77SSimon Glass    str = str.replace('-', '_')
6769f2ed77SSimon Glass    str = str.replace(',', '_')
6869f2ed77SSimon Glass    str = str.replace('/', '__')
6969f2ed77SSimon Glass    return str
7069f2ed77SSimon Glass
7169f2ed77SSimon Glassdef TabTo(num_tabs, str):
7269f2ed77SSimon Glass    if len(str) >= num_tabs * 8:
7369f2ed77SSimon Glass        return str + ' '
7469f2ed77SSimon Glass    return str + '\t' * (num_tabs - len(str) / 8)
7569f2ed77SSimon Glass
7669f2ed77SSimon Glassclass DtbPlatdata:
7769f2ed77SSimon Glass    """Provide a means to convert device tree binary data to platform data
7869f2ed77SSimon Glass
7969f2ed77SSimon Glass    The output of this process is C structures which can be used in space-
8069f2ed77SSimon Glass    constrained encvironments where the ~3KB code overhead of device tree
8169f2ed77SSimon Glass    code is not affordable.
8269f2ed77SSimon Glass
8369f2ed77SSimon Glass    Properties:
8469f2ed77SSimon Glass        fdt: Fdt object, referencing the device tree
8569f2ed77SSimon Glass        _dtb_fname: Filename of the input device tree binary file
8669f2ed77SSimon Glass        _valid_nodes: A list of Node object with compatible strings
8769f2ed77SSimon Glass        _options: Command-line options
8869f2ed77SSimon Glass        _phandle_node: A dict of nodes indexed by phandle number (1, 2...)
8969f2ed77SSimon Glass        _outfile: The current output file (sys.stdout or a real file)
9069f2ed77SSimon Glass        _lines: Stashed list of output lines for outputting in the future
9169f2ed77SSimon Glass        _phandle_node: A dict of Nodes indexed by phandle (an integer)
9269f2ed77SSimon Glass    """
9369f2ed77SSimon Glass    def __init__(self, dtb_fname, options):
9469f2ed77SSimon Glass        self._dtb_fname = dtb_fname
9569f2ed77SSimon Glass        self._valid_nodes = None
9669f2ed77SSimon Glass        self._options = options
9769f2ed77SSimon Glass        self._phandle_node = {}
9869f2ed77SSimon Glass        self._outfile = None
9969f2ed77SSimon Glass        self._lines = []
10069f2ed77SSimon Glass
10169f2ed77SSimon Glass    def SetupOutput(self, fname):
10269f2ed77SSimon Glass        """Set up the output destination
10369f2ed77SSimon Glass
10469f2ed77SSimon Glass        Once this is done, future calls to self.Out() will output to this
10569f2ed77SSimon Glass        file.
10669f2ed77SSimon Glass
10769f2ed77SSimon Glass        Args:
10869f2ed77SSimon Glass            fname: Filename to send output to, or '-' for stdout
10969f2ed77SSimon Glass        """
11069f2ed77SSimon Glass        if fname == '-':
11169f2ed77SSimon Glass            self._outfile = sys.stdout
11269f2ed77SSimon Glass        else:
11369f2ed77SSimon Glass            self._outfile = open(fname, 'w')
11469f2ed77SSimon Glass
11569f2ed77SSimon Glass    def Out(self, str):
11669f2ed77SSimon Glass        """Output a string to the output file
11769f2ed77SSimon Glass
11869f2ed77SSimon Glass        Args:
11969f2ed77SSimon Glass            str: String to output
12069f2ed77SSimon Glass        """
12169f2ed77SSimon Glass        self._outfile.write(str)
12269f2ed77SSimon Glass
12369f2ed77SSimon Glass    def Buf(self, str):
12469f2ed77SSimon Glass        """Buffer up a string to send later
12569f2ed77SSimon Glass
12669f2ed77SSimon Glass        Args:
12769f2ed77SSimon Glass            str: String to add to our 'buffer' list
12869f2ed77SSimon Glass        """
12969f2ed77SSimon Glass        self._lines.append(str)
13069f2ed77SSimon Glass
13169f2ed77SSimon Glass    def GetBuf(self):
13269f2ed77SSimon Glass        """Get the contents of the output buffer, and clear it
13369f2ed77SSimon Glass
13469f2ed77SSimon Glass        Returns:
13569f2ed77SSimon Glass            The output buffer, which is then cleared for future use
13669f2ed77SSimon Glass        """
13769f2ed77SSimon Glass        lines = self._lines
13869f2ed77SSimon Glass        self._lines = []
13969f2ed77SSimon Glass        return lines
14069f2ed77SSimon Glass
14169f2ed77SSimon Glass    def GetValue(self, type, value):
14269f2ed77SSimon Glass        """Get a value as a C expression
14369f2ed77SSimon Glass
14469f2ed77SSimon Glass        For integers this returns a byte-swapped (little-endian) hex string
14569f2ed77SSimon Glass        For bytes this returns a hex string, e.g. 0x12
14669f2ed77SSimon Glass        For strings this returns a literal string enclosed in quotes
14769f2ed77SSimon Glass        For booleans this return 'true'
14869f2ed77SSimon Glass
14969f2ed77SSimon Glass        Args:
15069f2ed77SSimon Glass            type: Data type (fdt_util)
15169f2ed77SSimon Glass            value: Data value, as a string of bytes
15269f2ed77SSimon Glass        """
15369f2ed77SSimon Glass        if type == fdt_util.TYPE_INT:
15469f2ed77SSimon Glass            return '%#x' % fdt_util.fdt32_to_cpu(value)
15569f2ed77SSimon Glass        elif type == fdt_util.TYPE_BYTE:
15669f2ed77SSimon Glass            return '%#x' % ord(value[0])
15769f2ed77SSimon Glass        elif type == fdt_util.TYPE_STRING:
15869f2ed77SSimon Glass            return '"%s"' % value
15969f2ed77SSimon Glass        elif type == fdt_util.TYPE_BOOL:
16069f2ed77SSimon Glass            return 'true'
16169f2ed77SSimon Glass
16269f2ed77SSimon Glass    def GetCompatName(self, node):
16369f2ed77SSimon Glass        """Get a node's first compatible string as a C identifier
16469f2ed77SSimon Glass
16569f2ed77SSimon Glass        Args:
16669f2ed77SSimon Glass            node: Node object to check
16769f2ed77SSimon Glass        Return:
16869f2ed77SSimon Glass            C identifier for the first compatible string
16969f2ed77SSimon Glass        """
17069f2ed77SSimon Glass        compat = node.props['compatible'].value
17169f2ed77SSimon Glass        if type(compat) == list:
17269f2ed77SSimon Glass            compat = compat[0]
17369f2ed77SSimon Glass        return Conv_name_to_c(compat)
17469f2ed77SSimon Glass
17569f2ed77SSimon Glass    def ScanDtb(self):
17669f2ed77SSimon Glass        """Scan the device tree to obtain a tree of notes and properties
17769f2ed77SSimon Glass
17869f2ed77SSimon Glass        Once this is done, self.fdt.GetRoot() can be called to obtain the
17969f2ed77SSimon Glass        device tree root node, and progress from there.
18069f2ed77SSimon Glass        """
18169f2ed77SSimon Glass        self.fdt = Fdt(self._dtb_fname)
18269f2ed77SSimon Glass        self.fdt.Scan()
18369f2ed77SSimon Glass
18469f2ed77SSimon Glass    def ScanTree(self):
18569f2ed77SSimon Glass        """Scan the device tree for useful information
18669f2ed77SSimon Glass
18769f2ed77SSimon Glass        This fills in the following properties:
18869f2ed77SSimon Glass            _phandle_node: A dict of Nodes indexed by phandle (an integer)
18969f2ed77SSimon Glass            _valid_nodes: A list of nodes we wish to consider include in the
19069f2ed77SSimon Glass                platform data
19169f2ed77SSimon Glass        """
19269f2ed77SSimon Glass        node_list = []
19369f2ed77SSimon Glass        self._phandle_node = {}
19469f2ed77SSimon Glass        for node in self.fdt.GetRoot().subnodes:
19569f2ed77SSimon Glass            if 'compatible' in node.props:
19669f2ed77SSimon Glass                status = node.props.get('status')
19769f2ed77SSimon Glass                if (not options.include_disabled and not status or
19869f2ed77SSimon Glass                    status.value != 'disabled'):
19969f2ed77SSimon Glass                    node_list.append(node)
20069f2ed77SSimon Glass                    phandle_prop = node.props.get('phandle')
20169f2ed77SSimon Glass                    if phandle_prop:
20269f2ed77SSimon Glass                        phandle = phandle_prop.GetPhandle()
20369f2ed77SSimon Glass                        self._phandle_node[phandle] = node
20469f2ed77SSimon Glass
20569f2ed77SSimon Glass        self._valid_nodes = node_list
20669f2ed77SSimon Glass
20769f2ed77SSimon Glass    def IsPhandle(self, prop):
20869f2ed77SSimon Glass        """Check if a node contains phandles
20969f2ed77SSimon Glass
21069f2ed77SSimon Glass        We have no reliable way of detecting whether a node uses a phandle
21169f2ed77SSimon Glass        or not. As an interim measure, use a list of known property names.
21269f2ed77SSimon Glass
21369f2ed77SSimon Glass        Args:
21469f2ed77SSimon Glass            prop: Prop object to check
21569f2ed77SSimon Glass        Return:
21669f2ed77SSimon Glass            True if the object value contains phandles, else False
21769f2ed77SSimon Glass        """
21869f2ed77SSimon Glass        if prop.name in ['clocks']:
21969f2ed77SSimon Glass            return True
22069f2ed77SSimon Glass        return False
22169f2ed77SSimon Glass
22269f2ed77SSimon Glass    def ScanStructs(self):
22369f2ed77SSimon Glass        """Scan the device tree building up the C structures we will use.
22469f2ed77SSimon Glass
22569f2ed77SSimon Glass        Build a dict keyed by C struct name containing a dict of Prop
22669f2ed77SSimon Glass        object for each struct field (keyed by property name). Where the
22769f2ed77SSimon Glass        same struct appears multiple times, try to use the 'widest'
22869f2ed77SSimon Glass        property, i.e. the one with a type which can express all others.
22969f2ed77SSimon Glass
23069f2ed77SSimon Glass        Once the widest property is determined, all other properties are
23169f2ed77SSimon Glass        updated to match that width.
23269f2ed77SSimon Glass        """
23369f2ed77SSimon Glass        structs = {}
23469f2ed77SSimon Glass        for node in self._valid_nodes:
23569f2ed77SSimon Glass            node_name = self.GetCompatName(node)
23669f2ed77SSimon Glass            fields = {}
23769f2ed77SSimon Glass
23869f2ed77SSimon Glass            # Get a list of all the valid properties in this node.
23969f2ed77SSimon Glass            for name, prop in node.props.iteritems():
24069f2ed77SSimon Glass                if name not in PROP_IGNORE_LIST and name[0] != '#':
24169f2ed77SSimon Glass                    fields[name] = copy.deepcopy(prop)
24269f2ed77SSimon Glass
24369f2ed77SSimon Glass            # If we've seen this node_name before, update the existing struct.
24469f2ed77SSimon Glass            if node_name in structs:
24569f2ed77SSimon Glass                struct = structs[node_name]
24669f2ed77SSimon Glass                for name, prop in fields.iteritems():
24769f2ed77SSimon Glass                    oldprop = struct.get(name)
24869f2ed77SSimon Glass                    if oldprop:
24969f2ed77SSimon Glass                        oldprop.Widen(prop)
25069f2ed77SSimon Glass                    else:
25169f2ed77SSimon Glass                        struct[name] = prop
25269f2ed77SSimon Glass
25369f2ed77SSimon Glass            # Otherwise store this as a new struct.
25469f2ed77SSimon Glass            else:
25569f2ed77SSimon Glass                structs[node_name] = fields
25669f2ed77SSimon Glass
25769f2ed77SSimon Glass        upto = 0
25869f2ed77SSimon Glass        for node in self._valid_nodes:
25969f2ed77SSimon Glass            node_name = self.GetCompatName(node)
26069f2ed77SSimon Glass            struct = structs[node_name]
26169f2ed77SSimon Glass            for name, prop in node.props.iteritems():
26269f2ed77SSimon Glass                if name not in PROP_IGNORE_LIST and name[0] != '#':
26369f2ed77SSimon Glass                    prop.Widen(struct[name])
26469f2ed77SSimon Glass            upto += 1
26569f2ed77SSimon Glass        return structs
26669f2ed77SSimon Glass
26769f2ed77SSimon Glass    def GenerateStructs(self, structs):
26869f2ed77SSimon Glass        """Generate struct defintions for the platform data
26969f2ed77SSimon Glass
27069f2ed77SSimon Glass        This writes out the body of a header file consisting of structure
27169f2ed77SSimon Glass        definitions for node in self._valid_nodes. See the documentation in
27269f2ed77SSimon Glass        README.of-plat for more information.
27369f2ed77SSimon Glass        """
27469f2ed77SSimon Glass        self.Out('#include <stdbool.h>\n')
27569f2ed77SSimon Glass        self.Out('#include <libfdt.h>\n')
27669f2ed77SSimon Glass
27769f2ed77SSimon Glass        # Output the struct definition
27869f2ed77SSimon Glass        for name in sorted(structs):
27969f2ed77SSimon Glass            self.Out('struct %s%s {\n' % (STRUCT_PREFIX, name));
28069f2ed77SSimon Glass            for pname in sorted(structs[name]):
28169f2ed77SSimon Glass                prop = structs[name][pname]
28269f2ed77SSimon Glass                if self.IsPhandle(prop):
28369f2ed77SSimon Glass                    # For phandles, include a reference to the target
28469f2ed77SSimon Glass                    self.Out('\t%s%s[%d]' % (TabTo(2, 'struct phandle_2_cell'),
28569f2ed77SSimon Glass                                             Conv_name_to_c(prop.name),
28669f2ed77SSimon Glass                                             len(prop.value) / 2))
28769f2ed77SSimon Glass                else:
28869f2ed77SSimon Glass                    ptype = TYPE_NAMES[prop.type]
28969f2ed77SSimon Glass                    self.Out('\t%s%s' % (TabTo(2, ptype),
29069f2ed77SSimon Glass                                         Conv_name_to_c(prop.name)))
29169f2ed77SSimon Glass                    if type(prop.value) == list:
29269f2ed77SSimon Glass                        self.Out('[%d]' % len(prop.value))
29369f2ed77SSimon Glass                self.Out(';\n')
29469f2ed77SSimon Glass            self.Out('};\n')
29569f2ed77SSimon Glass
29669f2ed77SSimon Glass    def GenerateTables(self):
29769f2ed77SSimon Glass        """Generate device defintions for the platform data
29869f2ed77SSimon Glass
29969f2ed77SSimon Glass        This writes out C platform data initialisation data and
30069f2ed77SSimon Glass        U_BOOT_DEVICE() declarations for each valid node. See the
30169f2ed77SSimon Glass        documentation in README.of-plat for more information.
30269f2ed77SSimon Glass        """
30369f2ed77SSimon Glass        self.Out('#include <common.h>\n')
30469f2ed77SSimon Glass        self.Out('#include <dm.h>\n')
30569f2ed77SSimon Glass        self.Out('#include <dt-structs.h>\n')
30669f2ed77SSimon Glass        self.Out('\n')
30769f2ed77SSimon Glass        node_txt_list = []
30869f2ed77SSimon Glass        for node in self._valid_nodes:
30969f2ed77SSimon Glass            struct_name = self.GetCompatName(node)
31069f2ed77SSimon Glass            var_name = Conv_name_to_c(node.name)
31169f2ed77SSimon Glass            self.Buf('static struct %s%s %s%s = {\n' %
31269f2ed77SSimon Glass                (STRUCT_PREFIX, struct_name, VAL_PREFIX, var_name))
31369f2ed77SSimon Glass            for pname, prop in node.props.iteritems():
31469f2ed77SSimon Glass                if pname in PROP_IGNORE_LIST or pname[0] == '#':
31569f2ed77SSimon Glass                    continue
31669f2ed77SSimon Glass                ptype = TYPE_NAMES[prop.type]
31769f2ed77SSimon Glass                member_name = Conv_name_to_c(prop.name)
31869f2ed77SSimon Glass                self.Buf('\t%s= ' % TabTo(3, '.' + member_name))
31969f2ed77SSimon Glass
32069f2ed77SSimon Glass                # Special handling for lists
32169f2ed77SSimon Glass                if type(prop.value) == list:
32269f2ed77SSimon Glass                    self.Buf('{')
32369f2ed77SSimon Glass                    vals = []
32469f2ed77SSimon Glass                    # For phandles, output a reference to the platform data
32569f2ed77SSimon Glass                    # of the target node.
32669f2ed77SSimon Glass                    if self.IsPhandle(prop):
32769f2ed77SSimon Glass                        # Process the list as pairs of (phandle, id)
32869f2ed77SSimon Glass                        it = iter(prop.value)
32969f2ed77SSimon Glass                        for phandle_cell, id_cell in zip(it, it):
33069f2ed77SSimon Glass                            phandle = fdt_util.fdt32_to_cpu(phandle_cell)
33169f2ed77SSimon Glass                            id = fdt_util.fdt32_to_cpu(id_cell)
33269f2ed77SSimon Glass                            target_node = self._phandle_node[phandle]
33369f2ed77SSimon Glass                            name = Conv_name_to_c(target_node.name)
33469f2ed77SSimon Glass                            vals.append('{&%s%s, %d}' % (VAL_PREFIX, name, id))
33569f2ed77SSimon Glass                    else:
33669f2ed77SSimon Glass                        for val in prop.value:
33769f2ed77SSimon Glass                            vals.append(self.GetValue(prop.type, val))
33869f2ed77SSimon Glass                    self.Buf(', '.join(vals))
33969f2ed77SSimon Glass                    self.Buf('}')
34069f2ed77SSimon Glass                else:
34169f2ed77SSimon Glass                    self.Buf(self.GetValue(prop.type, prop.value))
34269f2ed77SSimon Glass                self.Buf(',\n')
34369f2ed77SSimon Glass            self.Buf('};\n')
34469f2ed77SSimon Glass
34569f2ed77SSimon Glass            # Add a device declaration
34669f2ed77SSimon Glass            self.Buf('U_BOOT_DEVICE(%s) = {\n' % var_name)
34769f2ed77SSimon Glass            self.Buf('\t.name\t\t= "%s",\n' % struct_name)
34869f2ed77SSimon Glass            self.Buf('\t.platdata\t= &%s%s,\n' % (VAL_PREFIX, var_name))
34969f2ed77SSimon Glass            self.Buf('};\n')
35069f2ed77SSimon Glass            self.Buf('\n')
35169f2ed77SSimon Glass
35269f2ed77SSimon Glass            # Output phandle target nodes first, since they may be referenced
35369f2ed77SSimon Glass            # by others
35469f2ed77SSimon Glass            if 'phandle' in node.props:
35569f2ed77SSimon Glass                self.Out(''.join(self.GetBuf()))
35669f2ed77SSimon Glass            else:
35769f2ed77SSimon Glass                node_txt_list.append(self.GetBuf())
35869f2ed77SSimon Glass
35969f2ed77SSimon Glass        # Output all the nodes which are not phandle targets themselves, but
36069f2ed77SSimon Glass        # may reference them. This avoids the need for forward declarations.
36169f2ed77SSimon Glass        for node_txt in node_txt_list:
36269f2ed77SSimon Glass            self.Out(''.join(node_txt))
36369f2ed77SSimon Glass
36469f2ed77SSimon Glass
36569f2ed77SSimon Glassif __name__ != "__main__":
36669f2ed77SSimon Glass    pass
36769f2ed77SSimon Glass
36869f2ed77SSimon Glassparser = OptionParser()
36969f2ed77SSimon Glassparser.add_option('-d', '--dtb-file', action='store',
37069f2ed77SSimon Glass                  help='Specify the .dtb input file')
37169f2ed77SSimon Glassparser.add_option('--include-disabled', action='store_true',
37269f2ed77SSimon Glass                  help='Include disabled nodes')
37369f2ed77SSimon Glassparser.add_option('-o', '--output', action='store', default='-',
37469f2ed77SSimon Glass                  help='Select output filename')
37569f2ed77SSimon Glass(options, args) = parser.parse_args()
37669f2ed77SSimon Glass
37769f2ed77SSimon Glassif not args:
37869f2ed77SSimon Glass    raise ValueError('Please specify a command: struct, platdata')
37969f2ed77SSimon Glass
38069f2ed77SSimon Glassplat = DtbPlatdata(options.dtb_file, options)
38169f2ed77SSimon Glassplat.ScanDtb()
38269f2ed77SSimon Glassplat.ScanTree()
38369f2ed77SSimon Glassplat.SetupOutput(options.output)
38469f2ed77SSimon Glassstructs = plat.ScanStructs()
38569f2ed77SSimon Glass
38669f2ed77SSimon Glassfor cmd in args[0].split(','):
38769f2ed77SSimon Glass    if cmd == 'struct':
38869f2ed77SSimon Glass        plat.GenerateStructs(structs)
38969f2ed77SSimon Glass    elif cmd == 'platdata':
39069f2ed77SSimon Glass        plat.GenerateTables()
39169f2ed77SSimon Glass    else:
39269f2ed77SSimon Glass        raise ValueError("Unknown command '%s': (use: struct, platdata)" % cmd)
393