xref: /rk3399_rockchip-uboot/tools/dtoc/test_dtoc.py (revision 54d1a4b76c2dfc54f524c9a49fe2777d7ea94fc4)
1c0791928SSimon Glass#
2c0791928SSimon Glass# Copyright (c) 2012 The Chromium OS Authors.
3c0791928SSimon Glass#
4c0791928SSimon Glass# SPDX-License-Identifier:	GPL-2.0+
5c0791928SSimon Glass#
6c0791928SSimon Glass
7c0791928SSimon Glass"""Tests for the dtb_platdata module
8c0791928SSimon Glass
9c0791928SSimon GlassThis includes unit tests for some functions and functional tests for
10c0791928SSimon Glass"""
11c0791928SSimon Glass
12c0791928SSimon Glassimport collections
13c0791928SSimon Glassimport os
14c0791928SSimon Glassimport struct
15c0791928SSimon Glassimport unittest
16c0791928SSimon Glass
17c0791928SSimon Glassimport dtb_platdata
18c0791928SSimon Glassfrom dtb_platdata import conv_name_to_c
19c0791928SSimon Glassfrom dtb_platdata import get_compat_name
20c0791928SSimon Glassfrom dtb_platdata import get_value
21c0791928SSimon Glassfrom dtb_platdata import tab_to
22c0791928SSimon Glassimport fdt
23c0791928SSimon Glassimport fdt_util
24c0791928SSimon Glassimport tools
25c0791928SSimon Glass
26c0791928SSimon Glassour_path = os.path.dirname(os.path.realpath(__file__))
27c0791928SSimon Glass
28c0791928SSimon Glass
29c0791928SSimon Glassdef get_dtb_file(dts_fname):
30c0791928SSimon Glass    """Compile a .dts file to a .dtb
31c0791928SSimon Glass
32c0791928SSimon Glass    Args:
33c0791928SSimon Glass        dts_fname: Filename of .dts file in the current directory
34c0791928SSimon Glass
35c0791928SSimon Glass    Returns:
36c0791928SSimon Glass        Filename of compiled file in output directory
37c0791928SSimon Glass    """
38c0791928SSimon Glass    return fdt_util.EnsureCompiled(os.path.join(our_path, dts_fname))
39c0791928SSimon Glass
40c0791928SSimon Glass
41c0791928SSimon Glassclass TestDtoc(unittest.TestCase):
42c0791928SSimon Glass    """Tests for dtoc"""
43c0791928SSimon Glass    @classmethod
44c0791928SSimon Glass    def setUpClass(cls):
45c0791928SSimon Glass        tools.PrepareOutputDir(None)
46c0791928SSimon Glass
47c0791928SSimon Glass    @classmethod
48c0791928SSimon Glass    def tearDownClass(cls):
49c0791928SSimon Glass        tools._RemoveOutputDir()
50c0791928SSimon Glass
51c0791928SSimon Glass    def test_name(self):
52c0791928SSimon Glass        """Test conversion of device tree names to C identifiers"""
53c0791928SSimon Glass        self.assertEqual('serial_at_0x12', conv_name_to_c('serial@0x12'))
54c0791928SSimon Glass        self.assertEqual('vendor_clock_frequency',
55c0791928SSimon Glass                         conv_name_to_c('vendor,clock-frequency'))
56c0791928SSimon Glass        self.assertEqual('rockchip_rk3399_sdhci_5_1',
57c0791928SSimon Glass                         conv_name_to_c('rockchip,rk3399-sdhci-5.1'))
58c0791928SSimon Glass
59c0791928SSimon Glass    def test_tab_to(self):
60c0791928SSimon Glass        """Test operation of tab_to() function"""
61c0791928SSimon Glass        self.assertEqual('fred ', tab_to(0, 'fred'))
62c0791928SSimon Glass        self.assertEqual('fred\t', tab_to(1, 'fred'))
63c0791928SSimon Glass        self.assertEqual('fred was here ', tab_to(1, 'fred was here'))
64c0791928SSimon Glass        self.assertEqual('fred was here\t\t', tab_to(3, 'fred was here'))
65c0791928SSimon Glass        self.assertEqual('exactly8 ', tab_to(1, 'exactly8'))
66c0791928SSimon Glass        self.assertEqual('exactly8\t', tab_to(2, 'exactly8'))
67c0791928SSimon Glass
68c0791928SSimon Glass    def test_get_value(self):
69c0791928SSimon Glass        """Test operation of get_value() function"""
70c0791928SSimon Glass        self.assertEqual('0x45',
71c0791928SSimon Glass                         get_value(fdt.TYPE_INT, struct.pack('>I', 0x45)))
72c0791928SSimon Glass        self.assertEqual('0x45',
73c0791928SSimon Glass                         get_value(fdt.TYPE_BYTE, struct.pack('<I', 0x45)))
74c0791928SSimon Glass        self.assertEqual('0x0',
75c0791928SSimon Glass                         get_value(fdt.TYPE_BYTE, struct.pack('>I', 0x45)))
76c0791928SSimon Glass        self.assertEqual('"test"', get_value(fdt.TYPE_STRING, 'test'))
77c0791928SSimon Glass        self.assertEqual('true', get_value(fdt.TYPE_BOOL, None))
78c0791928SSimon Glass
79c0791928SSimon Glass    def test_get_compat_name(self):
80c0791928SSimon Glass        """Test operation of get_compat_name() function"""
81c0791928SSimon Glass        Prop = collections.namedtuple('Prop', ['value'])
82c0791928SSimon Glass        Node = collections.namedtuple('Node', ['props'])
83c0791928SSimon Glass
84c0791928SSimon Glass        prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1'])
85c0791928SSimon Glass        node = Node({'compatible': prop})
86c0791928SSimon Glass        self.assertEqual(('rockchip_rk3399_sdhci_5_1', ['arasan_sdhci_5_1']),
87c0791928SSimon Glass                         get_compat_name(node))
88c0791928SSimon Glass
89c0791928SSimon Glass        prop = Prop(['rockchip,rk3399-sdhci-5.1'])
90c0791928SSimon Glass        node = Node({'compatible': prop})
91c0791928SSimon Glass        self.assertEqual(('rockchip_rk3399_sdhci_5_1', []),
92c0791928SSimon Glass                         get_compat_name(node))
93c0791928SSimon Glass
94c0791928SSimon Glass        prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1', 'third'])
95c0791928SSimon Glass        node = Node({'compatible': prop})
96c0791928SSimon Glass        self.assertEqual(('rockchip_rk3399_sdhci_5_1',
97c0791928SSimon Glass                          ['arasan_sdhci_5_1', 'third']),
98c0791928SSimon Glass                         get_compat_name(node))
99c0791928SSimon Glass
100c0791928SSimon Glass    def test_empty_file(self):
101c0791928SSimon Glass        """Test output from a device tree file with no nodes"""
102c0791928SSimon Glass        dtb_file = get_dtb_file('dtoc_test_empty.dts')
103c0791928SSimon Glass        output = tools.GetOutputFilename('output')
104c0791928SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
105c0791928SSimon Glass        with open(output) as infile:
106c0791928SSimon Glass            lines = infile.read().splitlines()
107c0791928SSimon Glass        self.assertEqual(['#include <stdbool.h>', '#include <libfdt.h>'], lines)
108c0791928SSimon Glass
109c0791928SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
110c0791928SSimon Glass        with open(output) as infile:
111c0791928SSimon Glass            lines = infile.read().splitlines()
112c0791928SSimon Glass        self.assertEqual(['#include <common.h>', '#include <dm.h>',
113c0791928SSimon Glass                          '#include <dt-structs.h>', ''], lines)
114c0791928SSimon Glass
115c0791928SSimon Glass    def test_simple(self):
116c0791928SSimon Glass        """Test output from some simple nodes with various types of data"""
117c0791928SSimon Glass        dtb_file = get_dtb_file('dtoc_test_simple.dts')
118c0791928SSimon Glass        output = tools.GetOutputFilename('output')
119c0791928SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
120c0791928SSimon Glass        with open(output) as infile:
121c0791928SSimon Glass            data = infile.read()
122c0791928SSimon Glass        self.assertEqual('''#include <stdbool.h>
123c0791928SSimon Glass#include <libfdt.h>
1244b26144bSSimon Glassstruct dtd_sandbox_i2c_test {
1254b26144bSSimon Glass};
1264b26144bSSimon Glassstruct dtd_sandbox_pmic_test {
1274b26144bSSimon Glass\tbool\t\tlow_power;
1284b26144bSSimon Glass\tfdt64_t\t\treg[2];
1294b26144bSSimon Glass};
130c0791928SSimon Glassstruct dtd_sandbox_spl_test {
131c0791928SSimon Glass\tbool\t\tboolval;
132c0791928SSimon Glass\tunsigned char\tbytearray[3];
133c0791928SSimon Glass\tunsigned char\tbyteval;
134c0791928SSimon Glass\tfdt32_t\t\tintarray[4];
135c0791928SSimon Glass\tfdt32_t\t\tintval;
136c0791928SSimon Glass\tunsigned char\tlongbytearray[9];
137c0791928SSimon Glass\tconst char *\tstringarray[3];
138c0791928SSimon Glass\tconst char *\tstringval;
139c0791928SSimon Glass};
140c0791928SSimon Glassstruct dtd_sandbox_spl_test_2 {
141c0791928SSimon Glass};
142c0791928SSimon Glass''', data)
143c0791928SSimon Glass
144c0791928SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
145c0791928SSimon Glass        with open(output) as infile:
146c0791928SSimon Glass            data = infile.read()
147c0791928SSimon Glass        self.assertEqual('''#include <common.h>
148c0791928SSimon Glass#include <dm.h>
149c0791928SSimon Glass#include <dt-structs.h>
150c0791928SSimon Glass
151c0791928SSimon Glassstatic struct dtd_sandbox_spl_test dtv_spl_test = {
152c0791928SSimon Glass\t.bytearray\t\t= {0x6, 0x0, 0x0},
153c0791928SSimon Glass\t.byteval\t\t= 0x5,
154c0791928SSimon Glass\t.intval\t\t\t= 0x1,
15512a972efSSimon Glass\t.longbytearray\t\t= {0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,
15612a972efSSimon Glass\t\t0x11},
157c0791928SSimon Glass\t.stringval\t\t= "message",
158c0791928SSimon Glass\t.boolval\t\t= true,
159c0791928SSimon Glass\t.intarray\t\t= {0x2, 0x3, 0x4, 0x0},
160c0791928SSimon Glass\t.stringarray\t\t= {"multi-word", "message", ""},
161c0791928SSimon Glass};
162c0791928SSimon GlassU_BOOT_DEVICE(spl_test) = {
163c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test",
164c0791928SSimon Glass\t.platdata\t= &dtv_spl_test,
165c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test),
166c0791928SSimon Glass};
167c0791928SSimon Glass
168c0791928SSimon Glassstatic struct dtd_sandbox_spl_test dtv_spl_test2 = {
169c0791928SSimon Glass\t.bytearray\t\t= {0x1, 0x23, 0x34},
170c0791928SSimon Glass\t.byteval\t\t= 0x8,
171c0791928SSimon Glass\t.intval\t\t\t= 0x3,
17212a972efSSimon Glass\t.longbytearray\t\t= {0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
17312a972efSSimon Glass\t\t0x0},
174c0791928SSimon Glass\t.stringval\t\t= "message2",
175c0791928SSimon Glass\t.intarray\t\t= {0x5, 0x0, 0x0, 0x0},
176c0791928SSimon Glass\t.stringarray\t\t= {"another", "multi-word", "message"},
177c0791928SSimon Glass};
178c0791928SSimon GlassU_BOOT_DEVICE(spl_test2) = {
179c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test",
180c0791928SSimon Glass\t.platdata\t= &dtv_spl_test2,
181c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test2),
182c0791928SSimon Glass};
183c0791928SSimon Glass
184c0791928SSimon Glassstatic struct dtd_sandbox_spl_test dtv_spl_test3 = {
185c0791928SSimon Glass\t.stringarray\t\t= {"one", "", ""},
186c0791928SSimon Glass};
187c0791928SSimon GlassU_BOOT_DEVICE(spl_test3) = {
188c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test",
189c0791928SSimon Glass\t.platdata\t= &dtv_spl_test3,
190c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test3),
191c0791928SSimon Glass};
192c0791928SSimon Glass
193c0791928SSimon Glassstatic struct dtd_sandbox_spl_test_2 dtv_spl_test4 = {
194c0791928SSimon Glass};
195c0791928SSimon GlassU_BOOT_DEVICE(spl_test4) = {
196c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test_2",
197c0791928SSimon Glass\t.platdata\t= &dtv_spl_test4,
198c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test4),
199c0791928SSimon Glass};
200c0791928SSimon Glass
2014b26144bSSimon Glassstatic struct dtd_sandbox_i2c_test dtv_i2c_at_0 = {
2024b26144bSSimon Glass};
2034b26144bSSimon GlassU_BOOT_DEVICE(i2c_at_0) = {
2044b26144bSSimon Glass\t.name\t\t= "sandbox_i2c_test",
2054b26144bSSimon Glass\t.platdata\t= &dtv_i2c_at_0,
2064b26144bSSimon Glass\t.platdata_size\t= sizeof(dtv_i2c_at_0),
2074b26144bSSimon Glass};
2084b26144bSSimon Glass
2094b26144bSSimon Glassstatic struct dtd_sandbox_pmic_test dtv_pmic_at_9 = {
2104b26144bSSimon Glass\t.low_power\t\t= true,
2114b26144bSSimon Glass\t.reg\t\t\t= {0x9, 0x0},
2124b26144bSSimon Glass};
2134b26144bSSimon GlassU_BOOT_DEVICE(pmic_at_9) = {
2144b26144bSSimon Glass\t.name\t\t= "sandbox_pmic_test",
2154b26144bSSimon Glass\t.platdata\t= &dtv_pmic_at_9,
2164b26144bSSimon Glass\t.platdata_size\t= sizeof(dtv_pmic_at_9),
2174b26144bSSimon Glass};
2184b26144bSSimon Glass
219c0791928SSimon Glass''', data)
220c0791928SSimon Glass
221c0791928SSimon Glass    def test_phandle(self):
222c0791928SSimon Glass        """Test output from a node containing a phandle reference"""
223c0791928SSimon Glass        dtb_file = get_dtb_file('dtoc_test_phandle.dts')
224c0791928SSimon Glass        output = tools.GetOutputFilename('output')
225c0791928SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
226c0791928SSimon Glass        with open(output) as infile:
227c0791928SSimon Glass            data = infile.read()
228c0791928SSimon Glass        self.assertEqual('''#include <stdbool.h>
229c0791928SSimon Glass#include <libfdt.h>
230c0791928SSimon Glassstruct dtd_source {
231*54d1a4b7SSimon Glass\tstruct phandle_2_arg clocks[4];
232c0791928SSimon Glass};
233c0791928SSimon Glassstruct dtd_target {
234c0791928SSimon Glass\tfdt32_t\t\tintval;
235c0791928SSimon Glass};
236c0791928SSimon Glass''', data)
237c0791928SSimon Glass
238c0791928SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
239c0791928SSimon Glass        with open(output) as infile:
240c0791928SSimon Glass            data = infile.read()
241c0791928SSimon Glass        self.assertEqual('''#include <common.h>
242c0791928SSimon Glass#include <dm.h>
243c0791928SSimon Glass#include <dt-structs.h>
244c0791928SSimon Glass
245c0791928SSimon Glassstatic struct dtd_target dtv_phandle_target = {
246*54d1a4b7SSimon Glass\t.intval\t\t\t= 0x0,
247c0791928SSimon Glass};
248c0791928SSimon GlassU_BOOT_DEVICE(phandle_target) = {
249c0791928SSimon Glass\t.name\t\t= "target",
250c0791928SSimon Glass\t.platdata\t= &dtv_phandle_target,
251c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle_target),
252c0791928SSimon Glass};
253c0791928SSimon Glass
254*54d1a4b7SSimon Glassstatic struct dtd_target dtv_phandle2_target = {
255*54d1a4b7SSimon Glass\t.intval\t\t\t= 0x1,
256*54d1a4b7SSimon Glass};
257*54d1a4b7SSimon GlassU_BOOT_DEVICE(phandle2_target) = {
258*54d1a4b7SSimon Glass\t.name\t\t= "target",
259*54d1a4b7SSimon Glass\t.platdata\t= &dtv_phandle2_target,
260*54d1a4b7SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle2_target),
261*54d1a4b7SSimon Glass};
262*54d1a4b7SSimon Glass
263*54d1a4b7SSimon Glassstatic struct dtd_target dtv_phandle3_target = {
264*54d1a4b7SSimon Glass\t.intval\t\t\t= 0x2,
265*54d1a4b7SSimon Glass};
266*54d1a4b7SSimon GlassU_BOOT_DEVICE(phandle3_target) = {
267*54d1a4b7SSimon Glass\t.name\t\t= "target",
268*54d1a4b7SSimon Glass\t.platdata\t= &dtv_phandle3_target,
269*54d1a4b7SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle3_target),
270*54d1a4b7SSimon Glass};
271*54d1a4b7SSimon Glass
272c0791928SSimon Glassstatic struct dtd_source dtv_phandle_source = {
27359e6856dSSimon Glass\t.clocks\t\t\t= {
274*54d1a4b7SSimon Glass\t\t\t{&dtv_phandle_target, {}},
275*54d1a4b7SSimon Glass\t\t\t{&dtv_phandle2_target, {11}},
276*54d1a4b7SSimon Glass\t\t\t{&dtv_phandle3_target, {12, 13}},
277*54d1a4b7SSimon Glass\t\t\t{&dtv_phandle_target, {}},},
278c0791928SSimon Glass};
279c0791928SSimon GlassU_BOOT_DEVICE(phandle_source) = {
280c0791928SSimon Glass\t.name\t\t= "source",
281c0791928SSimon Glass\t.platdata\t= &dtv_phandle_source,
282c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle_source),
283c0791928SSimon Glass};
284c0791928SSimon Glass
285c0791928SSimon Glass''', data)
286c0791928SSimon Glass
287c0791928SSimon Glass    def test_aliases(self):
288c0791928SSimon Glass        """Test output from a node with multiple compatible strings"""
289c0791928SSimon Glass        dtb_file = get_dtb_file('dtoc_test_aliases.dts')
290c0791928SSimon Glass        output = tools.GetOutputFilename('output')
291c0791928SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
292c0791928SSimon Glass        with open(output) as infile:
293c0791928SSimon Glass            data = infile.read()
294c0791928SSimon Glass        self.assertEqual('''#include <stdbool.h>
295c0791928SSimon Glass#include <libfdt.h>
296c0791928SSimon Glassstruct dtd_compat1 {
297c0791928SSimon Glass\tfdt32_t\t\tintval;
298c0791928SSimon Glass};
299c0791928SSimon Glass#define dtd_compat2_1_fred dtd_compat1
300c0791928SSimon Glass#define dtd_compat3 dtd_compat1
301c0791928SSimon Glass''', data)
302c0791928SSimon Glass
303c0791928SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
304c0791928SSimon Glass        with open(output) as infile:
305c0791928SSimon Glass            data = infile.read()
306c0791928SSimon Glass        self.assertEqual('''#include <common.h>
307c0791928SSimon Glass#include <dm.h>
308c0791928SSimon Glass#include <dt-structs.h>
309c0791928SSimon Glass
310c0791928SSimon Glassstatic struct dtd_compat1 dtv_spl_test = {
311c0791928SSimon Glass\t.intval\t\t\t= 0x1,
312c0791928SSimon Glass};
313c0791928SSimon GlassU_BOOT_DEVICE(spl_test) = {
314c0791928SSimon Glass\t.name\t\t= "compat1",
315c0791928SSimon Glass\t.platdata\t= &dtv_spl_test,
316c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test),
317c0791928SSimon Glass};
318c0791928SSimon Glass
319c0791928SSimon Glass''', data)
320a28bfcc3SSimon Glass
321a28bfcc3SSimon Glass    def test_addresses64(self):
322a28bfcc3SSimon Glass        """Test output from a node with a 'reg' property with na=2, ns=2"""
323a28bfcc3SSimon Glass        dtb_file = get_dtb_file('dtoc_test_addr64.dts')
324a28bfcc3SSimon Glass        output = tools.GetOutputFilename('output')
325a28bfcc3SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
326a28bfcc3SSimon Glass        with open(output) as infile:
327a28bfcc3SSimon Glass            data = infile.read()
328a28bfcc3SSimon Glass        self.assertEqual('''#include <stdbool.h>
329a28bfcc3SSimon Glass#include <libfdt.h>
330a28bfcc3SSimon Glassstruct dtd_test1 {
331a28bfcc3SSimon Glass\tfdt64_t\t\treg[2];
332a28bfcc3SSimon Glass};
333a28bfcc3SSimon Glassstruct dtd_test2 {
334a28bfcc3SSimon Glass\tfdt64_t\t\treg[2];
335a28bfcc3SSimon Glass};
336a28bfcc3SSimon Glassstruct dtd_test3 {
337a28bfcc3SSimon Glass\tfdt64_t\t\treg[4];
338a28bfcc3SSimon Glass};
339a28bfcc3SSimon Glass''', data)
340a28bfcc3SSimon Glass
341a28bfcc3SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
342a28bfcc3SSimon Glass        with open(output) as infile:
343a28bfcc3SSimon Glass            data = infile.read()
344a28bfcc3SSimon Glass        self.assertEqual('''#include <common.h>
345a28bfcc3SSimon Glass#include <dm.h>
346a28bfcc3SSimon Glass#include <dt-structs.h>
347a28bfcc3SSimon Glass
348a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = {
349a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x5678},
350a28bfcc3SSimon Glass};
351a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = {
352a28bfcc3SSimon Glass\t.name\t\t= "test1",
353a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1,
354a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1),
355a28bfcc3SSimon Glass};
356a28bfcc3SSimon Glass
357a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = {
358a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654},
359a28bfcc3SSimon Glass};
360a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = {
361a28bfcc3SSimon Glass\t.name\t\t= "test2",
362a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2,
363a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2),
364a28bfcc3SSimon Glass};
365a28bfcc3SSimon Glass
366a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = {
367a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654, 0x2, 0x3},
368a28bfcc3SSimon Glass};
369a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = {
370a28bfcc3SSimon Glass\t.name\t\t= "test3",
371a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3,
372a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3),
373a28bfcc3SSimon Glass};
374a28bfcc3SSimon Glass
375a28bfcc3SSimon Glass''', data)
376a28bfcc3SSimon Glass
377a28bfcc3SSimon Glass    def test_addresses32(self):
378a28bfcc3SSimon Glass        """Test output from a node with a 'reg' property with na=1, ns=1"""
379a28bfcc3SSimon Glass        dtb_file = get_dtb_file('dtoc_test_addr32.dts')
380a28bfcc3SSimon Glass        output = tools.GetOutputFilename('output')
381a28bfcc3SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
382a28bfcc3SSimon Glass        with open(output) as infile:
383a28bfcc3SSimon Glass            data = infile.read()
384a28bfcc3SSimon Glass        self.assertEqual('''#include <stdbool.h>
385a28bfcc3SSimon Glass#include <libfdt.h>
386a28bfcc3SSimon Glassstruct dtd_test1 {
387a28bfcc3SSimon Glass\tfdt32_t\t\treg[2];
388a28bfcc3SSimon Glass};
389a28bfcc3SSimon Glassstruct dtd_test2 {
390a28bfcc3SSimon Glass\tfdt32_t\t\treg[4];
391a28bfcc3SSimon Glass};
392a28bfcc3SSimon Glass''', data)
393a28bfcc3SSimon Glass
394a28bfcc3SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
395a28bfcc3SSimon Glass        with open(output) as infile:
396a28bfcc3SSimon Glass            data = infile.read()
397a28bfcc3SSimon Glass        self.assertEqual('''#include <common.h>
398a28bfcc3SSimon Glass#include <dm.h>
399a28bfcc3SSimon Glass#include <dt-structs.h>
400a28bfcc3SSimon Glass
401a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = {
402a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x5678},
403a28bfcc3SSimon Glass};
404a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = {
405a28bfcc3SSimon Glass\t.name\t\t= "test1",
406a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1,
407a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1),
408a28bfcc3SSimon Glass};
409a28bfcc3SSimon Glass
410a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = {
411a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x98765432, 0x2, 0x3},
412a28bfcc3SSimon Glass};
413a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = {
414a28bfcc3SSimon Glass\t.name\t\t= "test2",
415a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2,
416a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2),
417a28bfcc3SSimon Glass};
418a28bfcc3SSimon Glass
419a28bfcc3SSimon Glass''', data)
420a28bfcc3SSimon Glass
421a28bfcc3SSimon Glass    def test_addresses64_32(self):
422a28bfcc3SSimon Glass        """Test output from a node with a 'reg' property with na=2, ns=1"""
423a28bfcc3SSimon Glass        dtb_file = get_dtb_file('dtoc_test_addr64_32.dts')
424a28bfcc3SSimon Glass        output = tools.GetOutputFilename('output')
425a28bfcc3SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
426a28bfcc3SSimon Glass        with open(output) as infile:
427a28bfcc3SSimon Glass            data = infile.read()
428a28bfcc3SSimon Glass        self.assertEqual('''#include <stdbool.h>
429a28bfcc3SSimon Glass#include <libfdt.h>
430a28bfcc3SSimon Glassstruct dtd_test1 {
431a28bfcc3SSimon Glass\tfdt64_t\t\treg[2];
432a28bfcc3SSimon Glass};
433a28bfcc3SSimon Glassstruct dtd_test2 {
434a28bfcc3SSimon Glass\tfdt64_t\t\treg[2];
435a28bfcc3SSimon Glass};
436a28bfcc3SSimon Glassstruct dtd_test3 {
437a28bfcc3SSimon Glass\tfdt64_t\t\treg[4];
438a28bfcc3SSimon Glass};
439a28bfcc3SSimon Glass''', data)
440a28bfcc3SSimon Glass
441a28bfcc3SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
442a28bfcc3SSimon Glass        with open(output) as infile:
443a28bfcc3SSimon Glass            data = infile.read()
444a28bfcc3SSimon Glass        self.assertEqual('''#include <common.h>
445a28bfcc3SSimon Glass#include <dm.h>
446a28bfcc3SSimon Glass#include <dt-structs.h>
447a28bfcc3SSimon Glass
448a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = {
449a28bfcc3SSimon Glass\t.reg\t\t\t= {0x123400000000, 0x5678},
450a28bfcc3SSimon Glass};
451a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = {
452a28bfcc3SSimon Glass\t.name\t\t= "test1",
453a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1,
454a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1),
455a28bfcc3SSimon Glass};
456a28bfcc3SSimon Glass
457a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = {
458a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x98765432},
459a28bfcc3SSimon Glass};
460a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = {
461a28bfcc3SSimon Glass\t.name\t\t= "test2",
462a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2,
463a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2),
464a28bfcc3SSimon Glass};
465a28bfcc3SSimon Glass
466a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = {
467a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x98765432, 0x2, 0x3},
468a28bfcc3SSimon Glass};
469a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = {
470a28bfcc3SSimon Glass\t.name\t\t= "test3",
471a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3,
472a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3),
473a28bfcc3SSimon Glass};
474a28bfcc3SSimon Glass
475a28bfcc3SSimon Glass''', data)
476a28bfcc3SSimon Glass
477a28bfcc3SSimon Glass    def test_addresses32_64(self):
478a28bfcc3SSimon Glass        """Test output from a node with a 'reg' property with na=1, ns=2"""
479a28bfcc3SSimon Glass        dtb_file = get_dtb_file('dtoc_test_addr32_64.dts')
480a28bfcc3SSimon Glass        output = tools.GetOutputFilename('output')
481a28bfcc3SSimon Glass        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
482a28bfcc3SSimon Glass        with open(output) as infile:
483a28bfcc3SSimon Glass            data = infile.read()
484a28bfcc3SSimon Glass        self.assertEqual('''#include <stdbool.h>
485a28bfcc3SSimon Glass#include <libfdt.h>
486a28bfcc3SSimon Glassstruct dtd_test1 {
487a28bfcc3SSimon Glass\tfdt64_t\t\treg[2];
488a28bfcc3SSimon Glass};
489a28bfcc3SSimon Glassstruct dtd_test2 {
490a28bfcc3SSimon Glass\tfdt64_t\t\treg[2];
491a28bfcc3SSimon Glass};
492a28bfcc3SSimon Glassstruct dtd_test3 {
493a28bfcc3SSimon Glass\tfdt64_t\t\treg[4];
494a28bfcc3SSimon Glass};
495a28bfcc3SSimon Glass''', data)
496a28bfcc3SSimon Glass
497a28bfcc3SSimon Glass        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
498a28bfcc3SSimon Glass        with open(output) as infile:
499a28bfcc3SSimon Glass            data = infile.read()
500a28bfcc3SSimon Glass        self.assertEqual('''#include <common.h>
501a28bfcc3SSimon Glass#include <dm.h>
502a28bfcc3SSimon Glass#include <dt-structs.h>
503a28bfcc3SSimon Glass
504a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = {
505a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x567800000000},
506a28bfcc3SSimon Glass};
507a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = {
508a28bfcc3SSimon Glass\t.name\t\t= "test1",
509a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1,
510a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1),
511a28bfcc3SSimon Glass};
512a28bfcc3SSimon Glass
513a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = {
514a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x9876543210987654},
515a28bfcc3SSimon Glass};
516a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = {
517a28bfcc3SSimon Glass\t.name\t\t= "test2",
518a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2,
519a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2),
520a28bfcc3SSimon Glass};
521a28bfcc3SSimon Glass
522a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = {
523a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x9876543210987654, 0x2, 0x3},
524a28bfcc3SSimon Glass};
525a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = {
526a28bfcc3SSimon Glass\t.name\t\t= "test3",
527a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3,
528a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3),
529a28bfcc3SSimon Glass};
530a28bfcc3SSimon Glass
531a28bfcc3SSimon Glass''', data)
532