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