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