13a37aee3SSimon Glass# SPDX-License-Identifier: GPL-2.0+ 283d290c5STom Rini# Copyright (c) 2013, Google Inc. 33a37aee3SSimon Glass# 43a37aee3SSimon Glass# Sanity check of the FIT handling in U-Boot 53a37aee3SSimon Glass 6dffd56d1SPaul Burtonfrom __future__ import print_function 7dffd56d1SPaul Burton 83a37aee3SSimon Glassimport os 93a37aee3SSimon Glassimport pytest 103a37aee3SSimon Glassimport struct 113a37aee3SSimon Glassimport u_boot_utils as util 123a37aee3SSimon Glass 133a37aee3SSimon Glass# Define a base ITS which we can adjust using % and a dictionary 143a37aee3SSimon Glassbase_its = ''' 153a37aee3SSimon Glass/dts-v1/; 163a37aee3SSimon Glass 173a37aee3SSimon Glass/ { 183a37aee3SSimon Glass description = "Chrome OS kernel image with one or more FDT blobs"; 193a37aee3SSimon Glass #address-cells = <1>; 203a37aee3SSimon Glass 213a37aee3SSimon Glass images { 223a37aee3SSimon Glass kernel@1 { 233a37aee3SSimon Glass data = /incbin/("%(kernel)s"); 243a37aee3SSimon Glass type = "kernel"; 253a37aee3SSimon Glass arch = "sandbox"; 263a37aee3SSimon Glass os = "linux"; 273a37aee3SSimon Glass compression = "none"; 283a37aee3SSimon Glass load = <0x40000>; 293a37aee3SSimon Glass entry = <0x8>; 303a37aee3SSimon Glass }; 313a37aee3SSimon Glass kernel@2 { 323a37aee3SSimon Glass data = /incbin/("%(loadables1)s"); 333a37aee3SSimon Glass type = "kernel"; 343a37aee3SSimon Glass arch = "sandbox"; 353a37aee3SSimon Glass os = "linux"; 363a37aee3SSimon Glass compression = "none"; 373a37aee3SSimon Glass %(loadables1_load)s 383a37aee3SSimon Glass entry = <0x0>; 393a37aee3SSimon Glass }; 403a37aee3SSimon Glass fdt@1 { 413a37aee3SSimon Glass description = "snow"; 423a37aee3SSimon Glass data = /incbin/("u-boot.dtb"); 433a37aee3SSimon Glass type = "flat_dt"; 443a37aee3SSimon Glass arch = "sandbox"; 453a37aee3SSimon Glass %(fdt_load)s 463a37aee3SSimon Glass compression = "none"; 473a37aee3SSimon Glass signature@1 { 483a37aee3SSimon Glass algo = "sha1,rsa2048"; 493a37aee3SSimon Glass key-name-hint = "dev"; 503a37aee3SSimon Glass }; 513a37aee3SSimon Glass }; 523a37aee3SSimon Glass ramdisk@1 { 533a37aee3SSimon Glass description = "snow"; 543a37aee3SSimon Glass data = /incbin/("%(ramdisk)s"); 553a37aee3SSimon Glass type = "ramdisk"; 563a37aee3SSimon Glass arch = "sandbox"; 573a37aee3SSimon Glass os = "linux"; 583a37aee3SSimon Glass %(ramdisk_load)s 593a37aee3SSimon Glass compression = "none"; 603a37aee3SSimon Glass }; 613a37aee3SSimon Glass ramdisk@2 { 623a37aee3SSimon Glass description = "snow"; 633a37aee3SSimon Glass data = /incbin/("%(loadables2)s"); 643a37aee3SSimon Glass type = "ramdisk"; 653a37aee3SSimon Glass arch = "sandbox"; 663a37aee3SSimon Glass os = "linux"; 673a37aee3SSimon Glass %(loadables2_load)s 683a37aee3SSimon Glass compression = "none"; 693a37aee3SSimon Glass }; 703a37aee3SSimon Glass }; 713a37aee3SSimon Glass configurations { 723a37aee3SSimon Glass default = "conf@1"; 733a37aee3SSimon Glass conf@1 { 743a37aee3SSimon Glass kernel = "kernel@1"; 753a37aee3SSimon Glass fdt = "fdt@1"; 763a37aee3SSimon Glass %(ramdisk_config)s 773a37aee3SSimon Glass %(loadables_config)s 783a37aee3SSimon Glass }; 793a37aee3SSimon Glass }; 803a37aee3SSimon Glass}; 813a37aee3SSimon Glass''' 823a37aee3SSimon Glass 833a37aee3SSimon Glass# Define a base FDT - currently we don't use anything in this 843a37aee3SSimon Glassbase_fdt = ''' 853a37aee3SSimon Glass/dts-v1/; 863a37aee3SSimon Glass 873a37aee3SSimon Glass/ { 883a37aee3SSimon Glass model = "Sandbox Verified Boot Test"; 893a37aee3SSimon Glass compatible = "sandbox"; 903a37aee3SSimon Glass 913a37aee3SSimon Glass reset@0 { 923a37aee3SSimon Glass compatible = "sandbox,reset"; 933a37aee3SSimon Glass }; 943a37aee3SSimon Glass 953a37aee3SSimon Glass}; 963a37aee3SSimon Glass''' 973a37aee3SSimon Glass 983a37aee3SSimon Glass# This is the U-Boot script that is run for each test. First load the FIT, 993a37aee3SSimon Glass# then run the 'bootm' command, then save out memory from the places where 1003a37aee3SSimon Glass# we expect 'bootm' to write things. Then quit. 1013a37aee3SSimon Glassbase_script = ''' 102*6d07d63dSSimon Glasshost load hostfs 0 %(fit_addr)x %(fit)s 1033a37aee3SSimon Glassfdt addr %(fit_addr)x 1043a37aee3SSimon Glassbootm start %(fit_addr)x 1053a37aee3SSimon Glassbootm loados 106*6d07d63dSSimon Glasshost save hostfs 0 %(kernel_addr)x %(kernel_out)s %(kernel_size)x 107*6d07d63dSSimon Glasshost save hostfs 0 %(fdt_addr)x %(fdt_out)s %(fdt_size)x 108*6d07d63dSSimon Glasshost save hostfs 0 %(ramdisk_addr)x %(ramdisk_out)s %(ramdisk_size)x 109*6d07d63dSSimon Glasshost save hostfs 0 %(loadables1_addr)x %(loadables1_out)s %(loadables1_size)x 110*6d07d63dSSimon Glasshost save hostfs 0 %(loadables2_addr)x %(loadables2_out)s %(loadables2_size)x 1113a37aee3SSimon Glass''' 1123a37aee3SSimon Glass 1133a37aee3SSimon Glass@pytest.mark.boardspec('sandbox') 1143a37aee3SSimon Glass@pytest.mark.buildconfigspec('fit_signature') 1152d26bf6cSStephen Warren@pytest.mark.requiredtool('dtc') 1163a37aee3SSimon Glassdef test_fit(u_boot_console): 1173a37aee3SSimon Glass def make_fname(leaf): 1183a37aee3SSimon Glass """Make a temporary filename 1193a37aee3SSimon Glass 1203a37aee3SSimon Glass Args: 1213a37aee3SSimon Glass leaf: Leaf name of file to create (within temporary directory) 1223a37aee3SSimon Glass Return: 1233a37aee3SSimon Glass Temporary filename 1243a37aee3SSimon Glass """ 1253a37aee3SSimon Glass 1263a37aee3SSimon Glass return os.path.join(cons.config.build_dir, leaf) 1273a37aee3SSimon Glass 1283a37aee3SSimon Glass def filesize(fname): 1293a37aee3SSimon Glass """Get the size of a file 1303a37aee3SSimon Glass 1313a37aee3SSimon Glass Args: 1323a37aee3SSimon Glass fname: Filename to check 1333a37aee3SSimon Glass Return: 1343a37aee3SSimon Glass Size of file in bytes 1353a37aee3SSimon Glass """ 1363a37aee3SSimon Glass return os.stat(fname).st_size 1373a37aee3SSimon Glass 1383a37aee3SSimon Glass def read_file(fname): 1393a37aee3SSimon Glass """Read the contents of a file 1403a37aee3SSimon Glass 1413a37aee3SSimon Glass Args: 1423a37aee3SSimon Glass fname: Filename to read 1433a37aee3SSimon Glass Returns: 1443a37aee3SSimon Glass Contents of file as a string 1453a37aee3SSimon Glass """ 14657bf9beaSPaul Burton with open(fname, 'rb') as fd: 1473a37aee3SSimon Glass return fd.read() 1483a37aee3SSimon Glass 1493a37aee3SSimon Glass def make_dtb(): 1503a37aee3SSimon Glass """Make a sample .dts file and compile it to a .dtb 1513a37aee3SSimon Glass 1523a37aee3SSimon Glass Returns: 1533a37aee3SSimon Glass Filename of .dtb file created 1543a37aee3SSimon Glass """ 1553a37aee3SSimon Glass src = make_fname('u-boot.dts') 1563a37aee3SSimon Glass dtb = make_fname('u-boot.dtb') 1573a37aee3SSimon Glass with open(src, 'w') as fd: 158dffd56d1SPaul Burton print(base_fdt, file=fd) 1593a37aee3SSimon Glass util.run_and_log(cons, ['dtc', src, '-O', 'dtb', '-o', dtb]) 1603a37aee3SSimon Glass return dtb 1613a37aee3SSimon Glass 1623a37aee3SSimon Glass def make_its(params): 1633a37aee3SSimon Glass """Make a sample .its file with parameters embedded 1643a37aee3SSimon Glass 1653a37aee3SSimon Glass Args: 1663a37aee3SSimon Glass params: Dictionary containing parameters to embed in the %() strings 1673a37aee3SSimon Glass Returns: 1683a37aee3SSimon Glass Filename of .its file created 1693a37aee3SSimon Glass """ 1703a37aee3SSimon Glass its = make_fname('test.its') 1713a37aee3SSimon Glass with open(its, 'w') as fd: 172dffd56d1SPaul Burton print(base_its % params, file=fd) 1733a37aee3SSimon Glass return its 1743a37aee3SSimon Glass 1753a37aee3SSimon Glass def make_fit(mkimage, params): 1763a37aee3SSimon Glass """Make a sample .fit file ready for loading 1773a37aee3SSimon Glass 1783a37aee3SSimon Glass This creates a .its script with the selected parameters and uses mkimage to 1793a37aee3SSimon Glass turn this into a .fit image. 1803a37aee3SSimon Glass 1813a37aee3SSimon Glass Args: 1823a37aee3SSimon Glass mkimage: Filename of 'mkimage' utility 1833a37aee3SSimon Glass params: Dictionary containing parameters to embed in the %() strings 1843a37aee3SSimon Glass Return: 1853a37aee3SSimon Glass Filename of .fit file created 1863a37aee3SSimon Glass """ 1873a37aee3SSimon Glass fit = make_fname('test.fit') 1883a37aee3SSimon Glass its = make_its(params) 1893a37aee3SSimon Glass util.run_and_log(cons, [mkimage, '-f', its, fit]) 1903a37aee3SSimon Glass with open(make_fname('u-boot.dts'), 'w') as fd: 191dffd56d1SPaul Burton print(base_fdt, file=fd) 1923a37aee3SSimon Glass return fit 1933a37aee3SSimon Glass 1943a37aee3SSimon Glass def make_kernel(filename, text): 1953a37aee3SSimon Glass """Make a sample kernel with test data 1963a37aee3SSimon Glass 1973a37aee3SSimon Glass Args: 1983a37aee3SSimon Glass filename: the name of the file you want to create 1993a37aee3SSimon Glass Returns: 2003a37aee3SSimon Glass Full path and filename of the kernel it created 2013a37aee3SSimon Glass """ 2023a37aee3SSimon Glass fname = make_fname(filename) 2033a37aee3SSimon Glass data = '' 2043a37aee3SSimon Glass for i in range(100): 2053a37aee3SSimon Glass data += 'this %s %d is unlikely to boot\n' % (text, i) 2063a37aee3SSimon Glass with open(fname, 'w') as fd: 207dffd56d1SPaul Burton print(data, file=fd) 2083a37aee3SSimon Glass return fname 2093a37aee3SSimon Glass 2103a37aee3SSimon Glass def make_ramdisk(filename, text): 2113a37aee3SSimon Glass """Make a sample ramdisk with test data 2123a37aee3SSimon Glass 2133a37aee3SSimon Glass Returns: 2143a37aee3SSimon Glass Filename of ramdisk created 2153a37aee3SSimon Glass """ 2163a37aee3SSimon Glass fname = make_fname(filename) 2173a37aee3SSimon Glass data = '' 2183a37aee3SSimon Glass for i in range(100): 2193a37aee3SSimon Glass data += '%s %d was seldom used in the middle ages\n' % (text, i) 2203a37aee3SSimon Glass with open(fname, 'w') as fd: 221dffd56d1SPaul Burton print(data, file=fd) 2223a37aee3SSimon Glass return fname 2233a37aee3SSimon Glass 2243a37aee3SSimon Glass def find_matching(text, match): 2253a37aee3SSimon Glass """Find a match in a line of text, and return the unmatched line portion 2263a37aee3SSimon Glass 2273a37aee3SSimon Glass This is used to extract a part of a line from some text. The match string 2283a37aee3SSimon Glass is used to locate the line - we use the first line that contains that 2293a37aee3SSimon Glass match text. 2303a37aee3SSimon Glass 2313a37aee3SSimon Glass Once we find a match, we discard the match string itself from the line, 2323a37aee3SSimon Glass and return what remains. 2333a37aee3SSimon Glass 2343a37aee3SSimon Glass TODO: If this function becomes more generally useful, we could change it 2353a37aee3SSimon Glass to use regex and return groups. 2363a37aee3SSimon Glass 2373a37aee3SSimon Glass Args: 2383a37aee3SSimon Glass text: Text to check (list of strings, one for each command issued) 2393a37aee3SSimon Glass match: String to search for 2403a37aee3SSimon Glass Return: 2413a37aee3SSimon Glass String containing unmatched portion of line 2423a37aee3SSimon Glass Exceptions: 2433a37aee3SSimon Glass ValueError: If match is not found 2443a37aee3SSimon Glass 2453a37aee3SSimon Glass >>> find_matching(['first line:10', 'second_line:20'], 'first line:') 2463a37aee3SSimon Glass '10' 2473a37aee3SSimon Glass >>> find_matching(['first line:10', 'second_line:20'], 'second line') 2483a37aee3SSimon Glass Traceback (most recent call last): 2493a37aee3SSimon Glass ... 2503a37aee3SSimon Glass ValueError: Test aborted 2513a37aee3SSimon Glass >>> find_matching('first line:10\', 'second_line:20'], 'second_line:') 2523a37aee3SSimon Glass '20' 2533a37aee3SSimon Glass >>> find_matching('first line:10\', 'second_line:20\nthird_line:30'], 2543a37aee3SSimon Glass 'third_line:') 2553a37aee3SSimon Glass '30' 2563a37aee3SSimon Glass """ 2573a37aee3SSimon Glass __tracebackhide__ = True 2583a37aee3SSimon Glass for line in '\n'.join(text).splitlines(): 2593a37aee3SSimon Glass pos = line.find(match) 2603a37aee3SSimon Glass if pos != -1: 2613a37aee3SSimon Glass return line[:pos] + line[pos + len(match):] 2623a37aee3SSimon Glass 2633a37aee3SSimon Glass pytest.fail("Expected '%s' but not found in output") 2643a37aee3SSimon Glass 2653a37aee3SSimon Glass def check_equal(expected_fname, actual_fname, failure_msg): 2663a37aee3SSimon Glass """Check that a file matches its expected contents 2673a37aee3SSimon Glass 2683a37aee3SSimon Glass Args: 2693a37aee3SSimon Glass expected_fname: Filename containing expected contents 2703a37aee3SSimon Glass actual_fname: Filename containing actual contents 2713a37aee3SSimon Glass failure_msg: Message to print on failure 2723a37aee3SSimon Glass """ 2733a37aee3SSimon Glass expected_data = read_file(expected_fname) 2743a37aee3SSimon Glass actual_data = read_file(actual_fname) 2753a37aee3SSimon Glass assert expected_data == actual_data, failure_msg 2763a37aee3SSimon Glass 2773a37aee3SSimon Glass def check_not_equal(expected_fname, actual_fname, failure_msg): 2783a37aee3SSimon Glass """Check that a file does not match its expected contents 2793a37aee3SSimon Glass 2803a37aee3SSimon Glass Args: 2813a37aee3SSimon Glass expected_fname: Filename containing expected contents 2823a37aee3SSimon Glass actual_fname: Filename containing actual contents 2833a37aee3SSimon Glass failure_msg: Message to print on failure 2843a37aee3SSimon Glass """ 2853a37aee3SSimon Glass expected_data = read_file(expected_fname) 2863a37aee3SSimon Glass actual_data = read_file(actual_fname) 2873a37aee3SSimon Glass assert expected_data != actual_data, failure_msg 2883a37aee3SSimon Glass 2893a37aee3SSimon Glass def run_fit_test(mkimage): 2903a37aee3SSimon Glass """Basic sanity check of FIT loading in U-Boot 2913a37aee3SSimon Glass 2923a37aee3SSimon Glass TODO: Almost everything: 2933a37aee3SSimon Glass - hash algorithms - invalid hash/contents should be detected 2943a37aee3SSimon Glass - signature algorithms - invalid sig/contents should be detected 2953a37aee3SSimon Glass - compression 2963a37aee3SSimon Glass - checking that errors are detected like: 2973a37aee3SSimon Glass - image overwriting 2983a37aee3SSimon Glass - missing images 2993a37aee3SSimon Glass - invalid configurations 3003a37aee3SSimon Glass - incorrect os/arch/type fields 3013a37aee3SSimon Glass - empty data 3023a37aee3SSimon Glass - images too large/small 3033a37aee3SSimon Glass - invalid FDT (e.g. putting a random binary in instead) 3043a37aee3SSimon Glass - default configuration selection 3053a37aee3SSimon Glass - bootm command line parameters should have desired effect 3063a37aee3SSimon Glass - run code coverage to make sure we are testing all the code 3073a37aee3SSimon Glass """ 3083a37aee3SSimon Glass # Set up invariant files 3093a37aee3SSimon Glass control_dtb = make_dtb() 3103a37aee3SSimon Glass kernel = make_kernel('test-kernel.bin', 'kernel') 3113a37aee3SSimon Glass ramdisk = make_ramdisk('test-ramdisk.bin', 'ramdisk') 3123a37aee3SSimon Glass loadables1 = make_kernel('test-loadables1.bin', 'lenrek') 3133a37aee3SSimon Glass loadables2 = make_ramdisk('test-loadables2.bin', 'ksidmar') 3143a37aee3SSimon Glass kernel_out = make_fname('kernel-out.bin') 3153a37aee3SSimon Glass fdt_out = make_fname('fdt-out.dtb') 3163a37aee3SSimon Glass ramdisk_out = make_fname('ramdisk-out.bin') 3173a37aee3SSimon Glass loadables1_out = make_fname('loadables1-out.bin') 3183a37aee3SSimon Glass loadables2_out = make_fname('loadables2-out.bin') 3193a37aee3SSimon Glass 3203a37aee3SSimon Glass # Set up basic parameters with default values 3213a37aee3SSimon Glass params = { 3223a37aee3SSimon Glass 'fit_addr' : 0x1000, 3233a37aee3SSimon Glass 3243a37aee3SSimon Glass 'kernel' : kernel, 3253a37aee3SSimon Glass 'kernel_out' : kernel_out, 3263a37aee3SSimon Glass 'kernel_addr' : 0x40000, 3273a37aee3SSimon Glass 'kernel_size' : filesize(kernel), 3283a37aee3SSimon Glass 3293a37aee3SSimon Glass 'fdt_out' : fdt_out, 3303a37aee3SSimon Glass 'fdt_addr' : 0x80000, 3313a37aee3SSimon Glass 'fdt_size' : filesize(control_dtb), 3323a37aee3SSimon Glass 'fdt_load' : '', 3333a37aee3SSimon Glass 3343a37aee3SSimon Glass 'ramdisk' : ramdisk, 3353a37aee3SSimon Glass 'ramdisk_out' : ramdisk_out, 3363a37aee3SSimon Glass 'ramdisk_addr' : 0xc0000, 3373a37aee3SSimon Glass 'ramdisk_size' : filesize(ramdisk), 3383a37aee3SSimon Glass 'ramdisk_load' : '', 3393a37aee3SSimon Glass 'ramdisk_config' : '', 3403a37aee3SSimon Glass 3413a37aee3SSimon Glass 'loadables1' : loadables1, 3423a37aee3SSimon Glass 'loadables1_out' : loadables1_out, 3433a37aee3SSimon Glass 'loadables1_addr' : 0x100000, 3443a37aee3SSimon Glass 'loadables1_size' : filesize(loadables1), 3453a37aee3SSimon Glass 'loadables1_load' : '', 3463a37aee3SSimon Glass 3473a37aee3SSimon Glass 'loadables2' : loadables2, 3483a37aee3SSimon Glass 'loadables2_out' : loadables2_out, 3493a37aee3SSimon Glass 'loadables2_addr' : 0x140000, 3503a37aee3SSimon Glass 'loadables2_size' : filesize(loadables2), 3513a37aee3SSimon Glass 'loadables2_load' : '', 3523a37aee3SSimon Glass 3533a37aee3SSimon Glass 'loadables_config' : '', 3543a37aee3SSimon Glass } 3553a37aee3SSimon Glass 3563a37aee3SSimon Glass # Make a basic FIT and a script to load it 3573a37aee3SSimon Glass fit = make_fit(mkimage, params) 3583a37aee3SSimon Glass params['fit'] = fit 3593a37aee3SSimon Glass cmd = base_script % params 3603a37aee3SSimon Glass 3613a37aee3SSimon Glass # First check that we can load a kernel 3623a37aee3SSimon Glass # We could perhaps reduce duplication with some loss of readability 3633a37aee3SSimon Glass cons.config.dtb = control_dtb 3643a37aee3SSimon Glass cons.restart_uboot() 3653a37aee3SSimon Glass with cons.log.section('Kernel load'): 3663a37aee3SSimon Glass output = cons.run_command_list(cmd.splitlines()) 3673a37aee3SSimon Glass check_equal(kernel, kernel_out, 'Kernel not loaded') 3683a37aee3SSimon Glass check_not_equal(control_dtb, fdt_out, 3693a37aee3SSimon Glass 'FDT loaded but should be ignored') 3703a37aee3SSimon Glass check_not_equal(ramdisk, ramdisk_out, 3713a37aee3SSimon Glass 'Ramdisk loaded but should not be') 3723a37aee3SSimon Glass 3733a37aee3SSimon Glass # Find out the offset in the FIT where U-Boot has found the FDT 3743a37aee3SSimon Glass line = find_matching(output, 'Booting using the fdt blob at ') 3753a37aee3SSimon Glass fit_offset = int(line, 16) - params['fit_addr'] 3763a37aee3SSimon Glass fdt_magic = struct.pack('>L', 0xd00dfeed) 3773a37aee3SSimon Glass data = read_file(fit) 3783a37aee3SSimon Glass 3793a37aee3SSimon Glass # Now find where it actually is in the FIT (skip the first word) 3803a37aee3SSimon Glass real_fit_offset = data.find(fdt_magic, 4) 3813a37aee3SSimon Glass assert fit_offset == real_fit_offset, ( 3823a37aee3SSimon Glass 'U-Boot loaded FDT from offset %#x, FDT is actually at %#x' % 3833a37aee3SSimon Glass (fit_offset, real_fit_offset)) 3843a37aee3SSimon Glass 3853a37aee3SSimon Glass # Now a kernel and an FDT 3863a37aee3SSimon Glass with cons.log.section('Kernel + FDT load'): 3873a37aee3SSimon Glass params['fdt_load'] = 'load = <%#x>;' % params['fdt_addr'] 3883a37aee3SSimon Glass fit = make_fit(mkimage, params) 3893a37aee3SSimon Glass cons.restart_uboot() 3903a37aee3SSimon Glass output = cons.run_command_list(cmd.splitlines()) 3913a37aee3SSimon Glass check_equal(kernel, kernel_out, 'Kernel not loaded') 3923a37aee3SSimon Glass check_equal(control_dtb, fdt_out, 'FDT not loaded') 3933a37aee3SSimon Glass check_not_equal(ramdisk, ramdisk_out, 3943a37aee3SSimon Glass 'Ramdisk loaded but should not be') 3953a37aee3SSimon Glass 3963a37aee3SSimon Glass # Try a ramdisk 3973a37aee3SSimon Glass with cons.log.section('Kernel + FDT + Ramdisk load'): 3983a37aee3SSimon Glass params['ramdisk_config'] = 'ramdisk = "ramdisk@1";' 3993a37aee3SSimon Glass params['ramdisk_load'] = 'load = <%#x>;' % params['ramdisk_addr'] 4003a37aee3SSimon Glass fit = make_fit(mkimage, params) 4013a37aee3SSimon Glass cons.restart_uboot() 4023a37aee3SSimon Glass output = cons.run_command_list(cmd.splitlines()) 4033a37aee3SSimon Glass check_equal(ramdisk, ramdisk_out, 'Ramdisk not loaded') 4043a37aee3SSimon Glass 4053a37aee3SSimon Glass # Configuration with some Loadables 4063a37aee3SSimon Glass with cons.log.section('Kernel + FDT + Ramdisk load + Loadables'): 4073a37aee3SSimon Glass params['loadables_config'] = 'loadables = "kernel@2", "ramdisk@2";' 4083a37aee3SSimon Glass params['loadables1_load'] = ('load = <%#x>;' % 4093a37aee3SSimon Glass params['loadables1_addr']) 4103a37aee3SSimon Glass params['loadables2_load'] = ('load = <%#x>;' % 4113a37aee3SSimon Glass params['loadables2_addr']) 4123a37aee3SSimon Glass fit = make_fit(mkimage, params) 4133a37aee3SSimon Glass cons.restart_uboot() 4143a37aee3SSimon Glass output = cons.run_command_list(cmd.splitlines()) 4153a37aee3SSimon Glass check_equal(loadables1, loadables1_out, 4163a37aee3SSimon Glass 'Loadables1 (kernel) not loaded') 4173a37aee3SSimon Glass check_equal(loadables2, loadables2_out, 4183a37aee3SSimon Glass 'Loadables2 (ramdisk) not loaded') 4193a37aee3SSimon Glass 4203a37aee3SSimon Glass cons = u_boot_console 4213a37aee3SSimon Glass try: 4223a37aee3SSimon Glass # We need to use our own device tree file. Remember to restore it 4233a37aee3SSimon Glass # afterwards. 4243a37aee3SSimon Glass old_dtb = cons.config.dtb 4253a37aee3SSimon Glass mkimage = cons.config.build_dir + '/tools/mkimage' 4263a37aee3SSimon Glass run_fit_test(mkimage) 4273a37aee3SSimon Glass finally: 4283a37aee3SSimon Glass # Go back to the original U-Boot with the correct dtb. 4293a37aee3SSimon Glass cons.config.dtb = old_dtb 4303a37aee3SSimon Glass cons.restart_uboot() 431