xref: /openbmc/u-boot/test/py/tests/test_fpga.py (revision 77c07e7e)
165a6b3c2SMichal Simek# SPDX-License-Identifier: GPL-2.0
265a6b3c2SMichal Simek#
365a6b3c2SMichal Simek# Copyright (c) 2018, Xilinx Inc.
465a6b3c2SMichal Simek#
565a6b3c2SMichal Simek# Michal Simek
665a6b3c2SMichal Simek# Siva Durga Prasad Paladugu
765a6b3c2SMichal Simek
865a6b3c2SMichal Simekimport pytest
965a6b3c2SMichal Simekimport re
1065a6b3c2SMichal Simekimport random
1165a6b3c2SMichal Simekimport u_boot_utils
1265a6b3c2SMichal Simek
1365a6b3c2SMichal Simek"""
1465a6b3c2SMichal SimekNote: This test relies on boardenv_* containing configuration values to define
1565a6b3c2SMichal Simekthe network available and files to be used for testing. Without this, this test
1665a6b3c2SMichal Simekwill be automatically skipped.
1765a6b3c2SMichal Simek
1865a6b3c2SMichal SimekFor example:
1965a6b3c2SMichal Simek
2065a6b3c2SMichal Simek# True if a DHCP server is attached to the network, and should be tested.
2165a6b3c2SMichal Simekenv__net_dhcp_server = True
2265a6b3c2SMichal Simek
2365a6b3c2SMichal Simek# A list of environment variables that should be set in order to configure a
2465a6b3c2SMichal Simek# static IP. In this test case we atleast need serverip for performing tftpb
2565a6b3c2SMichal Simek# to get required files.
2665a6b3c2SMichal Simekenv__net_static_env_vars = [
27*871bf7d9SSimon Glass    ('ipaddr', '10.0.0.100'),
28*871bf7d9SSimon Glass    ('netmask', '255.255.255.0'),
29*871bf7d9SSimon Glass    ('serverip', '10.0.0.1'),
3065a6b3c2SMichal Simek]
3165a6b3c2SMichal Simek
3265a6b3c2SMichal Simek# Details regarding the files that may be read from a TFTP server. .
3365a6b3c2SMichal Simekenv__fpga_secure_readable_file = {
34*871bf7d9SSimon Glass    'fn': 'auth_bhdr_ppk1_bit.bin',
35*871bf7d9SSimon Glass    'enckupfn': 'auth_bhdr_enc_kup_load_bit.bin',
36*871bf7d9SSimon Glass    'addr': 0x1000000,
37*871bf7d9SSimon Glass    'keyaddr': 0x100000,
38*871bf7d9SSimon Glass    'keyfn': 'key.txt',
3965a6b3c2SMichal Simek}
4065a6b3c2SMichal Simek
4165a6b3c2SMichal Simekenv__fpga_under_test = {
42*871bf7d9SSimon Glass    'dev': 0,
43*871bf7d9SSimon Glass    'addr' : 0x1000000,
44*871bf7d9SSimon Glass    'bitstream_load': 'compress.bin',
45*871bf7d9SSimon Glass    'bitstream_load_size': 1831960,
46*871bf7d9SSimon Glass    'bitstream_loadp': 'compress_pr.bin',
47*871bf7d9SSimon Glass    'bitstream_loadp_size': 423352,
48*871bf7d9SSimon Glass    'bitstream_loadb': 'compress.bit',
49*871bf7d9SSimon Glass    'bitstream_loadb_size': 1832086,
50*871bf7d9SSimon Glass    'bitstream_loadbp': 'compress_pr.bit',
51*871bf7d9SSimon Glass    'bitstream_loadbp_size': 423491,
52*871bf7d9SSimon Glass    'mkimage_legacy': 'download.ub',
53*871bf7d9SSimon Glass    'mkimage_legacy_size': 13321468,
54*871bf7d9SSimon Glass    'mkimage_legacy_gz': 'download.gz.ub',
55*871bf7d9SSimon Glass    'mkimage_legacy_gz_size': 53632,
56*871bf7d9SSimon Glass    'mkimage_fit': 'download-fit.ub',
57*871bf7d9SSimon Glass    'mkimage_fit_size': 13322784,
58*871bf7d9SSimon Glass    'loadfs': 'mmc 0 compress.bin',
59*871bf7d9SSimon Glass    'loadfs_size': 1831960,
60*871bf7d9SSimon Glass    'loadfs_block_size': 0x10000,
6165a6b3c2SMichal Simek}
6265a6b3c2SMichal Simek"""
6365a6b3c2SMichal Simek
6465a6b3c2SMichal Simekimport test_net
6565a6b3c2SMichal Simek
6665a6b3c2SMichal Simekdef check_dev(u_boot_console):
6765a6b3c2SMichal Simek    f = u_boot_console.config.env.get('env__fpga_under_test', None)
6865a6b3c2SMichal Simek    if not f:
6965a6b3c2SMichal Simek        pytest.skip('No FPGA to test')
7065a6b3c2SMichal Simek
7165a6b3c2SMichal Simek    dev = f.get('dev', -1)
7265a6b3c2SMichal Simek    if dev < 0:
7365a6b3c2SMichal Simek        pytest.fail('No dev specified via env__fpga_under_test')
7465a6b3c2SMichal Simek
7565a6b3c2SMichal Simek    return dev, f
7665a6b3c2SMichal Simek
7765a6b3c2SMichal Simekdef load_file_from_var(u_boot_console, name):
7865a6b3c2SMichal Simek    dev, f = check_dev(u_boot_console)
7965a6b3c2SMichal Simek
8065a6b3c2SMichal Simek    addr = f.get('addr', -1)
8165a6b3c2SMichal Simek    if addr < 0:
8265a6b3c2SMichal Simek        pytest.fail('No address specified via env__fpga_under_test')
8365a6b3c2SMichal Simek
8465a6b3c2SMichal Simek    test_net.test_net_dhcp(u_boot_console)
8565a6b3c2SMichal Simek    test_net.test_net_setup_static(u_boot_console)
8665a6b3c2SMichal Simek    bit = f['%s' % (name)]
8765a6b3c2SMichal Simek    bit_size = f['%s_size' % (name)]
8865a6b3c2SMichal Simek
8965a6b3c2SMichal Simek    expected_tftp = 'Bytes transferred = %d' % bit_size
9065a6b3c2SMichal Simek    output = u_boot_console.run_command('tftpboot %x %s' % (addr, bit))
9165a6b3c2SMichal Simek    assert expected_tftp in output
9265a6b3c2SMichal Simek
9365a6b3c2SMichal Simek    return f, dev, addr, bit, bit_size
9465a6b3c2SMichal Simek
9565a6b3c2SMichal Simek###### FPGA FAIL test ######
9665a6b3c2SMichal Simekexpected_usage = 'fpga - loadable FPGA image support'
9765a6b3c2SMichal Simek
9865a6b3c2SMichal Simek@pytest.mark.xfail
9965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
10065a6b3c2SMichal Simekdef test_fpga_fail(u_boot_console):
10165a6b3c2SMichal Simek    # Test non valid fpga subcommand
10265a6b3c2SMichal Simek    expected = 'fpga: non existing command'
10365a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga broken 0')
10465a6b3c2SMichal Simek    #assert expected in output
10565a6b3c2SMichal Simek    assert expected_usage in output
10665a6b3c2SMichal Simek
10765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
10865a6b3c2SMichal Simekdef test_fpga_help(u_boot_console):
10965a6b3c2SMichal Simek    # Just show help
11065a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga')
11165a6b3c2SMichal Simek    assert expected_usage in output
11265a6b3c2SMichal Simek
11365a6b3c2SMichal Simek
11465a6b3c2SMichal Simek###### FPGA DUMP tests ######
11565a6b3c2SMichal Simek
11665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
11765a6b3c2SMichal Simekdef test_fpga_dump(u_boot_console):
11865a6b3c2SMichal Simek    pytest.skip('Not implemented now')
11965a6b3c2SMichal Simek
12065a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
12165a6b3c2SMichal Simekdef test_fpga_dump_variable(u_boot_console):
12265a6b3c2SMichal Simek    # Same as above but via "fpga" variable
12365a6b3c2SMichal Simek    pytest.skip('Not implemented now')
12465a6b3c2SMichal Simek
12565a6b3c2SMichal Simek###### FPGA INFO tests ######
12665a6b3c2SMichal Simek
12765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
12865a6b3c2SMichal Simekdef test_fpga_info_fail(u_boot_console):
12965a6b3c2SMichal Simek    # Maybe this can be skipped completely
13065a6b3c2SMichal Simek    dev, f = check_dev(u_boot_console)
13165a6b3c2SMichal Simek
13265a6b3c2SMichal Simek    # Multiple parameters to fpga info should fail
13365a6b3c2SMichal Simek    expected = 'fpga: more parameters passed'
13465a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga info 0 0')
13565a6b3c2SMichal Simek    #assert expected in output
13665a6b3c2SMichal Simek    assert expected_usage in output
13765a6b3c2SMichal Simek
13865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
13965a6b3c2SMichal Simekdef test_fpga_info_list(u_boot_console):
14065a6b3c2SMichal Simek    # Maybe this can be skipped completely
14165a6b3c2SMichal Simek    dev, f = check_dev(u_boot_console)
14265a6b3c2SMichal Simek
14365a6b3c2SMichal Simek    # Code is design in a way that if fpga dev is not passed it should
14465a6b3c2SMichal Simek    # return list of all fpga devices in the system
14565a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga')
14665a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga info')
14765a6b3c2SMichal Simek    assert expected_usage not in output
14865a6b3c2SMichal Simek
14965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
15065a6b3c2SMichal Simekdef test_fpga_info(u_boot_console):
15165a6b3c2SMichal Simek    dev, f = check_dev(u_boot_console)
15265a6b3c2SMichal Simek
15365a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga info %x' % (dev))
15465a6b3c2SMichal Simek    assert expected_usage not in output
15565a6b3c2SMichal Simek
15665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
15765a6b3c2SMichal Simekdef test_fpga_info_variable(u_boot_console):
15865a6b3c2SMichal Simek    dev, f = check_dev(u_boot_console)
15965a6b3c2SMichal Simek
16065a6b3c2SMichal Simek    #
16165a6b3c2SMichal Simek    # fpga variable is storing device number which doesn't need to be passed
16265a6b3c2SMichal Simek    #
16365a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga %x' % (dev))
16465a6b3c2SMichal Simek
16565a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga info')
16665a6b3c2SMichal Simek    # Variable cleanup
16765a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga')
16865a6b3c2SMichal Simek    assert expected_usage not in output
16965a6b3c2SMichal Simek
17065a6b3c2SMichal Simek###### FPGA LOAD tests ######
17165a6b3c2SMichal Simek
17265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
17365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
17465a6b3c2SMichal Simekdef test_fpga_load_fail(u_boot_console):
17565a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'bitstream_load')
17665a6b3c2SMichal Simek
17765a6b3c2SMichal Simek    for cmd in ['dump', 'load', 'loadb']:
17865a6b3c2SMichal Simek	# missing dev parameter
17965a6b3c2SMichal Simek	expected = 'fpga: incorrect parameters passed'
18065a6b3c2SMichal Simek	output = u_boot_console.run_command('fpga %s %x $filesize' % (cmd, addr))
18165a6b3c2SMichal Simek	#assert expected in output
18265a6b3c2SMichal Simek	assert expected_usage in output
18365a6b3c2SMichal Simek
18465a6b3c2SMichal Simek	# more parameters - 0 at the end
18565a6b3c2SMichal Simek	expected = 'fpga: more parameters passed'
18665a6b3c2SMichal Simek	output = u_boot_console.run_command('fpga %s %x %x $filesize 0' % (cmd, dev, addr))
18765a6b3c2SMichal Simek	#assert expected in output
18865a6b3c2SMichal Simek	assert expected_usage in output
18965a6b3c2SMichal Simek
19065a6b3c2SMichal Simek	# 0 address
19165a6b3c2SMichal Simek	expected = 'fpga: zero fpga_data address'
19265a6b3c2SMichal Simek	output = u_boot_console.run_command('fpga %s %x 0 $filesize' % (cmd, dev))
19365a6b3c2SMichal Simek	#assert expected in output
19465a6b3c2SMichal Simek	assert expected_usage in output
19565a6b3c2SMichal Simek
19665a6b3c2SMichal Simek	# 0 filesize
19765a6b3c2SMichal Simek	expected = 'fpga: zero size'
19865a6b3c2SMichal Simek	output = u_boot_console.run_command('fpga %s %x %x 0' % (cmd, dev, addr))
19965a6b3c2SMichal Simek	#assert expected in output
20065a6b3c2SMichal Simek	assert expected_usage in output
20165a6b3c2SMichal Simek
20265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
20365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
20465a6b3c2SMichal Simekdef test_fpga_load(u_boot_console):
20565a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'bitstream_load')
20665a6b3c2SMichal Simek
20765a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
20865a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga load %x %x $filesize && echo %s' % (dev, addr, expected_text))
20965a6b3c2SMichal Simek    assert expected_text in output
21065a6b3c2SMichal Simek
21165a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
21265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadp')
21365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
21465a6b3c2SMichal Simekdef test_fpga_loadp(u_boot_console):
21565a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'bitstream_load')
21665a6b3c2SMichal Simek
21765a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
21865a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga load %x %x $filesize && echo %s' % (dev, addr, expected_text))
21965a6b3c2SMichal Simek    assert expected_text in output
22065a6b3c2SMichal Simek
22165a6b3c2SMichal Simek    # And load also partial bistream
22265a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'bitstream_loadp')
22365a6b3c2SMichal Simek
22465a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
22565a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadp %x %x $filesize && echo %s' % (dev, addr, expected_text))
22665a6b3c2SMichal Simek    assert expected_text in output
22765a6b3c2SMichal Simek
22865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
22965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
23065a6b3c2SMichal Simekdef test_fpga_loadb(u_boot_console):
23165a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'bitstream_loadb')
23265a6b3c2SMichal Simek
23365a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
23465a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadb %x %x $filesize && echo %s' % (dev, addr, expected_text))
23565a6b3c2SMichal Simek    assert expected_text in output
23665a6b3c2SMichal Simek
23765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
23865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadbp')
23965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
24065a6b3c2SMichal Simekdef test_fpga_loadbp(u_boot_console):
24165a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'bitstream_loadb')
24265a6b3c2SMichal Simek
24365a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
24465a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadb %x %x $filesize && echo %s' % (dev, addr, expected_text))
24565a6b3c2SMichal Simek    assert expected_text in output
24665a6b3c2SMichal Simek
24765a6b3c2SMichal Simek    # And load also partial bistream in bit format
24865a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'bitstream_loadbp')
24965a6b3c2SMichal Simek
25065a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
25165a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadbp %x %x $filesize && echo %s' % (dev, addr, expected_text))
25265a6b3c2SMichal Simek    assert expected_text in output
25365a6b3c2SMichal Simek
25465a6b3c2SMichal Simek###### FPGA LOADMK tests ######
25565a6b3c2SMichal Simek
25665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
25765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
25865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
25965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('image_format_legacy')
26065a6b3c2SMichal Simekdef test_fpga_loadmk_fail(u_boot_console):
26165a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_legacy')
26265a6b3c2SMichal Simek
26365a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
26465a6b3c2SMichal Simek
26565a6b3c2SMichal Simek    # load image but pass incorrect address to show error message
26665a6b3c2SMichal Simek    expected = 'Unknown image type'
26765a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x %x' % (dev, addr + 0x10))
26865a6b3c2SMichal Simek    assert expected in output
26965a6b3c2SMichal Simek
27065a6b3c2SMichal Simek    # Pass more parameters then command expects - 0 at the end
27165a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x %x 0' % (dev, addr))
27265a6b3c2SMichal Simek    #assert expected in output
27365a6b3c2SMichal Simek    assert expected_usage in output
27465a6b3c2SMichal Simek
27565a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
27665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
27765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
27865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('image_format_legacy')
27965a6b3c2SMichal Simekdef test_fpga_loadmk_legacy(u_boot_console):
28065a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_legacy')
28165a6b3c2SMichal Simek
28265a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
28365a6b3c2SMichal Simek
28465a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
28565a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x %x && echo %s' % (dev, addr, expected_text))
28665a6b3c2SMichal Simek    assert expected_text in output
28765a6b3c2SMichal Simek
28865a6b3c2SMichal Simek@pytest.mark.xfail
28965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
29065a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
29165a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
29265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('image_format_legacy')
29365a6b3c2SMichal Simekdef test_fpga_loadmk_legacy_variable_fpga(u_boot_console):
29465a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_legacy')
29565a6b3c2SMichal Simek
29665a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
29765a6b3c2SMichal Simek
29865a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga %x' % (dev))
29965a6b3c2SMichal Simek
30065a6b3c2SMichal Simek    # this testcase should cover case which looks like it is supported but dev pointer is broken by loading mkimage address
30165a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
30265a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x && echo %s' % (addr, expected_text))
30365a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga')
30465a6b3c2SMichal Simek    assert expected_text in output
30565a6b3c2SMichal Simek
30665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
30765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
30865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
30965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('image_format_legacy')
31065a6b3c2SMichal Simekdef test_fpga_loadmk_legacy_variable_fpgadata(u_boot_console):
31165a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_legacy')
31265a6b3c2SMichal Simek
31365a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
31465a6b3c2SMichal Simek
31565a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata %x' % (addr))
31665a6b3c2SMichal Simek
31765a6b3c2SMichal Simek    # this testcase should cover case which looks like it is supported but dev pointer is broken by loading mkimage address
31865a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
31965a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x && echo %s' % (dev, expected_text))
32065a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata')
32165a6b3c2SMichal Simek    assert expected_text in output
32265a6b3c2SMichal Simek
32365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
32465a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
32565a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
32665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('image_format_legacy')
32765a6b3c2SMichal Simekdef test_fpga_loadmk_legacy_variable(u_boot_console):
32865a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_legacy')
32965a6b3c2SMichal Simek
33065a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
33165a6b3c2SMichal Simek
33265a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga %x' % (dev))
33365a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata %x' % (addr))
33465a6b3c2SMichal Simek
33565a6b3c2SMichal Simek    # this testcase should cover case which looks like it is supported but dev pointer is broken by loading mkimage address
33665a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
33765a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk && echo %s' % (expected_text))
33865a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga')
33965a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata')
34065a6b3c2SMichal Simek    assert expected_text in output
34165a6b3c2SMichal Simek
34265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
34365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
34465a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
34565a6b3c2SMichal Simek@pytest.mark.buildconfigspec('image_format_legacy')
34665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('gzip')
34765a6b3c2SMichal Simekdef test_fpga_loadmk_legacy_gz(u_boot_console):
34865a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_legacy_gz')
34965a6b3c2SMichal Simek
35065a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
35165a6b3c2SMichal Simek
35265a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
35365a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x %x && echo %s' % (dev, addr, expected_text))
35465a6b3c2SMichal Simek    assert expected_text in output
35565a6b3c2SMichal Simek
35665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
35765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
35865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('fit')
35965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
36065a6b3c2SMichal Simekdef test_fpga_loadmk_fit(u_boot_console):
36165a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_fit')
36265a6b3c2SMichal Simek
36365a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
36465a6b3c2SMichal Simek
36565a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
36665a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x %x:fpga && echo %s' % (dev, addr, expected_text))
36765a6b3c2SMichal Simek    assert expected_text in output
36865a6b3c2SMichal Simek
36965a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
37065a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
37165a6b3c2SMichal Simek@pytest.mark.buildconfigspec('fit')
37265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
37365a6b3c2SMichal Simekdef test_fpga_loadmk_fit_variable_fpga(u_boot_console):
37465a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_fit')
37565a6b3c2SMichal Simek
37665a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
37765a6b3c2SMichal Simek    # FIXME this should fail - broken support in past
37865a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga %x' % (dev))
37965a6b3c2SMichal Simek
38065a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
38165a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x:fpga && echo %s' % (addr, expected_text))
38265a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga')
38365a6b3c2SMichal Simek    assert expected_text in output
38465a6b3c2SMichal Simek
38565a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
38665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
38765a6b3c2SMichal Simek@pytest.mark.buildconfigspec('fit')
38865a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
38965a6b3c2SMichal Simekdef test_fpga_loadmk_fit_variable_fpgadata(u_boot_console):
39065a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_fit')
39165a6b3c2SMichal Simek
39265a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
39365a6b3c2SMichal Simek    # FIXME this should fail - broken support in past
39465a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata %x:fpga' % (addr))
39565a6b3c2SMichal Simek
39665a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
39765a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk %x && echo %s' % (dev, expected_text))
39865a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata')
39965a6b3c2SMichal Simek    assert expected_text in output
40065a6b3c2SMichal Simek
40165a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
40265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_loadmk')
40365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('fit')
40465a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
40565a6b3c2SMichal Simekdef test_fpga_loadmk_fit_variable(u_boot_console):
40665a6b3c2SMichal Simek    f, dev, addr, bit, bit_size = load_file_from_var(u_boot_console, 'mkimage_fit')
40765a6b3c2SMichal Simek
40865a6b3c2SMichal Simek    u_boot_console.run_command('imi %x' % (addr))
40965a6b3c2SMichal Simek
41065a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga %x' % (dev))
41165a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata %x:fpga' % (addr))
41265a6b3c2SMichal Simek
41365a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
41465a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadmk && echo %s' % (expected_text))
41565a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpga')
41665a6b3c2SMichal Simek    u_boot_console.run_command('setenv fpgadata')
41765a6b3c2SMichal Simek    assert expected_text in output
41865a6b3c2SMichal Simek
41965a6b3c2SMichal Simek###### FPGA LOAD tests ######
42065a6b3c2SMichal Simek
42165a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
42265a6b3c2SMichal Simekdef test_fpga_loadfs_fail(u_boot_console):
42365a6b3c2SMichal Simek    dev, f = check_dev(u_boot_console)
42465a6b3c2SMichal Simek
42565a6b3c2SMichal Simek    addr = f.get('addr', -1)
42665a6b3c2SMichal Simek    if addr < 0:
42765a6b3c2SMichal Simek        pytest.fail('No address specified via env__fpga_under_test')
42865a6b3c2SMichal Simek
42965a6b3c2SMichal Simek    bit = f['loadfs']
43065a6b3c2SMichal Simek    bit_size = f['loadfs_size']
43165a6b3c2SMichal Simek    block_size = f['loadfs_block_size']
43265a6b3c2SMichal Simek
43365a6b3c2SMichal Simek    # less params - dev number removed
43465a6b3c2SMichal Simek    expected = 'fpga: incorrect parameters passed'
43565a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %x %x %x %s' % (addr, bit_size, block_size, bit))
43665a6b3c2SMichal Simek    #assert expected in output
43765a6b3c2SMichal Simek    assert expected_usage in output
43865a6b3c2SMichal Simek
43965a6b3c2SMichal Simek    # one more param - 0 at the end
44065a6b3c2SMichal Simek    # This is the longest command that's why there is no message from cmd/fpga.c
44165a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %x %x %x %x %s 0' % (dev, addr, bit_size, block_size, bit))
44265a6b3c2SMichal Simek    assert expected_usage in output
44365a6b3c2SMichal Simek
44465a6b3c2SMichal Simek    # zero address 0
44565a6b3c2SMichal Simek    expected = 'fpga: zero fpga_data address'
44665a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %x %x %x %x %s' % (dev, 0, bit_size, block_size, bit))
44765a6b3c2SMichal Simek    #assert expected in output
44865a6b3c2SMichal Simek    assert expected_usage in output
44965a6b3c2SMichal Simek
45065a6b3c2SMichal Simek    # bit_size 0
45165a6b3c2SMichal Simek    expected = 'fpga: zero size'
45265a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %x %x %x %x %s' % (dev, addr, 0, block_size, bit))
45365a6b3c2SMichal Simek    #assert expected in output
45465a6b3c2SMichal Simek    assert expected_usage in output
45565a6b3c2SMichal Simek
45665a6b3c2SMichal Simek    # block size 0
45765a6b3c2SMichal Simek    # FIXME this should pass but it failing too
45865a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %x %x %x %x %s' % (dev, addr, bit_size, 0, bit))
45965a6b3c2SMichal Simek    assert expected_usage in output
46065a6b3c2SMichal Simek
46165a6b3c2SMichal Simek    # non existing bitstream name
46265a6b3c2SMichal Simek    expected = 'Unable to read file noname'
46365a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %x %x %x %x mmc 0 noname' % (dev, addr, bit_size, block_size))
46465a6b3c2SMichal Simek    assert expected in output
46565a6b3c2SMichal Simek    assert expected_usage in output
46665a6b3c2SMichal Simek
46765a6b3c2SMichal Simek    # -1 dev number
46865a6b3c2SMichal Simek    expected = 'fpga_fsload: Invalid device number -1'
46965a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %d %x %x %x mmc 0 noname' % (-1, addr, bit_size, block_size))
47065a6b3c2SMichal Simek    assert expected in output
47165a6b3c2SMichal Simek    assert expected_usage in output
47265a6b3c2SMichal Simek
47365a6b3c2SMichal Simek
47465a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
47565a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_echo')
47665a6b3c2SMichal Simekdef test_fpga_loadfs(u_boot_console):
47765a6b3c2SMichal Simek    dev, f = check_dev(u_boot_console)
47865a6b3c2SMichal Simek
47965a6b3c2SMichal Simek    addr = f.get('addr', -1)
48065a6b3c2SMichal Simek    if addr < 0:
48165a6b3c2SMichal Simek        pytest.fail('No address specified via env__fpga_under_test')
48265a6b3c2SMichal Simek
48365a6b3c2SMichal Simek    bit = f['loadfs']
48465a6b3c2SMichal Simek    bit_size = f['loadfs_size']
48565a6b3c2SMichal Simek    block_size = f['loadfs_block_size']
48665a6b3c2SMichal Simek
48765a6b3c2SMichal Simek    # This should be done better
48865a6b3c2SMichal Simek    expected_text = 'FPGA loaded successfully'
48965a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loadfs %x %x %x %x %s && echo %s' % (dev, addr, bit_size, block_size, bit, expected_text))
49065a6b3c2SMichal Simek    assert expected_text in output
49165a6b3c2SMichal Simek
49265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
49365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_load_secure')
49465a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_net')
49565a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_dhcp')
49665a6b3c2SMichal Simek@pytest.mark.buildconfigspec('net')
49765a6b3c2SMichal Simekdef test_fpga_secure_bit_auth(u_boot_console):
49865a6b3c2SMichal Simek
49965a6b3c2SMichal Simek    test_net.test_net_dhcp(u_boot_console)
50065a6b3c2SMichal Simek    test_net.test_net_setup_static(u_boot_console)
50165a6b3c2SMichal Simek
50265a6b3c2SMichal Simek    f = u_boot_console.config.env.get('env__fpga_secure_readable_file', None)
50365a6b3c2SMichal Simek    if not f:
50465a6b3c2SMichal Simek        pytest.skip('No TFTP readable file to read')
50565a6b3c2SMichal Simek
50665a6b3c2SMichal Simek    addr = f.get('addr', None)
50765a6b3c2SMichal Simek    if not addr:
50865a6b3c2SMichal Simek      addr = u_boot_utils.find_ram_base(u_boot_console)
50965a6b3c2SMichal Simek
51065a6b3c2SMichal Simek    expected_tftp = 'Bytes transferred = '
51165a6b3c2SMichal Simek    fn = f['fn']
51265a6b3c2SMichal Simek    output = u_boot_console.run_command('tftpboot %x %s' % (addr, fn))
51365a6b3c2SMichal Simek    assert expected_tftp in output
51465a6b3c2SMichal Simek
51565a6b3c2SMichal Simek    expected_zynqmpsecure = 'Bitstream successfully loaded'
51665a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loads 0 %x $filesize 0 2' % (addr))
51765a6b3c2SMichal Simek    assert expected_zynqmpsecure in output
51865a6b3c2SMichal Simek
51965a6b3c2SMichal Simek
52065a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga')
52165a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_fpga_load_secure')
52265a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_net')
52365a6b3c2SMichal Simek@pytest.mark.buildconfigspec('cmd_dhcp')
52465a6b3c2SMichal Simek@pytest.mark.buildconfigspec('net')
52565a6b3c2SMichal Simekdef test_fpga_secure_bit_img_auth_kup(u_boot_console):
52665a6b3c2SMichal Simek
52765a6b3c2SMichal Simek    test_net.test_net_dhcp(u_boot_console)
52865a6b3c2SMichal Simek    test_net.test_net_setup_static(u_boot_console)
52965a6b3c2SMichal Simek
53065a6b3c2SMichal Simek    f = u_boot_console.config.env.get('env__fpga_secure_readable_file', None)
53165a6b3c2SMichal Simek    if not f:
53265a6b3c2SMichal Simek        pytest.skip('No TFTP readable file to read')
53365a6b3c2SMichal Simek
53465a6b3c2SMichal Simek    keyaddr = f.get('keyaddr', None)
53565a6b3c2SMichal Simek    if not keyaddr:
53665a6b3c2SMichal Simek      addr = u_boot_utils.find_ram_base(u_boot_console)
53765a6b3c2SMichal Simek    expected_tftp = 'Bytes transferred = '
53865a6b3c2SMichal Simek    keyfn = f['keyfn']
53965a6b3c2SMichal Simek    output = u_boot_console.run_command('tftpboot %x %s' % (keyaddr, keyfn))
54065a6b3c2SMichal Simek    assert expected_tftp in output
54165a6b3c2SMichal Simek
54265a6b3c2SMichal Simek    addr = f.get('addr', None)
54365a6b3c2SMichal Simek    if not addr:
54465a6b3c2SMichal Simek      addr = u_boot_utils.find_ram_base(u_boot_console)
54565a6b3c2SMichal Simek    expected_tftp = 'Bytes transferred = '
54665a6b3c2SMichal Simek    fn = f['enckupfn']
54765a6b3c2SMichal Simek    output = u_boot_console.run_command('tftpboot %x %s' % (addr, fn))
54865a6b3c2SMichal Simek    assert expected_tftp in output
54965a6b3c2SMichal Simek
55065a6b3c2SMichal Simek    expected_zynqmpsecure = 'Bitstream successfully loaded'
55165a6b3c2SMichal Simek    output = u_boot_console.run_command('fpga loads 0 %x $filesize 0 1 %x' % (addr, keyaddr))
55265a6b3c2SMichal Simek    assert expected_zynqmpsecure in output
553