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*3a40acd4SSimon Glass\tstruct phandle_1_arg clocks[1]; 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 = { 246c0791928SSimon Glass\t.intval\t\t\t= 0x1, 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 254c0791928SSimon Glassstatic struct dtd_source dtv_phandle_source = { 255c0791928SSimon Glass\t.clocks\t\t\t= {{&dtv_phandle_target, 1}}, 256c0791928SSimon Glass}; 257c0791928SSimon GlassU_BOOT_DEVICE(phandle_source) = { 258c0791928SSimon Glass\t.name\t\t= "source", 259c0791928SSimon Glass\t.platdata\t= &dtv_phandle_source, 260c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_phandle_source), 261c0791928SSimon Glass}; 262c0791928SSimon Glass 263c0791928SSimon Glass''', data) 264c0791928SSimon Glass 265c0791928SSimon Glass def test_aliases(self): 266c0791928SSimon Glass """Test output from a node with multiple compatible strings""" 267c0791928SSimon Glass dtb_file = get_dtb_file('dtoc_test_aliases.dts') 268c0791928SSimon Glass output = tools.GetOutputFilename('output') 269c0791928SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 270c0791928SSimon Glass with open(output) as infile: 271c0791928SSimon Glass data = infile.read() 272c0791928SSimon Glass self.assertEqual('''#include <stdbool.h> 273c0791928SSimon Glass#include <libfdt.h> 274c0791928SSimon Glassstruct dtd_compat1 { 275c0791928SSimon Glass\tfdt32_t\t\tintval; 276c0791928SSimon Glass}; 277c0791928SSimon Glass#define dtd_compat2_1_fred dtd_compat1 278c0791928SSimon Glass#define dtd_compat3 dtd_compat1 279c0791928SSimon Glass''', data) 280c0791928SSimon Glass 281c0791928SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 282c0791928SSimon Glass with open(output) as infile: 283c0791928SSimon Glass data = infile.read() 284c0791928SSimon Glass self.assertEqual('''#include <common.h> 285c0791928SSimon Glass#include <dm.h> 286c0791928SSimon Glass#include <dt-structs.h> 287c0791928SSimon Glass 288c0791928SSimon Glassstatic struct dtd_compat1 dtv_spl_test = { 289c0791928SSimon Glass\t.intval\t\t\t= 0x1, 290c0791928SSimon Glass}; 291c0791928SSimon GlassU_BOOT_DEVICE(spl_test) = { 292c0791928SSimon Glass\t.name\t\t= "compat1", 293c0791928SSimon Glass\t.platdata\t= &dtv_spl_test, 294c0791928SSimon Glass\t.platdata_size\t= sizeof(dtv_spl_test), 295c0791928SSimon Glass}; 296c0791928SSimon Glass 297c0791928SSimon Glass''', data) 298a28bfcc3SSimon Glass 299a28bfcc3SSimon Glass def test_addresses64(self): 300a28bfcc3SSimon Glass """Test output from a node with a 'reg' property with na=2, ns=2""" 301a28bfcc3SSimon Glass dtb_file = get_dtb_file('dtoc_test_addr64.dts') 302a28bfcc3SSimon Glass output = tools.GetOutputFilename('output') 303a28bfcc3SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 304a28bfcc3SSimon Glass with open(output) as infile: 305a28bfcc3SSimon Glass data = infile.read() 306a28bfcc3SSimon Glass self.assertEqual('''#include <stdbool.h> 307a28bfcc3SSimon Glass#include <libfdt.h> 308a28bfcc3SSimon Glassstruct dtd_test1 { 309a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 310a28bfcc3SSimon Glass}; 311a28bfcc3SSimon Glassstruct dtd_test2 { 312a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 313a28bfcc3SSimon Glass}; 314a28bfcc3SSimon Glassstruct dtd_test3 { 315a28bfcc3SSimon Glass\tfdt64_t\t\treg[4]; 316a28bfcc3SSimon Glass}; 317a28bfcc3SSimon Glass''', data) 318a28bfcc3SSimon Glass 319a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 320a28bfcc3SSimon Glass with open(output) as infile: 321a28bfcc3SSimon Glass data = infile.read() 322a28bfcc3SSimon Glass self.assertEqual('''#include <common.h> 323a28bfcc3SSimon Glass#include <dm.h> 324a28bfcc3SSimon Glass#include <dt-structs.h> 325a28bfcc3SSimon Glass 326a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = { 327a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x5678}, 328a28bfcc3SSimon Glass}; 329a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = { 330a28bfcc3SSimon Glass\t.name\t\t= "test1", 331a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1, 332a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1), 333a28bfcc3SSimon Glass}; 334a28bfcc3SSimon Glass 335a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = { 336a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654}, 337a28bfcc3SSimon Glass}; 338a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = { 339a28bfcc3SSimon Glass\t.name\t\t= "test2", 340a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2, 341a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2), 342a28bfcc3SSimon Glass}; 343a28bfcc3SSimon Glass 344a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = { 345a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654, 0x2, 0x3}, 346a28bfcc3SSimon Glass}; 347a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = { 348a28bfcc3SSimon Glass\t.name\t\t= "test3", 349a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3, 350a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3), 351a28bfcc3SSimon Glass}; 352a28bfcc3SSimon Glass 353a28bfcc3SSimon Glass''', data) 354a28bfcc3SSimon Glass 355a28bfcc3SSimon Glass def test_addresses32(self): 356a28bfcc3SSimon Glass """Test output from a node with a 'reg' property with na=1, ns=1""" 357a28bfcc3SSimon Glass dtb_file = get_dtb_file('dtoc_test_addr32.dts') 358a28bfcc3SSimon Glass output = tools.GetOutputFilename('output') 359a28bfcc3SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 360a28bfcc3SSimon Glass with open(output) as infile: 361a28bfcc3SSimon Glass data = infile.read() 362a28bfcc3SSimon Glass self.assertEqual('''#include <stdbool.h> 363a28bfcc3SSimon Glass#include <libfdt.h> 364a28bfcc3SSimon Glassstruct dtd_test1 { 365a28bfcc3SSimon Glass\tfdt32_t\t\treg[2]; 366a28bfcc3SSimon Glass}; 367a28bfcc3SSimon Glassstruct dtd_test2 { 368a28bfcc3SSimon Glass\tfdt32_t\t\treg[4]; 369a28bfcc3SSimon Glass}; 370a28bfcc3SSimon Glass''', data) 371a28bfcc3SSimon Glass 372a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 373a28bfcc3SSimon Glass with open(output) as infile: 374a28bfcc3SSimon Glass data = infile.read() 375a28bfcc3SSimon Glass self.assertEqual('''#include <common.h> 376a28bfcc3SSimon Glass#include <dm.h> 377a28bfcc3SSimon Glass#include <dt-structs.h> 378a28bfcc3SSimon Glass 379a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = { 380a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x5678}, 381a28bfcc3SSimon Glass}; 382a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = { 383a28bfcc3SSimon Glass\t.name\t\t= "test1", 384a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1, 385a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1), 386a28bfcc3SSimon Glass}; 387a28bfcc3SSimon Glass 388a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = { 389a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x98765432, 0x2, 0x3}, 390a28bfcc3SSimon Glass}; 391a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = { 392a28bfcc3SSimon Glass\t.name\t\t= "test2", 393a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2, 394a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2), 395a28bfcc3SSimon Glass}; 396a28bfcc3SSimon Glass 397a28bfcc3SSimon Glass''', data) 398a28bfcc3SSimon Glass 399a28bfcc3SSimon Glass def test_addresses64_32(self): 400a28bfcc3SSimon Glass """Test output from a node with a 'reg' property with na=2, ns=1""" 401a28bfcc3SSimon Glass dtb_file = get_dtb_file('dtoc_test_addr64_32.dts') 402a28bfcc3SSimon Glass output = tools.GetOutputFilename('output') 403a28bfcc3SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 404a28bfcc3SSimon Glass with open(output) as infile: 405a28bfcc3SSimon Glass data = infile.read() 406a28bfcc3SSimon Glass self.assertEqual('''#include <stdbool.h> 407a28bfcc3SSimon Glass#include <libfdt.h> 408a28bfcc3SSimon Glassstruct dtd_test1 { 409a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 410a28bfcc3SSimon Glass}; 411a28bfcc3SSimon Glassstruct dtd_test2 { 412a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 413a28bfcc3SSimon Glass}; 414a28bfcc3SSimon Glassstruct dtd_test3 { 415a28bfcc3SSimon Glass\tfdt64_t\t\treg[4]; 416a28bfcc3SSimon Glass}; 417a28bfcc3SSimon Glass''', data) 418a28bfcc3SSimon Glass 419a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 420a28bfcc3SSimon Glass with open(output) as infile: 421a28bfcc3SSimon Glass data = infile.read() 422a28bfcc3SSimon Glass self.assertEqual('''#include <common.h> 423a28bfcc3SSimon Glass#include <dm.h> 424a28bfcc3SSimon Glass#include <dt-structs.h> 425a28bfcc3SSimon Glass 426a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = { 427a28bfcc3SSimon Glass\t.reg\t\t\t= {0x123400000000, 0x5678}, 428a28bfcc3SSimon Glass}; 429a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = { 430a28bfcc3SSimon Glass\t.name\t\t= "test1", 431a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1, 432a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1), 433a28bfcc3SSimon Glass}; 434a28bfcc3SSimon Glass 435a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = { 436a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x98765432}, 437a28bfcc3SSimon Glass}; 438a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = { 439a28bfcc3SSimon Glass\t.name\t\t= "test2", 440a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2, 441a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2), 442a28bfcc3SSimon Glass}; 443a28bfcc3SSimon Glass 444a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = { 445a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234567890123456, 0x98765432, 0x2, 0x3}, 446a28bfcc3SSimon Glass}; 447a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = { 448a28bfcc3SSimon Glass\t.name\t\t= "test3", 449a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3, 450a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3), 451a28bfcc3SSimon Glass}; 452a28bfcc3SSimon Glass 453a28bfcc3SSimon Glass''', data) 454a28bfcc3SSimon Glass 455a28bfcc3SSimon Glass def test_addresses32_64(self): 456a28bfcc3SSimon Glass """Test output from a node with a 'reg' property with na=1, ns=2""" 457a28bfcc3SSimon Glass dtb_file = get_dtb_file('dtoc_test_addr32_64.dts') 458a28bfcc3SSimon Glass output = tools.GetOutputFilename('output') 459a28bfcc3SSimon Glass dtb_platdata.run_steps(['struct'], dtb_file, False, output) 460a28bfcc3SSimon Glass with open(output) as infile: 461a28bfcc3SSimon Glass data = infile.read() 462a28bfcc3SSimon Glass self.assertEqual('''#include <stdbool.h> 463a28bfcc3SSimon Glass#include <libfdt.h> 464a28bfcc3SSimon Glassstruct dtd_test1 { 465a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 466a28bfcc3SSimon Glass}; 467a28bfcc3SSimon Glassstruct dtd_test2 { 468a28bfcc3SSimon Glass\tfdt64_t\t\treg[2]; 469a28bfcc3SSimon Glass}; 470a28bfcc3SSimon Glassstruct dtd_test3 { 471a28bfcc3SSimon Glass\tfdt64_t\t\treg[4]; 472a28bfcc3SSimon Glass}; 473a28bfcc3SSimon Glass''', data) 474a28bfcc3SSimon Glass 475a28bfcc3SSimon Glass dtb_platdata.run_steps(['platdata'], dtb_file, False, output) 476a28bfcc3SSimon Glass with open(output) as infile: 477a28bfcc3SSimon Glass data = infile.read() 478a28bfcc3SSimon Glass self.assertEqual('''#include <common.h> 479a28bfcc3SSimon Glass#include <dm.h> 480a28bfcc3SSimon Glass#include <dt-structs.h> 481a28bfcc3SSimon Glass 482a28bfcc3SSimon Glassstatic struct dtd_test1 dtv_test1 = { 483a28bfcc3SSimon Glass\t.reg\t\t\t= {0x1234, 0x567800000000}, 484a28bfcc3SSimon Glass}; 485a28bfcc3SSimon GlassU_BOOT_DEVICE(test1) = { 486a28bfcc3SSimon Glass\t.name\t\t= "test1", 487a28bfcc3SSimon Glass\t.platdata\t= &dtv_test1, 488a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test1), 489a28bfcc3SSimon Glass}; 490a28bfcc3SSimon Glass 491a28bfcc3SSimon Glassstatic struct dtd_test2 dtv_test2 = { 492a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x9876543210987654}, 493a28bfcc3SSimon Glass}; 494a28bfcc3SSimon GlassU_BOOT_DEVICE(test2) = { 495a28bfcc3SSimon Glass\t.name\t\t= "test2", 496a28bfcc3SSimon Glass\t.platdata\t= &dtv_test2, 497a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test2), 498a28bfcc3SSimon Glass}; 499a28bfcc3SSimon Glass 500a28bfcc3SSimon Glassstatic struct dtd_test3 dtv_test3 = { 501a28bfcc3SSimon Glass\t.reg\t\t\t= {0x12345678, 0x9876543210987654, 0x2, 0x3}, 502a28bfcc3SSimon Glass}; 503a28bfcc3SSimon GlassU_BOOT_DEVICE(test3) = { 504a28bfcc3SSimon Glass\t.name\t\t= "test3", 505a28bfcc3SSimon Glass\t.platdata\t= &dtv_test3, 506a28bfcc3SSimon Glass\t.platdata_size\t= sizeof(dtv_test3), 507a28bfcc3SSimon Glass}; 508a28bfcc3SSimon Glass 509a28bfcc3SSimon Glass''', data) 510