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 29e71e2ceaSSimon GlassHEADER = '''/* 30e71e2ceaSSimon Glass * DO NOT MODIFY 31e71e2ceaSSimon Glass * 32e71e2ceaSSimon Glass * This file was generated by dtoc from a .dtb (device tree binary) file. 33e71e2ceaSSimon Glass */ 34e71e2ceaSSimon Glass 35e71e2ceaSSimon Glass#include <stdbool.h> 36*0e00a84cSMasahiro Yamada#include <linux/libfdt.h>''' 37e71e2ceaSSimon Glass 38e71e2ceaSSimon GlassC_HEADER = '''/* 39e71e2ceaSSimon Glass * DO NOT MODIFY 40e71e2ceaSSimon Glass * 41e71e2ceaSSimon Glass * This file was generated by dtoc from a .dtb (device tree binary) file. 42e71e2ceaSSimon Glass */ 43e71e2ceaSSimon Glass 44e71e2ceaSSimon Glass#include <common.h> 45e71e2ceaSSimon Glass#include <dm.h> 46e71e2ceaSSimon Glass#include <dt-structs.h> 47e71e2ceaSSimon Glass''' 48e71e2ceaSSimon Glass 49e71e2ceaSSimon Glass 50c0791928SSimon Glassdef get_dtb_file(dts_fname): 51c0791928SSimon Glass """Compile a .dts file to a .dtb 52c0791928SSimon Glass 53c0791928SSimon Glass Args: 54c0791928SSimon Glass dts_fname: Filename of .dts file in the current directory 55c0791928SSimon Glass 56c0791928SSimon Glass Returns: 57c0791928SSimon Glass Filename of compiled file in output directory 58c0791928SSimon Glass """ 59c0791928SSimon Glass return fdt_util.EnsureCompiled(os.path.join(our_path, dts_fname)) 60c0791928SSimon Glass 61c0791928SSimon Glass 62c0791928SSimon Glassclass TestDtoc(unittest.TestCase): 63c0791928SSimon Glass """Tests for dtoc""" 64c0791928SSimon Glass @classmethod 65c0791928SSimon Glass def setUpClass(cls): 66c0791928SSimon Glass tools.PrepareOutputDir(None) 67c0791928SSimon Glass 68c0791928SSimon Glass @classmethod 69c0791928SSimon Glass def tearDownClass(cls): 70c0791928SSimon Glass tools._RemoveOutputDir() 71c0791928SSimon Glass 72c0791928SSimon Glass def test_name(self): 73c0791928SSimon Glass """Test conversion of device tree names to C identifiers""" 74c0791928SSimon Glass self.assertEqual('serial_at_0x12', conv_name_to_c('serial@0x12')) 75c0791928SSimon Glass self.assertEqual('vendor_clock_frequency', 76c0791928SSimon Glass conv_name_to_c('vendor,clock-frequency')) 77c0791928SSimon Glass self.assertEqual('rockchip_rk3399_sdhci_5_1', 78c0791928SSimon Glass conv_name_to_c('rockchip,rk3399-sdhci-5.1')) 79c0791928SSimon Glass 80c0791928SSimon Glass def test_tab_to(self): 81c0791928SSimon Glass """Test operation of tab_to() function""" 82c0791928SSimon Glass self.assertEqual('fred ', tab_to(0, 'fred')) 83c0791928SSimon Glass self.assertEqual('fred\t', tab_to(1, 'fred')) 84c0791928SSimon Glass self.assertEqual('fred was here ', tab_to(1, 'fred was here')) 85c0791928SSimon Glass self.assertEqual('fred was here\t\t', tab_to(3, 'fred was here')) 86c0791928SSimon Glass self.assertEqual('exactly8 ', tab_to(1, 'exactly8')) 87c0791928SSimon Glass self.assertEqual('exactly8\t', tab_to(2, 'exactly8')) 88c0791928SSimon Glass 89c0791928SSimon Glass def test_get_value(self): 90c0791928SSimon Glass """Test operation of get_value() function""" 91c0791928SSimon Glass self.assertEqual('0x45', 92c0791928SSimon Glass get_value(fdt.TYPE_INT, struct.pack('>I', 0x45))) 93c0791928SSimon Glass self.assertEqual('0x45', 94c0791928SSimon Glass get_value(fdt.TYPE_BYTE, struct.pack('<I', 0x45))) 95c0791928SSimon Glass self.assertEqual('0x0', 96c0791928SSimon Glass get_value(fdt.TYPE_BYTE, struct.pack('>I', 0x45))) 97c0791928SSimon Glass self.assertEqual('"test"', get_value(fdt.TYPE_STRING, 'test')) 98c0791928SSimon Glass self.assertEqual('true', get_value(fdt.TYPE_BOOL, None)) 99c0791928SSimon Glass 100c0791928SSimon Glass def test_get_compat_name(self): 101c0791928SSimon Glass """Test operation of get_compat_name() function""" 102c0791928SSimon Glass Prop = collections.namedtuple('Prop', ['value']) 103c0791928SSimon Glass Node = collections.namedtuple('Node', ['props']) 104c0791928SSimon Glass 105c0791928SSimon Glass prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1']) 106c0791928SSimon Glass node = Node({'compatible': prop}) 107c0791928SSimon Glass self.assertEqual(('rockchip_rk3399_sdhci_5_1', ['arasan_sdhci_5_1']), 108c0791928SSimon Glass get_compat_name(node)) 109c0791928SSimon Glass 110c0791928SSimon Glass prop = Prop(['rockchip,rk3399-sdhci-5.1']) 111c0791928SSimon Glass node = Node({'compatible': prop}) 112c0791928SSimon Glass self.assertEqual(('rockchip_rk3399_sdhci_5_1', []), 113c0791928SSimon Glass get_compat_name(node)) 114c0791928SSimon Glass 115c0791928SSimon Glass prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1', 'third']) 116c0791928SSimon Glass node = Node({'compatible': prop}) 117c0791928SSimon Glass self.assertEqual(('rockchip_rk3399_sdhci_5_1', 118c0791928SSimon Glass ['arasan_sdhci_5_1', 'third']), 119c0791928SSimon Glass get_compat_name(node)) 120c0791928SSimon Glass 121c0791928SSimon Glass def test_empty_file(self): 122c0791928SSimon Glass """Test output from a device tree file with no nodes""" 123c0791928SSimon Glass dtb_file = get_dtb_file('dtoc_test_empty.dts') 124c0791928SSimon Glass output = tools.GetOutputFilename('output') 125c0791928SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 126c0791928SSimon Glass with open(output) as infile: 127c0791928SSimon Glass lines = infile.read().splitlines() 128e71e2ceaSSimon Glass self.assertEqual(HEADER.splitlines(), lines) 129c0791928SSimon Glass 130c0791928SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 131c0791928SSimon Glass with open(output) as infile: 132c0791928SSimon Glass lines = infile.read().splitlines() 133e71e2ceaSSimon Glass self.assertEqual(C_HEADER.splitlines() + [''], lines) 134c0791928SSimon Glass 135c0791928SSimon Glass def test_simple(self): 136c0791928SSimon Glass """Test output from some simple nodes with various types of data""" 137c0791928SSimon Glass dtb_file = get_dtb_file('dtoc_test_simple.dts') 138c0791928SSimon Glass output = tools.GetOutputFilename('output') 139c0791928SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 140c0791928SSimon Glass with open(output) as infile: 141c0791928SSimon Glass data = infile.read() 142e71e2ceaSSimon Glass self.assertEqual(HEADER + ''' 1434b26144bSSimon Glassstruct dtd_sandbox_i2c_test { 1444b26144bSSimon Glass}; 1454b26144bSSimon Glassstruct dtd_sandbox_pmic_test { 1464b26144bSSimon Glass\tbool\t\tlow_power; 1474b26144bSSimon Glass\tfdt64_t\t\treg[2]; 1484b26144bSSimon Glass}; 149c0791928SSimon Glassstruct dtd_sandbox_spl_test { 150c0791928SSimon Glass\tbool\t\tboolval; 151c0791928SSimon Glass\tunsigned char\tbytearray[3]; 152c0791928SSimon Glass\tunsigned char\tbyteval; 153c0791928SSimon Glass\tfdt32_t\t\tintarray[4]; 154c0791928SSimon Glass\tfdt32_t\t\tintval; 155c0791928SSimon Glass\tunsigned char\tlongbytearray[9]; 156c0791928SSimon Glass\tconst char *\tstringarray[3]; 157c0791928SSimon Glass\tconst char *\tstringval; 158c0791928SSimon Glass}; 159c0791928SSimon Glassstruct dtd_sandbox_spl_test_2 { 160c0791928SSimon Glass}; 161c0791928SSimon Glass''', data) 162c0791928SSimon Glass 163c0791928SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 164c0791928SSimon Glass with open(output) as infile: 165c0791928SSimon Glass data = infile.read() 166e71e2ceaSSimon Glass self.assertEqual(C_HEADER + ''' 167c0791928SSimon Glassstatic struct dtd_sandbox_spl_test dtv_spl_test = { 168c0791928SSimon Glass\t.bytearray\t\t= {0x6, 0x0, 0x0}, 169c0791928SSimon Glass\t.byteval\t\t= 0x5, 170c0791928SSimon Glass\t.intval\t\t\t= 0x1, 17112a972efSSimon Glass\t.longbytearray\t\t= {0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 17212a972efSSimon Glass\t\t0x11}, 173c0791928SSimon Glass\t.stringval\t\t= "message", 174c0791928SSimon Glass\t.boolval\t\t= true, 175c0791928SSimon Glass\t.intarray\t\t= {0x2, 0x3, 0x4, 0x0}, 176c0791928SSimon Glass\t.stringarray\t\t= {"multi-word", "message", ""}, 177c0791928SSimon Glass}; 178c0791928SSimon GlassU_BOOT_DEVICE(spl_test) = { 179c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test", 180c0791928SSimon Glass\t.platdata\t= &dtv_spl_test, 181c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test), 182c0791928SSimon Glass}; 183c0791928SSimon Glass 184c0791928SSimon Glassstatic struct dtd_sandbox_spl_test dtv_spl_test2 = { 185c0791928SSimon Glass\t.bytearray\t\t= {0x1, 0x23, 0x34}, 186c0791928SSimon Glass\t.byteval\t\t= 0x8, 187c0791928SSimon Glass\t.intval\t\t\t= 0x3, 18812a972efSSimon Glass\t.longbytearray\t\t= {0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 18912a972efSSimon Glass\t\t0x0}, 190c0791928SSimon Glass\t.stringval\t\t= "message2", 191c0791928SSimon Glass\t.intarray\t\t= {0x5, 0x0, 0x0, 0x0}, 192c0791928SSimon Glass\t.stringarray\t\t= {"another", "multi-word", "message"}, 193c0791928SSimon Glass}; 194c0791928SSimon GlassU_BOOT_DEVICE(spl_test2) = { 195c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test", 196c0791928SSimon Glass\t.platdata\t= &dtv_spl_test2, 197c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test2), 198c0791928SSimon Glass}; 199c0791928SSimon Glass 200c0791928SSimon Glassstatic struct dtd_sandbox_spl_test dtv_spl_test3 = { 201c0791928SSimon Glass\t.stringarray\t\t= {"one", "", ""}, 202c0791928SSimon Glass}; 203c0791928SSimon GlassU_BOOT_DEVICE(spl_test3) = { 204c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test", 205c0791928SSimon Glass\t.platdata\t= &dtv_spl_test3, 206c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test3), 207c0791928SSimon Glass}; 208c0791928SSimon Glass 209c0791928SSimon Glassstatic struct dtd_sandbox_spl_test_2 dtv_spl_test4 = { 210c0791928SSimon Glass}; 211c0791928SSimon GlassU_BOOT_DEVICE(spl_test4) = { 212c0791928SSimon Glass\t.name\t\t= "sandbox_spl_test_2", 213c0791928SSimon Glass\t.platdata\t= &dtv_spl_test4, 214c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test4), 215c0791928SSimon Glass}; 216c0791928SSimon Glass 2174b26144bSSimon Glassstatic struct dtd_sandbox_i2c_test dtv_i2c_at_0 = { 2184b26144bSSimon Glass}; 2194b26144bSSimon GlassU_BOOT_DEVICE(i2c_at_0) = { 2204b26144bSSimon Glass\t.name\t\t= "sandbox_i2c_test", 2214b26144bSSimon Glass\t.platdata\t= &dtv_i2c_at_0, 2224b26144bSSimon Glass\t.platdata_size\t= sizeof(dtv_i2c_at_0), 2234b26144bSSimon Glass}; 2244b26144bSSimon Glass 2254b26144bSSimon Glassstatic struct dtd_sandbox_pmic_test dtv_pmic_at_9 = { 2264b26144bSSimon Glass\t.low_power\t\t= true, 2274b26144bSSimon Glass\t.reg\t\t\t= {0x9, 0x0}, 2284b26144bSSimon Glass}; 2294b26144bSSimon GlassU_BOOT_DEVICE(pmic_at_9) = { 2304b26144bSSimon Glass\t.name\t\t= "sandbox_pmic_test", 2314b26144bSSimon Glass\t.platdata\t= &dtv_pmic_at_9, 2324b26144bSSimon Glass\t.platdata_size\t= sizeof(dtv_pmic_at_9), 2334b26144bSSimon Glass}; 2344b26144bSSimon Glass 235c0791928SSimon Glass''', data) 236c0791928SSimon Glass 237c0791928SSimon Glass def test_phandle(self): 238c0791928SSimon Glass """Test output from a node containing a phandle reference""" 239c0791928SSimon Glass dtb_file = get_dtb_file('dtoc_test_phandle.dts') 240c0791928SSimon Glass output = tools.GetOutputFilename('output') 241c0791928SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 242c0791928SSimon Glass with open(output) as infile: 243c0791928SSimon Glass data = infile.read() 244e71e2ceaSSimon Glass self.assertEqual(HEADER + ''' 245c0791928SSimon Glassstruct dtd_source { 24654d1a4b7SSimon Glass\tstruct phandle_2_arg clocks[4]; 247c0791928SSimon Glass}; 248c0791928SSimon Glassstruct dtd_target { 249c0791928SSimon Glass\tfdt32_t\t\tintval; 250c0791928SSimon Glass}; 251c0791928SSimon Glass''', data) 252c0791928SSimon Glass 253c0791928SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 254c0791928SSimon Glass with open(output) as infile: 255c0791928SSimon Glass data = infile.read() 256e71e2ceaSSimon Glass self.assertEqual(C_HEADER + ''' 257c0791928SSimon Glassstatic struct dtd_target dtv_phandle_target = { 25854d1a4b7SSimon Glass\t.intval\t\t\t= 0x0, 259c0791928SSimon Glass}; 260c0791928SSimon GlassU_BOOT_DEVICE(phandle_target) = { 261c0791928SSimon Glass\t.name\t\t= "target", 262c0791928SSimon Glass\t.platdata\t= &dtv_phandle_target, 263c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle_target), 264c0791928SSimon Glass}; 265c0791928SSimon Glass 26654d1a4b7SSimon Glassstatic struct dtd_target dtv_phandle2_target = { 26754d1a4b7SSimon Glass\t.intval\t\t\t= 0x1, 26854d1a4b7SSimon Glass}; 26954d1a4b7SSimon GlassU_BOOT_DEVICE(phandle2_target) = { 27054d1a4b7SSimon Glass\t.name\t\t= "target", 27154d1a4b7SSimon Glass\t.platdata\t= &dtv_phandle2_target, 27254d1a4b7SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle2_target), 27354d1a4b7SSimon Glass}; 27454d1a4b7SSimon Glass 27554d1a4b7SSimon Glassstatic struct dtd_target dtv_phandle3_target = { 27654d1a4b7SSimon Glass\t.intval\t\t\t= 0x2, 27754d1a4b7SSimon Glass}; 27854d1a4b7SSimon GlassU_BOOT_DEVICE(phandle3_target) = { 27954d1a4b7SSimon Glass\t.name\t\t= "target", 28054d1a4b7SSimon Glass\t.platdata\t= &dtv_phandle3_target, 28154d1a4b7SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle3_target), 28254d1a4b7SSimon Glass}; 28354d1a4b7SSimon Glass 284c0791928SSimon Glassstatic struct dtd_source dtv_phandle_source = { 28559e6856dSSimon Glass\t.clocks\t\t\t= { 28654d1a4b7SSimon Glass\t\t\t{&dtv_phandle_target, {}}, 28754d1a4b7SSimon Glass\t\t\t{&dtv_phandle2_target, {11}}, 28854d1a4b7SSimon Glass\t\t\t{&dtv_phandle3_target, {12, 13}}, 28954d1a4b7SSimon Glass\t\t\t{&dtv_phandle_target, {}},}, 290c0791928SSimon Glass}; 291c0791928SSimon GlassU_BOOT_DEVICE(phandle_source) = { 292c0791928SSimon Glass\t.name\t\t= "source", 293c0791928SSimon Glass\t.platdata\t= &dtv_phandle_source, 294c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle_source), 295c0791928SSimon Glass}; 296c0791928SSimon Glass 297c0791928SSimon Glass''', data) 298c0791928SSimon Glass 299c0791928SSimon Glass def test_aliases(self): 300c0791928SSimon Glass """Test output from a node with multiple compatible strings""" 301c0791928SSimon Glass dtb_file = get_dtb_file('dtoc_test_aliases.dts') 302c0791928SSimon Glass output = tools.GetOutputFilename('output') 303c0791928SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 304c0791928SSimon Glass with open(output) as infile: 305c0791928SSimon Glass data = infile.read() 306e71e2ceaSSimon Glass self.assertEqual(HEADER + ''' 307c0791928SSimon Glassstruct dtd_compat1 { 308c0791928SSimon Glass\tfdt32_t\t\tintval; 309c0791928SSimon Glass}; 310c0791928SSimon Glass#define dtd_compat2_1_fred dtd_compat1 311c0791928SSimon Glass#define dtd_compat3 dtd_compat1 312c0791928SSimon Glass''', data) 313c0791928SSimon Glass 314c0791928SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 315c0791928SSimon Glass with open(output) as infile: 316c0791928SSimon Glass data = infile.read() 317e71e2ceaSSimon Glass self.assertEqual(C_HEADER + ''' 318c0791928SSimon Glassstatic struct dtd_compat1 dtv_spl_test = { 319c0791928SSimon Glass\t.intval\t\t\t= 0x1, 320c0791928SSimon Glass}; 321c0791928SSimon GlassU_BOOT_DEVICE(spl_test) = { 322c0791928SSimon Glass\t.name\t\t= "compat1", 323c0791928SSimon Glass\t.platdata\t= &dtv_spl_test, 324c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test), 325c0791928SSimon Glass}; 326c0791928SSimon Glass 327c0791928SSimon Glass''', data) 328a28bfcc3SSimon Glass 329a28bfcc3SSimon Glass def test_addresses64(self): 330a28bfcc3SSimon Glass """Test output from a node with a 'reg' property with na=2, ns=2""" 331a28bfcc3SSimon Glass dtb_file = get_dtb_file('dtoc_test_addr64.dts') 332a28bfcc3SSimon Glass output = tools.GetOutputFilename('output') 333a28bfcc3SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 334a28bfcc3SSimon Glass with open(output) as infile: 335a28bfcc3SSimon Glass data = infile.read() 336e71e2ceaSSimon Glass self.assertEqual(HEADER + ''' 337a28bfcc3SSimon Glassstruct dtd_test1 { 338a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 339a28bfcc3SSimon Glass}; 340a28bfcc3SSimon Glassstruct dtd_test2 { 341a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 342a28bfcc3SSimon Glass}; 343a28bfcc3SSimon Glassstruct dtd_test3 { 344a28bfcc3SSimon Glass\tfdt64_t\t\treg[4]; 345a28bfcc3SSimon Glass}; 346a28bfcc3SSimon Glass''', data) 347a28bfcc3SSimon Glass 348a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 349a28bfcc3SSimon Glass with open(output) as infile: 350a28bfcc3SSimon Glass data = infile.read() 351e71e2ceaSSimon Glass self.assertEqual(C_HEADER + ''' 352a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = { 353a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x5678}, 354a28bfcc3SSimon Glass}; 355a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = { 356a28bfcc3SSimon Glass\t.name\t\t= "test1", 357a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1, 358a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1), 359a28bfcc3SSimon Glass}; 360a28bfcc3SSimon Glass 361a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = { 362a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654}, 363a28bfcc3SSimon Glass}; 364a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = { 365a28bfcc3SSimon Glass\t.name\t\t= "test2", 366a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2, 367a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2), 368a28bfcc3SSimon Glass}; 369a28bfcc3SSimon Glass 370a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = { 371a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654, 0x2, 0x3}, 372a28bfcc3SSimon Glass}; 373a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = { 374a28bfcc3SSimon Glass\t.name\t\t= "test3", 375a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3, 376a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3), 377a28bfcc3SSimon Glass}; 378a28bfcc3SSimon Glass 379a28bfcc3SSimon Glass''', data) 380a28bfcc3SSimon Glass 381a28bfcc3SSimon Glass def test_addresses32(self): 382a28bfcc3SSimon Glass """Test output from a node with a 'reg' property with na=1, ns=1""" 383a28bfcc3SSimon Glass dtb_file = get_dtb_file('dtoc_test_addr32.dts') 384a28bfcc3SSimon Glass output = tools.GetOutputFilename('output') 385a28bfcc3SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 386a28bfcc3SSimon Glass with open(output) as infile: 387a28bfcc3SSimon Glass data = infile.read() 388e71e2ceaSSimon Glass self.assertEqual(HEADER + ''' 389a28bfcc3SSimon Glassstruct dtd_test1 { 390a28bfcc3SSimon Glass\tfdt32_t\t\treg[2]; 391a28bfcc3SSimon Glass}; 392a28bfcc3SSimon Glassstruct dtd_test2 { 393a28bfcc3SSimon Glass\tfdt32_t\t\treg[4]; 394a28bfcc3SSimon Glass}; 395a28bfcc3SSimon Glass''', data) 396a28bfcc3SSimon Glass 397a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 398a28bfcc3SSimon Glass with open(output) as infile: 399a28bfcc3SSimon Glass data = infile.read() 400e71e2ceaSSimon Glass self.assertEqual(C_HEADER + ''' 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() 428e71e2ceaSSimon Glass self.assertEqual(HEADER + ''' 429a28bfcc3SSimon Glassstruct dtd_test1 { 430a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 431a28bfcc3SSimon Glass}; 432a28bfcc3SSimon Glassstruct dtd_test2 { 433a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 434a28bfcc3SSimon Glass}; 435a28bfcc3SSimon Glassstruct dtd_test3 { 436a28bfcc3SSimon Glass\tfdt64_t\t\treg[4]; 437a28bfcc3SSimon Glass}; 438a28bfcc3SSimon Glass''', data) 439a28bfcc3SSimon Glass 440a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 441a28bfcc3SSimon Glass with open(output) as infile: 442a28bfcc3SSimon Glass data = infile.read() 443e71e2ceaSSimon Glass self.assertEqual(C_HEADER + ''' 444a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = { 445a28bfcc3SSimon Glass\t.reg\t\t\t= {0x123400000000, 0x5678}, 446a28bfcc3SSimon Glass}; 447a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = { 448a28bfcc3SSimon Glass\t.name\t\t= "test1", 449a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1, 450a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1), 451a28bfcc3SSimon Glass}; 452a28bfcc3SSimon Glass 453a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = { 454a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x98765432}, 455a28bfcc3SSimon Glass}; 456a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = { 457a28bfcc3SSimon Glass\t.name\t\t= "test2", 458a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2, 459a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2), 460a28bfcc3SSimon Glass}; 461a28bfcc3SSimon Glass 462a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = { 463a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x98765432, 0x2, 0x3}, 464a28bfcc3SSimon Glass}; 465a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = { 466a28bfcc3SSimon Glass\t.name\t\t= "test3", 467a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3, 468a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3), 469a28bfcc3SSimon Glass}; 470a28bfcc3SSimon Glass 471a28bfcc3SSimon Glass''', data) 472a28bfcc3SSimon Glass 473a28bfcc3SSimon Glass def test_addresses32_64(self): 474a28bfcc3SSimon Glass """Test output from a node with a 'reg' property with na=1, ns=2""" 475a28bfcc3SSimon Glass dtb_file = get_dtb_file('dtoc_test_addr32_64.dts') 476a28bfcc3SSimon Glass output = tools.GetOutputFilename('output') 477a28bfcc3SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 478a28bfcc3SSimon Glass with open(output) as infile: 479a28bfcc3SSimon Glass data = infile.read() 480e71e2ceaSSimon Glass self.assertEqual(HEADER + ''' 481a28bfcc3SSimon Glassstruct dtd_test1 { 482a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 483a28bfcc3SSimon Glass}; 484a28bfcc3SSimon Glassstruct dtd_test2 { 485a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 486a28bfcc3SSimon Glass}; 487a28bfcc3SSimon Glassstruct dtd_test3 { 488a28bfcc3SSimon Glass\tfdt64_t\t\treg[4]; 489a28bfcc3SSimon Glass}; 490a28bfcc3SSimon Glass''', data) 491a28bfcc3SSimon Glass 492a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 493a28bfcc3SSimon Glass with open(output) as infile: 494a28bfcc3SSimon Glass data = infile.read() 495e71e2ceaSSimon Glass self.assertEqual(C_HEADER + ''' 496a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = { 497a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x567800000000}, 498a28bfcc3SSimon Glass}; 499a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = { 500a28bfcc3SSimon Glass\t.name\t\t= "test1", 501a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1, 502a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1), 503a28bfcc3SSimon Glass}; 504a28bfcc3SSimon Glass 505a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = { 506a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x9876543210987654}, 507a28bfcc3SSimon Glass}; 508a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = { 509a28bfcc3SSimon Glass\t.name\t\t= "test2", 510a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2, 511a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2), 512a28bfcc3SSimon Glass}; 513a28bfcc3SSimon Glass 514a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = { 515a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x9876543210987654, 0x2, 0x3}, 516a28bfcc3SSimon Glass}; 517a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = { 518a28bfcc3SSimon Glass\t.name\t\t= "test3", 519a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3, 520a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3), 521a28bfcc3SSimon Glass}; 522a28bfcc3SSimon Glass 523a28bfcc3SSimon Glass''', data) 524