Simon Glass | a2d24e6 | 2023-02-13 08:56:41 -0700 | [diff] [blame] | 1 | # SPDX-License-Identifier: GPL-2.0 |
| 2 | # Copyright 2023 Google LLC |
| 3 | # Written by Simon Glass <sjg@chromium.org> |
| 4 | |
| 5 | """Test handling of unmigrated u-boot,dm- tags""" |
| 6 | |
| 7 | import os |
| 8 | import pytest |
| 9 | |
| 10 | import u_boot_utils as util |
| 11 | |
| 12 | # This is needed for Azure, since the default '..' directory is not writeable |
| 13 | TMPDIR1 = '/tmp/test_no_migrate' |
| 14 | TMPDIR2 = '/tmp/test_no_migrate_spl' |
| 15 | TMPDIR3 = '/tmp/test_migrate' |
| 16 | |
| 17 | def build_for_migrate(cons, replace_pair, board, tmpdir, disable_migrate=True): |
| 18 | """Build an updated U-Boot with a slightly modified device tree |
| 19 | |
| 20 | Args: |
| 21 | cons (ConsoleBase): U-Boot console |
| 22 | replace_pair (tuple): |
| 23 | String to find |
| 24 | String to replace it with |
| 25 | board (str): Board to build |
| 26 | tmpdir (str): Temporary directory to use |
| 27 | disable_migrate (bool): True to disable CONFIG_OF_TAG_MIGRATE in build |
| 28 | """ |
| 29 | srcdir = cons.config.source_dir |
| 30 | build_dir = cons.config.build_dir |
| 31 | |
| 32 | # Get the source for the existing dts |
| 33 | dt_dir = os.path.join(build_dir, 'arch', 'sandbox', 'dts') |
| 34 | orig_fname = os.path.join(dt_dir, 'sandbox.dtb') |
| 35 | out_dts = os.path.join(dt_dir, 'sandbox_out.dts') |
| 36 | util.run_and_log(cons, ['dtc', orig_fname, '-I', 'dtb', '-O', 'dts', |
| 37 | '-o', out_dts]) |
| 38 | |
| 39 | # Update it to use an old tag |
| 40 | with open(out_dts) as inf: |
| 41 | data = inf.read() |
| 42 | data = data.replace(*replace_pair) |
| 43 | |
| 44 | dts_fname = os.path.join(dt_dir, 'sandbox_oldtag.dts') |
| 45 | with open(dts_fname, 'w') as outf: |
| 46 | print(data, file=outf) |
| 47 | dtb_fname = os.path.join(dt_dir, 'sandbox_oldtag.dtb') |
| 48 | util.run_and_log(cons, ['dtc', dts_fname, '-o', dtb_fname]) |
| 49 | |
| 50 | migrate = ['-a', '~CONFIG_OF_TAG_MIGRATE'] if disable_migrate else [] |
| 51 | |
| 52 | # Build sandbox with this new dtb, turning off OF_TAG_MIGRATE |
| 53 | env = dict(os.environ) |
| 54 | env['EXT_DTB'] = dtb_fname |
| 55 | env['DEVICE_TREE'] = 'sandbox_new' |
| 56 | env['NO_LTO'] = '1' # Speed up build |
| 57 | out = util.run_and_log( |
| 58 | cons, ['./tools/buildman/buildman', '-m', '--board', board, |
| 59 | *migrate, '-w', '-o', tmpdir], ignore_errors=True, env=env) |
| 60 | return out |
| 61 | |
| 62 | @pytest.mark.slow |
| 63 | @pytest.mark.boardspec('sandbox') |
| 64 | def test_of_no_migrate(u_boot_console): |
| 65 | """Test sandbox with old boot phase tags like u-boot,dm-pre-proper""" |
| 66 | cons = u_boot_console |
| 67 | |
| 68 | build_for_migrate(cons, ['bootph-some-ram', 'u-boot,dm-pre-proper'], |
| 69 | 'sandbox', TMPDIR1) |
| 70 | |
| 71 | # It should fail to run, since the lcd device will not be bound before |
| 72 | # relocation. so won't get its frame-buffer memory |
| 73 | out = util.run_and_log( |
| 74 | cons, [os.path.join(TMPDIR1, 'u-boot'), '-D', '-c', 'help'], |
| 75 | ignore_errors=True) |
| 76 | assert "Video device 'lcd' cannot allocate frame buffer memory" in out |
| 77 | |
| 78 | |
| 79 | @pytest.mark.slow |
| 80 | @pytest.mark.boardspec('sandbox_spl') |
| 81 | @pytest.mark.boardspec('spl_of_platdata_inst') |
| 82 | @pytest.mark.boardspec('!sandbox_tpl') |
| 83 | def test_of_no_migrate_spl(u_boot_console): |
| 84 | """Test sandbox with old boot phase tags like u-boot,dm-spl""" |
| 85 | cons = u_boot_console |
| 86 | |
| 87 | out = build_for_migrate(cons, ['bootph-pre-ram', 'u-boot,dm-spl'], |
| 88 | 'sandbox_spl', TMPDIR2) |
| 89 | |
| 90 | # It should fail to build, since the SPL DT will not include 'spl-test' |
| 91 | # node, among others |
| 92 | assert "undefined type ‘struct dtd_sandbox_spl_test’" in out |
| 93 | |
| 94 | |
| 95 | @pytest.mark.slow |
| 96 | @pytest.mark.boardspec('sandbox') |
| 97 | def test_of_migrate(u_boot_console): |
| 98 | """Test sandbox shows a message when tags were migrated""" |
| 99 | cons = u_boot_console |
| 100 | |
| 101 | build_for_migrate(cons, ['bootph-some-ram', 'u-boot,dm-pre-proper'], |
| 102 | 'sandbox', TMPDIR3, disable_migrate=False) |
| 103 | |
| 104 | # It should show a migration message |
| 105 | out = util.run_and_log( |
| 106 | cons, [os.path.join(TMPDIR3, 'u-boot'), '-D', '-c', 'help'], |
| 107 | ignore_errors=True) |
| 108 | assert "Warning: Device tree includes old 'u-boot,dm-' tags" in out |