All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] RFC: test: Bring in the test hooks
@ 2025-05-02  2:50 Simon Glass
  2025-05-02  2:50 ` [PATCH 1/3] " Simon Glass
                   ` (4 more replies)
  0 siblings, 5 replies; 25+ messages in thread
From: Simon Glass @ 2025-05-02  2:50 UTC (permalink / raw)
  To: U-Boot Mailing List; +Cc: Tom Rini, Heinrich Schuchardt, Simon Glass

During a recent discussion with Heinrich we discussed why the hooks are
kept in a separate repo.

The amount of code is small, a tenth of the size of the recently added
lwip, just by way of example. Testing is a critical part of U-Boot and
one of the things that distinguishes it from firmware projects that have
not kept up in this area. By having the tests somewhere else, we are
signalling that it is unusual, or difficult, or optional.

The hooks mechanism also needs something of an update to take account of
real boards in 2025. That will be much easier to undertake if the code
that test/py talks to is in the same repo.

This series brings the hook files in as first-class citizens of U-Boot.

If we do go ahead with this, I will send a different series which has
separate commits (with correct author) in the u-boot-test-hooks repo.


Simon Glass (3):
  test: Bring in the test hooks
  doc: Tidy up the hooks documentation
  CI: Update to use the hooks in the U-Boot repo

 .azure-pipelines.yml                          |  15 +-
 .gitlab-ci.yml                                |  16 +-
 doc/develop/index.rst                         |   1 +
 doc/develop/py_testing.rst                    |  22 +-
 doc/develop/test_hooks.rst                    | 306 ++++++++++++++++++
 test/hooks/bin/OLI01/conf.mx6qsabrelite_na    |  26 ++
 .../conf.integratorcp_cm926ejs_qemu           |  27 ++
 test/hooks/bin/bill-the-cat/conf.qemu_mips_na |  28 ++
 .../bill-the-cat/conf.vexpress_ca15_tc2_qemu  |  27 ++
 .../bin/common-config.cros-servo-dut-control  |  69 ++++
 test/hooks/bin/common.labgrid-trini           |  35 ++
 test/hooks/bin/console.fvp                    |  28 ++
 test/hooks/bin/console.labgrid-sjg            |  42 +++
 test/hooks/bin/console.labgrid-trini          |  24 ++
 test/hooks/bin/console.picocom                |  42 +++
 test/hooks/bin/console.qemu                   |  35 ++
 test/hooks/bin/download.imx_usb               |  23 ++
 test/hooks/bin/download.l4t-exec-uboot        |  25 ++
 test/hooks/bin/download.tegra-uboot-flasher   |  24 ++
 test/hooks/bin/ellesmere/common-labgrid-sjg   |  46 +++
 test/hooks/bin/ellesmere/conf.all             |  24 ++
 .../hooks/bin/ellesmere/conf.evb-ast2500_qemu |  11 +
 test/hooks/bin/ellesmere/conf.qemu-riscv32_na |   1 +
 .../bin/ellesmere/conf.qemu-riscv32_spl_na    |   1 +
 test/hooks/bin/ellesmere/conf.qemu-riscv64_na |   1 +
 test/hooks/bin/ellesmere/conf.qemu-x86_64_na  |   1 +
 test/hooks/bin/ellesmere/conf.qemu-x86_na     |   1 +
 test/hooks/bin/ellesmere/conf.qemu_arm64_na   |   1 +
 .../bin/ellesmere/conf.qemu_arm64_spl_na      |   1 +
 test/hooks/bin/ellesmere/conf.qemu_arm_na     |   1 +
 test/hooks/bin/ellesmere/conf.qemu_arm_spl_na |   1 +
 test/hooks/bin/flash.em100                    |  30 ++
 test/hooks/bin/flash.fiptool                  |  22 ++
 test/hooks/bin/flash.flashair                 |  45 +++
 test/hooks/bin/flash.labgrid-trini.sd-mux     |  31 ++
 test/hooks/bin/flash.none                     |  21 ++
 test/hooks/bin/flash.qemu_gen_padded_image    |  15 +
 test/hooks/bin/flash.recovery_l4t             |  44 +++
 test/hooks/bin/flash.sdwire_common_mount      |  80 +++++
 .../bin/flash.sdwire_digital-loggers_raw      |  41 +++
 test/hooks/bin/flash.sdwire_poweroff_mount    |  32 ++
 test/hooks/bin/flash.sdwire_poweroff_raw      |  42 +++
 test/hooks/bin/flash.sdwire_relay_mount       |  34 ++
 test/hooks/bin/flashair.rpi                   |  47 +++
 test/hooks/bin/flashair.ti-omap               |  26 ++
 test/hooks/bin/getrole.labgrid-sjg            |  34 ++
 .../kea/conf.Linksprite_pcDuino3_sjg-pcduino3 |  33 ++
 .../bin/kea/conf.chromebook_link_sjg-link     |  30 ++
 .../bin/kea/conf.chromebook_samus_sjg-samus   |  30 ++
 test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1    |  38 +++
 .../bin/kea/conf.minnowmax_sjg-minnowmax      |  33 ++
 .../hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc |  35 ++
 test/hooks/bin/kea/conf.rock2_sjg-rock2       |  33 ++
 test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b  |  34 ++
 test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b      |  34 ++
 .../bin/kea/conf.zynq_zybo_sjg-zynq_zybo      |  44 +++
 .../conf.am62x_beagleplay_a53_na              |  30 ++
 .../konsulko-labgrid/conf.am64x_evm_a53_na    |  30 ++
 .../bin/konsulko-labgrid/conf.rpi_4_32b_na    |   1 +
 test/hooks/bin/konsulko-labgrid/conf.rpi_4_na |   1 +
 .../bin/konsulko-labgrid/conf.rpi_arm64_na    |  25 ++
 test/hooks/bin/poweroff.digital-loggers       |  22 ++
 test/hooks/bin/poweroff.manual                |  21 ++
 test/hooks/bin/poweroff.none                  |  22 ++
 test/hooks/bin/poweroff.phidgets              |  37 +++
 test/hooks/bin/poweroff.pm342                 |  21 ++
 test/hooks/bin/poweroff.ykush                 |  23 ++
 test/hooks/bin/poweron.digital-loggers        |  22 ++
 test/hooks/bin/poweron.manual                 |  21 ++
 test/hooks/bin/poweron.none                   |  22 ++
 test/hooks/bin/poweron.phidgets               |  32 ++
 test/hooks/bin/poweron.pm342                  |  24 ++
 test/hooks/bin/poweron.ykush                  |  23 ++
 test/hooks/bin/push-flashair.py               | 118 +++++++
 test/hooks/bin/qemu.swtpm                     |  23 ++
 test/hooks/bin/recovery.manual                |  23 ++
 test/hooks/bin/recovery.phidgets              |  29 ++
 test/hooks/bin/recovery.pm342                 |  26 ++
 test/hooks/bin/recovery.relay                 |  39 +++
 test/hooks/bin/recovery.usbrelay              |  32 ++
 test/hooks/bin/release.labgrid-sjg            |  22 ++
 test/hooks/bin/release.none                   |  22 ++
 test/hooks/bin/reset.cros_servo               |  23 ++
 test/hooks/bin/reset.digital-loggers          |  25 ++
 test/hooks/bin/reset.labgrid-trini            |  24 ++
 test/hooks/bin/reset.none                     |  30 ++
 test/hooks/bin/reset.pm342                    |  21 ++
 test/hooks/bin/reset.recovery_download        |  36 +++
 test/hooks/bin/reset.usbrelay                 |  26 ++
 test/hooks/bin/reset.ykush                    |  25 ++
 test/hooks/bin/swarren-lx1/conf.jetson-tk1_na |  36 +++
 test/hooks/bin/swarren-lx1/conf.p2371-2180_na |  57 ++++
 .../bin/swarren-lx1/conf.p2771-0000-500_na    |  32 ++
 test/hooks/bin/travis-ci/conf.M5208EVBE_qemu  |  27 ++
 test/hooks/bin/travis-ci/conf.coreboot_qemu   |  28 ++
 .../hooks/bin/travis-ci/conf.evb-ast2500_qemu |  11 +
 .../hooks/bin/travis-ci/conf.evb-ast2600_qemu |  13 +
 .../travis-ci/conf.integratorcp_cm926ejs_qemu |  27 ++
 test/hooks/bin/travis-ci/conf.malta64_qemu    |  30 ++
 test/hooks/bin/travis-ci/conf.malta64el_qemu  |  31 ++
 test/hooks/bin/travis-ci/conf.malta_qemu      |  30 ++
 test/hooks/bin/travis-ci/conf.maltael_qemu    |  31 ++
 test/hooks/bin/travis-ci/conf.qemu-ae3xx_na   |  27 ++
 .../hooks/bin/travis-ci/conf.qemu-arm-sbsa_na |  27 ++
 test/hooks/bin/travis-ci/conf.qemu-ax25_na    |  27 ++
 .../bin/travis-ci/conf.qemu-loongarch64_na    |  12 +
 test/hooks/bin/travis-ci/conf.qemu-ppce500_na |  27 ++
 test/hooks/bin/travis-ci/conf.qemu-riscv32_na |  11 +
 .../bin/travis-ci/conf.qemu-riscv32_spl_na    |  11 +
 test/hooks/bin/travis-ci/conf.qemu-riscv64_na |  11 +
 .../bin/travis-ci/conf.qemu-riscv64_spl_na    |  11 +
 test/hooks/bin/travis-ci/conf.qemu-x86_64_na  |  27 ++
 test/hooks/bin/travis-ci/conf.qemu-x86_na     |  27 ++
 .../bin/travis-ci/conf.qemu-xtensa-dc233c_na  |  12 +
 test/hooks/bin/travis-ci/conf.qemu_arm64_na   |  30 ++
 .../bin/travis-ci/conf.qemu_arm64_spl_na      |  32 ++
 .../bin/travis-ci/conf.qemu_arm64_tpl_na      |  29 ++
 test/hooks/bin/travis-ci/conf.qemu_arm64be_na |  13 +
 test/hooks/bin/travis-ci/conf.qemu_arm_na     |  30 ++
 test/hooks/bin/travis-ci/conf.qemu_arm_spl_na |  31 ++
 test/hooks/bin/travis-ci/conf.qemu_mips64_na  |  28 ++
 .../hooks/bin/travis-ci/conf.qemu_mips64el_na |  28 ++
 test/hooks/bin/travis-ci/conf.qemu_mips_na    |  28 ++
 test/hooks/bin/travis-ci/conf.qemu_mipsel_na  |  28 ++
 .../bin/travis-ci/conf.r2dplus_i82557c_qemu   |  27 ++
 .../bin/travis-ci/conf.r2dplus_pcnet_qemu     |  27 ++
 .../bin/travis-ci/conf.r2dplus_rtl8139_qemu   |  27 ++
 .../bin/travis-ci/conf.r2dplus_tulip_qemu     |  27 ++
 .../conf.sifive_unleashed_sdcard_qemu         |  11 +
 .../conf.sifive_unleashed_spi-nor_qemu        |  11 +
 .../bin/travis-ci/conf.vexpress_ca15_tc2_qemu |  27 ++
 .../bin/travis-ci/conf.vexpress_ca9x4_qemu    |  27 ++
 .../travis-ci/conf.vexpress_fvp_bloblist_na   |   1 +
 test/hooks/bin/travis-ci/conf.vexpress_fvp_na |  29 ++
 .../travis-ci/conf.xilinx_versal_virt_qemu    |  27 ++
 .../bin/travis-ci/conf.xilinx_zynq_virt_qemu  |  27 ++
 test/hooks/bin/travis-ci/conf.xtfpga_qemu     |  27 ++
 test/hooks/bin/travis-ci/conf.zynq_zc702_qemu |  27 ++
 test/hooks/bin/u-boot-test-common             |  36 +++
 test/hooks/bin/u-boot-test-console            |  25 ++
 test/hooks/bin/u-boot-test-flash              |  25 ++
 test/hooks/bin/u-boot-test-getrole            |  38 +++
 test/hooks/bin/u-boot-test-power-off          |  25 ++
 test/hooks/bin/u-boot-test-power-on           |  25 ++
 test/hooks/bin/u-boot-test-release            |  26 ++
 test/hooks/bin/u-boot-test-reset              |  25 ++
 test/hooks/bin/wait_raw_device                |  34 ++
 test/hooks/bin/writer.imx_raw                 |  39 +++
 test/hooks/bin/writer.labgrid-trini.rpi       |  46 +++
 test/hooks/bin/writer.labgrid-trini.ti-k3     |  35 ++
 test/hooks/bin/writer.rk3288_raw              |  40 +++
 test/hooks/bin/writer.rpi_mount               |  43 +++
 test/hooks/bin/writer.sunxi_raw               |  36 +++
 test/hooks/bin/writer.ti-k3_mount             |  36 +++
 test/hooks/bin/writer.ti-omap_mount           |  29 ++
 test/hooks/bin/writer.zynq_mount              |  36 +++
 test/hooks/contrib/src/.gitignore             |   1 +
 test/hooks/contrib/src/README.txt             |  13 +
 test/hooks/contrib/src/build.sh               |   7 +
 test/hooks/contrib/src/phidgets-relay.c       |  81 +++++
 .../contrib/udev/swarren-lx1/99-ubtest.rules  |  89 +++++
 .../OLI01/u_boot_boardenv_mx6qsabrelite_na.py |  39 +++
 .../konsulko-labgrid/u_boot_boardenv_rpi_4.py |   1 +
 .../u_boot_boardenv_rpi_arm64.py              |  84 +++++
 .../u_boot_boardenv_jetson_tk1_na.py          | 110 +++++++
 .../u_boot_boardenv_p2371_2180_na.py          | 110 +++++++
 .../u_boot_boardenv_p2771_0000_500_na.py      |  73 +++++
 test/hooks/py/travis-ci/travis_tftp.py        |  31 ++
 .../u_boot_boardenv_M5208EVBE_qemu.py         |   6 +
 .../u_boot_boardenv_evb_ast2500_qemu.py       |   5 +
 .../u_boot_boardenv_evb_ast2600_qemu.py       |   4 +
 .../travis-ci/u_boot_boardenv_malta64_qemu.py |   5 +
 .../u_boot_boardenv_malta64el_qemu.py         |   5 +
 .../travis-ci/u_boot_boardenv_malta_qemu.py   |   5 +
 .../travis-ci/u_boot_boardenv_maltael_qemu.py |   5 +
 .../u_boot_boardenv_qemu_ae3xx_na.py          |   6 +
 .../u_boot_boardenv_qemu_arm64_na.py          |  12 +
 .../u_boot_boardenv_qemu_arm64be_na.py        |  10 +
 .../travis-ci/u_boot_boardenv_qemu_arm_na.py  |  12 +
 .../travis-ci/u_boot_boardenv_qemu_ax25_na.py |   6 +
 .../u_boot_boardenv_qemu_loongarch64_na.py    |  11 +
 .../u_boot_boardenv_qemu_riscv32_na.py        |  10 +
 .../u_boot_boardenv_qemu_riscv32_spl_na.py    |  10 +
 .../u_boot_boardenv_qemu_riscv64_na.py        |  10 +
 .../u_boot_boardenv_qemu_riscv64_spl_na.py    |  10 +
 .../u_boot_boardenv_qemu_x86_64_na.py         |  12 +
 .../travis-ci/u_boot_boardenv_qemu_x86_na.py  |  12 +
 .../u_boot_boardenv_qemu_xtensa_dc233c_na.py  |   6 +
 .../u_boot_boardenv_r2dplus_i82557c_qemu.py   |   6 +
 .../u_boot_boardenv_r2dplus_pcnet_qemu.py     |   6 +
 .../u_boot_boardenv_r2dplus_rtl8139_qemu.py   |   6 +
 .../u_boot_boardenv_r2dplus_tulip_qemu.py     |   6 +
 ...t_boardenv_sifive_unleashed_sdcard_qemu.py |  10 +
 ..._boardenv_sifive_unleashed_spi_nor_qemu.py |  10 +
 .../u_boot_boardenv_vexpress_ca15_tc2_qemu.py |  10 +
 .../u_boot_boardenv_vexpress_ca9x4_qemu.py    |  10 +
 ...u_boot_boardenv_xilinx_versal_virt_qemu.py |   1 +
 .../u_boot_boardenv_xilinx_zynq_virt_qemu.py  |   3 +
 .../u_boot_boardenv_zynq_zc702_qemu.py        |   3 +
 199 files changed, 5340 insertions(+), 27 deletions(-)
 create mode 100644 doc/develop/test_hooks.rst
 create mode 100644 test/hooks/bin/OLI01/conf.mx6qsabrelite_na
 create mode 100644 test/hooks/bin/bill-the-cat/conf.integratorcp_cm926ejs_qemu
 create mode 100644 test/hooks/bin/bill-the-cat/conf.qemu_mips_na
 create mode 100644 test/hooks/bin/bill-the-cat/conf.vexpress_ca15_tc2_qemu
 create mode 100755 test/hooks/bin/common-config.cros-servo-dut-control
 create mode 100644 test/hooks/bin/common.labgrid-trini
 create mode 100644 test/hooks/bin/console.fvp
 create mode 100644 test/hooks/bin/console.labgrid-sjg
 create mode 100755 test/hooks/bin/console.labgrid-trini
 create mode 100644 test/hooks/bin/console.picocom
 create mode 100644 test/hooks/bin/console.qemu
 create mode 100644 test/hooks/bin/download.imx_usb
 create mode 100644 test/hooks/bin/download.l4t-exec-uboot
 create mode 100755 test/hooks/bin/download.tegra-uboot-flasher
 create mode 100755 test/hooks/bin/ellesmere/common-labgrid-sjg
 create mode 100644 test/hooks/bin/ellesmere/conf.all
 create mode 100644 test/hooks/bin/ellesmere/conf.evb-ast2500_qemu
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_spl_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv64_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_64_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_spl_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_spl_na
 create mode 100644 test/hooks/bin/flash.em100
 create mode 100644 test/hooks/bin/flash.fiptool
 create mode 100644 test/hooks/bin/flash.flashair
 create mode 100644 test/hooks/bin/flash.labgrid-trini.sd-mux
 create mode 100644 test/hooks/bin/flash.none
 create mode 100755 test/hooks/bin/flash.qemu_gen_padded_image
 create mode 100644 test/hooks/bin/flash.recovery_l4t
 create mode 100644 test/hooks/bin/flash.sdwire_common_mount
 create mode 100644 test/hooks/bin/flash.sdwire_digital-loggers_raw
 create mode 100644 test/hooks/bin/flash.sdwire_poweroff_mount
 create mode 100644 test/hooks/bin/flash.sdwire_poweroff_raw
 create mode 100644 test/hooks/bin/flash.sdwire_relay_mount
 create mode 100644 test/hooks/bin/flashair.rpi
 create mode 100644 test/hooks/bin/flashair.ti-omap
 create mode 100755 test/hooks/bin/getrole.labgrid-sjg
 create mode 100644 test/hooks/bin/kea/conf.Linksprite_pcDuino3_sjg-pcduino3
 create mode 100644 test/hooks/bin/kea/conf.chromebook_link_sjg-link
 create mode 100644 test/hooks/bin/kea/conf.chromebook_samus_sjg-samus
 create mode 100644 test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1
 create mode 100644 test/hooks/bin/kea/conf.minnowmax_sjg-minnowmax
 create mode 100644 test/hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc
 create mode 100644 test/hooks/bin/kea/conf.rock2_sjg-rock2
 create mode 100644 test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b
 create mode 100644 test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b
 create mode 100644 test/hooks/bin/kea/conf.zynq_zybo_sjg-zynq_zybo
 create mode 100644 test/hooks/bin/konsulko-labgrid/conf.am62x_beagleplay_a53_na
 create mode 100644 test/hooks/bin/konsulko-labgrid/conf.am64x_evm_a53_na
 create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_32b_na
 create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_na
 create mode 100644 test/hooks/bin/konsulko-labgrid/conf.rpi_arm64_na
 create mode 100644 test/hooks/bin/poweroff.digital-loggers
 create mode 100644 test/hooks/bin/poweroff.manual
 create mode 100755 test/hooks/bin/poweroff.none
 create mode 100644 test/hooks/bin/poweroff.phidgets
 create mode 100644 test/hooks/bin/poweroff.pm342
 create mode 100644 test/hooks/bin/poweroff.ykush
 create mode 100644 test/hooks/bin/poweron.digital-loggers
 create mode 100644 test/hooks/bin/poweron.manual
 create mode 100755 test/hooks/bin/poweron.none
 create mode 100644 test/hooks/bin/poweron.phidgets
 create mode 100644 test/hooks/bin/poweron.pm342
 create mode 100644 test/hooks/bin/poweron.ykush
 create mode 100755 test/hooks/bin/push-flashair.py
 create mode 100755 test/hooks/bin/qemu.swtpm
 create mode 100644 test/hooks/bin/recovery.manual
 create mode 100644 test/hooks/bin/recovery.phidgets
 create mode 100644 test/hooks/bin/recovery.pm342
 create mode 100755 test/hooks/bin/recovery.relay
 create mode 100755 test/hooks/bin/recovery.usbrelay
 create mode 100644 test/hooks/bin/release.labgrid-sjg
 create mode 100644 test/hooks/bin/release.none
 create mode 100644 test/hooks/bin/reset.cros_servo
 create mode 100644 test/hooks/bin/reset.digital-loggers
 create mode 100755 test/hooks/bin/reset.labgrid-trini
 create mode 100644 test/hooks/bin/reset.none
 create mode 100644 test/hooks/bin/reset.pm342
 create mode 100644 test/hooks/bin/reset.recovery_download
 create mode 100644 test/hooks/bin/reset.usbrelay
 create mode 100644 test/hooks/bin/reset.ykush
 create mode 100644 test/hooks/bin/swarren-lx1/conf.jetson-tk1_na
 create mode 100644 test/hooks/bin/swarren-lx1/conf.p2371-2180_na
 create mode 100644 test/hooks/bin/swarren-lx1/conf.p2771-0000-500_na
 create mode 100644 test/hooks/bin/travis-ci/conf.M5208EVBE_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.coreboot_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2500_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2600_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.integratorcp_cm926ejs_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.malta64_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.malta64el_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.malta_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.maltael_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ae3xx_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-arm-sbsa_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ax25_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-loongarch64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ppce500_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-xtensa-dc233c_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_tpl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64be_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64el_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mipsel_na
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_i82557c_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_pcnet_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_rtl8139_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_tulip_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.sifive_unleashed_sdcard_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.sifive_unleashed_spi-nor_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_ca15_tc2_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_ca9x4_qemu
 create mode 120000 test/hooks/bin/travis-ci/conf.vexpress_fvp_bloblist_na
 create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_fvp_na
 create mode 100644 test/hooks/bin/travis-ci/conf.xilinx_versal_virt_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.xilinx_zynq_virt_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.xtfpga_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.zynq_zc702_qemu
 create mode 100755 test/hooks/bin/u-boot-test-common
 create mode 100755 test/hooks/bin/u-boot-test-console
 create mode 100755 test/hooks/bin/u-boot-test-flash
 create mode 100755 test/hooks/bin/u-boot-test-getrole
 create mode 100755 test/hooks/bin/u-boot-test-power-off
 create mode 100755 test/hooks/bin/u-boot-test-power-on
 create mode 100755 test/hooks/bin/u-boot-test-release
 create mode 100755 test/hooks/bin/u-boot-test-reset
 create mode 100644 test/hooks/bin/wait_raw_device
 create mode 100755 test/hooks/bin/writer.imx_raw
 create mode 100644 test/hooks/bin/writer.labgrid-trini.rpi
 create mode 100644 test/hooks/bin/writer.labgrid-trini.ti-k3
 create mode 100755 test/hooks/bin/writer.rk3288_raw
 create mode 100755 test/hooks/bin/writer.rpi_mount
 create mode 100755 test/hooks/bin/writer.sunxi_raw
 create mode 100755 test/hooks/bin/writer.ti-k3_mount
 create mode 100755 test/hooks/bin/writer.ti-omap_mount
 create mode 100755 test/hooks/bin/writer.zynq_mount
 create mode 100644 test/hooks/contrib/src/.gitignore
 create mode 100644 test/hooks/contrib/src/README.txt
 create mode 100755 test/hooks/contrib/src/build.sh
 create mode 100644 test/hooks/contrib/src/phidgets-relay.c
 create mode 100644 test/hooks/contrib/udev/swarren-lx1/99-ubtest.rules
 create mode 100644 test/hooks/py/OLI01/u_boot_boardenv_mx6qsabrelite_na.py
 create mode 120000 test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_4.py
 create mode 100644 test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_arm64.py
 create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_jetson_tk1_na.py
 create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_p2371_2180_na.py
 create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_p2771_0000_500_na.py
 create mode 100644 test/hooks/py/travis-ci/travis_tftp.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_M5208EVBE_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2500_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2600_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta64_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta64el_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_maltael_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_ae3xx_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64be_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_ax25_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_loongarch64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_spl_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_spl_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_xtensa_dc233c_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_i82557c_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_pcnet_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_rtl8139_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_tulip_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_sdcard_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_spi_nor_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca15_tc2_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca9x4_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_xilinx_versal_virt_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_xilinx_zynq_virt_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_zynq_zc702_qemu.py

-- 
2.43.0

base-commit: 9b9647c89cbe785fd935f70e16d08cf9812b9fda
branch: tes

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH 1/3] test: Bring in the test hooks
  2025-05-02  2:50 [PATCH 0/3] RFC: test: Bring in the test hooks Simon Glass
@ 2025-05-02  2:50 ` Simon Glass
  2025-05-02  2:50 ` [PATCH 2/3] doc: Tidy up the hooks documentation Simon Glass
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 25+ messages in thread
From: Simon Glass @ 2025-05-02  2:50 UTC (permalink / raw)
  To: U-Boot Mailing List; +Cc: Tom Rini, Heinrich Schuchardt, Simon Glass

Bring these in from u-boot-test-hooks commit a7bd2dc

A few changes are included:

- directory permission set to 755
- Contributing.md is dropped since it is no-longer relevant
- the 'src' and 'udev' directories are now inside a 'contrib' directory,
  since they are really just examples.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 test/hooks/README.md                          | 296 ++++++++++++++++++
 test/hooks/bin/OLI01/conf.mx6qsabrelite_na    |  26 ++
 .../conf.integratorcp_cm926ejs_qemu           |  27 ++
 test/hooks/bin/bill-the-cat/conf.qemu_mips_na |  28 ++
 .../bill-the-cat/conf.vexpress_ca15_tc2_qemu  |  27 ++
 .../bin/common-config.cros-servo-dut-control  |  69 ++++
 test/hooks/bin/common.labgrid-trini           |  35 +++
 test/hooks/bin/console.fvp                    |  28 ++
 test/hooks/bin/console.labgrid-sjg            |  42 +++
 test/hooks/bin/console.labgrid-trini          |  24 ++
 test/hooks/bin/console.picocom                |  42 +++
 test/hooks/bin/console.qemu                   |  35 +++
 test/hooks/bin/download.imx_usb               |  23 ++
 test/hooks/bin/download.l4t-exec-uboot        |  25 ++
 test/hooks/bin/download.tegra-uboot-flasher   |  24 ++
 test/hooks/bin/ellesmere/common-labgrid-sjg   |  46 +++
 test/hooks/bin/ellesmere/conf.all             |  24 ++
 .../hooks/bin/ellesmere/conf.evb-ast2500_qemu |  11 +
 test/hooks/bin/ellesmere/conf.qemu-riscv32_na |   1 +
 .../bin/ellesmere/conf.qemu-riscv32_spl_na    |   1 +
 test/hooks/bin/ellesmere/conf.qemu-riscv64_na |   1 +
 test/hooks/bin/ellesmere/conf.qemu-x86_64_na  |   1 +
 test/hooks/bin/ellesmere/conf.qemu-x86_na     |   1 +
 test/hooks/bin/ellesmere/conf.qemu_arm64_na   |   1 +
 .../bin/ellesmere/conf.qemu_arm64_spl_na      |   1 +
 test/hooks/bin/ellesmere/conf.qemu_arm_na     |   1 +
 test/hooks/bin/ellesmere/conf.qemu_arm_spl_na |   1 +
 test/hooks/bin/flash.em100                    |  30 ++
 test/hooks/bin/flash.fiptool                  |  22 ++
 test/hooks/bin/flash.flashair                 |  45 +++
 test/hooks/bin/flash.labgrid-trini.sd-mux     |  31 ++
 test/hooks/bin/flash.none                     |  21 ++
 test/hooks/bin/flash.qemu_gen_padded_image    |  15 +
 test/hooks/bin/flash.recovery_l4t             |  44 +++
 test/hooks/bin/flash.sdwire_common_mount      |  80 +++++
 .../bin/flash.sdwire_digital-loggers_raw      |  41 +++
 test/hooks/bin/flash.sdwire_poweroff_mount    |  32 ++
 test/hooks/bin/flash.sdwire_poweroff_raw      |  42 +++
 test/hooks/bin/flash.sdwire_relay_mount       |  34 ++
 test/hooks/bin/flashair.rpi                   |  47 +++
 test/hooks/bin/flashair.ti-omap               |  26 ++
 test/hooks/bin/getrole.labgrid-sjg            |  34 ++
 .../kea/conf.Linksprite_pcDuino3_sjg-pcduino3 |  33 ++
 .../bin/kea/conf.chromebook_link_sjg-link     |  30 ++
 .../bin/kea/conf.chromebook_samus_sjg-samus   |  30 ++
 test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1    |  38 +++
 .../bin/kea/conf.minnowmax_sjg-minnowmax      |  33 ++
 .../hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc |  35 +++
 test/hooks/bin/kea/conf.rock2_sjg-rock2       |  33 ++
 test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b  |  34 ++
 test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b      |  34 ++
 .../bin/kea/conf.zynq_zybo_sjg-zynq_zybo      |  44 +++
 .../conf.am62x_beagleplay_a53_na              |  30 ++
 .../konsulko-labgrid/conf.am64x_evm_a53_na    |  30 ++
 .../bin/konsulko-labgrid/conf.rpi_4_32b_na    |   1 +
 test/hooks/bin/konsulko-labgrid/conf.rpi_4_na |   1 +
 .../bin/konsulko-labgrid/conf.rpi_arm64_na    |  25 ++
 test/hooks/bin/poweroff.digital-loggers       |  22 ++
 test/hooks/bin/poweroff.manual                |  21 ++
 test/hooks/bin/poweroff.none                  |  22 ++
 test/hooks/bin/poweroff.phidgets              |  37 +++
 test/hooks/bin/poweroff.pm342                 |  21 ++
 test/hooks/bin/poweroff.ykush                 |  23 ++
 test/hooks/bin/poweron.digital-loggers        |  22 ++
 test/hooks/bin/poweron.manual                 |  21 ++
 test/hooks/bin/poweron.none                   |  22 ++
 test/hooks/bin/poweron.phidgets               |  32 ++
 test/hooks/bin/poweron.pm342                  |  24 ++
 test/hooks/bin/poweron.ykush                  |  23 ++
 test/hooks/bin/push-flashair.py               | 118 +++++++
 test/hooks/bin/qemu.swtpm                     |  23 ++
 test/hooks/bin/recovery.manual                |  23 ++
 test/hooks/bin/recovery.phidgets              |  29 ++
 test/hooks/bin/recovery.pm342                 |  26 ++
 test/hooks/bin/recovery.relay                 |  39 +++
 test/hooks/bin/recovery.usbrelay              |  32 ++
 test/hooks/bin/release.labgrid-sjg            |  22 ++
 test/hooks/bin/release.none                   |  22 ++
 test/hooks/bin/reset.cros_servo               |  23 ++
 test/hooks/bin/reset.digital-loggers          |  25 ++
 test/hooks/bin/reset.labgrid-trini            |  24 ++
 test/hooks/bin/reset.none                     |  30 ++
 test/hooks/bin/reset.pm342                    |  21 ++
 test/hooks/bin/reset.recovery_download        |  36 +++
 test/hooks/bin/reset.usbrelay                 |  26 ++
 test/hooks/bin/reset.ykush                    |  25 ++
 test/hooks/bin/swarren-lx1/conf.jetson-tk1_na |  36 +++
 test/hooks/bin/swarren-lx1/conf.p2371-2180_na |  57 ++++
 .../bin/swarren-lx1/conf.p2771-0000-500_na    |  32 ++
 test/hooks/bin/travis-ci/conf.M5208EVBE_qemu  |  27 ++
 test/hooks/bin/travis-ci/conf.coreboot_qemu   |  28 ++
 .../hooks/bin/travis-ci/conf.evb-ast2500_qemu |  11 +
 .../hooks/bin/travis-ci/conf.evb-ast2600_qemu |  13 +
 .../travis-ci/conf.integratorcp_cm926ejs_qemu |  27 ++
 test/hooks/bin/travis-ci/conf.malta64_qemu    |  30 ++
 test/hooks/bin/travis-ci/conf.malta64el_qemu  |  31 ++
 test/hooks/bin/travis-ci/conf.malta_qemu      |  30 ++
 test/hooks/bin/travis-ci/conf.maltael_qemu    |  31 ++
 test/hooks/bin/travis-ci/conf.qemu-ae3xx_na   |  27 ++
 .../hooks/bin/travis-ci/conf.qemu-arm-sbsa_na |  27 ++
 test/hooks/bin/travis-ci/conf.qemu-ax25_na    |  27 ++
 .../bin/travis-ci/conf.qemu-loongarch64_na    |  12 +
 test/hooks/bin/travis-ci/conf.qemu-ppce500_na |  27 ++
 test/hooks/bin/travis-ci/conf.qemu-riscv32_na |  11 +
 .../bin/travis-ci/conf.qemu-riscv32_spl_na    |  11 +
 test/hooks/bin/travis-ci/conf.qemu-riscv64_na |  11 +
 .../bin/travis-ci/conf.qemu-riscv64_spl_na    |  11 +
 test/hooks/bin/travis-ci/conf.qemu-x86_64_na  |  27 ++
 test/hooks/bin/travis-ci/conf.qemu-x86_na     |  27 ++
 .../bin/travis-ci/conf.qemu-xtensa-dc233c_na  |  12 +
 test/hooks/bin/travis-ci/conf.qemu_arm64_na   |  30 ++
 .../bin/travis-ci/conf.qemu_arm64_spl_na      |  32 ++
 .../bin/travis-ci/conf.qemu_arm64_tpl_na      |  29 ++
 test/hooks/bin/travis-ci/conf.qemu_arm64be_na |  13 +
 test/hooks/bin/travis-ci/conf.qemu_arm_na     |  30 ++
 test/hooks/bin/travis-ci/conf.qemu_arm_spl_na |  31 ++
 test/hooks/bin/travis-ci/conf.qemu_mips64_na  |  28 ++
 .../hooks/bin/travis-ci/conf.qemu_mips64el_na |  28 ++
 test/hooks/bin/travis-ci/conf.qemu_mips_na    |  28 ++
 test/hooks/bin/travis-ci/conf.qemu_mipsel_na  |  28 ++
 .../bin/travis-ci/conf.r2dplus_i82557c_qemu   |  27 ++
 .../bin/travis-ci/conf.r2dplus_pcnet_qemu     |  27 ++
 .../bin/travis-ci/conf.r2dplus_rtl8139_qemu   |  27 ++
 .../bin/travis-ci/conf.r2dplus_tulip_qemu     |  27 ++
 .../conf.sifive_unleashed_sdcard_qemu         |  11 +
 .../conf.sifive_unleashed_spi-nor_qemu        |  11 +
 .../bin/travis-ci/conf.vexpress_ca15_tc2_qemu |  27 ++
 .../bin/travis-ci/conf.vexpress_ca9x4_qemu    |  27 ++
 .../travis-ci/conf.vexpress_fvp_bloblist_na   |   1 +
 test/hooks/bin/travis-ci/conf.vexpress_fvp_na |  29 ++
 .../travis-ci/conf.xilinx_versal_virt_qemu    |  27 ++
 .../bin/travis-ci/conf.xilinx_zynq_virt_qemu  |  27 ++
 test/hooks/bin/travis-ci/conf.xtfpga_qemu     |  27 ++
 test/hooks/bin/travis-ci/conf.zynq_zc702_qemu |  27 ++
 test/hooks/bin/u-boot-test-common             |  36 +++
 test/hooks/bin/u-boot-test-console            |  25 ++
 test/hooks/bin/u-boot-test-flash              |  25 ++
 test/hooks/bin/u-boot-test-getrole            |  38 +++
 test/hooks/bin/u-boot-test-power-off          |  25 ++
 test/hooks/bin/u-boot-test-power-on           |  25 ++
 test/hooks/bin/u-boot-test-release            |  26 ++
 test/hooks/bin/u-boot-test-reset              |  25 ++
 test/hooks/bin/wait_raw_device                |  34 ++
 test/hooks/bin/writer.imx_raw                 |  39 +++
 test/hooks/bin/writer.labgrid-trini.rpi       |  46 +++
 test/hooks/bin/writer.labgrid-trini.ti-k3     |  35 +++
 test/hooks/bin/writer.rk3288_raw              |  40 +++
 test/hooks/bin/writer.rpi_mount               |  43 +++
 test/hooks/bin/writer.sunxi_raw               |  36 +++
 test/hooks/bin/writer.ti-k3_mount             |  36 +++
 test/hooks/bin/writer.ti-omap_mount           |  29 ++
 test/hooks/bin/writer.zynq_mount              |  36 +++
 test/hooks/contrib/src/.gitignore             |   1 +
 test/hooks/contrib/src/README.txt             |  13 +
 test/hooks/contrib/src/build.sh               |   7 +
 test/hooks/contrib/src/phidgets-relay.c       |  81 +++++
 .../contrib/udev/swarren-lx1/99-ubtest.rules  |  89 ++++++
 .../OLI01/u_boot_boardenv_mx6qsabrelite_na.py |  39 +++
 .../konsulko-labgrid/u_boot_boardenv_rpi_4.py |   1 +
 .../u_boot_boardenv_rpi_arm64.py              |  84 +++++
 .../u_boot_boardenv_jetson_tk1_na.py          | 110 +++++++
 .../u_boot_boardenv_p2371_2180_na.py          | 110 +++++++
 .../u_boot_boardenv_p2771_0000_500_na.py      |  73 +++++
 test/hooks/py/travis-ci/travis_tftp.py        |  31 ++
 .../u_boot_boardenv_M5208EVBE_qemu.py         |   6 +
 .../u_boot_boardenv_evb_ast2500_qemu.py       |   5 +
 .../u_boot_boardenv_evb_ast2600_qemu.py       |   4 +
 .../travis-ci/u_boot_boardenv_malta64_qemu.py |   5 +
 .../u_boot_boardenv_malta64el_qemu.py         |   5 +
 .../travis-ci/u_boot_boardenv_malta_qemu.py   |   5 +
 .../travis-ci/u_boot_boardenv_maltael_qemu.py |   5 +
 .../u_boot_boardenv_qemu_ae3xx_na.py          |   6 +
 .../u_boot_boardenv_qemu_arm64_na.py          |  12 +
 .../u_boot_boardenv_qemu_arm64be_na.py        |  10 +
 .../travis-ci/u_boot_boardenv_qemu_arm_na.py  |  12 +
 .../travis-ci/u_boot_boardenv_qemu_ax25_na.py |   6 +
 .../u_boot_boardenv_qemu_loongarch64_na.py    |  11 +
 .../u_boot_boardenv_qemu_riscv32_na.py        |  10 +
 .../u_boot_boardenv_qemu_riscv32_spl_na.py    |  10 +
 .../u_boot_boardenv_qemu_riscv64_na.py        |  10 +
 .../u_boot_boardenv_qemu_riscv64_spl_na.py    |  10 +
 .../u_boot_boardenv_qemu_x86_64_na.py         |  12 +
 .../travis-ci/u_boot_boardenv_qemu_x86_na.py  |  12 +
 .../u_boot_boardenv_qemu_xtensa_dc233c_na.py  |   6 +
 .../u_boot_boardenv_r2dplus_i82557c_qemu.py   |   6 +
 .../u_boot_boardenv_r2dplus_pcnet_qemu.py     |   6 +
 .../u_boot_boardenv_r2dplus_rtl8139_qemu.py   |   6 +
 .../u_boot_boardenv_r2dplus_tulip_qemu.py     |   6 +
 ...t_boardenv_sifive_unleashed_sdcard_qemu.py |  10 +
 ..._boardenv_sifive_unleashed_spi_nor_qemu.py |  10 +
 .../u_boot_boardenv_vexpress_ca15_tc2_qemu.py |  10 +
 .../u_boot_boardenv_vexpress_ca9x4_qemu.py    |  10 +
 ...u_boot_boardenv_xilinx_versal_virt_qemu.py |   1 +
 .../u_boot_boardenv_xilinx_zynq_virt_qemu.py  |   3 +
 .../u_boot_boardenv_zynq_zc702_qemu.py        |   3 +
 195 files changed, 5303 insertions(+)
 create mode 100644 test/hooks/README.md
 create mode 100644 test/hooks/bin/OLI01/conf.mx6qsabrelite_na
 create mode 100644 test/hooks/bin/bill-the-cat/conf.integratorcp_cm926ejs_qemu
 create mode 100644 test/hooks/bin/bill-the-cat/conf.qemu_mips_na
 create mode 100644 test/hooks/bin/bill-the-cat/conf.vexpress_ca15_tc2_qemu
 create mode 100755 test/hooks/bin/common-config.cros-servo-dut-control
 create mode 100644 test/hooks/bin/common.labgrid-trini
 create mode 100644 test/hooks/bin/console.fvp
 create mode 100644 test/hooks/bin/console.labgrid-sjg
 create mode 100755 test/hooks/bin/console.labgrid-trini
 create mode 100644 test/hooks/bin/console.picocom
 create mode 100644 test/hooks/bin/console.qemu
 create mode 100644 test/hooks/bin/download.imx_usb
 create mode 100644 test/hooks/bin/download.l4t-exec-uboot
 create mode 100755 test/hooks/bin/download.tegra-uboot-flasher
 create mode 100755 test/hooks/bin/ellesmere/common-labgrid-sjg
 create mode 100644 test/hooks/bin/ellesmere/conf.all
 create mode 100644 test/hooks/bin/ellesmere/conf.evb-ast2500_qemu
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_spl_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv64_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_64_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_spl_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_na
 create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_spl_na
 create mode 100644 test/hooks/bin/flash.em100
 create mode 100644 test/hooks/bin/flash.fiptool
 create mode 100644 test/hooks/bin/flash.flashair
 create mode 100644 test/hooks/bin/flash.labgrid-trini.sd-mux
 create mode 100644 test/hooks/bin/flash.none
 create mode 100755 test/hooks/bin/flash.qemu_gen_padded_image
 create mode 100644 test/hooks/bin/flash.recovery_l4t
 create mode 100644 test/hooks/bin/flash.sdwire_common_mount
 create mode 100644 test/hooks/bin/flash.sdwire_digital-loggers_raw
 create mode 100644 test/hooks/bin/flash.sdwire_poweroff_mount
 create mode 100644 test/hooks/bin/flash.sdwire_poweroff_raw
 create mode 100644 test/hooks/bin/flash.sdwire_relay_mount
 create mode 100644 test/hooks/bin/flashair.rpi
 create mode 100644 test/hooks/bin/flashair.ti-omap
 create mode 100755 test/hooks/bin/getrole.labgrid-sjg
 create mode 100644 test/hooks/bin/kea/conf.Linksprite_pcDuino3_sjg-pcduino3
 create mode 100644 test/hooks/bin/kea/conf.chromebook_link_sjg-link
 create mode 100644 test/hooks/bin/kea/conf.chromebook_samus_sjg-samus
 create mode 100644 test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1
 create mode 100644 test/hooks/bin/kea/conf.minnowmax_sjg-minnowmax
 create mode 100644 test/hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc
 create mode 100644 test/hooks/bin/kea/conf.rock2_sjg-rock2
 create mode 100644 test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b
 create mode 100644 test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b
 create mode 100644 test/hooks/bin/kea/conf.zynq_zybo_sjg-zynq_zybo
 create mode 100644 test/hooks/bin/konsulko-labgrid/conf.am62x_beagleplay_a53_na
 create mode 100644 test/hooks/bin/konsulko-labgrid/conf.am64x_evm_a53_na
 create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_32b_na
 create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_na
 create mode 100644 test/hooks/bin/konsulko-labgrid/conf.rpi_arm64_na
 create mode 100644 test/hooks/bin/poweroff.digital-loggers
 create mode 100644 test/hooks/bin/poweroff.manual
 create mode 100755 test/hooks/bin/poweroff.none
 create mode 100644 test/hooks/bin/poweroff.phidgets
 create mode 100644 test/hooks/bin/poweroff.pm342
 create mode 100644 test/hooks/bin/poweroff.ykush
 create mode 100644 test/hooks/bin/poweron.digital-loggers
 create mode 100644 test/hooks/bin/poweron.manual
 create mode 100755 test/hooks/bin/poweron.none
 create mode 100644 test/hooks/bin/poweron.phidgets
 create mode 100644 test/hooks/bin/poweron.pm342
 create mode 100644 test/hooks/bin/poweron.ykush
 create mode 100755 test/hooks/bin/push-flashair.py
 create mode 100755 test/hooks/bin/qemu.swtpm
 create mode 100644 test/hooks/bin/recovery.manual
 create mode 100644 test/hooks/bin/recovery.phidgets
 create mode 100644 test/hooks/bin/recovery.pm342
 create mode 100755 test/hooks/bin/recovery.relay
 create mode 100755 test/hooks/bin/recovery.usbrelay
 create mode 100644 test/hooks/bin/release.labgrid-sjg
 create mode 100644 test/hooks/bin/release.none
 create mode 100644 test/hooks/bin/reset.cros_servo
 create mode 100644 test/hooks/bin/reset.digital-loggers
 create mode 100755 test/hooks/bin/reset.labgrid-trini
 create mode 100644 test/hooks/bin/reset.none
 create mode 100644 test/hooks/bin/reset.pm342
 create mode 100644 test/hooks/bin/reset.recovery_download
 create mode 100644 test/hooks/bin/reset.usbrelay
 create mode 100644 test/hooks/bin/reset.ykush
 create mode 100644 test/hooks/bin/swarren-lx1/conf.jetson-tk1_na
 create mode 100644 test/hooks/bin/swarren-lx1/conf.p2371-2180_na
 create mode 100644 test/hooks/bin/swarren-lx1/conf.p2771-0000-500_na
 create mode 100644 test/hooks/bin/travis-ci/conf.M5208EVBE_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.coreboot_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2500_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2600_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.integratorcp_cm926ejs_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.malta64_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.malta64el_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.malta_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.maltael_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ae3xx_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-arm-sbsa_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ax25_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-loongarch64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ppce500_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu-xtensa-dc233c_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_tpl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64be_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_spl_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64el_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips_na
 create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mipsel_na
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_i82557c_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_pcnet_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_rtl8139_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_tulip_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.sifive_unleashed_sdcard_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.sifive_unleashed_spi-nor_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_ca15_tc2_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_ca9x4_qemu
 create mode 120000 test/hooks/bin/travis-ci/conf.vexpress_fvp_bloblist_na
 create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_fvp_na
 create mode 100644 test/hooks/bin/travis-ci/conf.xilinx_versal_virt_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.xilinx_zynq_virt_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.xtfpga_qemu
 create mode 100644 test/hooks/bin/travis-ci/conf.zynq_zc702_qemu
 create mode 100755 test/hooks/bin/u-boot-test-common
 create mode 100755 test/hooks/bin/u-boot-test-console
 create mode 100755 test/hooks/bin/u-boot-test-flash
 create mode 100755 test/hooks/bin/u-boot-test-getrole
 create mode 100755 test/hooks/bin/u-boot-test-power-off
 create mode 100755 test/hooks/bin/u-boot-test-power-on
 create mode 100755 test/hooks/bin/u-boot-test-release
 create mode 100755 test/hooks/bin/u-boot-test-reset
 create mode 100644 test/hooks/bin/wait_raw_device
 create mode 100755 test/hooks/bin/writer.imx_raw
 create mode 100644 test/hooks/bin/writer.labgrid-trini.rpi
 create mode 100644 test/hooks/bin/writer.labgrid-trini.ti-k3
 create mode 100755 test/hooks/bin/writer.rk3288_raw
 create mode 100755 test/hooks/bin/writer.rpi_mount
 create mode 100755 test/hooks/bin/writer.sunxi_raw
 create mode 100755 test/hooks/bin/writer.ti-k3_mount
 create mode 100755 test/hooks/bin/writer.ti-omap_mount
 create mode 100755 test/hooks/bin/writer.zynq_mount
 create mode 100644 test/hooks/contrib/src/.gitignore
 create mode 100644 test/hooks/contrib/src/README.txt
 create mode 100755 test/hooks/contrib/src/build.sh
 create mode 100644 test/hooks/contrib/src/phidgets-relay.c
 create mode 100644 test/hooks/contrib/udev/swarren-lx1/99-ubtest.rules
 create mode 100644 test/hooks/py/OLI01/u_boot_boardenv_mx6qsabrelite_na.py
 create mode 120000 test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_4.py
 create mode 100644 test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_arm64.py
 create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_jetson_tk1_na.py
 create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_p2371_2180_na.py
 create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_p2771_0000_500_na.py
 create mode 100644 test/hooks/py/travis-ci/travis_tftp.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_M5208EVBE_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2500_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2600_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta64_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta64el_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_maltael_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_ae3xx_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64be_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_ax25_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_loongarch64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_spl_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_spl_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_64_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_xtensa_dc233c_na.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_i82557c_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_pcnet_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_rtl8139_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_tulip_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_sdcard_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_spi_nor_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca15_tc2_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca9x4_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_xilinx_versal_virt_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_xilinx_zynq_virt_qemu.py
 create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_zynq_zc702_qemu.py

diff --git a/test/hooks/README.md b/test/hooks/README.md
new file mode 100644
index 00000000000..ecf8a46c4a5
--- /dev/null
+++ b/test/hooks/README.md
@@ -0,0 +1,296 @@
+# Introduction
+
+This repository contains working example support ("hook") scripts for U-Boot's
+built-in test framework. That framework is located in the `test/py/` directory
+in the U-Boot source tree.
+
+You may use these examples as a reference when creating your own hook scripts,
+or even derive your own scripts directly from the files in this repository.
+
+# Contributing
+
+See [Contributing.md](Contributing.md).
+
+# Flashing Philosophy
+
+U-Boot may be installed onto a target device either by:
+
+- Writing the U-Boot binary to flash, so that it runs at every cold boot or
+  reset. In this case, flashing is a one-time operation.
+
+- Downloading U-Boot into RAM whenever it needs to RAM. In this case, the
+  download needs to happen every time the target board is reset, since the
+  desired binary is not permanently stored on the system.
+
+The example scripts in this repository take the second approach. This approach
+avoids modifying the device's flash memory for each U-Boot binary to be tested,
+which should increase longevity of the device. This does mean that the
+implementation of the `test/py/` hook scripts is slightly inconsistent with
+their naming; `u-boot-test-flash` does nothing whereas `u-boot-test-reset`
+downloads U-Boot into RAM rather than only performing a simple system reset.
+
+# USB Port Paths
+
+When multiple USB devices of the same type are attached to the same system, some
+mechanism for differentiating between them is required, in order for software to
+choose which device to communicate with. In some cases, the only available
+mechanism is based on the physical USB port to which the device is attached. For
+this mechanism to work, there must be a stable way to uniquely name each
+physical USB port. The naming convention is known as the USB port path.
+
+Each USB bus in the system is assigned a unique number by the Linux kernel.
+These numbers are typically stable across reboots since they are assigned based
+on device creation or probing order, which is usually driven by stable
+BIOS-driven data structures. Changes to system hardware can cause these numbers
+to change though. Equally, it's a good idea to validate the bus numbers after
+reboot. The USB bus number forms the first part of the USB port path.
+
+Each USB controller or hub contains a number of physical USB ports (sockets).
+Each of these has a unique fixed number, per the USB specification. These port
+numbers form the balance of the USB port path.
+
+Linux uses the format `${bus}-${port}.${port}.${port}...` to represent the USB
+port path.
+
+For example:
+
+    +--------------+
+    | PC           |
+    | +----------+ |
+    | | USB ctlr | |
+    | | Bus 4    | |       +----------+
+    | |   Port 1 |---------| USB hub  |
+    | +----------+ |       |   Port 1 |     +-----------------+
+    +--------------+       |   Port 2------ | USB device      |
+                           |   Port 3 |     | Port path 4-1.2 |
+                           +----------+     | Bus/device 4/15 |
+                                            +-----------------+
+
+Note that USB device numbers are not stable; they change each time a device
+appears on the bus, such as when it is power cycled or reset.
+
+To determine the USB port path of your device, first manually identify a device
+node related to your USB device. For example, you might run `lsusb` with the
+device both unplugged and plugged in, find the device's bus and device number,
+and then use device file `/dev/bus/usb/${busnum}/${devnum}`. Alternatively, you
+may find some type-specific device node such as `/dev/ttyUSB2` or `/dev/sdc` by
+experimentation using tools such as `picocom` or `mount` and `ls`.
+
+Once a device node has been identified, use udevadm to query all known
+information about the device, then find an entry with `SUBSYSTEMS=="usb"` and a
+`KERNELS` value in the format of a USB port path:
+
+    $ udevadm info -a /dev/ttyUSB2
+    ...
+    looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6:1.2/ttyUSB2/tty/ttyUSB2':
+        KERNEL=="ttyUSB2"
+        SUBSYSTEM=="tty"
+        DRIVER==""
+
+    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6:1.2/ttyUSB2':
+        KERNELS=="ttyUSB2"
+        SUBSYSTEMS=="usb-serial"
+        DRIVERS=="ftdi_sio"
+    ...
+    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-6/3-6:1.2':
+        KERNELS=="3-6:1.2"
+        SUBSYSTEMS=="usb"
+        DRIVERS=="ftdi_sio"
+    ...
+    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-6':
+        KERNELS=="3-6"
+        SUBSYSTEMS=="usb"
+        DRIVERS=="usb"
+    ...
+    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3':
+        KERNELS=="usb3"
+        SUBSYSTEMS=="usb"
+        DRIVERS=="usb"
+
+Here, the USB port path is "`3-6`".
+
+or:
+
+    $ udevadm info -a /dev/bus/usb/003/086
+    ....
+    looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10.4':
+        KERNEL=="3-10.4"
+        SUBSYSTEM=="usb"
+        DRIVER=="usb"
+
+Here, the USB port path is "`3-10.4`".
+
+# udev Rules
+
+See the `udev/` directory in this repository.
+
+Testing should be performed as a non-root user. This requires that the relevant
+device nodes have non-default permissions. udev rules may be used to achieve
+this.
+
+To save hardware, it is possible to attach multiple Tegra devices to a single
+host machine. This requires that each program that interacts with the device be
+able to communicate with a specific Tegra device.
+
+Some applications allow the USB port path be passed to them as a parameter. This
+requires no configuration via udev.
+
+Some applications use device-specific properties to identify devices, such as
+the serial number encoded into a USB device descriptor. This requires no
+configuration via udev.
+
+Other applications allow a USB device filename to be passed in. udev rules may
+be used to create well-known device filenames based on a device's USB port
+path.
+
+The example udev rules demonstrate both of these types of rules.
+
+# Scripts and Binaries
+
+See the `bin/` directory in this repository.
+
+Scripts exist to power on, power off, flash, and reset Tegra boards, and access
+their serial console. The U-Boot test framework expects these scripts to exist
+in `$PATH`, and executes them at appropriate times.
+
+Note that the test framework itself does not use the power on/off scripts.
+However, they may be used by a companion continuous integration framework that
+triggers the U-Boot test framework. For example,
+https://github.com/swarren/u-boot-ci-scripts.
+
+U-Boot's test framework identifies each board by type (e.g. p2371-2180; the
+engineering name for Jetson TX1) and identity (an arbitrary user-assigned string
+used to differentiate multiple instances of the same board type within a user's
+testing setup). Each script is passed these two parameters to inform it which
+board to operate upon.
+
+Different test setups will use different techniques to control target hardware.
+For example, reset and forced recovery signals may be manipulated through
+NVIDIA's proprietary PM342 debug board, or some form of relay or electronic
+switch board hard-wired to the board's physical buttons.
+
+The scripts are written to be highly generic, and allow sharing of code between
+boards. To this end, the top-level implementation of each script does little
+more than include a board-specific configuration file, and then include another
+file specific to implementation the desired action.
+
+Board configuration files are located in
+`bin/${hostname}/conf.${board_type}_${board_identity}`. These files are
+segregated by hostname so that the repository can be used directly across
+multiple different test machines, without the need for host-specific branches or
+post-checkout configuration.
+
+The board configuration file defines which mechanism is used for each possible
+action, and any parameters associated with it. For example, downloading U-Boot
+into RAM may used either the `tegra-uboot-flasher` tool for boards containing
+T124 or earlier, or L4T's `exec-uboot.sh` for boards containing T210 or newer.
+These scripts. In each case, the directory name where the tool is installed must
+be defined.
+
+Each action is implemented in a script fragment directly in the `bin/` directory,
+with filename `${action_type}.${implementation_name}`.
+
+If using these scripts directly for testing Tegra devices, it is likely that
+you will not need to create new `download.*` implementations, but will need to
+create new `poweroff.*`, `poweron.*`, and `recovery.*` implementations.
+
+Observe that some external tools (`download.*` especially) invoked by these
+scripts must be replicated once per board instance, or their actions somehow
+serialized, since they copy files into their own directories when executing, and
+hence parallel execution would cause incorrect operation.
+
+## Labgrid Integration
+
+Labgrid is a python library for embedded-board-control. It includes a client
+program which is used to integrate with the U-Boot pytests.
+
+Since Labgrid has all the information necessary to build and boot on a lab,
+there is no per-board configuration required. The various flash.xxx and
+recovery.xxx scripts are not used. To set it up, one implementation is:
+
+- In your bin/$hostname directory, create an executable file
+  `common-labgrid-sjg` and set your crossbar and environment information, for
+  example:
+
+      # Hostname and port for the gRPC coordinator
+      export LG_COORDINATOR=kea:20408
+
+      # Environment file for the lab
+      export LG_ENV="/path/to/kea_env.cfg"
+
+      # Location of the U-Boot test hooks
+      export UB_TEST_HOOKS=/path/to/u-boot-test-hooks
+
+      # Make sure only one buildman can run at a time, since it uses all CPUs
+      export BUILDMAN_PROCESS_LIMIT=1
+
+      # Use the internal console since microcom can miss serial input at boot
+      export LG_CONSOLE="internal"
+
+      # Tell u-boot-test-hooks to use the Labgrid-sjg integration
+      export USE_LABGRID_SJG=1
+
+      flash_impl=none
+      reset_impl=none
+      console_impl=labgrid-sjg
+      release_impl=labgrid-sjg
+      getrole_impl=labgrid-sjg
+      power_impl=none
+
+The last 6 lines tell the hooks to use Labgrid for console and board release
+as well as a new 'getrole' hook which is only used by Labgrid. The flash, reset
+and power features of boards are all handled by entirely by Labgrid.
+
+Then create another executable file (in the same directory) called 'conf.all',
+containing::
+
+    .. code-block:: bash
+
+    . "${bin_dir}/${hostname}/common-labgrid-sjg"
+
+That should be all that is needed.
+
+An alternate implementation requires setting the following environment
+variables must be set as per your lab:
+
+- `LG_CROSSBAR` must point at the crossbar service.
+- `LG_PLACE` must point at the device under test.
+- `LG_ENV` must point at the labgrid yaml file that describes your lab.
+
+In order for a given platform to be tested, it must be acquired before starting
+tests and then released once complete. See the bin/konsulko-labgrid directory
+for example boards using this method.
+
+## Dependencies
+
+The example scripts depend on various external tools, the installation location
+of which must be specified in the board configuration files:
+
+- `tegra-uboot-flasher`; see
+  https://github.com/NVIDIA/tegra-uboot-flasher-scripts.
+- L4T's flashing tools. This must be a regular L4T host-side installation,
+  possibly stripped down to contain just:
+  - The top-level directory (which contains `flash.sh` and `*.conf`).
+  - The `bootloader/` directory.
+  - The `kernel/` directory.
+- `imx_usb`; see
+  https://github.com/boundarydevices/imx_usb_loader.
+- As-yet-unpublished scripts to control various USB relay boards.
+
+U-Boot's test framework also requires a `dfu-util` that supports the -p
+command-line option. Most distros provide this nowadays.
+
+# Python Modules
+
+See the `py/` directory in this repository.
+
+A Python module exists for each board and defines numerous parameters used by
+the U-Boot test framework. The framework expects to simply import these modules
+directly, and hence they must be locatable within `$PYTHONPATH`.
+
+These modules are again located in a separate directory for each host, so that
+the repository may be shared across hosts.
+
+For complete details re: the required content of these Python modules, please
+see `test/py/README.md` in the U-boot source tree, and also the comments in some
+individual test files in `test/py/tests/test_*.py`.
diff --git a/test/hooks/bin/OLI01/conf.mx6qsabrelite_na b/test/hooks/bin/OLI01/conf.mx6qsabrelite_na
new file mode 100644
index 00000000000..8f29cb59e9c
--- /dev/null
+++ b/test/hooks/bin/OLI01/conf.mx6qsabrelite_na
@@ -0,0 +1,26 @@
+# Copyright (c) 2016, Guillaume GARDET. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyUSB0
+power_impl=manual
+flash_impl=none
+reset_impl=recovery_download
+recovery_impl=manual
+download_impl=imx_usb
diff --git a/test/hooks/bin/bill-the-cat/conf.integratorcp_cm926ejs_qemu b/test/hooks/bin/bill-the-cat/conf.integratorcp_cm926ejs_qemu
new file mode 100644
index 00000000000..d6e2f19b9e0
--- /dev/null
+++ b/test/hooks/bin/bill-the-cat/conf.integratorcp_cm926ejs_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="integratorcp"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/bill-the-cat/conf.qemu_mips_na b/test/hooks/bin/bill-the-cat/conf.qemu_mips_na
new file mode 100644
index 00000000000..7a0ea036910
--- /dev/null
+++ b/test/hooks/bin/bill-the-cat/conf.qemu_mips_na
@@ -0,0 +1,28 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="mips"
+qemu_binary="qemu-system-mips"
+qemu_extra_args="-nographic -monitor null"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash,format=raw"
+qemu_helper_script="qemu-mips"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/bill-the-cat/conf.vexpress_ca15_tc2_qemu b/test/hooks/bin/bill-the-cat/conf.vexpress_ca15_tc2_qemu
new file mode 100644
index 00000000000..070b78b0741
--- /dev/null
+++ b/test/hooks/bin/bill-the-cat/conf.vexpress_ca15_tc2_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="vexpress-a15"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -m 1G"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/common-config.cros-servo-dut-control b/test/hooks/bin/common-config.cros-servo-dut-control
new file mode 100755
index 00000000000..70826e1b6f1
--- /dev/null
+++ b/test/hooks/bin/common-config.cros-servo-dut-control
@@ -0,0 +1,69 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# This can be included by config files to set the cros_servo_port and
+# console_dev variables.
+
+# It requires:
+# - standalone-hdctools to be installed at the same level as u-boot-test-hooks
+#     (i.e. at /path/to/u-boot-test-hooks/../standalone-hdctools)
+# - a servo board connected. Servo is used to control resetting the board and to
+#     access the serial console
+# - a servodrc also at the directory above u-boot-test-hooks (see sample below)
+# - 'servo_name' variable set to the board name, before including this script
+
+# Install hdctools here
+# https://chromium.googlesource.com/a/chromiumos/platform/standalone-hdctools
+
+# Information on servo here:
+# https://chromium.googlesource.com/chromiumos/third_party/hdctools/+/refs/heads/master/README.md
+
+# the ubtest directory holds u-boot-test-hooks and other things
+UBTEST_DIR="$(dirname "$(dirname "$(dirname "${BASH_SOURCE[0]}")")")"
+RCFILE="${UBTEST_DIR}/servodrc"
+DUT_CONTROL="${UBTEST_DIR}/standalone-hdctools/dut-control"
+
+# Look up the servo_name and get the port number
+cros_servo_port="$(grep ^${cros_servo_name}, ${RCFILE} |cut -f3 -d,)"
+if [ -z "${cros_servo_port}" ]; then
+    echo "Failed to find servo port for ${cros_servo_name}"
+    exit 1
+fi
+
+# Find the console
+console_dev="$(${DUT_CONTROL} -p ${cros_servo_port} cpu_uart_pty |cut -f2 -d:)"
+if [ -z "${console_dev}" ]; then
+    echo "Failed to find console for ${cros_servo_name}"
+    exit 1
+fi
+
+
+# Here is a sample servodrc
+# This file describes servo boards connected to this host.
+#
+# Line text starting with # to end of line is ignored, as well as empy lines.
+#
+# Configuration lines consist of up to 4 comma separated fields, the last
+# two are optional:
+#
+# name serial-number port-number board
+#
+# Remove the # from the next line
+# link, 905537-00223, 9902, link
diff --git a/test/hooks/bin/common.labgrid-trini b/test/hooks/bin/common.labgrid-trini
new file mode 100644
index 00000000000..e07107462a5
--- /dev/null
+++ b/test/hooks/bin/common.labgrid-trini
@@ -0,0 +1,35 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Ensure we have all environment variables set
+if [ -z "${LG_CROSSBAR}" ]; then
+	echo "LG_CROSSBAR is unset";
+	exit 1;
+fi
+
+if [ -z "${LG_PLACE}" ]; then
+	echo "LG_PLACE is unset";
+	exit 1;
+fi
+
+if [ -z "${LG_ENV}" ]; then
+	echo "LG_ENV is unset";
+	exit 1;
+fi
diff --git a/test/hooks/bin/console.fvp b/test/hooks/bin/console.fvp
new file mode 100644
index 00000000000..eacae7d107d
--- /dev/null
+++ b/test/hooks/bin/console.fvp
@@ -0,0 +1,28 @@
+# Copyright (c) 2025 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# We must be passed the arguments to pass to FVP
+ARGS="${fvp_args}"
+
+"${fvp_binary}" ${ARGS} &
+
+# We need to wait for FVP to have spawned itself before launching telnet
+sleep 1
+exec telnet localhost 5000
diff --git a/test/hooks/bin/console.labgrid-sjg b/test/hooks/bin/console.labgrid-sjg
new file mode 100644
index 00000000000..85e7da54373
--- /dev/null
+++ b/test/hooks/bin/console.labgrid-sjg
@@ -0,0 +1,42 @@
+# Copyright 2024 Google LLC
+# Written by Simon Glass
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# The variables here can come from one of two places:
+#
+# 1. When using the ub-xxx scripts (e.g. ub-int) they come from those scripts,
+#    set by the get_args.sh script
+#
+# 2. When running from gitlab, the variables are all empty and so take the
+#    default values below, except for ${strategy} which is set in the gitlab
+#    script
+
+# On input:
+# strategy: Strategy arguments to use, e.g. "-s start". Normally this is
+# "-s uboot -e off" but it can be "-s start -e off" or even empty
+# verbose: Verbose argument to use, e.g. "-v"
+#
+# These variables are set by .gitlab-ci.yml or by
+
+exec labgrid-client -V do-bootstrap ${bootstrap:-1} -V do-build ${build:-1} \
+    -V do-send ${send:-0} -V do-clean ${clean:-0} \
+    -V process-limit ${BUILDMAN_PROCESS_LIMIT:-0} \
+    -r "${U_BOOT_BOARD_IDENTITY}" ${strategy} ${verbose} -a console \
+    ${console_log}
diff --git a/test/hooks/bin/console.labgrid-trini b/test/hooks/bin/console.labgrid-trini
new file mode 100755
index 00000000000..a2678cc6050
--- /dev/null
+++ b/test/hooks/bin/console.labgrid-trini
@@ -0,0 +1,24 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Ensure we have all environment variables set
+. common.labgrid-trini
+
+exec labgrid-client console
diff --git a/test/hooks/bin/console.picocom b/test/hooks/bin/console.picocom
new file mode 100644
index 00000000000..5960e9f2aa0
--- /dev/null
+++ b/test/hooks/bin/console.picocom
@@ -0,0 +1,42 @@
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+if [ -z "${console_baud}" ]; then
+    console_baud=115200
+fi
+
+# Some boards have a UART built into them and it doesn't appear until the
+# board is powered on. An example is zynq_zybo. Try to handle this by waiting
+# for the console and then continuing as soon as possible (so we don't miss
+# the U-Boot banner).
+if [ -n "${console_wait}" ]; then
+    for i in {0..99}; do
+        if [ -e "${console_dev}" ]; then
+            break
+        fi
+        sleep .1
+    done
+    if [ ! -e "${console_dev}" ]; then
+        echo "Console ${console_dev} not found"
+        exit 1
+    fi
+fi
+
+exec picocom -b "${console_baud}" "${console_dev}"
diff --git a/test/hooks/bin/console.qemu b/test/hooks/bin/console.qemu
new file mode 100644
index 00000000000..14650a2df59
--- /dev/null
+++ b/test/hooks/bin/console.qemu
@@ -0,0 +1,35 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+ARGS=""
+if [ ! -z "${qemu_extra_args}" ]; then
+  ARGS+="${qemu_extra_args} "
+fi
+
+# We must have these arguments
+ARGS+="-M ${qemu_machine}"
+ARGS+=" ${qemu_kernel_args}"
+
+# If we have a helper script to run, run it.
+if [ ! -z "${qemu_helper_script}" ]; then
+  . "${bin_dir}/qemu.${qemu_helper_script}"
+fi
+
+exec "${qemu_binary}" ${ARGS}
diff --git a/test/hooks/bin/download.imx_usb b/test/hooks/bin/download.imx_usb
new file mode 100644
index 00000000000..06522f1c792
--- /dev/null
+++ b/test/hooks/bin/download.imx_usb
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+# Copyright (c) 2016, Guillaume GARDET. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+sudo imx_usb -v ${U_BOOT_BUILD_DIR}/u-boot.imx
diff --git a/test/hooks/bin/download.l4t-exec-uboot b/test/hooks/bin/download.l4t-exec-uboot
new file mode 100644
index 00000000000..d5ccb979d77
--- /dev/null
+++ b/test/hooks/bin/download.l4t-exec-uboot
@@ -0,0 +1,25 @@
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+link=`readlink "${board_usb_dev}"`
+instance=`echo "${link}" | sed -e "s@bus/usb@@"`
+
+cp "${U_BOOT_BUILD_DIR}"/u-boot{,.bin,.dtb,-dtb.bin} "${download_l4t}/bootloader/t210ref/${board_type}/"
+sudo "${download_l4t}/bootloader/exec-uboot.sh" --instance "${instance}" "${board_type}"
diff --git a/test/hooks/bin/download.tegra-uboot-flasher b/test/hooks/bin/download.tegra-uboot-flasher
new file mode 100755
index 00000000000..53f790e17d9
--- /dev/null
+++ b/test/hooks/bin/download.tegra-uboot-flasher
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+"${tubf_bin}/build" --boards "${tubf_board}" import-uboot "${U_BOOT_BUILD_DIR}"
+"${tubf_bin}/tegra-uboot-flasher" exec --usb-port-path "${board_usb_port_path}" "${tubf_config}"
diff --git a/test/hooks/bin/ellesmere/common-labgrid-sjg b/test/hooks/bin/ellesmere/common-labgrid-sjg
new file mode 100755
index 00000000000..6b3eff5f277
--- /dev/null
+++ b/test/hooks/bin/ellesmere/common-labgrid-sjg
@@ -0,0 +1,46 @@
+# Copyright 2024 Google LLC
+# Written by Simon Glass
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Hostname and port for the gRPC coordinator
+export LG_COORDINATOR=kea:20408
+
+# Environment file for the lab
+export LG_ENV=/vid/software/devel/ubtest/lab/cfg/kea_env.cfg
+
+# Make sure only one buildman can run at a time, since it uses all CPUs
+export BUILDMAN_PROCESS_LIMIT=1
+
+# Location of the U-Boot test hooks
+export UB_TEST_HOOKS=/vid/software/devel/ubtest/u-boot-test-hooks
+
+# Use the internal console since microcom can miss serial input at boot
+export LG_CONSOLE=internal
+
+# Tell u-boot-test-hooks to use the Labgrid integration
+export USE_LABGRID_SJG=1
+
+
+flash_impl=none
+reset_impl=none
+console_impl=labgrid-sjg
+release_impl=labgrid-sjg
+getrole_impl=labgrid-sjg
+power_impl=none
diff --git a/test/hooks/bin/ellesmere/conf.all b/test/hooks/bin/ellesmere/conf.all
new file mode 100644
index 00000000000..4a82ee7b30f
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.all
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+# Copyright 2024 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "${bin_dir}/${hostname}/common-labgrid-sjg"
diff --git a/test/hooks/bin/ellesmere/conf.evb-ast2500_qemu b/test/hooks/bin/ellesmere/conf.evb-ast2500_qemu
new file mode 100644
index 00000000000..7f0f3c56e00
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.evb-ast2500_qemu
@@ -0,0 +1,11 @@
+# Copyright 2019 IBM Corp.
+# Joel Stanley <joel@jms.id.au>
+# SPDX-License-Identifier: GPL-2.0+
+
+console_impl=qemu
+qemu_machine="ast2500-evb"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -m 512M -serial mon:stdio -net nic,model=ftgmac100 -net user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR}"
+qemu_kernel_args="-drive file=${U_BOOT_BUILD_DIR}/flash.img,format=raw,if=mtd"
+reset_impl=none
+flash_impl=qemu_gen_padded_image
diff --git a/test/hooks/bin/ellesmere/conf.qemu-riscv32_na b/test/hooks/bin/ellesmere/conf.qemu-riscv32_na
new file mode 120000
index 00000000000..0646dbcd185
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu-riscv32_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu-riscv32_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu-riscv32_spl_na b/test/hooks/bin/ellesmere/conf.qemu-riscv32_spl_na
new file mode 120000
index 00000000000..ceda23fa712
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu-riscv32_spl_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu-riscv32_spl_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu-riscv64_na b/test/hooks/bin/ellesmere/conf.qemu-riscv64_na
new file mode 120000
index 00000000000..085574b9eac
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu-riscv64_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu-riscv64_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu-x86_64_na b/test/hooks/bin/ellesmere/conf.qemu-x86_64_na
new file mode 120000
index 00000000000..3a1470e9d89
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu-x86_64_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu-x86_64_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu-x86_na b/test/hooks/bin/ellesmere/conf.qemu-x86_na
new file mode 120000
index 00000000000..f6e7e5a764e
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu-x86_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu-x86_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu_arm64_na b/test/hooks/bin/ellesmere/conf.qemu_arm64_na
new file mode 120000
index 00000000000..cf56db1ebf3
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu_arm64_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu_arm64_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu_arm64_spl_na b/test/hooks/bin/ellesmere/conf.qemu_arm64_spl_na
new file mode 120000
index 00000000000..abbbc0247a3
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu_arm64_spl_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu_arm64_spl_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu_arm_na b/test/hooks/bin/ellesmere/conf.qemu_arm_na
new file mode 120000
index 00000000000..aa91a9ff653
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu_arm_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu_arm_na
\ No newline at end of file
diff --git a/test/hooks/bin/ellesmere/conf.qemu_arm_spl_na b/test/hooks/bin/ellesmere/conf.qemu_arm_spl_na
new file mode 120000
index 00000000000..e171c5a98d0
--- /dev/null
+++ b/test/hooks/bin/ellesmere/conf.qemu_arm_spl_na
@@ -0,0 +1 @@
+../travis-ci/conf.qemu_arm_spl_na
\ No newline at end of file
diff --git a/test/hooks/bin/flash.em100 b/test/hooks/bin/flash.em100
new file mode 100644
index 00000000000..17ab18875e0
--- /dev/null
+++ b/test/hooks/bin/flash.em100
@@ -0,0 +1,30 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Designed for using a Dediprog EM100Pro or Pro-G2 SPI-flash emulator
+# https://www.dediprog.com/product/EM100Pro-G2
+# (the older EM100Pro works but is not listed anymore)
+
+# It requires these tools:
+# em100 at https://review.coreboot.org/cgit/em100.git
+# Instructions at https://www.coreboot.org/EM100pro
+
+em100 -x "${em100_serial}" -s -p LOW -d "${U_BOOT_BUILD_DIR}/u-boot.rom" \
+    -c "${em100_chip}" -r
diff --git a/test/hooks/bin/flash.fiptool b/test/hooks/bin/flash.fiptool
new file mode 100644
index 00000000000..23014f2bbe8
--- /dev/null
+++ b/test/hooks/bin/flash.fiptool
@@ -0,0 +1,22 @@
+# Copyright (c) 2025 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Call fiptool to update an existing fip.bin file
+fiptool update --nt-fw="${U_BOOT_BUILD_DIR}/u-boot.bin" ${fip}
diff --git a/test/hooks/bin/flash.flashair b/test/hooks/bin/flash.flashair
new file mode 100644
index 00000000000..8cedbb87a90
--- /dev/null
+++ b/test/hooks/bin/flash.flashair
@@ -0,0 +1,45 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Make sure that the card is available to us now.
+while true; do
+    ping -c 1 ${flashair_ip} >/dev/null 2>&1
+    if [ $? -eq 0 ]; then
+        break;
+    fi
+done
+
+# Make our new holding space.
+UL_DIR=`mktemp -d`
+
+# Run this script to copy files as they must appear on the target into
+# the given directory.
+. "${bin_dir}/${flashair_copy_script}"
+
+# Collect all arguments
+ARGS=()
+if [ ! -z "${flashair_rmlist}" ]; then
+  ARGS+=("rmlist:${flashair_rmlist}")
+fi
+
+ARGS+=("push:${UL_DIR}")
+push-flashair.py ${flashair_ip} "${ARGS[@]}"
+
+rm -rf "${UL_DIR}" "${flashair_rmlist}"
diff --git a/test/hooks/bin/flash.labgrid-trini.sd-mux b/test/hooks/bin/flash.labgrid-trini.sd-mux
new file mode 100644
index 00000000000..a9648dc1dad
--- /dev/null
+++ b/test/hooks/bin/flash.labgrid-trini.sd-mux
@@ -0,0 +1,31 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Ensure we have all environment variables set
+. common.labgrid-trini
+
+echo "switching sd-mux to host"
+labgrid-client sd-mux host
+#let mmc have some time to initialize to be available for udisks
+sleep 1
+. writer.${flash_writer}
+
+echo "switching sd-mux to dut"
+labgrid-client sd-mux dut
diff --git a/test/hooks/bin/flash.none b/test/hooks/bin/flash.none
new file mode 100644
index 00000000000..4c3b1b53c33
--- /dev/null
+++ b/test/hooks/bin/flash.none
@@ -0,0 +1,21 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# No flashing needed
diff --git a/test/hooks/bin/flash.qemu_gen_padded_image b/test/hooks/bin/flash.qemu_gen_padded_image
new file mode 100755
index 00000000000..3b413fecdc8
--- /dev/null
+++ b/test/hooks/bin/flash.qemu_gen_padded_image
@@ -0,0 +1,15 @@
+# Copyright 2019 IBM Corp.
+# Joel Stanley <joel@jms.id.au>
+# SPDX-License-Identifier: GPL-2.0+
+
+# TODO: Work out a better temp directory
+FLASH_IMG="${U_BOOT_BUILD_DIR}"/flash.img
+
+# Allow custom flash image size
+FLASH_SIZE="${flash_size:=32}"
+
+# Allow custom U-Boot binaries
+U_BOOT_BIN="${flash_u_boot_bin:=u-boot.bin}"
+
+dd if=/dev/zero of="${FLASH_IMG}" count="${FLASH_SIZE}" bs=1M
+dd if="${U_BOOT_BUILD_DIR}/${U_BOOT_BIN}" of="${FLASH_IMG}" conv=notrunc
diff --git a/test/hooks/bin/flash.recovery_l4t b/test/hooks/bin/flash.recovery_l4t
new file mode 100644
index 00000000000..0c4bd0d0f3a
--- /dev/null
+++ b/test/hooks/bin/flash.recovery_l4t
@@ -0,0 +1,44 @@
+# Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "${bin_dir}/recovery.${recovery_impl}"
+
+# USB enumeration delay
+for ((i = 0; i <= 100; i++)); do
+    if [ -e "${board_usb_dev}" ]; then
+        break
+    fi
+    sleep 0.1
+done
+sleep 1
+
+cp "${U_BOOT_BUILD_DIR}"/u-boot-dtb.bin "${flash_l4t}/${flash_l4t_uboot_path}/u-boot.bin"
+# FIXME: To speed things up here, we could add "-k kernel" and just reflash the
+# "kernel" partition (which holds U-Boot when it's in use). However, this
+# relies on having the right L4T already flashed, which isn't likely on my
+# system since I use the board for other things.
+(cd "${flash_l4t}" && sudo "${flash_l4t}/flash.sh" --usb-instance "${board_usb_port_path}" -r "${flash_l4t_board}" mmcblk0p1)
+# Prevent the system from booting before the reset script is run. Otherwise,
+# either (a) the test system won't capture the start of the UART log, or (b)
+# U-Boot will start running early, and the test system will start capturing
+# part way through boot, and see extra copies of all the U-Boot messages, and
+# hence fail the boot test. Ideally, flash.sh wouldn't auto-reset/boot the
+# system.
+. "${bin_dir}/recovery.${recovery_impl}"
diff --git a/test/hooks/bin/flash.sdwire_common_mount b/test/hooks/bin/flash.sdwire_common_mount
new file mode 100644
index 00000000000..b76add064fb
--- /dev/null
+++ b/test/hooks/bin/flash.sdwire_common_mount
@@ -0,0 +1,80 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Handles the common SDwire mounting (caller does power control)
+
+mount_dir=/media/${mount_point}
+
+# Switch over to get USB card access
+sd-mux-ctrl --device-serial ${sdwire_serial} --ts
+
+complete=false
+for i in {0..9}; do
+    if out="$(mount UUID=${mount_uuid} 2>&1)"; then
+        complete=true
+        break
+    fi
+    echo $out
+
+    # If it is already mounted, try to unmount it first. It may have been
+    # mounted by another user so we won't have the access we need. If this gives
+    # an error then we know we cannot continue
+    if [[ $out == *"already mounted"* ]]; then
+        umount UUID=${mount_uuid}
+    fi
+    sleep 1
+done
+if [[ $complete = false ]]; then
+    echo "Failed to mount UUID ${mount_uuid} after 10 tries"
+    exit 1
+fi
+
+# Sanity check
+if ! mountpoint -q ${mount_dir}; then
+    echo "Mount ${mount_dir} not available after 'mount'"
+    exit 1
+fi
+
+# Perform the write, pass along as much environment as possible
+. writer.${flash_writer}
+
+complete=false
+for i in {0..9}; do
+    if out="$(umount ${mount_dir} 2>&1)"; then
+        complete=true
+        break
+    fi
+    echo $out
+    sleep 1
+done
+
+if [[ $complete = false ]]; then
+    echo "Failed to umount UUID ${mount_uuid} after 10 tries"
+    exit 1
+fi
+
+# Sanity check
+if mountpoint -q ${mount_dir}; then
+    echo "Mount ${mount_dir} still available after 'umount'"
+    exit 1
+fi
+
+# Back to card access for the DUT
+sd-mux-ctrl --device-serial ${sdwire_serial} --dut
diff --git a/test/hooks/bin/flash.sdwire_digital-loggers_raw b/test/hooks/bin/flash.sdwire_digital-loggers_raw
new file mode 100644
index 00000000000..f9956f7ed04
--- /dev/null
+++ b/test/hooks/bin/flash.sdwire_digital-loggers_raw
@@ -0,0 +1,41 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Designed for using SDwire uSD mux and ykush USB power control:
+# https://wiki.tizen.org/SDWire
+# https://dlidirect.com/products/new-pro-switch
+
+# It requires these tools:
+# sd-mux-ctrl at https://git.tizen.org/cgit/tools/testlab/sd-mux/
+# curl to control the power switch
+
+# Power off
+curl --data ${power_port}=OFF -o /dev/null --silent \
+	http://${power_user:-admin}:${power_pass:-1234}@${power_ip}/outlet
+
+# Switch over to get USB card access
+sd-mux-ctrl --device-serial ${sdwire_serial} --ts
+
+. wait_raw_device
+
+writer.${flash_writer} ${raw_device} ${U_BOOT_BUILD_DIR}
+
+# Back to card access for the DUT
+sd-mux-ctrl --device-serial ${sdwire_serial} --dut
diff --git a/test/hooks/bin/flash.sdwire_poweroff_mount b/test/hooks/bin/flash.sdwire_poweroff_mount
new file mode 100644
index 00000000000..a44a524b7d8
--- /dev/null
+++ b/test/hooks/bin/flash.sdwire_poweroff_mount
@@ -0,0 +1,32 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Designed for using SDwire uSD mux and ykush USB power control:
+# https://wiki.tizen.org/SDWire
+# https://www.yepkit.com/products/ykush
+
+# It requires these tools:
+# sd-mux-ctrl at https://git.tizen.org/cgit/tools/testlab/sd-mux/
+# ykushcmd at https://github.com/Yepkit/ykush
+
+# Power off
+. poweroff.${power_impl}
+
+. flash.sdwire_common_mount
diff --git a/test/hooks/bin/flash.sdwire_poweroff_raw b/test/hooks/bin/flash.sdwire_poweroff_raw
new file mode 100644
index 00000000000..d82a3ef836a
--- /dev/null
+++ b/test/hooks/bin/flash.sdwire_poweroff_raw
@@ -0,0 +1,42 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Designed for using SDwire uSD mux and ykush USB power control:
+# https://wiki.tizen.org/SDWire
+# https://www.yepkit.com/products/ykush
+
+# It requires these tools:
+# sd-mux-ctrl at https://git.tizen.org/cgit/tools/testlab/sd-mux/
+# ykushcmd at https://github.com/Yepkit/ykush
+
+mount_dir=/media/${mount_point}
+
+# Power off
+. poweroff.${power_impl}
+
+# Switch over to get USB card access
+sd-mux-ctrl --device-serial ${sdwire_serial} --ts
+
+. wait_raw_device
+
+writer.${flash_writer} ${raw_device} ${U_BOOT_BUILD_DIR}
+
+# Back to card access for the DUT
+sd-mux-ctrl --device-serial ${sdwire_serial} --dut
diff --git a/test/hooks/bin/flash.sdwire_relay_mount b/test/hooks/bin/flash.sdwire_relay_mount
new file mode 100644
index 00000000000..f75d33f9fd0
--- /dev/null
+++ b/test/hooks/bin/flash.sdwire_relay_mount
@@ -0,0 +1,34 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Designed for using SDwire uSD mux and selected power control:
+# https://wiki.tizen.org/SDWire
+
+# It requires these tools:
+# sd-mux-ctrl at https://git.tizen.org/cgit/tools/testlab/sd-mux/
+# usbrelay
+
+. poweroff.${power_impl}
+
+sleep 0.1
+
+. flash.sdwire_common_mount
+
+. poweron.${power_impl}
diff --git a/test/hooks/bin/flashair.rpi b/test/hooks/bin/flashair.rpi
new file mode 100644
index 00000000000..2c2756c7308
--- /dev/null
+++ b/test/hooks/bin/flashair.rpi
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# Copyright (c) 2016 Stephen Warren <swarren@wwwdotorg.org>
+# Copyright (c) 2016 Konsulko Group
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright notice,
+#   this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name of the copyright holder nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+cp "${U_BOOT_BUILD_DIR}"/u-boot.bin "${UL_DIR}"/u-boot.bin
+
+touch "${UL_DIR}/config.txt"
+
+echo "enable_uart=1" >> "${UL_DIR}/config.txt"
+echo "kernel=u-boot.bin" >> "${UL_DIR}/config.txt"
+
+case "${board_type}" in
+rpi_3|rpi_3b|rpi_3_b_plus|rpi_4|rpi_arm64)
+    echo "arm_64bit=1" >> "${UL_DIR}/config.txt"
+    ;;
+esac
+
+case "${board_ident}" in
+3-32-pl011)
+    echo "dtoverlay=pi3-miniuart-bt" >> "${UL_DIR}/config.txt"
+    ;;
+esac
diff --git a/test/hooks/bin/flashair.ti-omap b/test/hooks/bin/flashair.ti-omap
new file mode 100644
index 00000000000..aa271b20b97
--- /dev/null
+++ b/test/hooks/bin/flashair.ti-omap
@@ -0,0 +1,26 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+#
+# This script will copy the 'MLO' and 'u-boot.img' files into the correct
+# location for the flashair wrapper to upload them.  The 'MLO' file is what
+# the ROM found in most 32bit TI platforms (other than the Keystone family)
+# will look for when booting from a FAT partition.
+
+cp "${U_BOOT_BUILD_DIR}"/{MLO,u-boot.img} "${UL_DIR}/"
diff --git a/test/hooks/bin/getrole.labgrid-sjg b/test/hooks/bin/getrole.labgrid-sjg
new file mode 100755
index 00000000000..7cef0a5064d
--- /dev/null
+++ b/test/hooks/bin/getrole.labgrid-sjg
@@ -0,0 +1,34 @@
+# Copyright 2024 Google LLC
+# Written by Simon Glass
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+[ -n "${do_configure}" ] && config_arg=",config_file"
+
+# The following spurious output is present with Python 3.12 on Ubuntu 24.04 so
+# use a redirection to drop it:
+
+# Error in sys.excepthook:
+#
+# Original exception was:
+#
+
+exec labgrid-client -r "${target}" -a query -n \
+	UBootProviderDriver:board,board_extra,source_dir,build_dir,build_dir_extra${config_arg} \
+	2>/dev/null
diff --git a/test/hooks/bin/kea/conf.Linksprite_pcDuino3_sjg-pcduino3 b/test/hooks/bin/kea/conf.Linksprite_pcDuino3_sjg-pcduino3
new file mode 100644
index 00000000000..0ef71c9261a
--- /dev/null
+++ b/test/hooks/bin/kea/conf.Linksprite_pcDuino3_sjg-pcduino3
@@ -0,0 +1,33 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyusb_port2
+reset_impl=ykush
+flash_impl=sdwire_poweroff_raw
+power_impl=ykush
+
+flash_writer=sunxi_raw
+
+ykush_serial=YK17698
+ykush_port=2
+
+sdwire_serial=sdwire-7
+
+raw_device=/dev/sdcard0
diff --git a/test/hooks/bin/kea/conf.chromebook_link_sjg-link b/test/hooks/bin/kea/conf.chromebook_link_sjg-link
new file mode 100644
index 00000000000..ac10acbc7a1
--- /dev/null
+++ b/test/hooks/bin/kea/conf.chromebook_link_sjg-link
@@ -0,0 +1,30 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+reset_impl=cros_servo
+flash_impl=em100
+power_impl=cros_servo
+
+em100_chip=W25Q64FV
+em100_serial=DP022781
+
+cros_servo_name=link
+
+. common-config.cros-servo-dut-control
diff --git a/test/hooks/bin/kea/conf.chromebook_samus_sjg-samus b/test/hooks/bin/kea/conf.chromebook_samus_sjg-samus
new file mode 100644
index 00000000000..0e7db499a8d
--- /dev/null
+++ b/test/hooks/bin/kea/conf.chromebook_samus_sjg-samus
@@ -0,0 +1,30 @@
+# Copyright 2021 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+reset_impl=servo
+flash_impl=em100
+power_impl=servo
+
+em100_chip=W25Q64FV
+em100_serial=DP033694
+
+servo_name=samus
+
+. ubtest_common
diff --git a/test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1 b/test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1
new file mode 100644
index 00000000000..1883254d916
--- /dev/null
+++ b/test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1
@@ -0,0 +1,38 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+relay_type=6QMBS_
+
+console_dev=/dev/ttyusb_port3
+reset_impl=usbrelay
+flash_impl=none
+reset_impl=recovery_download
+recovery_impl=usbrelay
+
+usbrelay_power=1
+usbrelay_reset=2
+usbrelay_recovery=3
+
+board_usb_dev=/dev/usbdev-jetson-tk1
+download_impl=tegra-uboot-flasher
+tubf_bin=/vid/software/devel/tegra/tegra-uboot-flasher-scripts
+tubf_board=jetson-tk1
+tubf_config=jetson-tk1
+board_usb_port_path=4-10.1.1
diff --git a/test/hooks/bin/kea/conf.minnowmax_sjg-minnowmax b/test/hooks/bin/kea/conf.minnowmax_sjg-minnowmax
new file mode 100644
index 00000000000..c98df9844d9
--- /dev/null
+++ b/test/hooks/bin/kea/conf.minnowmax_sjg-minnowmax
@@ -0,0 +1,33 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyusb_port7
+reset_impl=digital-loggers
+flash_impl=em100
+power_impl=digital-loggers
+
+power_ip="192.168.4.19"
+power_user="admin"
+power_pass="1234"
+power_port=6
+
+em100_dev=/dev/em100_0
+em100_serial=DP139140
+em100_chip=W25Q64DW
diff --git a/test/hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc b/test/hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc
new file mode 100644
index 00000000000..f168e76335d
--- /dev/null
+++ b/test/hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc
@@ -0,0 +1,35 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyusb_port4
+reset_impl=digital-loggers
+flash_impl=sdwire_digital-loggers_raw
+power_impl=digital-loggers
+
+flash_writer=sunxi_raw
+
+power_ip="192.168.4.19"
+power_user="admin"
+power_pass="1234"
+power_port=1
+
+sdwire_serial=202001064004
+
+raw_device=/dev/sdcard1
diff --git a/test/hooks/bin/kea/conf.rock2_sjg-rock2 b/test/hooks/bin/kea/conf.rock2_sjg-rock2
new file mode 100644
index 00000000000..6cb09021cb0
--- /dev/null
+++ b/test/hooks/bin/kea/conf.rock2_sjg-rock2
@@ -0,0 +1,33 @@
+# Copyright (c) 2020 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyusb_port8
+reset_impl=ykush
+flash_impl=sdwire_poweroff_raw
+power_impl=ykush
+
+flash_writer=rk3288_raw
+
+ykush_serial=YK17698
+ykush_port=3
+
+sdwire_serial=sdwireda10
+
+raw_device=/dev/sdcard3
diff --git a/test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b b/test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b
new file mode 100644
index 00000000000..020eca2404d
--- /dev/null
+++ b/test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b
@@ -0,0 +1,34 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyusb_port1
+reset_impl=ykush
+flash_impl=sdwire_poweroff_mount
+power_impl=ykush
+
+flash_writer=rpi_mount
+
+ykush_serial=YK17698
+ykush_port=1
+
+sdwire_serial=sdwire-18
+
+mount_uuid=B529-9710
+mount_point=rpi3_b_boot
diff --git a/test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b b/test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b
new file mode 100644
index 00000000000..d8d2a94f036
--- /dev/null
+++ b/test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b
@@ -0,0 +1,34 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyusb_port1
+reset_impl=ykush
+flash_impl=sdwire_ykush_mount
+power_impl=ykush
+
+flash_writer=rpi_mount
+
+ykush_serial=YK17698
+ykush_port=1
+
+sdwire_serial=sdwire-18
+
+mount_uuid=B529-9710
+mount_point=rpi3_b_boot
diff --git a/test/hooks/bin/kea/conf.zynq_zybo_sjg-zynq_zybo b/test/hooks/bin/kea/conf.zynq_zybo_sjg-zynq_zybo
new file mode 100644
index 00000000000..4a46374d8dd
--- /dev/null
+++ b/test/hooks/bin/kea/conf.zynq_zybo_sjg-zynq_zybo
@@ -0,0 +1,44 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+set -ex
+
+relay_type=6QMBS_
+
+console_dev=/dev/ttyusb_port5
+console_wait=1
+
+reset_impl=usbrelay
+flash_impl=sdwire_relay_mount
+power_impl=digital-loggers
+
+flash_writer=zynq_mount
+
+usbrelay_reset=6
+
+power_ip="192.168.4.19"
+power_user="admin"
+power_pass="1234"
+power_port=5
+
+sdwire_serial=202001064001
+
+mount_uuid=5203-DB74
+mount_point=zynq_zybo_boot
diff --git a/test/hooks/bin/konsulko-labgrid/conf.am62x_beagleplay_a53_na b/test/hooks/bin/konsulko-labgrid/conf.am62x_beagleplay_a53_na
new file mode 100644
index 00000000000..a7839564e90
--- /dev/null
+++ b/test/hooks/bin/konsulko-labgrid/conf.am62x_beagleplay_a53_na
@@ -0,0 +1,30 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# List the files to copy
+tispl=tispl.bin_unsigned
+uboot=u-boot.img_unsigned
+tiboot3=tiboot3-am62x-gp-evm.bin
+
+# Use labgrid
+console_impl=labgrid-trini
+reset_impl=labgrid-trini
+flash_impl=labgrid-trini.sd-mux
+flash_writer=labgrid-trini.ti-k3
diff --git a/test/hooks/bin/konsulko-labgrid/conf.am64x_evm_a53_na b/test/hooks/bin/konsulko-labgrid/conf.am64x_evm_a53_na
new file mode 100644
index 00000000000..dac7049be34
--- /dev/null
+++ b/test/hooks/bin/konsulko-labgrid/conf.am64x_evm_a53_na
@@ -0,0 +1,30 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# List the files to copy
+tispl=tispl.bin_unsigned
+uboot=u-boot.img_unsigned
+tiboot3=tiboot3-am64x-gp-evm.bin
+
+# Use labgrid
+console_impl=labgrid-trini
+reset_impl=labgrid-trini
+flash_impl=labgrid-trini.sd-mux
+flash_writer=labgrid-trini.ti-k3
diff --git a/test/hooks/bin/konsulko-labgrid/conf.rpi_4_32b_na b/test/hooks/bin/konsulko-labgrid/conf.rpi_4_32b_na
new file mode 120000
index 00000000000..d33d959874c
--- /dev/null
+++ b/test/hooks/bin/konsulko-labgrid/conf.rpi_4_32b_na
@@ -0,0 +1 @@
+conf.rpi_arm64_na
\ No newline at end of file
diff --git a/test/hooks/bin/konsulko-labgrid/conf.rpi_4_na b/test/hooks/bin/konsulko-labgrid/conf.rpi_4_na
new file mode 120000
index 00000000000..d33d959874c
--- /dev/null
+++ b/test/hooks/bin/konsulko-labgrid/conf.rpi_4_na
@@ -0,0 +1 @@
+conf.rpi_arm64_na
\ No newline at end of file
diff --git a/test/hooks/bin/konsulko-labgrid/conf.rpi_arm64_na b/test/hooks/bin/konsulko-labgrid/conf.rpi_arm64_na
new file mode 100644
index 00000000000..8c8e1a177d0
--- /dev/null
+++ b/test/hooks/bin/konsulko-labgrid/conf.rpi_arm64_na
@@ -0,0 +1,25 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Use labgrid
+console_impl=labgrid-trini
+reset_impl=labgrid-trini
+flash_impl=labgrid-trini.sd-mux
+flash_writer=labgrid-trini.rpi
diff --git a/test/hooks/bin/poweroff.digital-loggers b/test/hooks/bin/poweroff.digital-loggers
new file mode 100644
index 00000000000..eaf6a392ab8
--- /dev/null
+++ b/test/hooks/bin/poweroff.digital-loggers
@@ -0,0 +1,22 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+curl --data ${power_port}=OFF -o /dev/null --silent \
+	http://${power_user:-admin}:${power_pass:-1234}@${power_ip}/outlet
diff --git a/test/hooks/bin/poweroff.manual b/test/hooks/bin/poweroff.manual
new file mode 100644
index 00000000000..05be7802dd9
--- /dev/null
+++ b/test/hooks/bin/poweroff.manual
@@ -0,0 +1,21 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# We do nothing, and assume the user will power off the board later
diff --git a/test/hooks/bin/poweroff.none b/test/hooks/bin/poweroff.none
new file mode 100755
index 00000000000..cd9733ed034
--- /dev/null
+++ b/test/hooks/bin/poweroff.none
@@ -0,0 +1,22 @@
+# Copyright 2024 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# No power-control needed
diff --git a/test/hooks/bin/poweroff.phidgets b/test/hooks/bin/poweroff.phidgets
new file mode 100644
index 00000000000..7d9e7da6c44
--- /dev/null
+++ b/test/hooks/bin/poweroff.phidgets
@@ -0,0 +1,37 @@
+# Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+export LD_LIBRARY_PATH="${phidgets_dir}/lib:${LD_LIBRARY_PATH}"
+
+# Put board into recovery so it doesn't boot
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_recovery} 1
+sleep 0.25
+# Pulse power button to ensure board is on
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_power} 1
+sleep 0.75
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_power} 0
+sleep 0.25
+# Hold power button to turn board off
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_power} 1
+sleep 15
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_power} 0
+sleep 0.25
+# Release recovery
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_recovery} 0
diff --git a/test/hooks/bin/poweroff.pm342 b/test/hooks/bin/poweroff.pm342
new file mode 100644
index 00000000000..2ebfb7308af
--- /dev/null
+++ b/test/hooks/bin/poweroff.pm342
@@ -0,0 +1,21 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+"${nv_board_automation_bin}/boardctl" --target pm342 --serial "${pm342_serial}" power_off
diff --git a/test/hooks/bin/poweroff.ykush b/test/hooks/bin/poweroff.ykush
new file mode 100644
index 00000000000..fe03df70e2b
--- /dev/null
+++ b/test/hooks/bin/poweroff.ykush
@@ -0,0 +1,23 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Usees YKUSB to power the device off
+
+ykushcmd -s ${ykush_serial} -d ${ykush_port}
diff --git a/test/hooks/bin/poweron.digital-loggers b/test/hooks/bin/poweron.digital-loggers
new file mode 100644
index 00000000000..f7a97f65ac6
--- /dev/null
+++ b/test/hooks/bin/poweron.digital-loggers
@@ -0,0 +1,22 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+curl --data ${power_port}=ON -o /dev/null --silent \
+	http://${power_user:-admin}:${power_pass:-1234}@${power_ip}/outlet
diff --git a/test/hooks/bin/poweron.manual b/test/hooks/bin/poweron.manual
new file mode 100644
index 00000000000..ad5a3251563
--- /dev/null
+++ b/test/hooks/bin/poweron.manual
@@ -0,0 +1,21 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# We do nothing, and assume the user has already powered on the board first
diff --git a/test/hooks/bin/poweron.none b/test/hooks/bin/poweron.none
new file mode 100755
index 00000000000..cd9733ed034
--- /dev/null
+++ b/test/hooks/bin/poweron.none
@@ -0,0 +1,22 @@
+# Copyright 2024 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# No power-control needed
diff --git a/test/hooks/bin/poweron.phidgets b/test/hooks/bin/poweron.phidgets
new file mode 100644
index 00000000000..06af8b89142
--- /dev/null
+++ b/test/hooks/bin/poweron.phidgets
@@ -0,0 +1,32 @@
+# Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+export LD_LIBRARY_PATH="${phidgets_dir}/lib:${LD_LIBRARY_PATH}"
+
+# Put board into recovery so it doesn't boot
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_recovery} 1
+sleep 0.25
+# Pulse power button to turn board on
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_power} 1
+sleep 0.75
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_power} 0
+sleep 0.25
+# Release recovery
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_recovery} 0
diff --git a/test/hooks/bin/poweron.pm342 b/test/hooks/bin/poweron.pm342
new file mode 100644
index 00000000000..de3c11f5ce1
--- /dev/null
+++ b/test/hooks/bin/poweron.pm342
@@ -0,0 +1,24 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Basic power on
+"${nv_board_automation_bin}/boardctl" --target pm342 --serial "${pm342_serial}" power_on
+# Put board into recovery so it doesn't boot
+. "${bin_dir}/recovery.pm342"
diff --git a/test/hooks/bin/poweron.ykush b/test/hooks/bin/poweron.ykush
new file mode 100644
index 00000000000..5a541eccffd
--- /dev/null
+++ b/test/hooks/bin/poweron.ykush
@@ -0,0 +1,23 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Usees YKUSB to power the device on
+
+ykushcmd -s ${ykush_serial} -u ${ykush_port}
diff --git a/test/hooks/bin/push-flashair.py b/test/hooks/bin/push-flashair.py
new file mode 100755
index 00000000000..b71149a4e60
--- /dev/null
+++ b/test/hooks/bin/push-flashair.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python3
+
+# Copyright (c) 2016 Stephen Warren <swarren@wwwdotorg.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright notice,
+#   this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name of the copyright holder nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+import argparse
+import fnmatch
+import os
+import requests
+import sys
+try:
+    from os import scandir
+except ImportError:
+    from scandir import scandir
+
+def push_file(host, local_path, remote_name):
+    print('..PUSH FILE: ' + remote_name)
+    files = {'file': (remote_name, open(local_path,'rb'))}
+    response = requests.post('http://%s/upload.cgi' % host, files=files)
+    print('.... ' + str(response.status_code))
+    response.raise_for_status()
+    if 'NG' in response.text or 'action=/upload.cgi' not in response.text:
+        print('Upload failed:', file=sys.stderr)
+        print(response.text, file=sys.stderr)
+        sys.exit(1)
+
+def op_push_dir(host, local_dir):
+    print('PUSH DIR: ' + local_dir)
+    for de in scandir(local_dir):
+        if not de.is_file():
+            print('Can\'t handle non-file "%s"' % de.path, file=sys.stderr)
+            sys.exit(1)
+        push_file(host, de.path, de.name)
+
+def op_rm_list(host, rm_list_file):
+    print('RM LIST: ' + rm_list_file)
+    params = {'op': 100, 'DIR': '/'}
+    response = requests.get('http://%s/command.cgi' % host, params=params)
+    response.raise_for_status()
+    lines = response.text.splitlines()
+    if lines[0] != 'WLANSD_FILELIST':
+        print('File list qery failed:', file=sys.stderr)
+        print(response.text, file=sys.stderr)
+        sys.exit(1)
+    existing_files = []
+    for l in lines[1:]:
+        existing_files.append(l.split(',')[1].lower())
+    with open(rm_list_file, 'rt') as fh:
+        for l in fh:
+            l = l.split('#')[0]
+            rmspec = l.strip().lower()
+            if not rmspec:
+                continue
+            for remote_filename in existing_files[:]:
+                if fnmatch.fnmatch(remote_filename, rmspec):
+                    print('..DELETE: ' + remote_filename)
+                    params = {'DEL': '/' + remote_filename}
+                    response = requests.get('http://%s/upload.cgi' % host, params=params)
+                    print('.... ' + str(response.status_code))
+                    response.raise_for_status()
+                    if 'SUCCESS' not in response.text:
+                        print('Delete failed:', file=sys.stderr)
+                        print(response.text, file=sys.stderr)
+                        sys.exit(1)
+
+op_map = {
+    'push': op_push_dir,
+    'rmlist': op_rm_list,
+}
+
+def main():
+    parser = argparse.ArgumentParser(
+        description='Copy files to a Toshiba FlashAir device')
+    parser.add_argument('host', help='The host or host:port of the FlashAir')
+    parser.add_argument('ops', nargs='+', help='''Operations to perform;
+    "dir", "push:dir": push directory, "rmlist:listfile": delete files listed
+    in listfile''')
+    args = parser.parse_args()
+
+    for op in args.ops:
+        if not ':' in op:
+            func = op_push_dir
+            param = op
+        else:
+            (op_name, param) = op.split(':', 1)
+            if op_name not in op_map:
+                print('"%s" is not a valid operation' % op_name,
+                    file=sys.stderr)
+                parser.print_help(file=sys.stderr)
+                sys.exit(1)
+            func = op_map[op_name]
+        func(args.host, param)
+
+if __name__ == '__main__':
+    main()
diff --git a/test/hooks/bin/qemu.swtpm b/test/hooks/bin/qemu.swtpm
new file mode 100755
index 00000000000..c40c537d3de
--- /dev/null
+++ b/test/hooks/bin/qemu.swtpm
@@ -0,0 +1,23 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-2
+#
+# This script launches swtpm to emulate a TPMv2.
+#
+# The parameter -t makes it unload when the connection to QEMU is
+# terminated.
+#
+# To make use of it add
+#
+#     qemu_helper_script="swtpm"
+#
+# to the board script and the following arguments to qemu_extra_args
+#
+#     -chardev socket,id=chrtpm,path=/tmp/tpm/swtpm-sock \
+#     -tpmdev emulator,id=tpm0,chardev=chrtpm \
+#     -device tpm-tis-device,tpmdev=tpm0
+#
+# U-Boot must be built with CONFIG_TPM2_MMIO=y.
+
+mkdir -p /tmp/tpm
+swtpm socket -d -t --tpmstate dir=/tmp/tpm --tpm2 \
+--ctrl type=unixio,path=/tmp/tpm/swtpm-sock
diff --git a/test/hooks/bin/recovery.manual b/test/hooks/bin/recovery.manual
new file mode 100644
index 00000000000..b3d3a14ab3a
--- /dev/null
+++ b/test/hooks/bin/recovery.manual
@@ -0,0 +1,23 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+echo PLACE THE BOARD INTO RECOVERY MODE > /dev/tty
+echo PRESS ENTER WHEN DONE > /dev/tty
+read foo > /dev/tty < /dev/tty
diff --git a/test/hooks/bin/recovery.phidgets b/test/hooks/bin/recovery.phidgets
new file mode 100644
index 00000000000..163fe4a7089
--- /dev/null
+++ b/test/hooks/bin/recovery.phidgets
@@ -0,0 +1,29 @@
+# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+export LD_LIBRARY_PATH="${phidgets_dir}/lib:${LD_LIBRARY_PATH}"
+
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_recovery} 1
+sleep 0.25
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_reset} 1
+sleep 0.25
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_reset} 0
+sleep 0.25
+"${phidgets_dir}/bin/phidgets-relay" ${phidgets_serial} ${phidgets_relay_recovery} 0
diff --git a/test/hooks/bin/recovery.pm342 b/test/hooks/bin/recovery.pm342
new file mode 100644
index 00000000000..8d7a8aca3c9
--- /dev/null
+++ b/test/hooks/bin/recovery.pm342
@@ -0,0 +1,26 @@
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# The "recovery" command doesn't work on p2771-0000, so do this manually:
+"${nv_board_automation_bin}/boardctl" --target pm342 --serial "${pm342_serial}" recovery_down
+sleep 0.25
+"${nv_board_automation_bin}/boardctl" --target pm342 --serial "${pm342_serial}" reset
+sleep 0.25
+"${nv_board_automation_bin}/boardctl" --target pm342 --serial "${pm342_serial}" recovery_up
diff --git a/test/hooks/bin/recovery.relay b/test/hooks/bin/recovery.relay
new file mode 100755
index 00000000000..df838039097
--- /dev/null
+++ b/test/hooks/bin/recovery.relay
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+"${recovery_relay_bin}/relayctl.py" "${recovery_relay_type}" \
+    "${recovery_relay_dev}" "${recovery_relay_force_recovery}" on
+
+sleep 0.1
+
+"${recovery_relay_bin}/relayctl.py" "${recovery_relay_type}" \
+    "${recovery_relay_dev}" "${recovery_relay_reset}" on
+
+sleep 0.1
+
+"${recovery_relay_bin}/relayctl.py" "${recovery_relay_type}" \
+    "${recovery_relay_dev}" "${recovery_relay_reset}" off
+
+sleep 0.1
+
+"${recovery_relay_bin}/relayctl.py" "${recovery_relay_type}" \
+    "${recovery_relay_dev}" "${recovery_relay_force_recovery}" off
diff --git a/test/hooks/bin/recovery.usbrelay b/test/hooks/bin/recovery.usbrelay
new file mode 100755
index 00000000000..3b4dcdf13a5
--- /dev/null
+++ b/test/hooks/bin/recovery.usbrelay
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+usbrelay "${relay_type}${usbrelay_recovery}=1"
+usbrelay "${relay_type}${usbrelay_reset}=1"
+
+sleep 0.1
+
+usbrelay "${relay_type}${usbrelay_reset}=0"
+
+sleep 0.1
+
+usbrelay "${relay_type}${usbrelay_recovery}=0"
diff --git a/test/hooks/bin/release.labgrid-sjg b/test/hooks/bin/release.labgrid-sjg
new file mode 100644
index 00000000000..54e789533f8
--- /dev/null
+++ b/test/hooks/bin/release.labgrid-sjg
@@ -0,0 +1,22 @@
+# Copyright 2024 Google LLC
+# Written by Simon Glass
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+exec labgrid-client -r "${U_BOOT_BOARD_IDENTITY}" release -a
diff --git a/test/hooks/bin/release.none b/test/hooks/bin/release.none
new file mode 100644
index 00000000000..284d1b17fad
--- /dev/null
+++ b/test/hooks/bin/release.none
@@ -0,0 +1,22 @@
+# Copyright 2024 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# No releasing needed
diff --git a/test/hooks/bin/reset.cros_servo b/test/hooks/bin/reset.cros_servo
new file mode 100644
index 00000000000..c5ff64d0f8d
--- /dev/null
+++ b/test/hooks/bin/reset.cros_servo
@@ -0,0 +1,23 @@
+# Copyright 2020 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Uses servo to reset the board
+
+${DUT_CONTROL} -p ${cros_servo_port} cold_reset:on sleep:.2 cold_reset:off
diff --git a/test/hooks/bin/reset.digital-loggers b/test/hooks/bin/reset.digital-loggers
new file mode 100644
index 00000000000..17129745c68
--- /dev/null
+++ b/test/hooks/bin/reset.digital-loggers
@@ -0,0 +1,25 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+curl --data ${power_port}=OFF -o /dev/null --silent \
+	http://${power_user:-admin}:${power_pass:-1234}@${power_ip}/outlet
+sleep .5
+curl --data ${power_port}=ON -o /dev/null --silent \
+	http://${power_user:-admin}:${power_pass:-1234}@${power_ip}/outlet
diff --git a/test/hooks/bin/reset.labgrid-trini b/test/hooks/bin/reset.labgrid-trini
new file mode 100755
index 00000000000..c17b60324e3
--- /dev/null
+++ b/test/hooks/bin/reset.labgrid-trini
@@ -0,0 +1,24 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Ensure we have all environment variables set
+. common.labgrid-trini
+
+exec labgrid-client power cycle
diff --git a/test/hooks/bin/reset.none b/test/hooks/bin/reset.none
new file mode 100644
index 00000000000..32bd386623e
--- /dev/null
+++ b/test/hooks/bin/reset.none
@@ -0,0 +1,30 @@
+# Copyright (c) 2016, Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# You probably should not be using this script. The only exception may be
+# if your console implementation spawns the target device itself (e.g. it
+# invokes an emulator such as qemu) rather than simply attaching to an
+# existing target device (which incidentally may also be possible with
+# qemu). The fact this script does nothing also assumes that U-Boot's
+# test/-py scripts re-invoke the console implementation every time the target
+# is reset, which is true at present, but in theory could be changed in the
+# future.
+
+# No reset needed
diff --git a/test/hooks/bin/reset.pm342 b/test/hooks/bin/reset.pm342
new file mode 100644
index 00000000000..067a5fa1e78
--- /dev/null
+++ b/test/hooks/bin/reset.pm342
@@ -0,0 +1,21 @@
+# Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+"${nv_board_automation_bin}/boardctl" --target pm342 --serial "${pm342_serial}" reset
diff --git a/test/hooks/bin/reset.recovery_download b/test/hooks/bin/reset.recovery_download
new file mode 100644
index 00000000000..1d4cc8d211d
--- /dev/null
+++ b/test/hooks/bin/reset.recovery_download
@@ -0,0 +1,36 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "${bin_dir}/recovery.${recovery_impl}"
+
+# USB enumeration delay
+for ((i = 0; i <= 100; i++)); do
+    if [ -e "${board_usb_dev}" ]; then
+        break
+    fi
+    sleep 0.1
+done
+if [ ! -e "${board_usb_dev}" ]; then
+    echo "Cannot find device ${board_usb_dev}"
+    exit 1
+fi
+sleep 1
+
+. "${bin_dir}/download.${download_impl}"
diff --git a/test/hooks/bin/reset.usbrelay b/test/hooks/bin/reset.usbrelay
new file mode 100644
index 00000000000..43d3430b18c
--- /dev/null
+++ b/test/hooks/bin/reset.usbrelay
@@ -0,0 +1,26 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Usees usbrelay to assert and release reset
+usbrelay "${relay_type}${usbrelay_reset}=1"
+
+sleep .2
+
+usbrelay "${relay_type}${usbrelay_reset}=0"
diff --git a/test/hooks/bin/reset.ykush b/test/hooks/bin/reset.ykush
new file mode 100644
index 00000000000..f328eec5db8
--- /dev/null
+++ b/test/hooks/bin/reset.ykush
@@ -0,0 +1,25 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Usees YKUSB to power the device off and then on
+
+ykushcmd -s ${ykush_serial} -d ${ykush_port}
+sleep 1
+ykushcmd -s ${ykush_serial} -u ${ykush_port}
diff --git a/test/hooks/bin/swarren-lx1/conf.jetson-tk1_na b/test/hooks/bin/swarren-lx1/conf.jetson-tk1_na
new file mode 100644
index 00000000000..88d0d71d689
--- /dev/null
+++ b/test/hooks/bin/swarren-lx1/conf.jetson-tk1_na
@@ -0,0 +1,36 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/ttyS0
+power_impl=phidgets
+flash_impl=none
+reset_impl=recovery_download
+recovery_impl=phidgets
+phidgets_dir="${HOME}/phidgets"
+phidgets_serial=109237
+phidgets_relay_power=0
+phidgets_relay_recovery=1
+phidgets_relay_reset=2
+board_usb_dev=/dev/usbdev-jetson-tk1
+download_impl=tegra-uboot-flasher
+tubf_bin="${HOME}/ubtest-tegra-uboot-flasher/scripts"
+tubf_board=jetson-tk1
+tubf_config=jetson-tk1
+board_usb_port_path=1-8.3
diff --git a/test/hooks/bin/swarren-lx1/conf.p2371-2180_na b/test/hooks/bin/swarren-lx1/conf.p2371-2180_na
new file mode 100644
index 00000000000..b8e604c94dd
--- /dev/null
+++ b/test/hooks/bin/swarren-lx1/conf.p2371-2180_na
@@ -0,0 +1,57 @@
+# Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+syms_file="${U_BOOT_BUILD_DIR}/u-boot.sym"
+if [ -f "${syms_file}" ]; then
+  set +e
+  grep -q cboot "${syms_file}" >/dev/null 2>&1
+  grep_ret=$?
+  set -e
+  if [ ${grep_ret} -eq 0 ]; then
+    boot_from_cboot=1
+  else
+    boot_from_cboot=0
+  fi
+else
+  boot_from_cboot=0
+fi
+
+console_dev=/dev/console-p2371-2180
+power_impl=pm342
+recovery_impl=pm342
+nv_board_automation_bin="${HOME}/ubtest-nvidia-board-automation"
+pm342_serial=SRW-0
+board_usb_dev=/dev/usbdev-p2371-2180
+board_usb_port_path=1-5
+
+if [ ${boot_from_cboot} -eq 1 ]; then
+  echo conf.p2371-2180_na: U-Boot branch requires flashing for testing
+  flash_impl=recovery_l4t
+  flash_l4t="${HOME}/ubtest-l4t-r28.1-p2371-2180"
+  flash_l4t_uboot_path=bootloader/t210ref/p2371-2180/
+  flash_l4t_board=jetson-tx1
+  reset_impl=pm342
+else
+  echo conf.p2371-2180_na: U-Boot branch can use USB RCM for testing
+  flash_impl=none
+  reset_impl=recovery_download
+  download_impl=l4t-exec-uboot
+  download_l4t="${HOME}/ubtest-l4t-exec-uboot"
+fi
diff --git a/test/hooks/bin/swarren-lx1/conf.p2771-0000-500_na b/test/hooks/bin/swarren-lx1/conf.p2771-0000-500_na
new file mode 100644
index 00000000000..3c197eacf62
--- /dev/null
+++ b/test/hooks/bin/swarren-lx1/conf.p2771-0000-500_na
@@ -0,0 +1,32 @@
+# Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_dev=/dev/console-p2771-0000
+power_impl=pm342
+flash_impl=recovery_l4t
+recovery_impl=pm342
+flash_l4t="${HOME}/ubtest-l4t-r28.1-p2771-0000"
+flash_l4t_uboot_path=bootloader/t186ref/p2771-0000/500/
+flash_l4t_board=jetson-tx2
+reset_impl=pm342
+nv_board_automation_bin="${HOME}/ubtest-nvidia-board-automation"
+pm342_serial=SRW-1
+board_usb_dev=/dev/usbdev-p2771-0000
+board_usb_port_path=3-2
diff --git a/test/hooks/bin/travis-ci/conf.M5208EVBE_qemu b/test/hooks/bin/travis-ci/conf.M5208EVBE_qemu
new file mode 100644
index 00000000000..947f13c790f
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.M5208EVBE_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2023 Marek Vasut <marek.vasut+renesas@mailbox.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="mcf5208evb"
+qemu_binary="qemu-system-m68k"
+qemu_extra_args="-nographic -serial mon:stdio -net user,tftp=${UBOOT_TRAVIS_BUILD_DIR} -net nic,model=mcf-fec"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.coreboot_qemu b/test/hooks/bin/travis-ci/conf.coreboot_qemu
new file mode 100644
index 00000000000..76d6927510f
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.coreboot_qemu
@@ -0,0 +1,28 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+# Copyright 2021 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="pc"
+qemu_binary="qemu-system-i386"
+qemu_extra_args="-nographic -cpu qemu32 -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/coreboot.rom"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.evb-ast2500_qemu b/test/hooks/bin/travis-ci/conf.evb-ast2500_qemu
new file mode 100644
index 00000000000..2e9adc6af9b
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.evb-ast2500_qemu
@@ -0,0 +1,11 @@
+# Copyright 2019 IBM Corp.
+# Joel Stanley <joel@jms.id.au>
+# SPDX-License-Identifier: GPL-2.0+
+
+console_impl=qemu
+qemu_machine="ast2500-evb"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -nic user,tftp=${UBOOT_TRAVIS_BUILD_DIR}"
+qemu_kernel_args="-drive file=${U_BOOT_BUILD_DIR}/flash.img,format=raw,if=mtd"
+reset_impl=none
+flash_impl=qemu_gen_padded_image
diff --git a/test/hooks/bin/travis-ci/conf.evb-ast2600_qemu b/test/hooks/bin/travis-ci/conf.evb-ast2600_qemu
new file mode 100644
index 00000000000..386ff7d2577
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.evb-ast2600_qemu
@@ -0,0 +1,13 @@
+# Copyright 2022 IBM Corp.
+# Joel Stanley <joel@jms.id.au>
+# SPDX-License-Identifier: GPL-2.0+
+
+console_impl=qemu
+qemu_machine="ast2600-evb"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -nic user,tftp=${UBOOT_TRAVIS_BUILD_DIR}"
+qemu_kernel_args="-drive file=${U_BOOT_BUILD_DIR}/flash.img,format=raw,if=mtd"
+flash_u_boot_bin="u-boot-with-spl.bin"
+reset_impl=none
+flash_impl=qemu_gen_padded_image
+flash_size=64
diff --git a/test/hooks/bin/travis-ci/conf.integratorcp_cm926ejs_qemu b/test/hooks/bin/travis-ci/conf.integratorcp_cm926ejs_qemu
new file mode 100644
index 00000000000..d6e2f19b9e0
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.integratorcp_cm926ejs_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="integratorcp"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.malta64_qemu b/test/hooks/bin/travis-ci/conf.malta64_qemu
new file mode 100644
index 00000000000..462591d2cfb
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.malta64_qemu
@@ -0,0 +1,30 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+# Copyright (c) 2020 Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="malta"
+qemu_binary="qemu-system-mips64"
+qemu_extra_args="-nographic -cpu MIPS64R2-generic -m 256"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw \
+    -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device pcnet,netdev=net0"
+reset_impl=none
+flash_impl=qemu_gen_padded_image
+flash_size=4
diff --git a/test/hooks/bin/travis-ci/conf.malta64el_qemu b/test/hooks/bin/travis-ci/conf.malta64el_qemu
new file mode 100644
index 00000000000..5a35f1d71a6
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.malta64el_qemu
@@ -0,0 +1,31 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+# Copyright (c) 2020 Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="malta"
+qemu_binary="qemu-system-mips64el"
+qemu_extra_args="-nographic -cpu MIPS64R2-generic -m 256"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw \
+    -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device pcnet,netdev=net0"
+reset_impl=none
+flash_impl=qemu_gen_padded_image
+flash_size=4
+flash_u_boot_bin=u-boot-swap.bin
diff --git a/test/hooks/bin/travis-ci/conf.malta_qemu b/test/hooks/bin/travis-ci/conf.malta_qemu
new file mode 100644
index 00000000000..a2b39a4ba66
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.malta_qemu
@@ -0,0 +1,30 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+# Copyright (c) 2020 Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="malta"
+qemu_binary="qemu-system-mips"
+qemu_extra_args="-nographic -cpu 24Kc -m 256"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw \
+    -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device pcnet,netdev=net0"
+reset_impl=none
+flash_impl=qemu_gen_padded_image
+flash_size=4
diff --git a/test/hooks/bin/travis-ci/conf.maltael_qemu b/test/hooks/bin/travis-ci/conf.maltael_qemu
new file mode 100644
index 00000000000..8b73e51f385
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.maltael_qemu
@@ -0,0 +1,31 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+# Copyright (c) 2020 Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="malta"
+qemu_binary="qemu-system-mipsel"
+qemu_extra_args="-nographic -cpu 24Kc -m 256"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw \
+    -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device pcnet,netdev=net0"
+reset_impl=none
+flash_impl=qemu_gen_padded_image
+flash_size=4
+flash_u_boot_bin=u-boot-swap.bin
diff --git a/test/hooks/bin/travis-ci/conf.qemu-ae3xx_na b/test/hooks/bin/travis-ci/conf.qemu-ae3xx_na
new file mode 100644
index 00000000000..cf3c391a187
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-ae3xx_na
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="andes_ae300"
+qemu_binary="qemu-system-nds32"
+qemu_extra_args="-nographic -m 1G -gdb tcp::5678"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-arm-sbsa_na b/test/hooks/bin/travis-ci/conf.qemu-arm-sbsa_na
new file mode 100644
index 00000000000..fea885ffea0
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-arm-sbsa_na
@@ -0,0 +1,27 @@
+# Copyright (c) 2024 Patrick Rudolph. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="sbsa-ref"
+qemu_binary="qemu-system-aarch64"
+qemu_extra_args="-cpu cortex-a57 -smp 4 -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0 -device virtio-rng-pci -semihosting"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/secure-world.rom,format=raw -drive if=pflash,file=${U_BOOT_BUILD_DIR}/unsecure-world.rom,format=raw"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-ax25_na b/test/hooks/bin/travis-ci/conf.qemu-ax25_na
new file mode 100644
index 00000000000..6837cb8151e
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-ax25_na
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="andes_ae350"
+qemu_binary="qemu-system-riscv64"
+qemu_extra_args="-nographic -m 4G -gdb tcp::5678"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-loongarch64_na b/test/hooks/bin/travis-ci/conf.qemu-loongarch64_na
new file mode 100644
index 00000000000..e8860bb4032
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-loongarch64_na
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2024 Jiaxun Yang
+#
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-loongarch64"
+qemu_extra_args="-m 1G -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device virtio-net-pci,netdev=net0 -device virtio-rng-pci"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-ppce500_na b/test/hooks/bin/travis-ci/conf.qemu-ppce500_na
new file mode 100644
index 00000000000..bcf00206ef8
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-ppce500_na
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="ppce500"
+qemu_binary="qemu-system-ppc"
+qemu_extra_args="-nographic"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-riscv32_na b/test/hooks/bin/travis-ci/conf.qemu-riscv32_na
new file mode 100644
index 00000000000..23706f38488
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-riscv32_na
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2020 Bin Meng <bmeng.cn@gmail.com>
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-riscv32"
+qemu_extra_args="-m 1G -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device virtio-net-device,netdev=net0 -device virtio-rng-device"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-riscv32_spl_na b/test/hooks/bin/travis-ci/conf.qemu-riscv32_spl_na
new file mode 100644
index 00000000000..cdf285ec10b
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-riscv32_spl_na
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2020 Bin Meng <bmeng.cn@gmail.com>
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-riscv32"
+qemu_extra_args="-smp 4 -m 1G -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device virtio-net-device,netdev=net0 -device virtio-rng-device"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/spl/u-boot-spl -device loader,file=${U_BOOT_BUILD_DIR}/u-boot.itb,addr=0x80200000"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-riscv64_na b/test/hooks/bin/travis-ci/conf.qemu-riscv64_na
new file mode 100644
index 00000000000..97c346912ff
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-riscv64_na
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2019 Heinrich Schuchardt
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-riscv64"
+qemu_extra_args="-m 1G -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device virtio-net-device,netdev=net0 -netdev user,id=net1,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device virtio-net-device,netdev=net1 -device virtio-rng-device"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-riscv64_spl_na b/test/hooks/bin/travis-ci/conf.qemu-riscv64_spl_na
new file mode 100644
index 00000000000..cabf17b3ddf
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-riscv64_spl_na
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2020 Bin Meng <bmeng.cn@gmail.com>
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-riscv64"
+qemu_extra_args="-smp 4 -m 1G -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device virtio-net-device,netdev=net0 -device virtio-rng-device"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/spl/u-boot-spl -device loader,file=${U_BOOT_BUILD_DIR}/u-boot.itb,addr=0x80200000"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-x86_64_na b/test/hooks/bin/travis-ci/conf.qemu-x86_64_na
new file mode 100644
index 00000000000..356c5cf47a5
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-x86_64_na
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="pc"
+qemu_binary="qemu-system-x86_64"
+qemu_extra_args="-nographic -cpu qemu64 -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot.rom"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-x86_na b/test/hooks/bin/travis-ci/conf.qemu-x86_na
new file mode 100644
index 00000000000..28a78b3d276
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-x86_na
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="pc"
+qemu_binary="qemu-system-i386"
+qemu_extra_args="-nographic -cpu qemu32 -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot.rom"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu-xtensa-dc233c_na b/test/hooks/bin/travis-ci/conf.qemu-xtensa-dc233c_na
new file mode 100644
index 00000000000..fc3b5880e5c
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu-xtensa-dc233c_na
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2024 Jiaxun Yang
+#
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-xtensa"
+qemu_extra_args="-cpu dc233c -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device virtio-net-pci,netdev=net0 -device virtio-rng-pci -semihosting"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot.elf"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu_arm64_na b/test/hooks/bin/travis-ci/conf.qemu_arm64_na
new file mode 100644
index 00000000000..e195b5e47d7
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_arm64_na
@@ -0,0 +1,30 @@
+# Copyright (c) 2017 Tuomas Tynkkynen. All rights reserved.
+# Based on conf.vexpress_ca15_tc2_qemu which is:
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_helper_script="swtpm"
+qemu_binary="qemu-system-aarch64"
+qemu_extra_args="-cpu cortex-a57 -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0 -device virtio-rng-pci -semihosting -chardev socket,id=chrtpm,path=/tmp/tpm/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis-device,tpmdev=tpm0"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu_arm64_spl_na b/test/hooks/bin/travis-ci/conf.qemu_arm64_spl_na
new file mode 100644
index 00000000000..9a0d9b30b99
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_arm64_spl_na
@@ -0,0 +1,32 @@
+# Copyright (c) 2017 Tuomas Tynkkynen. All rights reserved.
+# Based on conf.vexpress_ca15_tc2_qemu which is:
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_helper_script="swtpm"
+qemu_binary="qemu-system-aarch64"
+qemu_extra_args="-cpu cortex-a57 -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0 -device virtio-rng-pci -semihosting -chardev socket,id=chrtpm,path=/tmp/tpm/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis-device,tpmdev=tpm0"
+
+# Uses image.bin which contains SPL and U-Boot
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/image.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu_arm64_tpl_na b/test/hooks/bin/travis-ci/conf.qemu_arm64_tpl_na
new file mode 100644
index 00000000000..556e15b11f8
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_arm64_tpl_na
@@ -0,0 +1,29 @@
+# Copyright (c) 2017 Tuomas Tynkkynen. All rights reserved.
+# Based on conf.vexpress_ca15_tc2_qemu which is:
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-aarch64"
+qemu_extra_args="-cpu cortex-a57 -nographic"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/image.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu_arm64be_na b/test/hooks/bin/travis-ci/conf.qemu_arm64be_na
new file mode 100644
index 00000000000..3929636932e
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_arm64be_na
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2024 Jiaxun Yang
+#
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_helper_script="swtpm"
+qemu_binary="qemu-system-aarch64"
+qemu_extra_args="-cpu cortex-a57 -nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0 -device virtio-rng-pci -semihosting -chardev socket,id=chrtpm,path=/tmp/tpm/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis-device,tpmdev=tpm0"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu_arm_na b/test/hooks/bin/travis-ci/conf.qemu_arm_na
new file mode 100644
index 00000000000..de0694d423e
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_arm_na
@@ -0,0 +1,30 @@
+# Copyright (c) 2017 Tuomas Tynkkynen. All rights reserved.
+# Based on conf.vexpress_ca15_tc2_qemu which is:
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_helper_script="swtpm"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0 -device virtio-rng-pci -chardev socket,id=chrtpm,path=/tmp/tpm/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis-device,tpmdev=tpm0"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu_arm_spl_na b/test/hooks/bin/travis-ci/conf.qemu_arm_spl_na
new file mode 100644
index 00000000000..1646ea383b4
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_arm_spl_na
@@ -0,0 +1,31 @@
+# Copyright (c) 2017 Tuomas Tynkkynen. All rights reserved.
+# Based on conf.vexpress_ca15_tc2_qemu which is:
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="virt"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -netdev user,id=net0,tftp=${UBOOT_TRAVIS_BUILD_DIR} -device e1000,netdev=net0 -device virtio-rng-pci"
+
+# Uses image.bin which contains SPL and U-Boot
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/image.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.qemu_mips64_na b/test/hooks/bin/travis-ci/conf.qemu_mips64_na
new file mode 100644
index 00000000000..dd096a8c5a8
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_mips64_na
@@ -0,0 +1,28 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="mips"
+qemu_binary="qemu-system-mips64"
+qemu_extra_args="-nographic -monitor null -cpu MIPS64R2-generic"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw"
+reset_impl=none
+flash_impl="qemu_gen_padded_image"
+flash_size=4
diff --git a/test/hooks/bin/travis-ci/conf.qemu_mips64el_na b/test/hooks/bin/travis-ci/conf.qemu_mips64el_na
new file mode 100644
index 00000000000..a8a213296ce
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_mips64el_na
@@ -0,0 +1,28 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="mips"
+qemu_binary="qemu-system-mips64el"
+qemu_extra_args="-nographic -monitor null -cpu MIPS64R2-generic"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw"
+reset_impl=none
+flash_impl="qemu_gen_padded_image"
+flash_size=4
diff --git a/test/hooks/bin/travis-ci/conf.qemu_mips_na b/test/hooks/bin/travis-ci/conf.qemu_mips_na
new file mode 100644
index 00000000000..a5e2a437b9f
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_mips_na
@@ -0,0 +1,28 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="mips"
+qemu_binary="qemu-system-mips"
+qemu_extra_args="-nographic -monitor null"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw"
+reset_impl=none
+flash_impl="qemu_gen_padded_image"
+flash_size=4
diff --git a/test/hooks/bin/travis-ci/conf.qemu_mipsel_na b/test/hooks/bin/travis-ci/conf.qemu_mipsel_na
new file mode 100644
index 00000000000..6481f24ce3f
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.qemu_mipsel_na
@@ -0,0 +1,28 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="mips"
+qemu_binary="qemu-system-mipsel"
+qemu_extra_args="-nographic -monitor null"
+qemu_kernel_args="-drive if=pflash,file=${U_BOOT_BUILD_DIR}/flash.img,format=raw"
+reset_impl=none
+flash_impl="qemu_gen_padded_image"
+flash_size=4
diff --git a/test/hooks/bin/travis-ci/conf.r2dplus_i82557c_qemu b/test/hooks/bin/travis-ci/conf.r2dplus_i82557c_qemu
new file mode 100644
index 00000000000..85ad999ba3d
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.r2dplus_i82557c_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2020 Marek Vasut <marek.vasut+renesas@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="r2d"
+qemu_binary="qemu-system-sh4"
+qemu_extra_args="-nographic -serial null -serial mon:stdio -net user,tftp=${UBOOT_TRAVIS_BUILD_DIR} -net nic,model=i82557c"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.r2dplus_pcnet_qemu b/test/hooks/bin/travis-ci/conf.r2dplus_pcnet_qemu
new file mode 100644
index 00000000000..5d208bdc6df
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.r2dplus_pcnet_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2020 Marek Vasut <marek.vasut+renesas@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="r2d"
+qemu_binary="qemu-system-sh4"
+qemu_extra_args="-nographic -serial null -serial mon:stdio -net user,tftp=${UBOOT_TRAVIS_BUILD_DIR} -net nic,model=pcnet"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.r2dplus_rtl8139_qemu b/test/hooks/bin/travis-ci/conf.r2dplus_rtl8139_qemu
new file mode 100644
index 00000000000..b582eecc2a8
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.r2dplus_rtl8139_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2020 Marek Vasut <marek.vasut+renesas@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="r2d"
+qemu_binary="qemu-system-sh4"
+qemu_extra_args="-nographic -serial null -serial mon:stdio -net user,tftp=${UBOOT_TRAVIS_BUILD_DIR} -net nic,model=rtl8139"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.r2dplus_tulip_qemu b/test/hooks/bin/travis-ci/conf.r2dplus_tulip_qemu
new file mode 100644
index 00000000000..b04ba0605ca
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.r2dplus_tulip_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2020 Marek Vasut <marek.vasut+renesas@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="r2d"
+qemu_binary="qemu-system-sh4"
+qemu_extra_args="-nographic -serial null -serial mon:stdio -net user,tftp=${UBOOT_TRAVIS_BUILD_DIR} -net nic,model=tulip"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot.bin"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.sifive_unleashed_sdcard_qemu b/test/hooks/bin/travis-ci/conf.sifive_unleashed_sdcard_qemu
new file mode 100644
index 00000000000..e84ce7d6876
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.sifive_unleashed_sdcard_qemu
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2021 Bin Meng <bmeng.cn@gmail.com>
+
+console_impl=qemu
+qemu_machine="sifive_u,msel=11"
+qemu_binary="qemu-system-riscv64"
+qemu_extra_args="-smp 5 -m 8G -nographic -nic user,tftp=${UBOOT_TRAVIS_BUILD_DIR}"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/spl/u-boot-spl.bin -drive file=${U_BOOT_BUILD_DIR}/sdcard.img,format=raw,if=sd"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.sifive_unleashed_spi-nor_qemu b/test/hooks/bin/travis-ci/conf.sifive_unleashed_spi-nor_qemu
new file mode 100644
index 00000000000..56a7a0c1501
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.sifive_unleashed_spi-nor_qemu
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: MIT
+#
+# Copyright (c) 2021 Bin Meng <bmeng.cn@gmail.com>
+
+console_impl=qemu
+qemu_machine="sifive_u,msel=6"
+qemu_binary="qemu-system-riscv64"
+qemu_extra_args="-smp 5 -m 8G -nographic -nic user,tftp=${UBOOT_TRAVIS_BUILD_DIR}"
+qemu_kernel_args="-bios ${U_BOOT_BUILD_DIR}/spl/u-boot-spl.bin -drive file=${U_BOOT_BUILD_DIR}/spi-nor.img,format=raw,if=mtd"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.vexpress_ca15_tc2_qemu b/test/hooks/bin/travis-ci/conf.vexpress_ca15_tc2_qemu
new file mode 100644
index 00000000000..55e40038b37
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.vexpress_ca15_tc2_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="vexpress-a15"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -m 1G -audio none -net user,tftp=${UBOOT_TRAVIS_BUILD_DIR} -net nic"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.vexpress_ca9x4_qemu b/test/hooks/bin/travis-ci/conf.vexpress_ca9x4_qemu
new file mode 100644
index 00000000000..b5ed72934c3
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.vexpress_ca9x4_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="vexpress-a9"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-nographic -m 1G -audio none -net user,tftp=${UBOOT_TRAVIS_BUILD_DIR} -net nic"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.vexpress_fvp_bloblist_na b/test/hooks/bin/travis-ci/conf.vexpress_fvp_bloblist_na
new file mode 120000
index 00000000000..ef6f0a4ee82
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.vexpress_fvp_bloblist_na
@@ -0,0 +1 @@
+conf.vexpress_fvp_na
\ No newline at end of file
diff --git a/test/hooks/bin/travis-ci/conf.vexpress_fvp_na b/test/hooks/bin/travis-ci/conf.vexpress_fvp_na
new file mode 100644
index 00000000000..0f99cc9aead
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.vexpress_fvp_na
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+if [ -z "${fip}" -o -z "${bl1}" ]; then
+	echo "The environment must point 'fip' and 'bl1' at existing fip and bl1 files"
+	exit 1
+fi
+console_impl=fvp
+fvp_binary="FVP_Base_RevC-2xAEMvA"
+fvp_args="-C bp.flashloader0.fname=${fip} -C bp.secureflashloader.fname=${bl1} -C bp.vis.disable_visualisation=1"
+reset_impl=none
+flash_impl=fiptool
diff --git a/test/hooks/bin/travis-ci/conf.xilinx_versal_virt_qemu b/test/hooks/bin/travis-ci/conf.xilinx_versal_virt_qemu
new file mode 100644
index 00000000000..0a8ee48eda3
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.xilinx_versal_virt_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2018 Xilinx, Inc. (Michal Simek). All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="xlnx-versal-virt"
+qemu_binary="qemu-system-aarch64"
+qemu_extra_args="-display none -m 4G -serial mon:stdio"
+qemu_kernel_args="-device loader,file=${U_BOOT_BUILD_DIR}/u-boot,cpu-num=0"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.xilinx_zynq_virt_qemu b/test/hooks/bin/travis-ci/conf.xilinx_zynq_virt_qemu
new file mode 100644
index 00000000000..a6af659bddd
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.xilinx_zynq_virt_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Xilinx, Inc. (Michal Simek). All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="xilinx-zynq-a9"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-display none -m 1G -nographic -serial /dev/null -serial mon:stdio -monitor null"
+qemu_kernel_args="-device loader,file=${U_BOOT_BUILD_DIR}/u-boot-dtb.bin,addr=0x4000000,cpu-num=0"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.xtfpga_qemu b/test/hooks/bin/travis-ci/conf.xtfpga_qemu
new file mode 100644
index 00000000000..f2681d538dc
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.xtfpga_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2018 Cadence Design Systems Inc. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="kc705"
+qemu_binary="qemu-system-xtensa"
+qemu_extra_args="-nographic -monitor null -m 1G -cpu dc233c"
+qemu_kernel_args="-kernel ${U_BOOT_BUILD_DIR}/u-boot"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/travis-ci/conf.zynq_zc702_qemu b/test/hooks/bin/travis-ci/conf.zynq_zc702_qemu
new file mode 100644
index 00000000000..eef7904d501
--- /dev/null
+++ b/test/hooks/bin/travis-ci/conf.zynq_zc702_qemu
@@ -0,0 +1,27 @@
+# Copyright (c) 2016 Xilinx, Inc. (Michal Simek). All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+console_impl=qemu
+qemu_machine="xilinx-zynq-a9"
+qemu_binary="qemu-system-arm"
+qemu_extra_args="-display none -m 40000000 -nographic -serial /dev/null -serial mon:stdio -monitor null"
+qemu_kernel_args="-device loader,file=${U_BOOT_BUILD_DIR}/u-boot-dtb.bin,addr=0x4000000,cpu-num=0"
+reset_impl=none
+flash_impl=none
diff --git a/test/hooks/bin/u-boot-test-common b/test/hooks/bin/u-boot-test-common
new file mode 100755
index 00000000000..2c3b476bceb
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-common
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+# Copyright 2024 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+set -e
+
+bin_dir="`dirname $0`"
+board_type="$1"
+board_ident="$2"
+hostname="`hostname`"
+
+# Use either the Labgrid integration or the traditional hooks
+if [ -n "${USE_LABGRID_SJG}" ]; then
+	. "${bin_dir}/${hostname}/conf.all"
+else
+	. "${bin_dir}/${hostname}/conf.${board_type}_${board_ident}"
+fi
diff --git a/test/hooks/bin/u-boot-test-console b/test/hooks/bin/u-boot-test-console
new file mode 100755
index 00000000000..8b7377a2aba
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-console
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "$(dirname $0)/u-boot-test-common"
+
+. "${bin_dir}/console.${console_impl:-picocom}"
diff --git a/test/hooks/bin/u-boot-test-flash b/test/hooks/bin/u-boot-test-flash
new file mode 100755
index 00000000000..bd89a50e6a3
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-flash
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "$(dirname $0)/u-boot-test-common"
+
+. "${bin_dir}/flash.${flash_impl}"
diff --git a/test/hooks/bin/u-boot-test-getrole b/test/hooks/bin/u-boot-test-getrole
new file mode 100755
index 00000000000..ac8e02a243c
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-getrole
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+# Copyright 2024 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Prints the following pieces of information, each on a separate line
+#
+# - U-Boot board name
+# - source path
+# - build dir
+# - filename of .config file
+#
+# For example
+
+. "$(dirname $0)/u-boot-test-common"
+
+target="$1"
+[ -n "$2" ] && do_configure=1
+
+. "${bin_dir}/getrole.${getrole_impl:-none}"
diff --git a/test/hooks/bin/u-boot-test-power-off b/test/hooks/bin/u-boot-test-power-off
new file mode 100755
index 00000000000..83b69c00486
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-power-off
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "$(dirname $0)/u-boot-test-common"
+
+. "${bin_dir}/poweroff.${power_impl}"
diff --git a/test/hooks/bin/u-boot-test-power-on b/test/hooks/bin/u-boot-test-power-on
new file mode 100755
index 00000000000..5a41c3e2de4
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-power-on
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "$(dirname $0)/u-boot-test-common"
+
+. "${bin_dir}/poweron.${power_impl}"
diff --git a/test/hooks/bin/u-boot-test-release b/test/hooks/bin/u-boot-test-release
new file mode 100755
index 00000000000..5a3a849408b
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-release
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Copyright 2024 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "$(dirname $0)/u-boot-test-common"
+
+. "${bin_dir}/release.${release_impl:-none}"
diff --git a/test/hooks/bin/u-boot-test-reset b/test/hooks/bin/u-boot-test-reset
new file mode 100755
index 00000000000..77e3f408d8b
--- /dev/null
+++ b/test/hooks/bin/u-boot-test-reset
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+. "$(dirname $0)/u-boot-test-common"
+
+. "${bin_dir}/reset.${reset_impl}"
diff --git a/test/hooks/bin/wait_raw_device b/test/hooks/bin/wait_raw_device
new file mode 100644
index 00000000000..c2921147651
--- /dev/null
+++ b/test/hooks/bin/wait_raw_device
@@ -0,0 +1,34 @@
+# Copyright 2021 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Wait for the device ${raw_device} to become available
+complete=false
+for i in {0..9}; do
+    if dd if=${raw_device} of=/dev/null count=1 >/dev/null 2>&1; then
+        complete=true
+        break
+    fi
+
+    sleep 1
+done
+if [[ $complete = false ]]; then
+    echo "Failed to access ${raw_device} after 10 tries"
+    exit 1
+fi
diff --git a/test/hooks/bin/writer.imx_raw b/test/hooks/bin/writer.imx_raw
new file mode 100755
index 00000000000..4708bab3ca2
--- /dev/null
+++ b/test/hooks/bin/writer.imx_raw
@@ -0,0 +1,39 @@
+# Copyright 2021 Konsulko Group, All rights reserved.
+# Based on writer.sunxi_raw which is
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Writes raw imx images to the board
+
+# Args:
+#  $1: Device path of the sdcard when board is off (e.g. /dev/sdcard0)
+#  $2: U-Boot build directory
+
+set -e
+
+device=$1
+build=$2
+
+echo "Writing to ${device} from build at ${build}"
+
+# At least partially zero out the previous image
+dd if=/dev/zero of=$device bs=1k seek=1 count=128
+dd if=${build}/u-boot-with-spl.imx of=$device bs=1024 seek=1
+sync $device
diff --git a/test/hooks/bin/writer.labgrid-trini.rpi b/test/hooks/bin/writer.labgrid-trini.rpi
new file mode 100644
index 00000000000..83ce516da29
--- /dev/null
+++ b/test/hooks/bin/writer.labgrid-trini.rpi
@@ -0,0 +1,46 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Ensure we have all environment variables set
+. common.labgrid-trini
+set -e
+
+build=${U_BOOT_BUILD_DIR}
+configtxt=`mktemp`
+
+echo "enable_uart=1" | tee ${configtxt}
+echo "kernel=u-boot.bin" | tee -a ${configtxt}
+
+case "${board_type}" in
+rpi_3|rpi_3b|rpi_3_b_plus|rpi_4|rpi_arm64)
+    echo "arm_64bit=1" | tee -a ${configtxt}
+    ;;
+esac
+
+case "${board_ident}" in
+3-32-pl011)
+    echo "dtoverlay=pi3-miniuart-bt" | sudo tee -a ${configtxt}
+    ;;
+esac
+
+labgrid-client write-files -T ${configtxt} config.txt
+labgrid-client write-files -T ${build}/u-boot.bin u-boot.bin
+rm ${configtxt}
+echo "Done writing build"
diff --git a/test/hooks/bin/writer.labgrid-trini.ti-k3 b/test/hooks/bin/writer.labgrid-trini.ti-k3
new file mode 100644
index 00000000000..bcaf7a0536b
--- /dev/null
+++ b/test/hooks/bin/writer.labgrid-trini.ti-k3
@@ -0,0 +1,35 @@
+# Copyright (c) 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Ensure we have all environment variables set
+. common.labgrid-trini
+
+build=${U_BOOT_BUILD_DIR}
+
+if [ -z "${tispl}" -o -z "${uboot}" -o -z "${tiboot3}" ]; then
+    echo "Must configure tispl, uboot, tiboot3 and optionally sysfw"
+    echo "per the board documentation."
+    exit 1
+fi
+echo "Writing build at ${build}"
+labgrid-client write-files -T ${build}/${tispl} tispl.bin
+labgrid-client write-files -T ${build}/${uboot} u-boot.img
+labgrid-client write-files -T ${build/_a??/_r5}/${tiboot3} tiboot3.bin
+echo "Done writing build"
diff --git a/test/hooks/bin/writer.rk3288_raw b/test/hooks/bin/writer.rk3288_raw
new file mode 100755
index 00000000000..f77a04829ca
--- /dev/null
+++ b/test/hooks/bin/writer.rk3288_raw
@@ -0,0 +1,40 @@
+# Copyright 202 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Writes Rockchip RK3288 image to the board
+
+# Args:
+#  $1: Device path of the sdcard when board is off (e.g. /dev/sdcard0)
+#  $2: U-Boot build directory
+
+set -ex
+
+device=$1
+build=$2
+
+tmp=${build}
+
+echo "Writing to ${device} from build at ${build}"
+
+${build}/tools/mkimage -n rk3288 -T rksd -d ${build}/spl/u-boot-spl.bin \
+    ${tmp}/out
+cat ${build}/u-boot-dtb.bin >>${tmp}/out
+dd if=${tmp}/out of=${device} seek=64
+sync
diff --git a/test/hooks/bin/writer.rpi_mount b/test/hooks/bin/writer.rpi_mount
new file mode 100755
index 00000000000..ab7c3b5a243
--- /dev/null
+++ b/test/hooks/bin/writer.rpi_mount
@@ -0,0 +1,43 @@
+# Copyright 2019 Google LLC. All rights reserved.
+# Copyright 2024 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+set -e
+
+build=${U_BOOT_BUILD_DIR}
+
+echo "Writing to ${mount_dir} from build at ${build}"
+
+sudo cp -v ${build}/u-boot.bin ${mount_dir}/u-boot.bin
+
+echo "enable_uart=1" | sudo tee ${mount_dir}/config.txt
+echo "kernel=u-boot.bin" | sudo tee -a ${mount_dir}/config.txt
+
+case "${board_type}" in
+rpi_3|rpi_3b|rpi_3_b_plus|rpi_4|rpi_arm64)
+    echo "arm_64bit=1" | sudo tee -a ${mount_dir}/config.txt
+    ;;
+esac
+
+case "${board_ident}" in
+3-32-pl011)
+    echo "dtoverlay=pi3-miniuart-bt" | sudo tee -a ${mount_dir}/config.txt
+    ;;
+esac
diff --git a/test/hooks/bin/writer.sunxi_raw b/test/hooks/bin/writer.sunxi_raw
new file mode 100755
index 00000000000..faa72b76a4b
--- /dev/null
+++ b/test/hooks/bin/writer.sunxi_raw
@@ -0,0 +1,36 @@
+# Copyright 2019 Google LLC. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Writes sunxi image to the board
+
+# Args:
+#  $1: Device path of the sdcard when board is off (e.g. /dev/sdcard0)
+#  $2: U-Boot build directory
+
+set -ex
+
+device=$1
+build=$2
+
+echo "Writing to ${device} from build at ${build}"
+
+dd if=/dev/zero of=$device bs=1k count=1024
+dd if=${build}/u-boot-sunxi-with-spl.bin of=$device bs=1024 seek=8
+sync $device
diff --git a/test/hooks/bin/writer.ti-k3_mount b/test/hooks/bin/writer.ti-k3_mount
new file mode 100755
index 00000000000..791c77aa09f
--- /dev/null
+++ b/test/hooks/bin/writer.ti-k3_mount
@@ -0,0 +1,36 @@
+# Copyright 2022 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Copies MLO to the filesystem
+
+set -e
+
+build=${U_BOOT_BUILD_DIR}
+
+if [ -z "${tispl}" -o -z "${uboot}" -o -z "${tiboot3}" ]; then
+    echo "Must configure tispl, uboot, tiboot3 and optionally sysfw"
+    echo "per the board documentation."
+    exit 1
+fi
+echo "Writing to ${mount_dir} from build at ${build}"
+sudo cp -v ${build}/${tispl} ${mount_dir}/tispl.bin
+sudo cp -v ${build}/${uboot} ${mount_dir}/u-boot.img
+sudo cp -v ${build/_a??/_r5}/${tiboot3} ${mount_dir}/tiboot3.bin
+[ ! -z "${sysfw}" ] && sudo cp -v ${build/_a??/_r5}/${sysfw} ${mount_dir}/sysfw.itb
diff --git a/test/hooks/bin/writer.ti-omap_mount b/test/hooks/bin/writer.ti-omap_mount
new file mode 100755
index 00000000000..7d1dbee8f65
--- /dev/null
+++ b/test/hooks/bin/writer.ti-omap_mount
@@ -0,0 +1,29 @@
+# Copyright 2022 Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Copies MLO to the filesystem
+
+set -e
+
+build=${U_BOOT_BUILD_DIR}
+
+echo "Writing to ${mount_dir} from build at ${build}"
+
+sudo cp ${build}/MLO ${build}/u-boot.img ${mount_dir}/
diff --git a/test/hooks/bin/writer.zynq_mount b/test/hooks/bin/writer.zynq_mount
new file mode 100755
index 00000000000..c8395a40680
--- /dev/null
+++ b/test/hooks/bin/writer.zynq_mount
@@ -0,0 +1,36 @@
+# Copyright 2020 Google LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# Writes zynq images to the board
+
+set -ex
+
+tmp=$(mktemp -d)
+
+build=${U_BOOT_BUILD_DIR}
+
+echo "Writing to ${mount_dir} from build at ${build}"
+
+# Copy U-Boot over from the build directory
+cp ${build}/u-boot.bin ${mount_dir}/rpi3-u-boot.bin
+zynq-boot-bin.py -o ${tmp}/boot.bin -u ${build}/spl/u-boot-spl-dtb.bin
+cp ${tmp}/boot.bin ${mount_dir}/BOOT.bin
+cp ${build}/u-boot.img ${mount_dir}/.
+rm -rf ${tmp}
diff --git a/test/hooks/contrib/src/.gitignore b/test/hooks/contrib/src/.gitignore
new file mode 100644
index 00000000000..36606cf14b4
--- /dev/null
+++ b/test/hooks/contrib/src/.gitignore
@@ -0,0 +1 @@
+phidgets-relay
diff --git a/test/hooks/contrib/src/README.txt b/test/hooks/contrib/src/README.txt
new file mode 100644
index 00000000000..5a4b59d6d91
--- /dev/null
+++ b/test/hooks/contrib/src/README.txt
@@ -0,0 +1,13 @@
+# Don't use libphidgets22 since it's stupid and resets the state of all outputs
+# on open and close.
+wget https://www.phidgets.com/downloads/phidget21/libraries/linux/libphidget/libphidget_2.1.8.20170607.tar.gz
+tar xf libphidget_2.1.8.20170607.tar.gz
+cd libphidget-2.1.8.20170607
+./configure --prefix="${HOME}/phidgets"
+make
+make install
+cd ..
+./build.sh
+mkdir "${HOME}/phidgets/bin"
+cp phidgets-relay "${HOME}/phidgets/bin"
+LD_LIBRARY_PATH="${HOME}/phidgets/lib" "${HOME}/phidgets/bin/phidgets-relay" 109237 2 1
diff --git a/test/hooks/contrib/src/build.sh b/test/hooks/contrib/src/build.sh
new file mode 100755
index 00000000000..53d40eaca07
--- /dev/null
+++ b/test/hooks/contrib/src/build.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+gcc -o phidgets-relay \
+    -I "${HOME}/phidgets/include" \
+    phidgets-relay.c \
+    -L "${HOME}/phidgets/lib" -lphidget21 \
+    -lusb-1.0 -lpthread -ldl -lm
diff --git a/test/hooks/contrib/src/phidgets-relay.c b/test/hooks/contrib/src/phidgets-relay.c
new file mode 100644
index 00000000000..77afd0c60a8
--- /dev/null
+++ b/test/hooks/contrib/src/phidgets-relay.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <phidget21.h>
+
+static void usage(const char *appname) {
+	fprintf(stderr, "usage: %s serial relay_id value\n", appname);
+	exit(1);
+}
+
+static void phidgets_error(const char *func, int err) {
+	int err2;
+	const char* error;
+
+	fprintf(stderr, "%s() failed:\n", func);
+	err2 = CPhidget_getErrorDescription(err, &error);
+	if (err != EPHIDGET_OK) {
+		fprintf(stderr, "\tPCPhidget_getErrorDescription() failed: %d\n", err2);
+		exit(1);
+	}
+
+	fprintf(stderr, "\t%s\n", error);
+	exit(1);
+}
+
+int main(int argc, char **argv) {
+	int serial, relay_id, value, err;
+	CPhidgetInterfaceKitHandle ifk;
+
+	if (argc != 4)
+		usage(argv[0]);
+
+	serial = atoi(argv[1]);
+	relay_id = atoi(argv[2]);
+	value = atoi(argv[3]);
+
+	err = CPhidget_enableLogging(PHIDGET_LOG_VERBOSE, NULL);
+	if (err != EPHIDGET_OK)
+		phidgets_error("CPhidget_enableLogging", err);
+	err = CPhidgetInterfaceKit_create(&ifk);
+	if (err != EPHIDGET_OK)
+		phidgets_error("CPhidgetInterfaceKit_create", err);
+	err = CPhidget_open((CPhidgetHandle)ifk, serial);
+	if (err != EPHIDGET_OK)
+		phidgets_error("CPhidget_open", err);
+	err = CPhidget_waitForAttachment((CPhidgetHandle)ifk, 0);
+	if (err != EPHIDGET_OK)
+		phidgets_error("CPhidget_waitForAttachment", err);
+	err = CPhidgetInterfaceKit_setOutputState(ifk, relay_id, value);
+	if (err != EPHIDGET_OK)
+		phidgets_error("CPhidgetInterfaceKit_setOutputState", err);
+	err = CPhidget_close((CPhidgetHandle)ifk);
+	if (err != EPHIDGET_OK)
+		phidgets_error("CPhidget_close", err);
+	err = CPhidget_delete((CPhidgetHandle)ifk);
+	if (err != EPHIDGET_OK)
+		phidgets_error("CPhidget_delete", err);
+
+	return 0;
+}
diff --git a/test/hooks/contrib/udev/swarren-lx1/99-ubtest.rules b/test/hooks/contrib/udev/swarren-lx1/99-ubtest.rules
new file mode 100644
index 00000000000..ec7c6e4b5ca
--- /dev/null
+++ b/test/hooks/contrib/udev/swarren-lx1/99-ubtest.rules
@@ -0,0 +1,89 @@
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# One line per physical USB port that is attached to any U-Boot device you
+# wish to test (e.g. serial dongle, flashing device, the board's device-mode
+# port, etc.)
+
+# Jetson TK1 (PM375)
+# Serial console
+ACTION=="add", KERNELS=="ttyS0", ENV{UBTEST_DEVICE}="1", SYMLINK+="console-jetson-tk1"
+# Phidgets control board
+ACTION=="add", SUBSYSTEMS=="usb", DRIVER=="usb", KERNELS=="1-8.7", ENV{UBTEST_DEVICE}="1", SYMLINK+="phidgets-jetson-tk1"
+# Device-mode port
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-8.3", ENV{UBTEST_DEVICE}="1", SYMLINK+="usbdev-jetson-tk1"
+
+# Jetson Nano (p3450-0000)
+# Serial console
+ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-3.4.4:1.0", ENV{UBTEST_DEVICE}="1", SYMLINK+="console-nano"
+# Device-mode port
+ACTION=="add", SUBSYSTEMS=="usb", DRIVER=="usb", KERNELS=="1-3.2", ENV{UBTEST_DEVICE}="1", SYMLINK+="usbdev-nano"
+
+# Jetson TX1 (P2371-2180)
+# Serial console
+ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-4:1.2", ENV{UBTEST_DEVICE}="1", SYMLINK+="console-p2371-2180"
+# PM342 debug board
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-4", ENV{UBTEST_DEVICE}="1", SYMLINK+="pm342-p2371-2180"
+# Device-mode port
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-5", ENV{UBTEST_DEVICE}="1", SYMLINK+="usbdev-p2371-2180"
+
+# Jetson TX2 (P2771-0000)
+# Serial console
+ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-7:1.2", ENV{UBTEST_DEVICE}="1", SYMLINK+="console-p2771-0000"
+# PM342 debug board
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-7", ENV{UBTEST_DEVICE}="1", SYMLINK+="pm342-p2771-0000"
+# Device-mode port
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="3-2", ENV{UBTEST_DEVICE}="1", SYMLINK+="usbdev-p2771-0000"
+
+# Jetson Xavier (B)
+# Serial console
+ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-8.6:1.3", ENV{UBTEST_DEVICE}="1", SYMLINK+="console-xavier-b"
+# FTDI port
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-8.6", ENV{UBTEST_DEVICE}="1", SYMLINK+="pm342-xavier-b"
+# Device-mode port
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-8.5", ENV{UBTEST_DEVICE}="1", SYMLINK+="usbdev-xavier-b"
+
+# Jetson Xavier (C)
+# Serial console
+ACTION=="add", SUBSYSTEM=="tty", KERNELS=="1-8.4:1.3", ENV{UBTEST_DEVICE}="1", SYMLINK+="console-xavier-c"
+# FTDI port
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-8.4", ENV{UBTEST_DEVICE}="1", SYMLINK+="pm342-xavier-c"
+# Device-mode port
+ACTION=="add", SUBSYSTEMS=="usb", KERNELS=="1-8.2", ENV{UBTEST_DEVICE}="1", SYMLINK+="usbdev-xavier-c"
+
+# NVIDIA's PM342 control scripts search for devices with matching USB vendor
+# and device ID, then check each to verify if it matches the requested serial
+# number. If a USB device node isn't r/w for the user running the script,
+# the device can be enumerated, but the serial number can't be queried. The
+# PM342 scripts (or libftdi/libusb called by them) treat this as an error,
+# which stops the script from looking for further PM342 devices. This will
+# sometimes prevent the scripts seeing a PM342, even if that specific device
+# has permissions that allow the serial number to be read. Fix this by opening
+# the permissions for all PM342 devices. Also note that all PM342 devices (and
+# in fact any FTDI devices at least with the same vid/pid) MUST have a serial
+# number defined; an empty serial number in one device also causes failures
+# finding other devices:-(
+ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ENV{UBTEST_DEVICE}="1"
+
+# Configure the port with permissions that will allow the test program to run
+# as an unprivileged user. In the example below, all users are given access.
+# If you need more restrictive permissions, set "OWNER" or "GROUP" instead,
+# and run the test as that user/group.
+ACTION=="add", ENV{UBTEST_DEVICE}=="1", MODE:="666"
diff --git a/test/hooks/py/OLI01/u_boot_boardenv_mx6qsabrelite_na.py b/test/hooks/py/OLI01/u_boot_boardenv_mx6qsabrelite_na.py
new file mode 100644
index 00000000000..e0d990fb250
--- /dev/null
+++ b/test/hooks/py/OLI01/u_boot_boardenv_mx6qsabrelite_na.py
@@ -0,0 +1,39 @@
+# Copyright (c) 2016, Guillaume GARDET. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+env__net_static_env_vars = [
+    ("ethaddr", "00:14:6C:8A:CA:D9"),
+    ("ipaddr", "192.168.2.10"),
+    ("netmask", "255.255.255.0"),
+    ("serverip", "192.168.2.1"),
+    ("tftpserverip", "192.168.2.1"),
+]
+
+env__net_tftp_readable_file = {
+    "fn": "linux.vmx",
+    "size": 7368000,
+    "crc32": "ef74eee2",
+}
+
+env__net_nfs_readable_file = {
+    "fn": "/home/guillaume/nfs/linux.vmx",
+    "size": 7368000,
+    "crc32": "ef74eee2",
+}
diff --git a/test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_4.py b/test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_4.py
new file mode 120000
index 00000000000..d6f7a632f39
--- /dev/null
+++ b/test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_4.py
@@ -0,0 +1 @@
+u_boot_boardenv_rpi_arm64.py
\ No newline at end of file
diff --git a/test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_arm64.py b/test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_arm64.py
new file mode 100644
index 00000000000..c7985a53734
--- /dev/null
+++ b/test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_arm64.py
@@ -0,0 +1,84 @@
+# Copyright (c) 2025, Konsulko Group. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+
+env__net_uses_usb = True
+
+env__net_dhcp_server = True
+
+# The file 1MiBtest.bin is created with:
+# dd if=/dev/urandom of=1MiBtest.bin bs=1M count=1
+env__net_tftp_readable_file = {
+    "fn": "1MiBtest.bin",
+    "size": 1048576,
+    "crc32": "2fa737e0",
+    "fnu": "ubtest-upload.bin",
+}
+
+# Extracted from a previous U-Boot build.
+env__efi_loader_helloworld_file = {
+    'fn': 'EFI/arm64/helloworld.efi',
+    'size': 4528,
+    'addr': 0x00200000,
+    'crc32': '2b466005',
+}
+
+# Taken from an existing functional binary elsewhere.
+env__efi_loader_grub_file = {
+    'fn': 'EFI/arm64/grubaa64.efi',
+    'size': 724992,
+    'addr': 0x00200000,
+    'crc32': '8db3f0f1',
+}
+
+env__tftp_boot_test_skip = False
+
+# A build of upstream v6.13 arm64 defconfig and image.fit
+env__net_tftp_bootable_file = {
+    'timeout': 50000,
+    'addr': 0x00200000,
+    'fn': 'v6.13/image.fit.arm64',
+    'size': 28574720,
+    'crc32': '8513595c',
+    'pattern': 'Booting Linux on physical CPU',
+}
+
+# Based on the explanation in test/py/tests/test_net_boot.py
+env__net_pxe_bootable_file = {
+    'fn': 'default',
+    'addr': 0x00200000,
+    'size': 64,
+    'timeout': 50000,
+    'pattern': 'Linux',
+    'valid_label': '1',
+    'invalid_label': '2',
+    'exp_str_invalid': 'Skipping install for failure retrieving',
+    'local_label': '3',
+    'exp_str_local': 'missing environment variable: localcmd',
+    'empty_label': '4',
+    'exp_str_empty': 'No kernel given, skipping boot',
+}
+env__pxe_boot_test_skip = False
+
+env__bootstage_cmd_file = {
+    'addr': 0x2400000,
+    'size': 0x1000,
+    'bootstage_magic_addr': 0xb00757a3,
+}
diff --git a/test/hooks/py/swarren-lx1/u_boot_boardenv_jetson_tk1_na.py b/test/hooks/py/swarren-lx1/u_boot_boardenv_jetson_tk1_na.py
new file mode 100644
index 00000000000..6d1e424c9f1
--- /dev/null
+++ b/test/hooks/py/swarren-lx1/u_boot_boardenv_jetson_tk1_na.py
@@ -0,0 +1,110 @@
+# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+env__mount_points = (
+    "/mnt/ubtest-mnt-jetson-tk1-na",
+)
+
+env__usb_dev_ports = (
+    {
+        "fixture_id": "micro_b",
+        "tgt_usb_ctlr": "0",
+        "host_ums_dev_node": "/dev/disk/by-path/pci-0000:00:14.0-usb-0:8.3:1.0-scsi-0:0:0:0",
+        "host_usb_dev_node": "/dev/usbdev-jetson-tk1",
+        "host_usb_port_path": "1-8.3",
+    },
+)
+
+env__block_devs = (
+    # SD card; present since I plugged one in
+    {
+        "fixture_id": "sd",
+        "type": "mmc",
+        "id": "1",
+        "writable_fs_partition": 1,
+        "writable_fs_subdir": "tmp/",
+    },
+    # eMMC; always present
+    {
+        "fixture_id": "emmc",
+        "type": "mmc",
+        "id": "0",
+    },
+)
+
+env__dfu_configs = (
+    # SD card, partition 1, ext4 filesystem
+    {
+        "fixture_id": "sd_fs",
+        "alt_info": "/dfu_test.bin ext4 1 1;/dfu_dummy.bin ext4 1 1",
+        "cmd_params": "mmc 1",
+        "test_sizes": (
+            64 - 1,
+            64,
+            64 + 1,
+            4096 - 1,
+        ),
+    },
+    # SD card, partition 3, partition
+    {
+        "fixture_id": "sd_part",
+        "alt_info": "/dfu_test.bin part 1 3;/dfu_dummy.bin ext4 1 1",
+        "cmd_params": "mmc 1",
+        "test_sizes": (
+            128 - 1,
+            128,
+            128 + 1,
+            4096,
+        ),
+    },
+    # SD card, partition 3, raw device (location overlays partition 3)
+    {
+        "fixture_id": "sd_raw",
+        "alt_info": "/dfu_test.bin raw 4196352 18432;/dfu_dummy.bin ext4 1 1",
+        "cmd_params": "mmc 1",
+        "test_sizes": (
+            960 - 1,
+            960,
+            960 + 1,
+            4096 + 1,
+        ),
+    },
+    # RAM
+    {
+        "fixture_id": "ram",
+        "alt_info": "alt0 ram 80000000 01000000;alt1 ram 81000000 01000000",
+        "cmd_params": "ram na",
+        "test_sizes": (
+            1024 * 1024 - 1,
+            1024 * 1024,
+            8 * 1024 * 1024,
+        ),
+    },
+)
+
+env__net_uses_pci = True
+
+env__net_dhcp_server = True
+
+env__net_tftp_readable_file = {
+    "fn": "ubtest-readable.bin",
+    "size": 5058624,
+    "crc32": "c2244b26",
+}
diff --git a/test/hooks/py/swarren-lx1/u_boot_boardenv_p2371_2180_na.py b/test/hooks/py/swarren-lx1/u_boot_boardenv_p2371_2180_na.py
new file mode 100644
index 00000000000..25ad0d4326d
--- /dev/null
+++ b/test/hooks/py/swarren-lx1/u_boot_boardenv_p2371_2180_na.py
@@ -0,0 +1,110 @@
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+env__mount_points = (
+    "/mnt/ubtest-mnt-p2371-2180-na",
+)
+
+env__usb_dev_ports = (
+    {
+        "fixture_id": "micro_b",
+        "tgt_usb_ctlr": "0",
+        "host_ums_dev_node": "/dev/disk/by-path/pci-0000:00:14.0-usb-0:5:1.0-scsi-0:0:0:0",
+        "host_usb_dev_node": "/dev/usbdev-p2371-2180",
+        "host_usb_port_path": "1-5",
+    },
+)
+
+env__block_devs = (
+    # SD card; present since I plugged one in
+    {
+        "fixture_id": "sd",
+        "type": "mmc",
+        "id": "1",
+        "writable_fs_partition": 1,
+        "writable_fs_subdir": "tmp/",
+    },
+    # eMMC; always present
+    {
+        "fixture_id": "emmc",
+        "type": "mmc",
+        "id": "0",
+    },
+)
+
+env__dfu_configs = (
+    # SD card, partition 1, ext4 filesystem
+    {
+        "fixture_id": "sd_fs",
+        "alt_info": "/dfu_test.bin ext4 1 1;/dfu_dummy.bin ext4 1 1",
+        "cmd_params": "mmc 1",
+        "test_sizes": (
+            64 - 1,
+            64,
+            64 + 1,
+            4096 - 1,
+        ),
+    },
+    # SD card, partition 3, partition
+    {
+        "fixture_id": "sd_part",
+        "alt_info": "/dfu_test.bin part 1 3;/dfu_dummy.bin ext4 1 1",
+        "cmd_params": "mmc 1",
+        "test_sizes": (
+            128 - 1,
+            128,
+            128 + 1,
+            4096,
+        ),
+    },
+    # SD card, partition 3, raw device (location overlays partition 3)
+    {
+        "fixture_id": "sd_raw",
+        "alt_info": "/dfu_test.bin raw 4196352 18432;/dfu_dummy.bin ext4 1 1",
+        "cmd_params": "mmc 1",
+        "test_sizes": (
+            960 - 1,
+            960,
+            960 + 1,
+            4096 + 1,
+        ),
+    },
+    # RAM
+    {
+        "fixture_id": "ram",
+        "alt_info": "alt0 ram 80000000 01000000;alt1 ram 81000000 01000000",
+        "cmd_params": "ram na",
+        "test_sizes": (
+            1024 * 1024 - 1,
+            1024 * 1024,
+            8 * 1024 * 1024,
+        ),
+    },
+)
+
+env__net_uses_pci = True
+
+env__net_dhcp_server = True
+
+env__net_tftp_readable_file = {
+    "fn": "ubtest-readable.bin",
+    "size": 5058624,
+    "crc32": "c2244b26",
+}
diff --git a/test/hooks/py/swarren-lx1/u_boot_boardenv_p2771_0000_500_na.py b/test/hooks/py/swarren-lx1/u_boot_boardenv_p2771_0000_500_na.py
new file mode 100644
index 00000000000..84283cebde4
--- /dev/null
+++ b/test/hooks/py/swarren-lx1/u_boot_boardenv_p2771_0000_500_na.py
@@ -0,0 +1,73 @@
+# Copyright (c) 2015-2018, NVIDIA CORPORATION. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+env__net_uses_pci = False
+
+env__net_dhcp_server = True
+
+env__net_tftp_readable_file = {
+    "fn": "ubtest-readable.bin",
+    "size": 5058624,
+    "crc32": "c2244b26",
+}
+
+env__mmc_rd_configs = (
+    {
+        "fixture_id": "emmc-boot0",
+        "is_emmc": True,
+        "devid": 0,
+        "partid": 1,
+        "sector": 0x10,
+        "count": 1,
+    },
+    {
+        "fixture_id": "emmc-boot1",
+        "is_emmc": True,
+        "devid": 0,
+        "partid": 2,
+        "sector": 0x10,
+        "count": 1,
+    },
+    {
+        "fixture_id": "emmc-data",
+        "is_emmc": True,
+        "devid": 0,
+        "partid": 0,
+        "sector": 0x10,
+        "count": 0x1000,
+    },
+    {
+        "fixture_id": "sd-mbr",
+        "is_emmc": False,
+        "devid": 1,
+        "partid": None,
+        "sector": 0,
+        "count": 1,
+        "crc32": "8f6ecf0d",
+    },
+    {
+        "fixture_id": "sd-large",
+        "is_emmc": False,
+        "devid": 1,
+        "partid": None,
+        "sector": 0x10,
+        "count": 0x1000,
+    },
+)
diff --git a/test/hooks/py/travis-ci/travis_tftp.py b/test/hooks/py/travis-ci/travis_tftp.py
new file mode 100644
index 00000000000..3e1f11d3956
--- /dev/null
+++ b/test/hooks/py/travis-ci/travis_tftp.py
@@ -0,0 +1,31 @@
+import os
+import binascii
+
+def file2env(file_name, addr=None):
+    """Create dictionary describing file
+
+    @filename:  name of the file to be described
+    @addr:      address used for loading the file as int (e.g. 0x40400000)
+    Return:     dictionary describing the file with entries
+                * fn    - filename
+                * size  - file size in bytes
+                * crc32 - checksum using CRC-32 algorithm
+                * addr  - loading address, optional
+    """
+    file_full = os.environ['UBOOT_TRAVIS_BUILD_DIR'] + "/" + file_name
+
+    if not os.path.isfile(file_full):
+        return None
+
+    ret = {
+        "fn": file_name,
+        "size": os.path.getsize(file_full),
+    }
+
+    with open(file_full, 'rb') as fd:
+        ret["crc32"] = hex(binascii.crc32(fd.read()) & 0xffffffff)[2:]
+
+    if addr is not None:
+        ret['addr'] = addr
+
+    return ret
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_M5208EVBE_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_M5208EVBE_qemu.py
new file mode 100644
index 00000000000..4e100cd410d
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_M5208EVBE_qemu.py
@@ -0,0 +1,6 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = False
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2500_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2500_qemu.py
new file mode 100644
index 00000000000..f4b6b2728b3
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2500_qemu.py
@@ -0,0 +1,5 @@
+import travis_tftp
+
+env__spl_skipped = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2600_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2600_qemu.py
new file mode 100644
index 00000000000..396261efa3a
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2600_qemu.py
@@ -0,0 +1,4 @@
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_malta64_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_malta64_qemu.py
new file mode 100644
index 00000000000..5cc141fa1cd
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_malta64_qemu.py
@@ -0,0 +1,5 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot', 0xffffffff81000000)
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_malta64el_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_malta64el_qemu.py
new file mode 100644
index 00000000000..5cc141fa1cd
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_malta64el_qemu.py
@@ -0,0 +1,5 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot', 0xffffffff81000000)
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_malta_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_malta_qemu.py
new file mode 100644
index 00000000000..af9ea6d5439
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_malta_qemu.py
@@ -0,0 +1,5 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot', 0x81000000)
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_maltael_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_maltael_qemu.py
new file mode 100644
index 00000000000..af9ea6d5439
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_maltael_qemu.py
@@ -0,0 +1,5 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot', 0x81000000)
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_ae3xx_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_ae3xx_na.py
new file mode 100644
index 00000000000..97272d548fb
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_ae3xx_na.py
@@ -0,0 +1,6 @@
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_na.py
new file mode 100644
index 00000000000..8e1a7709ec8
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_na.py
@@ -0,0 +1,12 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot.bin', 0x40400000)
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi', 0x40400000)
+env__efi_loader_grub_file = travis_tftp.file2env('grub_arm64.efi', 0x40400000)
+env__efi_fit_tftp_file = {
+    'addr' : 0x40400000,
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64be_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64be_na.py
new file mode 100644
index 00000000000..5746b37dbcf
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64be_na.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot.bin', 0x40400000)
+env__efi_fit_tftp_file = {
+    'addr' : 0x40400000,
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm_na.py
new file mode 100644
index 00000000000..718c87bbe14
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm_na.py
@@ -0,0 +1,12 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot.bin', 0x40400000)
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi', 0x40400000)
+env__efi_loader_grub_file = travis_tftp.file2env('grub_arm.efi', 0x40400000)
+env__efi_fit_tftp_file = {
+    'addr' : 0x40400000,
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_ax25_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_ax25_na.py
new file mode 100644
index 00000000000..97272d548fb
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_ax25_na.py
@@ -0,0 +1,6 @@
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_loongarch64_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_loongarch64_na.py
new file mode 100644
index 00000000000..8a9f747f045
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_loongarch64_na.py
@@ -0,0 +1,11 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_loongarch64.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_na.py
new file mode 100644
index 00000000000..ba6c12249a7
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_na.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_riscv32.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_spl_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_spl_na.py
new file mode 100644
index 00000000000..ba6c12249a7
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_spl_na.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_riscv32.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_na.py
new file mode 100644
index 00000000000..a86e0bd42a6
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_na.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_riscv64.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_spl_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_spl_na.py
new file mode 100644
index 00000000000..a86e0bd42a6
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_spl_na.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_riscv64.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_64_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_64_na.py
new file mode 100644
index 00000000000..a50d60d9b4c
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_64_na.py
@@ -0,0 +1,12 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_check_smbios = True
+env__efi_loader_grub_file = travis_tftp.file2env('grub_x64.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_na.py
new file mode 100644
index 00000000000..e2e795b1c10
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_na.py
@@ -0,0 +1,12 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_check_smbios = True
+env__efi_loader_grub_file = travis_tftp.file2env('grub_x86.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_qemu_xtensa_dc233c_na.py b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_xtensa_dc233c_na.py
new file mode 100644
index 00000000000..8fdb24b284c
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_qemu_xtensa_dc233c_na.py
@@ -0,0 +1,6 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_i82557c_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_i82557c_qemu.py
new file mode 100644
index 00000000000..8fdb24b284c
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_i82557c_qemu.py
@@ -0,0 +1,6 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_pcnet_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_pcnet_qemu.py
new file mode 100644
index 00000000000..8fdb24b284c
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_pcnet_qemu.py
@@ -0,0 +1,6 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_rtl8139_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_rtl8139_qemu.py
new file mode 100644
index 00000000000..8fdb24b284c
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_rtl8139_qemu.py
@@ -0,0 +1,6 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_tulip_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_tulip_qemu.py
new file mode 100644
index 00000000000..8fdb24b284c
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_tulip_qemu.py
@@ -0,0 +1,6 @@
+import os
+import travis_tftp
+
+env__net_uses_pci = True
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_sdcard_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_sdcard_qemu.py
new file mode 100644
index 00000000000..a86e0bd42a6
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_sdcard_qemu.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_riscv64.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_spi_nor_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_spi_nor_qemu.py
new file mode 100644
index 00000000000..a86e0bd42a6
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_spi_nor_qemu.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_riscv64.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca15_tc2_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca15_tc2_qemu.py
new file mode 100644
index 00000000000..ffb84d6a242
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca15_tc2_qemu.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_arm.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca9x4_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca9x4_qemu.py
new file mode 100644
index 00000000000..ffb84d6a242
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca9x4_qemu.py
@@ -0,0 +1,10 @@
+import os
+import travis_tftp
+
+env__net_dhcp_server = True
+env__net_tftp_readable_file = travis_tftp.file2env('u-boot')
+env__efi_loader_helloworld_file = travis_tftp.file2env('lib/efi_loader/helloworld.efi')
+env__efi_loader_grub_file = travis_tftp.file2env('grub_arm.efi')
+env__efi_fit_tftp_file = {
+    "dn" : os.environ['UBOOT_TRAVIS_BUILD_DIR'],
+}
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_xilinx_versal_virt_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_xilinx_versal_virt_qemu.py
new file mode 100644
index 00000000000..6fd75071ce0
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_xilinx_versal_virt_qemu.py
@@ -0,0 +1 @@
+env__tpm_device_test_skip=True
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_xilinx_zynq_virt_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_xilinx_zynq_virt_qemu.py
new file mode 100644
index 00000000000..42685ad42d9
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_xilinx_zynq_virt_qemu.py
@@ -0,0 +1,3 @@
+env__spl_skipped = True
+env__saveenv_test_skip = True
+env__reset_test_skip = True
diff --git a/test/hooks/py/travis-ci/u_boot_boardenv_zynq_zc702_qemu.py b/test/hooks/py/travis-ci/u_boot_boardenv_zynq_zc702_qemu.py
new file mode 100644
index 00000000000..42685ad42d9
--- /dev/null
+++ b/test/hooks/py/travis-ci/u_boot_boardenv_zynq_zc702_qemu.py
@@ -0,0 +1,3 @@
+env__spl_skipped = True
+env__saveenv_test_skip = True
+env__reset_test_skip = True
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 2/3] doc: Tidy up the hooks documentation
  2025-05-02  2:50 [PATCH 0/3] RFC: test: Bring in the test hooks Simon Glass
  2025-05-02  2:50 ` [PATCH 1/3] " Simon Glass
@ 2025-05-02  2:50 ` Simon Glass
  2025-05-02  2:50 ` [PATCH 3/3] CI: Update to use the hooks in the U-Boot repo Simon Glass
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 25+ messages in thread
From: Simon Glass @ 2025-05-02  2:50 UTC (permalink / raw)
  To: U-Boot Mailing List; +Cc: Tom Rini, Heinrich Schuchardt, Simon Glass

Now that these files are within the repo, link the documentation to the
normal U-Boot documentation. Update directory paths and convert it to
rST format.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 doc/develop/index.rst                         |  1 +
 doc/develop/py_testing.rst                    | 22 +++---
 .../README.md => doc/develop/test_hooks.rst   | 72 +++++++++++--------
 3 files changed, 54 insertions(+), 41 deletions(-)
 rename test/hooks/README.md => doc/develop/test_hooks.rst (87%)

diff --git a/doc/develop/index.rst b/doc/develop/index.rst
index d9f2a838207..ffbb3aeb466 100644
--- a/doc/develop/index.rst
+++ b/doc/develop/index.rst
@@ -85,6 +85,7 @@ Testing
    tests_writing
    tests_sandbox
    binman_tests
+   test_hooks
 
 Refactoring
 -----------
diff --git a/doc/develop/py_testing.rst b/doc/develop/py_testing.rst
index fb153a277fc..c65de27369b 100644
--- a/doc/develop/py_testing.rst
+++ b/doc/develop/py_testing.rst
@@ -314,6 +314,8 @@ via `$PATH`. These scripts implement certain actions on behalf of the test
 suite. This keeps the test suite simple and isolated from system variances
 unrelated to U-Boot features.
 
+For more details see :doc:`test_hooks`.
+
 Hook scripts
 ~~~~~~~~~~~~
 
@@ -404,9 +406,9 @@ saving wear on the flash chip(s).
 Examples
 ''''''''
 
-https://source.denx.de/u-boot/u-boot-test-hooks contains some working example hook
+The directory `test/hooks` contains some working example hook
 scripts, and may be useful as a reference when implementing hook scripts for
-your platform. These scripts are not considered part of U-Boot itself.
+your platform. These scripts are considered part of U-Boot itself.
 
 Board-type-specific configuration
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -469,16 +471,16 @@ instances of:
 Complete invocation example
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Assuming that you have installed the hook scripts into $HOME/ubtest/bin, and
-any required environment configuration Python modules into $HOME/ubtest/py,
-then you would likely invoke the test script as follows:
+Assuming that you have installed U-Boot `$UBOOT`, any new hooks into
+`$UBOOT/test/hooks/bin` and any new configuration Python modules into
+`$UBOOT/test/hooks/py`, then you would likely invoke the test script as follows:
 
 If U-Boot has already been built:
 
 .. code-block:: bash
 
-    PATH=$HOME/ubtest/bin:$PATH \
-    PYTHONPATH=${HOME}/ubtest/py/${HOSTNAME}:${PYTHONPATH} \
+    PATH=$UBOOT/test/hooks/bin:$PATH \
+    PYTHONPATH=$UBOOT/test/hooks/py/${HOSTNAME}:${PYTHONPATH} \
     ./test/py/test.py --bd seaboard
 
 If you want the test script to compile U-Boot for you too, then you likely
@@ -488,7 +490,7 @@ follows:
 .. code-block:: bash
 
     CROSS_COMPILE=arm-none-eabi- \
-    PATH=$HOME/ubtest/bin:$PATH \
+    PATH=$UBOOT/test/hooks/bin:$PATH \
     PYTHONPATH=${HOME}/ubtest/py/${HOSTNAME}:${PYTHONPATH} \
     ./test/py/test.py --bd seaboard --build
 
@@ -496,8 +498,8 @@ or, using buildman to handle it:
 
 .. code-block:: bash
 
-    PATH=$HOME/ubtest/bin:$PATH \
-    PYTHONPATH=${HOME}/ubtest/py/${HOSTNAME}:${PYTHONPATH} \
+    PATH=$UBOOT/test/hooks/bin:$PATH \
+    PYTHONPATH=$UBOOT/test/hooks/py/${HOSTNAME}:${PYTHONPATH} \
     ./test/py/test.py --bd seaboard --build --buildman
 
 Writing tests
diff --git a/test/hooks/README.md b/doc/develop/test_hooks.rst
similarity index 87%
rename from test/hooks/README.md
rename to doc/develop/test_hooks.rst
index ecf8a46c4a5..c86b45b38b9 100644
--- a/test/hooks/README.md
+++ b/doc/develop/test_hooks.rst
@@ -1,17 +1,20 @@
-# Introduction
+Hardware testing
+================
 
-This repository contains working example support ("hook") scripts for U-Boot's
+The ``test/hooks`` directory contains support ("hook") scripts for U-Boot's
 built-in test framework. That framework is located in the `test/py/` directory
 in the U-Boot source tree.
 
 You may use these examples as a reference when creating your own hook scripts,
-or even derive your own scripts directly from the files in this repository.
+or even derive your own scripts directly from the files in ``test/hooks``.
 
-# Contributing
+Contributing
+------------
 
-See [Contributing.md](Contributing.md).
+Please send a patch to the U-Boot as per :doc:`process`
 
-# Flashing Philosophy
+Flashing Philosophy
+-------------------
 
 U-Boot may be installed onto a target device either by:
 
@@ -22,14 +25,15 @@ U-Boot may be installed onto a target device either by:
   download needs to happen every time the target board is reset, since the
   desired binary is not permanently stored on the system.
 
-The example scripts in this repository take the second approach. This approach
+The example scripts in ``test/hooks`` take the second approach. This approach
 avoids modifying the device's flash memory for each U-Boot binary to be tested,
 which should increase longevity of the device. This does mean that the
 implementation of the `test/py/` hook scripts is slightly inconsistent with
 their naming; `u-boot-test-flash` does nothing whereas `u-boot-test-reset`
 downloads U-Boot into RAM rather than only performing a simple system reset.
 
-# USB Port Paths
+USB Port Paths
+--------------
 
 When multiple USB devices of the same type are attached to the same system, some
 mechanism for differentiating between them is required, in order for software to
@@ -52,7 +56,7 @@ numbers form the balance of the USB port path.
 Linux uses the format `${bus}-${port}.${port}.${port}...` to represent the USB
 port path.
 
-For example:
+For example::
 
     +--------------+
     | PC           |
@@ -78,7 +82,7 @@ experimentation using tools such as `picocom` or `mount` and `ls`.
 
 Once a device node has been identified, use udevadm to query all known
 information about the device, then find an entry with `SUBSYSTEMS=="usb"` and a
-`KERNELS` value in the format of a USB port path:
+`KERNELS` value in the format of a USB port path::
 
     $ udevadm info -a /dev/ttyUSB2
     ...
@@ -109,7 +113,7 @@ information about the device, then find an entry with `SUBSYSTEMS=="usb"` and a
 
 Here, the USB port path is "`3-6`".
 
-or:
+or::
 
     $ udevadm info -a /dev/bus/usb/003/086
     ....
@@ -120,9 +124,10 @@ or:
 
 Here, the USB port path is "`3-10.4`".
 
-# udev Rules
+udev Rules
+----------
 
-See the `udev/` directory in this repository.
+See the `test/hooks/udev/` directory.
 
 Testing should be performed as a non-root user. This requires that the relevant
 device nodes have non-default permissions. udev rules may be used to achieve
@@ -145,9 +150,10 @@ path.
 
 The example udev rules demonstrate both of these types of rules.
 
-# Scripts and Binaries
+Scripts and Binaries
+--------------------
 
-See the `bin/` directory in this repository.
+See the `test/hooks/bin/` directory.
 
 Scripts exist to power on, power off, flash, and reset Tegra boards, and access
 their serial console. The U-Boot test framework expects these scripts to exist
@@ -175,10 +181,11 @@ more than include a board-specific configuration file, and then include another
 file specific to implementation the desired action.
 
 Board configuration files are located in
-`bin/${hostname}/conf.${board_type}_${board_identity}`. These files are
-segregated by hostname so that the repository can be used directly across
+`test/hooks/bin/${hostname}/conf.${board_type}_${board_identity}`. These files
+are segregated by hostname so that the repository can be used directly across
 multiple different test machines, without the need for host-specific branches or
-post-checkout configuration.
+post-checkout configuration. Your scripts can also exist outside the U-Boot
+repo if that is helpful.
 
 The board configuration file defines which mechanism is used for each possible
 action, and any parameters associated with it. For example, downloading U-Boot
@@ -187,8 +194,8 @@ T124 or earlier, or L4T's `exec-uboot.sh` for boards containing T210 or newer.
 These scripts. In each case, the directory name where the tool is installed must
 be defined.
 
-Each action is implemented in a script fragment directly in the `bin/` directory,
-with filename `${action_type}.${implementation_name}`.
+Each action is implemented in a script fragment directly in the`test/hooks/bin/`
+directory, with filename `${action_type}.${implementation_name}`.
 
 If using these scripts directly for testing Tegra devices, it is likely that
 you will not need to create new `download.*` implementations, but will need to
@@ -199,7 +206,8 @@ scripts must be replicated once per board instance, or their actions somehow
 serialized, since they copy files into their own directories when executing, and
 hence parallel execution would cause incorrect operation.
 
-## Labgrid Integration
+Labgrid Integration
+-------------------
 
 Labgrid is a python library for embedded-board-control. It includes a client
 program which is used to integrate with the U-Boot pytests.
@@ -208,9 +216,9 @@ Since Labgrid has all the information necessary to build and boot on a lab,
 there is no per-board configuration required. The various flash.xxx and
 recovery.xxx scripts are not used. To set it up, one implementation is:
 
-- In your bin/$hostname directory, create an executable file
+- In the test/hooks/bin/$hostname directory, create an executable file
   `common-labgrid-sjg` and set your crossbar and environment information, for
-  example:
+  example::
 
       # Hostname and port for the gRPC coordinator
       export LG_COORDINATOR=kea:20408
@@ -219,7 +227,7 @@ recovery.xxx scripts are not used. To set it up, one implementation is:
       export LG_ENV="/path/to/kea_env.cfg"
 
       # Location of the U-Boot test hooks
-      export UB_TEST_HOOKS=/path/to/u-boot-test-hooks
+      export UB_TEST_HOOKS=/path/to/u-boot/test/hooks
 
       # Make sure only one buildman can run at a time, since it uses all CPUs
       export BUILDMAN_PROCESS_LIMIT=1
@@ -258,10 +266,11 @@ variables must be set as per your lab:
 - `LG_ENV` must point at the labgrid yaml file that describes your lab.
 
 In order for a given platform to be tested, it must be acquired before starting
-tests and then released once complete. See the bin/konsulko-labgrid directory
-for example boards using this method.
+tests and then released once complete. See the `test/hooks/bin/konsulko-labgrid`
+directory for example boards using this method.
 
-## Dependencies
+Dependencies
+------------
 
 The example scripts depend on various external tools, the installation location
 of which must be specified in the board configuration files:
@@ -280,9 +289,10 @@ of which must be specified in the board configuration files:
 U-Boot's test framework also requires a `dfu-util` that supports the -p
 command-line option. Most distros provide this nowadays.
 
-# Python Modules
+Python Modules
+--------------
 
-See the `py/` directory in this repository.
+See the `test/hooks/py/` directory.
 
 A Python module exists for each board and defines numerous parameters used by
 the U-Boot test framework. The framework expects to simply import these modules
@@ -292,5 +302,5 @@ These modules are again located in a separate directory for each host, so that
 the repository may be shared across hosts.
 
 For complete details re: the required content of these Python modules, please
-see `test/py/README.md` in the U-boot source tree, and also the comments in some
-individual test files in `test/py/tests/test_*.py`.
+see :doc:`py_testing` and also the comments in some individual test files in
+`test/py/tests/test_*.py`.
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 3/3] CI: Update to use the hooks in the U-Boot repo
  2025-05-02  2:50 [PATCH 0/3] RFC: test: Bring in the test hooks Simon Glass
  2025-05-02  2:50 ` [PATCH 1/3] " Simon Glass
  2025-05-02  2:50 ` [PATCH 2/3] doc: Tidy up the hooks documentation Simon Glass
@ 2025-05-02  2:50 ` Simon Glass
  2025-05-02  4:18   ` Heinrich Schuchardt
  2025-05-02 14:33 ` [PATCH 0/3] RFC: test: Bring in the test hooks Tom Rini
  2025-05-05  7:00 ` neil.armstrong
  4 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-02  2:50 UTC (permalink / raw)
  To: U-Boot Mailing List; +Cc: Tom Rini, Heinrich Schuchardt, Simon Glass

Now that the hooks are present, make use of them directly rather than
cloning the separate repo.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 .azure-pipelines.yml | 15 +++++++--------
 .gitlab-ci.yml       | 16 +++++++---------
 2 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml
index a00ee67f297..bf50727ea55 100644
--- a/.azure-pipelines.yml
+++ b/.azure-pipelines.yml
@@ -251,13 +251,12 @@ stages:
           # the below corresponds to .gitlab-ci.yml "before_script"
           cd \${WORK_DIR}
           git config --global --add safe.directory \${WORK_DIR}
-          git clone --depth=1 https://source.denx.de/u-boot/u-boot-test-hooks /tmp/uboot-test-hooks
           # qemu_arm64_lwip_defconfig is the same as qemu_arm64 but with NET_LWIP enabled.
           # The test config and the boardenv file from qemu_arm64 can be re-used so create symlinks
-          ln -s conf.qemu_arm64_na /tmp/uboot-test-hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
-          ln -s u_boot_boardenv_qemu_arm64_na.py /tmp/uboot-test-hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
-          ln -s travis-ci /tmp/uboot-test-hooks/bin/\`hostname\`
-          ln -s travis-ci /tmp/uboot-test-hooks/py/\`hostname\`
+          ln -s conf.qemu_arm64_na test/hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
+          ln -s u_boot_boardenv_qemu_arm64_na.py test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
+          ln -s travis-ci test/hooks/bin/\`hostname\`
+          ln -s travis-ci test/hooks/py/\`hostname\`
           if [[ "\${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
               wget -O - https://github.com/riscv-software-src/opensbi/releases/download/v1.3.1/opensbi-1.3.1-rv-bin.tar.xz | tar -C /tmp -xJ;
               export OPENSBI=/tmp/opensbi-1.3.1-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin;
@@ -307,12 +306,12 @@ stages:
               /opt/coreboot/cbfstool \${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom remove -n fallback/payload;
               /opt/coreboot/cbfstool \${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom add-flat-binary -f \${UBOOT_TRAVIS_BUILD_DIR}/u-boot.bin -n fallback/payload -c LZMA -l 0x1110000 -e 0x1110000;
           fi
-          export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:\${PATH}
-          export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci
+          export PATH=/opt/qemu/bin:test/hooks/bin:\${PATH}
+          export PYTHONPATH=test/hooks/py/travis-ci
           # "\${var:+"-k \$var"}" expands to "" if \$var is empty, "-k \$var" if not
           ./test/py/test.py -ra -o cache_dir="\$UBOOT_TRAVIS_BUILD_DIR"/.pytest_cache --bd \${TEST_PY_BD} \${TEST_PY_ID} \${TEST_PY_EXTRA} \${TEST_PY_TEST_SPEC:+"-k \${TEST_PY_TEST_SPEC}"} --build-dir "\$UBOOT_TRAVIS_BUILD_DIR" --report-dir "\$UBOOT_TRAVIS_BUILD_DIR" --junitxml=\$(System.DefaultWorkingDirectory)/results.xml
           # the below corresponds to .gitlab-ci.yml "after_script"
-          rm -rf /tmp/uboot-test-hooks /tmp/venv
+          rm -rf /tmp/venv
           EOF
       - task: CopyFiles@2
         displayName: 'Copy test.sh for later usage'
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9f69895efd8..ba9ca5fb9e0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -30,15 +30,13 @@ stages:
   rules:
     - when: always
   before_script:
-    # Clone uboot-test-hooks
     - git config --global --add safe.directory "${CI_PROJECT_DIR}"
-    - git clone --depth=1 https://source.denx.de/u-boot/u-boot-test-hooks /tmp/uboot-test-hooks
     # qemu_arm64_lwip_defconfig is the same as qemu_arm64 but with NET_LWIP enabled.
     # The test config and the boardenv file from qemu_arm64 can be re-used so create symlinks
-    - ln -s conf.qemu_arm64_na /tmp/uboot-test-hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
-    - ln -s u_boot_boardenv_qemu_arm64_na.py /tmp/uboot-test-hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
-    - ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname`
-    - ln -s travis-ci /tmp/uboot-test-hooks/py/`hostname`
+    - ln -s conf.qemu_arm64_na test/hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
+    - ln -s u_boot_boardenv_qemu_arm64_na.py test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
+    - ln -s travis-ci test/hooks/bin/`hostname`
+    - ln -s travis-ci test/hooks/py/`hostname`
     - if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
         wget -O - https://github.com/riscv-software-src/opensbi/releases/download/v1.3.1/opensbi-1.3.1-rv-bin.tar.xz | tar -C /tmp -xJ;
         export OPENSBI=/tmp/opensbi-1.3.1-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin;
@@ -60,7 +58,7 @@ stages:
 
   after_script:
     - cp -v /tmp/${TEST_PY_BD}/*.{html,css,xml} .
-    - rm -rf /tmp/uboot-test-hooks /tmp/venv
+    - rm -rf /tmp/venv
   script:
     # If we've been asked to use clang only do one configuration.
     - export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD}
@@ -93,8 +91,8 @@ stages:
         /opt/coreboot/cbfstool ${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom add-flat-binary -f ${UBOOT_TRAVIS_BUILD_DIR}/u-boot.bin -n fallback/payload -c LZMA -l 0x1110000 -e 0x1110000;
       fi
     # "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
-    - export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
-      export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
+    - export PATH=/opt/qemu/bin:test/hooks/bin:${PATH};
+      export PYTHONPATH=test/hooks/py/travis-ci;
       ./test/py/test.py -ra --bd ${TEST_PY_BD} ${TEST_PY_ID} ${TEST_PY_EXTRA}
         ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"}
         --build-dir "$UBOOT_TRAVIS_BUILD_DIR"
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH 3/3] CI: Update to use the hooks in the U-Boot repo
  2025-05-02  2:50 ` [PATCH 3/3] CI: Update to use the hooks in the U-Boot repo Simon Glass
@ 2025-05-02  4:18   ` Heinrich Schuchardt
  0 siblings, 0 replies; 25+ messages in thread
From: Heinrich Schuchardt @ 2025-05-02  4:18 UTC (permalink / raw)
  To: Simon Glass, U-Boot Mailing List; +Cc: Tom Rini

Am 2. Mai 2025 04:50:19 MESZ schrieb Simon Glass <sjg@chromium.org>:
>Now that the hooks are present, make use of them directly rather than
>cloning the separate repo.
>
>Signed-off-by: Simon Glass <sjg@chromium.org>

Using the same git repo makes testing changes in the test hooks much easier.

Acked-by: Heinrich Schuchardt <xypron.glpk@gmx.de>


>---
>
> .azure-pipelines.yml | 15 +++++++--------
> .gitlab-ci.yml       | 16 +++++++---------
> 2 files changed, 14 insertions(+), 17 deletions(-)
>
>diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml
>index a00ee67f297..bf50727ea55 100644
>--- a/.azure-pipelines.yml
>+++ b/.azure-pipelines.yml
>@@ -251,13 +251,12 @@ stages:
>           # the below corresponds to .gitlab-ci.yml "before_script"
>           cd \${WORK_DIR}
>           git config --global --add safe.directory \${WORK_DIR}
>-          git clone --depth=1 https://source.denx.de/u-boot/u-boot-test-hooks /tmp/uboot-test-hooks
>           # qemu_arm64_lwip_defconfig is the same as qemu_arm64 but with NET_LWIP enabled.
>           # The test config and the boardenv file from qemu_arm64 can be re-used so create symlinks
>-          ln -s conf.qemu_arm64_na /tmp/uboot-test-hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
>-          ln -s u_boot_boardenv_qemu_arm64_na.py /tmp/uboot-test-hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
>-          ln -s travis-ci /tmp/uboot-test-hooks/bin/\`hostname\`
>-          ln -s travis-ci /tmp/uboot-test-hooks/py/\`hostname\`
>+          ln -s conf.qemu_arm64_na test/hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
>+          ln -s u_boot_boardenv_qemu_arm64_na.py test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
>+          ln -s travis-ci test/hooks/bin/\`hostname\`
>+          ln -s travis-ci test/hooks/py/\`hostname\`
>           if [[ "\${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
>               wget -O - https://github.com/riscv-software-src/opensbi/releases/download/v1.3.1/opensbi-1.3.1-rv-bin.tar.xz | tar -C /tmp -xJ;
>               export OPENSBI=/tmp/opensbi-1.3.1-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin;
>@@ -307,12 +306,12 @@ stages:
>               /opt/coreboot/cbfstool \${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom remove -n fallback/payload;
>               /opt/coreboot/cbfstool \${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom add-flat-binary -f \${UBOOT_TRAVIS_BUILD_DIR}/u-boot.bin -n fallback/payload -c LZMA -l 0x1110000 -e 0x1110000;
>           fi
>-          export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:\${PATH}
>-          export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci
>+          export PATH=/opt/qemu/bin:test/hooks/bin:\${PATH}
>+          export PYTHONPATH=test/hooks/py/travis-ci
>           # "\${var:+"-k \$var"}" expands to "" if \$var is empty, "-k \$var" if not
>           ./test/py/test.py -ra -o cache_dir="\$UBOOT_TRAVIS_BUILD_DIR"/.pytest_cache --bd \${TEST_PY_BD} \${TEST_PY_ID} \${TEST_PY_EXTRA} \${TEST_PY_TEST_SPEC:+"-k \${TEST_PY_TEST_SPEC}"} --build-dir "\$UBOOT_TRAVIS_BUILD_DIR" --report-dir "\$UBOOT_TRAVIS_BUILD_DIR" --junitxml=\$(System.DefaultWorkingDirectory)/results.xml
>           # the below corresponds to .gitlab-ci.yml "after_script"
>-          rm -rf /tmp/uboot-test-hooks /tmp/venv
>+          rm -rf /tmp/venv
>           EOF
>       - task: CopyFiles@2
>         displayName: 'Copy test.sh for later usage'
>diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
>index 9f69895efd8..ba9ca5fb9e0 100644
>--- a/.gitlab-ci.yml
>+++ b/.gitlab-ci.yml
>@@ -30,15 +30,13 @@ stages:
>   rules:
>     - when: always
>   before_script:
>-    # Clone uboot-test-hooks
>     - git config --global --add safe.directory "${CI_PROJECT_DIR}"
>-    - git clone --depth=1 https://source.denx.de/u-boot/u-boot-test-hooks /tmp/uboot-test-hooks
>     # qemu_arm64_lwip_defconfig is the same as qemu_arm64 but with NET_LWIP enabled.
>     # The test config and the boardenv file from qemu_arm64 can be re-used so create symlinks
>-    - ln -s conf.qemu_arm64_na /tmp/uboot-test-hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
>-    - ln -s u_boot_boardenv_qemu_arm64_na.py /tmp/uboot-test-hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
>-    - ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname`
>-    - ln -s travis-ci /tmp/uboot-test-hooks/py/`hostname`
>+    - ln -s conf.qemu_arm64_na test/hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
>+    - ln -s u_boot_boardenv_qemu_arm64_na.py test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
>+    - ln -s travis-ci test/hooks/bin/`hostname`
>+    - ln -s travis-ci test/hooks/py/`hostname`
>     - if [[ "${TEST_PY_BD}" == "qemu-riscv32_spl" ]]; then
>         wget -O - https://github.com/riscv-software-src/opensbi/releases/download/v1.3.1/opensbi-1.3.1-rv-bin.tar.xz | tar -C /tmp -xJ;
>         export OPENSBI=/tmp/opensbi-1.3.1-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin;
>@@ -60,7 +58,7 @@ stages:
> 
>   after_script:
>     - cp -v /tmp/${TEST_PY_BD}/*.{html,css,xml} .
>-    - rm -rf /tmp/uboot-test-hooks /tmp/venv
>+    - rm -rf /tmp/venv
>   script:
>     # If we've been asked to use clang only do one configuration.
>     - export UBOOT_TRAVIS_BUILD_DIR=/tmp/${TEST_PY_BD}
>@@ -93,8 +91,8 @@ stages:
>         /opt/coreboot/cbfstool ${UBOOT_TRAVIS_BUILD_DIR}/coreboot.rom add-flat-binary -f ${UBOOT_TRAVIS_BUILD_DIR}/u-boot.bin -n fallback/payload -c LZMA -l 0x1110000 -e 0x1110000;
>       fi
>     # "${var:+"-k $var"}" expands to "" if $var is empty, "-k $var" if not
>-    - export PATH=/opt/qemu/bin:/tmp/uboot-test-hooks/bin:${PATH};
>-      export PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci;
>+    - export PATH=/opt/qemu/bin:test/hooks/bin:${PATH};
>+      export PYTHONPATH=test/hooks/py/travis-ci;
>       ./test/py/test.py -ra --bd ${TEST_PY_BD} ${TEST_PY_ID} ${TEST_PY_EXTRA}
>         ${TEST_PY_TEST_SPEC:+"-k ${TEST_PY_TEST_SPEC}"}
>         --build-dir "$UBOOT_TRAVIS_BUILD_DIR"


^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02  2:50 [PATCH 0/3] RFC: test: Bring in the test hooks Simon Glass
                   ` (2 preceding siblings ...)
  2025-05-02  2:50 ` [PATCH 3/3] CI: Update to use the hooks in the U-Boot repo Simon Glass
@ 2025-05-02 14:33 ` Tom Rini
  2025-05-02 14:49   ` Simon Glass
  2025-05-05  7:00 ` neil.armstrong
  4 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-02 14:33 UTC (permalink / raw)
  To: Simon Glass; +Cc: U-Boot Mailing List, Heinrich Schuchardt

[-- Attachment #1: Type: text/plain, Size: 1966 bytes --]

On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:

> During a recent discussion with Heinrich we discussed why the hooks are
> kept in a separate repo.
> 
> The amount of code is small, a tenth of the size of the recently added
> lwip, just by way of example. Testing is a critical part of U-Boot and
> one of the things that distinguishes it from firmware projects that have
> not kept up in this area. By having the tests somewhere else, we are
> signalling that it is unusual, or difficult, or optional.
> 
> The hooks mechanism also needs something of an update to take account of
> real boards in 2025. That will be much easier to undertake if the code
> that test/py talks to is in the same repo.
> 
> This series brings the hook files in as first-class citizens of U-Boot.
> 
> If we do go ahead with this, I will send a different series which has
> separate commits (with correct author) in the u-boot-test-hooks repo.

I think bringing more projects directly in to the repository is a bad
idea. Your example of lwip isn't applicable because it's a read-only
subtree that's maintained outside of the project (same as the dts
subtree). But sure, lets "Say Yes". That said, we still need to:
- Remove needless examples from the tree.
- Not include personal labs directly in the tree.

That last one is why I really think this is a bad idea. The point of
having the hooks standalone is so that any given lab can easily add
support for their lab and manage it, without worrying about disclosing
internal layout. There's going to be hard coded default passwords there.
There's going to be repository secrets there. That kind of information
really should not be in a public repository. Integrating the hooks with
mainline will make lab management harder, not easier. The point of the
existing labs in u-boot-test-hooks is to provide samples.

I think this is all why no, we should not go down this path.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02 14:33 ` [PATCH 0/3] RFC: test: Bring in the test hooks Tom Rini
@ 2025-05-02 14:49   ` Simon Glass
  2025-05-02 15:06     ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-02 14:49 UTC (permalink / raw)
  To: Tom Rini; +Cc: U-Boot Mailing List, Heinrich Schuchardt

Hi Tom,

On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
>
> On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
>
> > During a recent discussion with Heinrich we discussed why the hooks are
> > kept in a separate repo.
> >
> > The amount of code is small, a tenth of the size of the recently added
> > lwip, just by way of example. Testing is a critical part of U-Boot and
> > one of the things that distinguishes it from firmware projects that have
> > not kept up in this area. By having the tests somewhere else, we are
> > signalling that it is unusual, or difficult, or optional.
> >
> > The hooks mechanism also needs something of an update to take account of
> > real boards in 2025. That will be much easier to undertake if the code
> > that test/py talks to is in the same repo.
> >
> > This series brings the hook files in as first-class citizens of U-Boot.
> >
> > If we do go ahead with this, I will send a different series which has
> > separate commits (with correct author) in the u-boot-test-hooks repo.
>
> I think bringing more projects directly in to the repository is a bad
> idea. Your example of lwip isn't applicable because it's a read-only
> subtree that's maintained outside of the project (same as the dts
> subtree). But sure, lets "Say Yes". That said, we still need to:
> - Remove needless examples from the tree.
> - Not include personal labs directly in the tree.
>
> That last one is why I really think this is a bad idea. The point of
> having the hooks standalone is so that any given lab can easily add
> support for their lab and manage it, without worrying about disclosing
> internal layout. There's going to be hard coded default passwords there.
> There's going to be repository secrets there. That kind of information
> really should not be in a public repository. Integrating the hooks with
> mainline will make lab management harder, not easier. The point of the
> existing labs in u-boot-test-hooks is to provide samples.
>
> I think this is all why no, we should not go down this path.

Is it worth discussing this, or is your mind made up? I have some
thoughts on the last one.

Regards,
SImon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02 14:49   ` Simon Glass
@ 2025-05-02 15:06     ` Tom Rini
  2025-05-02 17:19       ` Heinrich Schuchardt
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-02 15:06 UTC (permalink / raw)
  To: Simon Glass; +Cc: U-Boot Mailing List, Heinrich Schuchardt

[-- Attachment #1: Type: text/plain, Size: 2578 bytes --]

On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> Hi Tom,
> 
> On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> >
> > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> >
> > > During a recent discussion with Heinrich we discussed why the hooks are
> > > kept in a separate repo.
> > >
> > > The amount of code is small, a tenth of the size of the recently added
> > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > one of the things that distinguishes it from firmware projects that have
> > > not kept up in this area. By having the tests somewhere else, we are
> > > signalling that it is unusual, or difficult, or optional.
> > >
> > > The hooks mechanism also needs something of an update to take account of
> > > real boards in 2025. That will be much easier to undertake if the code
> > > that test/py talks to is in the same repo.
> > >
> > > This series brings the hook files in as first-class citizens of U-Boot.
> > >
> > > If we do go ahead with this, I will send a different series which has
> > > separate commits (with correct author) in the u-boot-test-hooks repo.
> >
> > I think bringing more projects directly in to the repository is a bad
> > idea. Your example of lwip isn't applicable because it's a read-only
> > subtree that's maintained outside of the project (same as the dts
> > subtree). But sure, lets "Say Yes". That said, we still need to:
> > - Remove needless examples from the tree.
> > - Not include personal labs directly in the tree.
> >
> > That last one is why I really think this is a bad idea. The point of
> > having the hooks standalone is so that any given lab can easily add
> > support for their lab and manage it, without worrying about disclosing
> > internal layout. There's going to be hard coded default passwords there.
> > There's going to be repository secrets there. That kind of information
> > really should not be in a public repository. Integrating the hooks with
> > mainline will make lab management harder, not easier. The point of the
> > existing labs in u-boot-test-hooks is to provide samples.
> >
> > I think this is all why no, we should not go down this path.
> 
> Is it worth discussing this, or is your mind made up? I have some
> thoughts on the last one.

I think it's a terrible idea that I already said:
> But sure, lets "Say Yes".

But please do spend time explaining your thoughts and perhaps others
will also agree with you and I'll feel less bad taking this in?

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02 15:06     ` Tom Rini
@ 2025-05-02 17:19       ` Heinrich Schuchardt
  2025-05-02 19:30         ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Heinrich Schuchardt @ 2025-05-02 17:19 UTC (permalink / raw)
  To: Tom Rini; +Cc: U-Boot Mailing List, Simon Glass

On 5/2/25 17:06, Tom Rini wrote:
> On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
>> Hi Tom,
>>
>> On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
>>>
>>> On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
>>>
>>>> During a recent discussion with Heinrich we discussed why the hooks are
>>>> kept in a separate repo.
>>>>
>>>> The amount of code is small, a tenth of the size of the recently added
>>>> lwip, just by way of example. Testing is a critical part of U-Boot and
>>>> one of the things that distinguishes it from firmware projects that have
>>>> not kept up in this area. By having the tests somewhere else, we are
>>>> signalling that it is unusual, or difficult, or optional.
>>>>
>>>> The hooks mechanism also needs something of an update to take account of
>>>> real boards in 2025. That will be much easier to undertake if the code
>>>> that test/py talks to is in the same repo.
>>>>
>>>> This series brings the hook files in as first-class citizens of U-Boot.
>>>>
>>>> If we do go ahead with this, I will send a different series which has
>>>> separate commits (with correct author) in the u-boot-test-hooks repo.
>>>
>>> I think bringing more projects directly in to the repository is a bad
>>> idea. Your example of lwip isn't applicable because it's a read-only
>>> subtree that's maintained outside of the project (same as the dts
>>> subtree). But sure, lets "Say Yes". That said, we still need to:
>>> - Remove needless examples from the tree.
>>> - Not include personal labs directly in the tree.
>>>
>>> That last one is why I really think this is a bad idea. The point of
>>> having the hooks standalone is so that any given lab can easily add
>>> support for their lab and manage it, without worrying about disclosing
>>> internal layout. There's going to be hard coded default passwords there.

Secrets MUST NEVER reside in git repos.

I can't imagine that such irresponsible habits would be practiced by any 
accountable developer.

Please, have a look at

https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html

to see how to do it properly.

The same is true for a private lab:
Use environment variables that are coming from outside the repository.

>>> There's going to be repository secrets there. That kind of information
>>> really should not be in a public repository. Integrating the hooks with
>>> mainline will make lab management harder, not easier. The point of the
>>> existing labs in u-boot-test-hooks is to provide samples.
>>>
>>> I think this is all why no, we should not go down this path.
>>
>> Is it worth discussing this, or is your mind made up? I have some
>> thoughts on the last one.
> 
> I think it's a terrible idea that I already said:
>> But sure, lets "Say Yes".
> 
> But please do spend time explaining your thoughts and perhaps others
> will also agree with you and I'll feel less bad taking this in?
> 

Currently when changing a test hook I have to go through these steps:

* fork u-boot-test-hooks
* push a commit to my fork
* update both .gitlab-ci.yaml and .azure-pipelines.yaml
* commit the change code.denx.de
* create a merge request for github.com/u-boot/u-boot

If the test hooks were in the same repo as main U-Boot, I could save two 
steps.

Best regards

Heinrich

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02 17:19       ` Heinrich Schuchardt
@ 2025-05-02 19:30         ` Tom Rini
  2025-05-02 19:42           ` Heinrich Schuchardt
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-02 19:30 UTC (permalink / raw)
  To: Heinrich Schuchardt; +Cc: U-Boot Mailing List, Simon Glass

[-- Attachment #1: Type: text/plain, Size: 4821 bytes --]

On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> On 5/2/25 17:06, Tom Rini wrote:
> > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > Hi Tom,
> > > 
> > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > 
> > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > 
> > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > kept in a separate repo.
> > > > > 
> > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > one of the things that distinguishes it from firmware projects that have
> > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > signalling that it is unusual, or difficult, or optional.
> > > > > 
> > > > > The hooks mechanism also needs something of an update to take account of
> > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > that test/py talks to is in the same repo.
> > > > > 
> > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > 
> > > > > If we do go ahead with this, I will send a different series which has
> > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > 
> > > > I think bringing more projects directly in to the repository is a bad
> > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > subtree that's maintained outside of the project (same as the dts
> > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > - Remove needless examples from the tree.
> > > > - Not include personal labs directly in the tree.
> > > > 
> > > > That last one is why I really think this is a bad idea. The point of
> > > > having the hooks standalone is so that any given lab can easily add
> > > > support for their lab and manage it, without worrying about disclosing
> > > > internal layout. There's going to be hard coded default passwords there.
> 
> Secrets MUST NEVER reside in git repos.
> 
> I can't imagine that such irresponsible habits would be practiced by any
> accountable developer.

I agree it shouldn't be done. And just this week was the most recent
time I've seen a company do that internally, because it's internal and
was just a temporary thing. We helped them stop needing to do that, but
assuming it never happens is a bad idea.

> Please, have a look at
> 
> https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> 
> to see how to do it properly.
> 
> The same is true for a private lab:
> Use environment variables that are coming from outside the repository.
> 
> > > > There's going to be repository secrets there. That kind of information
> > > > really should not be in a public repository. Integrating the hooks with
> > > > mainline will make lab management harder, not easier. The point of the
> > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > 
> > > > I think this is all why no, we should not go down this path.
> > > 
> > > Is it worth discussing this, or is your mind made up? I have some
> > > thoughts on the last one.
> > 
> > I think it's a terrible idea that I already said:
> > > But sure, lets "Say Yes".
> > 
> > But please do spend time explaining your thoughts and perhaps others
> > will also agree with you and I'll feel less bad taking this in?
> > 
> 
> Currently when changing a test hook I have to go through these steps:
> 
> * fork u-boot-test-hooks
> * push a commit to my fork
> * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> * commit the change code.denx.de
> * create a merge request for github.com/u-boot/u-boot
> 
> If the test hooks were in the same repo as main U-Boot, I could save two
> steps.

Yes, that's true, the steps for updating our CI are a little bit longer.
I would be happy to make u-boot-test-hooks more widely writable (so it
would instead be pushing to a branch for step 1+2). But I'm also
concerned with external labs (which is both the origin of these scripts,
and where they're also used).

Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
That has subdirectories for both "sage" and "lootbox" (the two lab
hosts), and in turn py and bin subdirectories for each. There's no value
in publishing these changes as there's nothing unique about the
platforms there, which aren't already in the mainline u-boot-test-hooks.

How should I manage these changes moving forward?

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02 19:30         ` Tom Rini
@ 2025-05-02 19:42           ` Heinrich Schuchardt
  2025-05-02 20:04             ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Heinrich Schuchardt @ 2025-05-02 19:42 UTC (permalink / raw)
  To: Tom Rini; +Cc: U-Boot Mailing List, Simon Glass

On 5/2/25 21:30, Tom Rini wrote:
> On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
>> On 5/2/25 17:06, Tom Rini wrote:
>>> On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
>>>> Hi Tom,
>>>>
>>>> On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
>>>>>
>>>>> On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
>>>>>
>>>>>> During a recent discussion with Heinrich we discussed why the hooks are
>>>>>> kept in a separate repo.
>>>>>>
>>>>>> The amount of code is small, a tenth of the size of the recently added
>>>>>> lwip, just by way of example. Testing is a critical part of U-Boot and
>>>>>> one of the things that distinguishes it from firmware projects that have
>>>>>> not kept up in this area. By having the tests somewhere else, we are
>>>>>> signalling that it is unusual, or difficult, or optional.
>>>>>>
>>>>>> The hooks mechanism also needs something of an update to take account of
>>>>>> real boards in 2025. That will be much easier to undertake if the code
>>>>>> that test/py talks to is in the same repo.
>>>>>>
>>>>>> This series brings the hook files in as first-class citizens of U-Boot.
>>>>>>
>>>>>> If we do go ahead with this, I will send a different series which has
>>>>>> separate commits (with correct author) in the u-boot-test-hooks repo.
>>>>>
>>>>> I think bringing more projects directly in to the repository is a bad
>>>>> idea. Your example of lwip isn't applicable because it's a read-only
>>>>> subtree that's maintained outside of the project (same as the dts
>>>>> subtree). But sure, lets "Say Yes". That said, we still need to:
>>>>> - Remove needless examples from the tree.
>>>>> - Not include personal labs directly in the tree.
>>>>>
>>>>> That last one is why I really think this is a bad idea. The point of
>>>>> having the hooks standalone is so that any given lab can easily add
>>>>> support for their lab and manage it, without worrying about disclosing
>>>>> internal layout. There's going to be hard coded default passwords there.
>>
>> Secrets MUST NEVER reside in git repos.
>>
>> I can't imagine that such irresponsible habits would be practiced by any
>> accountable developer.
> 
> I agree it shouldn't be done. And just this week was the most recent
> time I've seen a company do that internally, because it's internal and
> was just a temporary thing. We helped them stop needing to do that, but
> assuming it never happens is a bad idea.
> 
>> Please, have a look at
>>
>> https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
>> https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
>>
>> to see how to do it properly.
>>
>> The same is true for a private lab:
>> Use environment variables that are coming from outside the repository.
>>
>>>>> There's going to be repository secrets there. That kind of information
>>>>> really should not be in a public repository. Integrating the hooks with
>>>>> mainline will make lab management harder, not easier. The point of the
>>>>> existing labs in u-boot-test-hooks is to provide samples.
>>>>>
>>>>> I think this is all why no, we should not go down this path.
>>>>
>>>> Is it worth discussing this, or is your mind made up? I have some
>>>> thoughts on the last one.
>>>
>>> I think it's a terrible idea that I already said:
>>>> But sure, lets "Say Yes".
>>>
>>> But please do spend time explaining your thoughts and perhaps others
>>> will also agree with you and I'll feel less bad taking this in?
>>>
>>
>> Currently when changing a test hook I have to go through these steps:
>>
>> * fork u-boot-test-hooks
>> * push a commit to my fork
>> * update both .gitlab-ci.yaml and .azure-pipelines.yaml
>> * commit the change code.denx.de
>> * create a merge request for github.com/u-boot/u-boot
>>
>> If the test hooks were in the same repo as main U-Boot, I could save two
>> steps.
> 
> Yes, that's true, the steps for updating our CI are a little bit longer.
> I would be happy to make u-boot-test-hooks more widely writable (so it
> would instead be pushing to a branch for step 1+2). But I'm also
> concerned with external labs (which is both the origin of these scripts,
> and where they're also used).
> 
> Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> That has subdirectories for both "sage" and "lootbox" (the two lab
> hosts), and in turn py and bin subdirectories for each. There's no value
> in publishing these changes as there's nothing unique about the
> platforms there, which aren't already in the mainline u-boot-test-hooks.
> 
> How should I manage these changes moving forward?

You could create two branches based on origin/master u-boot:

One for maintaining your test lab specific u-boot-test changes and one 
for your private u-boot code changes.

Check out the lab specific u-boot-test branch for steering the tests of 
the u-boot code branch.

As said don't put the secrets into any of your branches.

Best regards

Heinrich

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02 19:42           ` Heinrich Schuchardt
@ 2025-05-02 20:04             ` Tom Rini
  2025-05-03 14:29               ` Simon Glass
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-02 20:04 UTC (permalink / raw)
  To: Heinrich Schuchardt; +Cc: U-Boot Mailing List, Simon Glass

[-- Attachment #1: Type: text/plain, Size: 6025 bytes --]

On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt wrote:
> On 5/2/25 21:30, Tom Rini wrote:
> > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> > > On 5/2/25 17:06, Tom Rini wrote:
> > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > > > Hi Tom,
> > > > > 
> > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > > > 
> > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > > > 
> > > > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > > > kept in a separate repo.
> > > > > > > 
> > > > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > > > one of the things that distinguishes it from firmware projects that have
> > > > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > > > signalling that it is unusual, or difficult, or optional.
> > > > > > > 
> > > > > > > The hooks mechanism also needs something of an update to take account of
> > > > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > > > that test/py talks to is in the same repo.
> > > > > > > 
> > > > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > > > 
> > > > > > > If we do go ahead with this, I will send a different series which has
> > > > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > > > 
> > > > > > I think bringing more projects directly in to the repository is a bad
> > > > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > > > subtree that's maintained outside of the project (same as the dts
> > > > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > > > - Remove needless examples from the tree.
> > > > > > - Not include personal labs directly in the tree.
> > > > > > 
> > > > > > That last one is why I really think this is a bad idea. The point of
> > > > > > having the hooks standalone is so that any given lab can easily add
> > > > > > support for their lab and manage it, without worrying about disclosing
> > > > > > internal layout. There's going to be hard coded default passwords there.
> > > 
> > > Secrets MUST NEVER reside in git repos.
> > > 
> > > I can't imagine that such irresponsible habits would be practiced by any
> > > accountable developer.
> > 
> > I agree it shouldn't be done. And just this week was the most recent
> > time I've seen a company do that internally, because it's internal and
> > was just a temporary thing. We helped them stop needing to do that, but
> > assuming it never happens is a bad idea.
> > 
> > > Please, have a look at
> > > 
> > > https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > 
> > > to see how to do it properly.
> > > 
> > > The same is true for a private lab:
> > > Use environment variables that are coming from outside the repository.
> > > 
> > > > > > There's going to be repository secrets there. That kind of information
> > > > > > really should not be in a public repository. Integrating the hooks with
> > > > > > mainline will make lab management harder, not easier. The point of the
> > > > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > > > 
> > > > > > I think this is all why no, we should not go down this path.
> > > > > 
> > > > > Is it worth discussing this, or is your mind made up? I have some
> > > > > thoughts on the last one.
> > > > 
> > > > I think it's a terrible idea that I already said:
> > > > > But sure, lets "Say Yes".
> > > > 
> > > > But please do spend time explaining your thoughts and perhaps others
> > > > will also agree with you and I'll feel less bad taking this in?
> > > > 
> > > 
> > > Currently when changing a test hook I have to go through these steps:
> > > 
> > > * fork u-boot-test-hooks
> > > * push a commit to my fork
> > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > * commit the change code.denx.de
> > > * create a merge request for github.com/u-boot/u-boot
> > > 
> > > If the test hooks were in the same repo as main U-Boot, I could save two
> > > steps.
> > 
> > Yes, that's true, the steps for updating our CI are a little bit longer.
> > I would be happy to make u-boot-test-hooks more widely writable (so it
> > would instead be pushing to a branch for step 1+2). But I'm also
> > concerned with external labs (which is both the origin of these scripts,
> > and where they're also used).
> > 
> > Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> > That has subdirectories for both "sage" and "lootbox" (the two lab
> > hosts), and in turn py and bin subdirectories for each. There's no value
> > in publishing these changes as there's nothing unique about the
> > platforms there, which aren't already in the mainline u-boot-test-hooks.
> > 
> > How should I manage these changes moving forward?
> 
> You could create two branches based on origin/master u-boot:
> 
> One for maintaining your test lab specific u-boot-test changes and one for
> your private u-boot code changes.
> 
> Check out the lab specific u-boot-test branch for steering the tests of the
> u-boot code branch.

So now for a lab you need to maintain a branch of U-Boot itself, and
then to test you need to merge your lab support in? And then if there's
problems work back what git hash you tested on, if reporting either
problems, or as part of the "wouldn't it be nice to collect results
idea" work backwards from there? And bisecting problems then becomes a
real nightmare since each step requires a merge.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02 20:04             ` Tom Rini
@ 2025-05-03 14:29               ` Simon Glass
  2025-05-05 18:18                 ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-03 14:29 UTC (permalink / raw)
  To: Tom Rini; +Cc: Heinrich Schuchardt, U-Boot Mailing List

Hi Tom,

On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com> wrote:
>
> On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt wrote:
> > On 5/2/25 21:30, Tom Rini wrote:
> > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > > > > Hi Tom,
> > > > > >
> > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > > > >
> > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > > > >
> > > > > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > > > > kept in a separate repo.
> > > > > > > >
> > > > > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > > > > one of the things that distinguishes it from firmware projects that have
> > > > > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > > > > signalling that it is unusual, or difficult, or optional.
> > > > > > > >
> > > > > > > > The hooks mechanism also needs something of an update to take account of
> > > > > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > > > > that test/py talks to is in the same repo.
> > > > > > > >
> > > > > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > > > >
> > > > > > > > If we do go ahead with this, I will send a different series which has
> > > > > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > > > >
> > > > > > > I think bringing more projects directly in to the repository is a bad
> > > > > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > > > > subtree that's maintained outside of the project (same as the dts
> > > > > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > > > > - Remove needless examples from the tree.
> > > > > > > - Not include personal labs directly in the tree.
> > > > > > >
> > > > > > > That last one is why I really think this is a bad idea. The point of
> > > > > > > having the hooks standalone is so that any given lab can easily add
> > > > > > > support for their lab and manage it, without worrying about disclosing
> > > > > > > internal layout. There's going to be hard coded default passwords there.
> > > >
> > > > Secrets MUST NEVER reside in git repos.
> > > >
> > > > I can't imagine that such irresponsible habits would be practiced by any
> > > > accountable developer.
> > >
> > > I agree it shouldn't be done. And just this week was the most recent
> > > time I've seen a company do that internally, because it's internal and
> > > was just a temporary thing. We helped them stop needing to do that, but
> > > assuming it never happens is a bad idea.
> > >
> > > > Please, have a look at
> > > >
> > > > https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > >
> > > > to see how to do it properly.
> > > >
> > > > The same is true for a private lab:
> > > > Use environment variables that are coming from outside the repository.
> > > >
> > > > > > > There's going to be repository secrets there. That kind of information
> > > > > > > really should not be in a public repository. Integrating the hooks with
> > > > > > > mainline will make lab management harder, not easier. The point of the
> > > > > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > > > >
> > > > > > > I think this is all why no, we should not go down this path.
> > > > > >
> > > > > > Is it worth discussing this, or is your mind made up? I have some
> > > > > > thoughts on the last one.
> > > > >
> > > > > I think it's a terrible idea that I already said:
> > > > > > But sure, lets "Say Yes".
> > > > >
> > > > > But please do spend time explaining your thoughts and perhaps others
> > > > > will also agree with you and I'll feel less bad taking this in?

Well firstly, we should bring in the whole git history so I don't
believe these patches should be applied as is. I did push a branch[1]
but can send the commands if it helps.

> > > > >
> > > >
> > > > Currently when changing a test hook I have to go through these steps:
> > > >
> > > > * fork u-boot-test-hooks
> > > > * push a commit to my fork
> > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > * commit the change code.denx.de
> > > > * create a merge request for github.com/u-boot/u-boot
> > > >
> > > > If the test hooks were in the same repo as main U-Boot, I could save two
> > > > steps.
> > >
> > > Yes, that's true, the steps for updating our CI are a little bit longer.
> > > I would be happy to make u-boot-test-hooks more widely writable (so it
> > > would instead be pushing to a branch for step 1+2). But I'm also
> > > concerned with external labs (which is both the origin of these scripts,
> > > and where they're also used).
> > >
> > > Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> > > That has subdirectories for both "sage" and "lootbox" (the two lab
> > > hosts), and in turn py and bin subdirectories for each. There's no value
> > > in publishing these changes as there's nothing unique about the
> > > platforms there, which aren't already in the mainline u-boot-test-hooks.
> > >
> > > How should I manage these changes moving forward?
> >
> > You could create two branches based on origin/master u-boot:
> >
> > One for maintaining your test lab specific u-boot-test changes and one for
> > your private u-boot code changes.
> >
> > Check out the lab specific u-boot-test branch for steering the tests of the
> > u-boot code branch.
>
> So now for a lab you need to maintain a branch of U-Boot itself, and
> then to test you need to merge your lab support in? And then if there's
> problems work back what git hash you tested on, if reporting either
> problems, or as part of the "wouldn't it be nice to collect results
> idea" work backwards from there? And bisecting problems then becomes a
> real nightmare since each step requires a merge.

If you have your own hook scripts, they don't have to be in the U-Boot
tree. That is entirely up to you. In my case I would want them in the
tree, but in your case you can put them somewhere else.  You can even
put them inside the U-Boot directory but without adding them to git,
if that helps. But we set up the 'PATH' variable to where things are.
If we need to change things to make this easier for people, we can.
I'm really not seeing any nightmares here at all.

Regards,
Simon

[1] https://github.com/sjg20/uboot-test-hooks/tree/move

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-02  2:50 [PATCH 0/3] RFC: test: Bring in the test hooks Simon Glass
                   ` (3 preceding siblings ...)
  2025-05-02 14:33 ` [PATCH 0/3] RFC: test: Bring in the test hooks Tom Rini
@ 2025-05-05  7:00 ` neil.armstrong
  2025-05-05 12:58   ` Simon Glass
  4 siblings, 1 reply; 25+ messages in thread
From: neil.armstrong @ 2025-05-05  7:00 UTC (permalink / raw)
  To: Simon Glass, U-Boot Mailing List; +Cc: Tom Rini, Heinrich Schuchardt

Hi,

On 02/05/2025 04:50, Simon Glass wrote:
> During a recent discussion with Heinrich we discussed why the hooks are
> kept in a separate repo.
> 
> The amount of code is small, a tenth of the size of the recently added
> lwip, just by way of example. Testing is a critical part of U-Boot and
> one of the things that distinguishes it from firmware projects that have
> not kept up in this area. By having the tests somewhere else, we are
> signalling that it is unusual, or difficult, or optional.
> 
> The hooks mechanism also needs something of an update to take account of
> real boards in 2025. That will be much easier to undertake if the code
> that test/py talks to is in the same repo.
> 
> This series brings the hook files in as first-class citizens of U-Boot.

So this will definitely remove the ability to have test hooks out of the
U-boot tree ? This is a major regression, and I do not want my test hooks
to be in the main u-boot tree for plenty of reasons, the main reasons is
that I need flexibility to handle my lab boards and I can't wait multiple
weeks to have the hooks fixed in the main tree.

This could be enhanced, but I agree with Tom, it's a bad idea to merge
them in the main tree.

Neil

> 
> If we do go ahead with this, I will send a different series which has
> separate commits (with correct author) in the u-boot-test-hooks repo.
> 
> 
> Simon Glass (3):
>    test: Bring in the test hooks
>    doc: Tidy up the hooks documentation
>    CI: Update to use the hooks in the U-Boot repo
> 
>   .azure-pipelines.yml                          |  15 +-
>   .gitlab-ci.yml                                |  16 +-
>   doc/develop/index.rst                         |   1 +
>   doc/develop/py_testing.rst                    |  22 +-
>   doc/develop/test_hooks.rst                    | 306 ++++++++++++++++++
>   test/hooks/bin/OLI01/conf.mx6qsabrelite_na    |  26 ++
>   .../conf.integratorcp_cm926ejs_qemu           |  27 ++
>   test/hooks/bin/bill-the-cat/conf.qemu_mips_na |  28 ++
>   .../bill-the-cat/conf.vexpress_ca15_tc2_qemu  |  27 ++
>   .../bin/common-config.cros-servo-dut-control  |  69 ++++
>   test/hooks/bin/common.labgrid-trini           |  35 ++
>   test/hooks/bin/console.fvp                    |  28 ++
>   test/hooks/bin/console.labgrid-sjg            |  42 +++
>   test/hooks/bin/console.labgrid-trini          |  24 ++
>   test/hooks/bin/console.picocom                |  42 +++
>   test/hooks/bin/console.qemu                   |  35 ++
>   test/hooks/bin/download.imx_usb               |  23 ++
>   test/hooks/bin/download.l4t-exec-uboot        |  25 ++
>   test/hooks/bin/download.tegra-uboot-flasher   |  24 ++
>   test/hooks/bin/ellesmere/common-labgrid-sjg   |  46 +++
>   test/hooks/bin/ellesmere/conf.all             |  24 ++
>   .../hooks/bin/ellesmere/conf.evb-ast2500_qemu |  11 +
>   test/hooks/bin/ellesmere/conf.qemu-riscv32_na |   1 +
>   .../bin/ellesmere/conf.qemu-riscv32_spl_na    |   1 +
>   test/hooks/bin/ellesmere/conf.qemu-riscv64_na |   1 +
>   test/hooks/bin/ellesmere/conf.qemu-x86_64_na  |   1 +
>   test/hooks/bin/ellesmere/conf.qemu-x86_na     |   1 +
>   test/hooks/bin/ellesmere/conf.qemu_arm64_na   |   1 +
>   .../bin/ellesmere/conf.qemu_arm64_spl_na      |   1 +
>   test/hooks/bin/ellesmere/conf.qemu_arm_na     |   1 +
>   test/hooks/bin/ellesmere/conf.qemu_arm_spl_na |   1 +
>   test/hooks/bin/flash.em100                    |  30 ++
>   test/hooks/bin/flash.fiptool                  |  22 ++
>   test/hooks/bin/flash.flashair                 |  45 +++
>   test/hooks/bin/flash.labgrid-trini.sd-mux     |  31 ++
>   test/hooks/bin/flash.none                     |  21 ++
>   test/hooks/bin/flash.qemu_gen_padded_image    |  15 +
>   test/hooks/bin/flash.recovery_l4t             |  44 +++
>   test/hooks/bin/flash.sdwire_common_mount      |  80 +++++
>   .../bin/flash.sdwire_digital-loggers_raw      |  41 +++
>   test/hooks/bin/flash.sdwire_poweroff_mount    |  32 ++
>   test/hooks/bin/flash.sdwire_poweroff_raw      |  42 +++
>   test/hooks/bin/flash.sdwire_relay_mount       |  34 ++
>   test/hooks/bin/flashair.rpi                   |  47 +++
>   test/hooks/bin/flashair.ti-omap               |  26 ++
>   test/hooks/bin/getrole.labgrid-sjg            |  34 ++
>   .../kea/conf.Linksprite_pcDuino3_sjg-pcduino3 |  33 ++
>   .../bin/kea/conf.chromebook_link_sjg-link     |  30 ++
>   .../bin/kea/conf.chromebook_samus_sjg-samus   |  30 ++
>   test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1    |  38 +++
>   .../bin/kea/conf.minnowmax_sjg-minnowmax      |  33 ++
>   .../hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc |  35 ++
>   test/hooks/bin/kea/conf.rock2_sjg-rock2       |  33 ++
>   test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b  |  34 ++
>   test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b      |  34 ++
>   .../bin/kea/conf.zynq_zybo_sjg-zynq_zybo      |  44 +++
>   .../conf.am62x_beagleplay_a53_na              |  30 ++
>   .../konsulko-labgrid/conf.am64x_evm_a53_na    |  30 ++
>   .../bin/konsulko-labgrid/conf.rpi_4_32b_na    |   1 +
>   test/hooks/bin/konsulko-labgrid/conf.rpi_4_na |   1 +
>   .../bin/konsulko-labgrid/conf.rpi_arm64_na    |  25 ++
>   test/hooks/bin/poweroff.digital-loggers       |  22 ++
>   test/hooks/bin/poweroff.manual                |  21 ++
>   test/hooks/bin/poweroff.none                  |  22 ++
>   test/hooks/bin/poweroff.phidgets              |  37 +++
>   test/hooks/bin/poweroff.pm342                 |  21 ++
>   test/hooks/bin/poweroff.ykush                 |  23 ++
>   test/hooks/bin/poweron.digital-loggers        |  22 ++
>   test/hooks/bin/poweron.manual                 |  21 ++
>   test/hooks/bin/poweron.none                   |  22 ++
>   test/hooks/bin/poweron.phidgets               |  32 ++
>   test/hooks/bin/poweron.pm342                  |  24 ++
>   test/hooks/bin/poweron.ykush                  |  23 ++
>   test/hooks/bin/push-flashair.py               | 118 +++++++
>   test/hooks/bin/qemu.swtpm                     |  23 ++
>   test/hooks/bin/recovery.manual                |  23 ++
>   test/hooks/bin/recovery.phidgets              |  29 ++
>   test/hooks/bin/recovery.pm342                 |  26 ++
>   test/hooks/bin/recovery.relay                 |  39 +++
>   test/hooks/bin/recovery.usbrelay              |  32 ++
>   test/hooks/bin/release.labgrid-sjg            |  22 ++
>   test/hooks/bin/release.none                   |  22 ++
>   test/hooks/bin/reset.cros_servo               |  23 ++
>   test/hooks/bin/reset.digital-loggers          |  25 ++
>   test/hooks/bin/reset.labgrid-trini            |  24 ++
>   test/hooks/bin/reset.none                     |  30 ++
>   test/hooks/bin/reset.pm342                    |  21 ++
>   test/hooks/bin/reset.recovery_download        |  36 +++
>   test/hooks/bin/reset.usbrelay                 |  26 ++
>   test/hooks/bin/reset.ykush                    |  25 ++
>   test/hooks/bin/swarren-lx1/conf.jetson-tk1_na |  36 +++
>   test/hooks/bin/swarren-lx1/conf.p2371-2180_na |  57 ++++
>   .../bin/swarren-lx1/conf.p2771-0000-500_na    |  32 ++
>   test/hooks/bin/travis-ci/conf.M5208EVBE_qemu  |  27 ++
>   test/hooks/bin/travis-ci/conf.coreboot_qemu   |  28 ++
>   .../hooks/bin/travis-ci/conf.evb-ast2500_qemu |  11 +
>   .../hooks/bin/travis-ci/conf.evb-ast2600_qemu |  13 +
>   .../travis-ci/conf.integratorcp_cm926ejs_qemu |  27 ++
>   test/hooks/bin/travis-ci/conf.malta64_qemu    |  30 ++
>   test/hooks/bin/travis-ci/conf.malta64el_qemu  |  31 ++
>   test/hooks/bin/travis-ci/conf.malta_qemu      |  30 ++
>   test/hooks/bin/travis-ci/conf.maltael_qemu    |  31 ++
>   test/hooks/bin/travis-ci/conf.qemu-ae3xx_na   |  27 ++
>   .../hooks/bin/travis-ci/conf.qemu-arm-sbsa_na |  27 ++
>   test/hooks/bin/travis-ci/conf.qemu-ax25_na    |  27 ++
>   .../bin/travis-ci/conf.qemu-loongarch64_na    |  12 +
>   test/hooks/bin/travis-ci/conf.qemu-ppce500_na |  27 ++
>   test/hooks/bin/travis-ci/conf.qemu-riscv32_na |  11 +
>   .../bin/travis-ci/conf.qemu-riscv32_spl_na    |  11 +
>   test/hooks/bin/travis-ci/conf.qemu-riscv64_na |  11 +
>   .../bin/travis-ci/conf.qemu-riscv64_spl_na    |  11 +
>   test/hooks/bin/travis-ci/conf.qemu-x86_64_na  |  27 ++
>   test/hooks/bin/travis-ci/conf.qemu-x86_na     |  27 ++
>   .../bin/travis-ci/conf.qemu-xtensa-dc233c_na  |  12 +
>   test/hooks/bin/travis-ci/conf.qemu_arm64_na   |  30 ++
>   .../bin/travis-ci/conf.qemu_arm64_spl_na      |  32 ++
>   .../bin/travis-ci/conf.qemu_arm64_tpl_na      |  29 ++
>   test/hooks/bin/travis-ci/conf.qemu_arm64be_na |  13 +
>   test/hooks/bin/travis-ci/conf.qemu_arm_na     |  30 ++
>   test/hooks/bin/travis-ci/conf.qemu_arm_spl_na |  31 ++
>   test/hooks/bin/travis-ci/conf.qemu_mips64_na  |  28 ++
>   .../hooks/bin/travis-ci/conf.qemu_mips64el_na |  28 ++
>   test/hooks/bin/travis-ci/conf.qemu_mips_na    |  28 ++
>   test/hooks/bin/travis-ci/conf.qemu_mipsel_na  |  28 ++
>   .../bin/travis-ci/conf.r2dplus_i82557c_qemu   |  27 ++
>   .../bin/travis-ci/conf.r2dplus_pcnet_qemu     |  27 ++
>   .../bin/travis-ci/conf.r2dplus_rtl8139_qemu   |  27 ++
>   .../bin/travis-ci/conf.r2dplus_tulip_qemu     |  27 ++
>   .../conf.sifive_unleashed_sdcard_qemu         |  11 +
>   .../conf.sifive_unleashed_spi-nor_qemu        |  11 +
>   .../bin/travis-ci/conf.vexpress_ca15_tc2_qemu |  27 ++
>   .../bin/travis-ci/conf.vexpress_ca9x4_qemu    |  27 ++
>   .../travis-ci/conf.vexpress_fvp_bloblist_na   |   1 +
>   test/hooks/bin/travis-ci/conf.vexpress_fvp_na |  29 ++
>   .../travis-ci/conf.xilinx_versal_virt_qemu    |  27 ++
>   .../bin/travis-ci/conf.xilinx_zynq_virt_qemu  |  27 ++
>   test/hooks/bin/travis-ci/conf.xtfpga_qemu     |  27 ++
>   test/hooks/bin/travis-ci/conf.zynq_zc702_qemu |  27 ++
>   test/hooks/bin/u-boot-test-common             |  36 +++
>   test/hooks/bin/u-boot-test-console            |  25 ++
>   test/hooks/bin/u-boot-test-flash              |  25 ++
>   test/hooks/bin/u-boot-test-getrole            |  38 +++
>   test/hooks/bin/u-boot-test-power-off          |  25 ++
>   test/hooks/bin/u-boot-test-power-on           |  25 ++
>   test/hooks/bin/u-boot-test-release            |  26 ++
>   test/hooks/bin/u-boot-test-reset              |  25 ++
>   test/hooks/bin/wait_raw_device                |  34 ++
>   test/hooks/bin/writer.imx_raw                 |  39 +++
>   test/hooks/bin/writer.labgrid-trini.rpi       |  46 +++
>   test/hooks/bin/writer.labgrid-trini.ti-k3     |  35 ++
>   test/hooks/bin/writer.rk3288_raw              |  40 +++
>   test/hooks/bin/writer.rpi_mount               |  43 +++
>   test/hooks/bin/writer.sunxi_raw               |  36 +++
>   test/hooks/bin/writer.ti-k3_mount             |  36 +++
>   test/hooks/bin/writer.ti-omap_mount           |  29 ++
>   test/hooks/bin/writer.zynq_mount              |  36 +++
>   test/hooks/contrib/src/.gitignore             |   1 +
>   test/hooks/contrib/src/README.txt             |  13 +
>   test/hooks/contrib/src/build.sh               |   7 +
>   test/hooks/contrib/src/phidgets-relay.c       |  81 +++++
>   .../contrib/udev/swarren-lx1/99-ubtest.rules  |  89 +++++
>   .../OLI01/u_boot_boardenv_mx6qsabrelite_na.py |  39 +++
>   .../konsulko-labgrid/u_boot_boardenv_rpi_4.py |   1 +
>   .../u_boot_boardenv_rpi_arm64.py              |  84 +++++
>   .../u_boot_boardenv_jetson_tk1_na.py          | 110 +++++++
>   .../u_boot_boardenv_p2371_2180_na.py          | 110 +++++++
>   .../u_boot_boardenv_p2771_0000_500_na.py      |  73 +++++
>   test/hooks/py/travis-ci/travis_tftp.py        |  31 ++
>   .../u_boot_boardenv_M5208EVBE_qemu.py         |   6 +
>   .../u_boot_boardenv_evb_ast2500_qemu.py       |   5 +
>   .../u_boot_boardenv_evb_ast2600_qemu.py       |   4 +
>   .../travis-ci/u_boot_boardenv_malta64_qemu.py |   5 +
>   .../u_boot_boardenv_malta64el_qemu.py         |   5 +
>   .../travis-ci/u_boot_boardenv_malta_qemu.py   |   5 +
>   .../travis-ci/u_boot_boardenv_maltael_qemu.py |   5 +
>   .../u_boot_boardenv_qemu_ae3xx_na.py          |   6 +
>   .../u_boot_boardenv_qemu_arm64_na.py          |  12 +
>   .../u_boot_boardenv_qemu_arm64be_na.py        |  10 +
>   .../travis-ci/u_boot_boardenv_qemu_arm_na.py  |  12 +
>   .../travis-ci/u_boot_boardenv_qemu_ax25_na.py |   6 +
>   .../u_boot_boardenv_qemu_loongarch64_na.py    |  11 +
>   .../u_boot_boardenv_qemu_riscv32_na.py        |  10 +
>   .../u_boot_boardenv_qemu_riscv32_spl_na.py    |  10 +
>   .../u_boot_boardenv_qemu_riscv64_na.py        |  10 +
>   .../u_boot_boardenv_qemu_riscv64_spl_na.py    |  10 +
>   .../u_boot_boardenv_qemu_x86_64_na.py         |  12 +
>   .../travis-ci/u_boot_boardenv_qemu_x86_na.py  |  12 +
>   .../u_boot_boardenv_qemu_xtensa_dc233c_na.py  |   6 +
>   .../u_boot_boardenv_r2dplus_i82557c_qemu.py   |   6 +
>   .../u_boot_boardenv_r2dplus_pcnet_qemu.py     |   6 +
>   .../u_boot_boardenv_r2dplus_rtl8139_qemu.py   |   6 +
>   .../u_boot_boardenv_r2dplus_tulip_qemu.py     |   6 +
>   ...t_boardenv_sifive_unleashed_sdcard_qemu.py |  10 +
>   ..._boardenv_sifive_unleashed_spi_nor_qemu.py |  10 +
>   .../u_boot_boardenv_vexpress_ca15_tc2_qemu.py |  10 +
>   .../u_boot_boardenv_vexpress_ca9x4_qemu.py    |  10 +
>   ...u_boot_boardenv_xilinx_versal_virt_qemu.py |   1 +
>   .../u_boot_boardenv_xilinx_zynq_virt_qemu.py  |   3 +
>   .../u_boot_boardenv_zynq_zc702_qemu.py        |   3 +
>   199 files changed, 5340 insertions(+), 27 deletions(-)
>   create mode 100644 doc/develop/test_hooks.rst
>   create mode 100644 test/hooks/bin/OLI01/conf.mx6qsabrelite_na
>   create mode 100644 test/hooks/bin/bill-the-cat/conf.integratorcp_cm926ejs_qemu
>   create mode 100644 test/hooks/bin/bill-the-cat/conf.qemu_mips_na
>   create mode 100644 test/hooks/bin/bill-the-cat/conf.vexpress_ca15_tc2_qemu
>   create mode 100755 test/hooks/bin/common-config.cros-servo-dut-control
>   create mode 100644 test/hooks/bin/common.labgrid-trini
>   create mode 100644 test/hooks/bin/console.fvp
>   create mode 100644 test/hooks/bin/console.labgrid-sjg
>   create mode 100755 test/hooks/bin/console.labgrid-trini
>   create mode 100644 test/hooks/bin/console.picocom
>   create mode 100644 test/hooks/bin/console.qemu
>   create mode 100644 test/hooks/bin/download.imx_usb
>   create mode 100644 test/hooks/bin/download.l4t-exec-uboot
>   create mode 100755 test/hooks/bin/download.tegra-uboot-flasher
>   create mode 100755 test/hooks/bin/ellesmere/common-labgrid-sjg
>   create mode 100644 test/hooks/bin/ellesmere/conf.all
>   create mode 100644 test/hooks/bin/ellesmere/conf.evb-ast2500_qemu
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_spl_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv64_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_64_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_spl_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_na
>   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_spl_na
>   create mode 100644 test/hooks/bin/flash.em100
>   create mode 100644 test/hooks/bin/flash.fiptool
>   create mode 100644 test/hooks/bin/flash.flashair
>   create mode 100644 test/hooks/bin/flash.labgrid-trini.sd-mux
>   create mode 100644 test/hooks/bin/flash.none
>   create mode 100755 test/hooks/bin/flash.qemu_gen_padded_image
>   create mode 100644 test/hooks/bin/flash.recovery_l4t
>   create mode 100644 test/hooks/bin/flash.sdwire_common_mount
>   create mode 100644 test/hooks/bin/flash.sdwire_digital-loggers_raw
>   create mode 100644 test/hooks/bin/flash.sdwire_poweroff_mount
>   create mode 100644 test/hooks/bin/flash.sdwire_poweroff_raw
>   create mode 100644 test/hooks/bin/flash.sdwire_relay_mount
>   create mode 100644 test/hooks/bin/flashair.rpi
>   create mode 100644 test/hooks/bin/flashair.ti-omap
>   create mode 100755 test/hooks/bin/getrole.labgrid-sjg
>   create mode 100644 test/hooks/bin/kea/conf.Linksprite_pcDuino3_sjg-pcduino3
>   create mode 100644 test/hooks/bin/kea/conf.chromebook_link_sjg-link
>   create mode 100644 test/hooks/bin/kea/conf.chromebook_samus_sjg-samus
>   create mode 100644 test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1
>   create mode 100644 test/hooks/bin/kea/conf.minnowmax_sjg-minnowmax
>   create mode 100644 test/hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc
>   create mode 100644 test/hooks/bin/kea/conf.rock2_sjg-rock2
>   create mode 100644 test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b
>   create mode 100644 test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b
>   create mode 100644 test/hooks/bin/kea/conf.zynq_zybo_sjg-zynq_zybo
>   create mode 100644 test/hooks/bin/konsulko-labgrid/conf.am62x_beagleplay_a53_na
>   create mode 100644 test/hooks/bin/konsulko-labgrid/conf.am64x_evm_a53_na
>   create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_32b_na
>   create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_na
>   create mode 100644 test/hooks/bin/konsulko-labgrid/conf.rpi_arm64_na
>   create mode 100644 test/hooks/bin/poweroff.digital-loggers
>   create mode 100644 test/hooks/bin/poweroff.manual
>   create mode 100755 test/hooks/bin/poweroff.none
>   create mode 100644 test/hooks/bin/poweroff.phidgets
>   create mode 100644 test/hooks/bin/poweroff.pm342
>   create mode 100644 test/hooks/bin/poweroff.ykush
>   create mode 100644 test/hooks/bin/poweron.digital-loggers
>   create mode 100644 test/hooks/bin/poweron.manual
>   create mode 100755 test/hooks/bin/poweron.none
>   create mode 100644 test/hooks/bin/poweron.phidgets
>   create mode 100644 test/hooks/bin/poweron.pm342
>   create mode 100644 test/hooks/bin/poweron.ykush
>   create mode 100755 test/hooks/bin/push-flashair.py
>   create mode 100755 test/hooks/bin/qemu.swtpm
>   create mode 100644 test/hooks/bin/recovery.manual
>   create mode 100644 test/hooks/bin/recovery.phidgets
>   create mode 100644 test/hooks/bin/recovery.pm342
>   create mode 100755 test/hooks/bin/recovery.relay
>   create mode 100755 test/hooks/bin/recovery.usbrelay
>   create mode 100644 test/hooks/bin/release.labgrid-sjg
>   create mode 100644 test/hooks/bin/release.none
>   create mode 100644 test/hooks/bin/reset.cros_servo
>   create mode 100644 test/hooks/bin/reset.digital-loggers
>   create mode 100755 test/hooks/bin/reset.labgrid-trini
>   create mode 100644 test/hooks/bin/reset.none
>   create mode 100644 test/hooks/bin/reset.pm342
>   create mode 100644 test/hooks/bin/reset.recovery_download
>   create mode 100644 test/hooks/bin/reset.usbrelay
>   create mode 100644 test/hooks/bin/reset.ykush
>   create mode 100644 test/hooks/bin/swarren-lx1/conf.jetson-tk1_na
>   create mode 100644 test/hooks/bin/swarren-lx1/conf.p2371-2180_na
>   create mode 100644 test/hooks/bin/swarren-lx1/conf.p2771-0000-500_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.M5208EVBE_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.coreboot_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2500_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2600_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.integratorcp_cm926ejs_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.malta64_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.malta64el_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.malta_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.maltael_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ae3xx_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-arm-sbsa_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ax25_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-loongarch64_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ppce500_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_spl_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_spl_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_64_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-xtensa-dc233c_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_spl_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_tpl_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64be_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_spl_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64el_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mipsel_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_i82557c_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_pcnet_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_rtl8139_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_tulip_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.sifive_unleashed_sdcard_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.sifive_unleashed_spi-nor_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_ca15_tc2_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_ca9x4_qemu
>   create mode 120000 test/hooks/bin/travis-ci/conf.vexpress_fvp_bloblist_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_fvp_na
>   create mode 100644 test/hooks/bin/travis-ci/conf.xilinx_versal_virt_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.xilinx_zynq_virt_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.xtfpga_qemu
>   create mode 100644 test/hooks/bin/travis-ci/conf.zynq_zc702_qemu
>   create mode 100755 test/hooks/bin/u-boot-test-common
>   create mode 100755 test/hooks/bin/u-boot-test-console
>   create mode 100755 test/hooks/bin/u-boot-test-flash
>   create mode 100755 test/hooks/bin/u-boot-test-getrole
>   create mode 100755 test/hooks/bin/u-boot-test-power-off
>   create mode 100755 test/hooks/bin/u-boot-test-power-on
>   create mode 100755 test/hooks/bin/u-boot-test-release
>   create mode 100755 test/hooks/bin/u-boot-test-reset
>   create mode 100644 test/hooks/bin/wait_raw_device
>   create mode 100755 test/hooks/bin/writer.imx_raw
>   create mode 100644 test/hooks/bin/writer.labgrid-trini.rpi
>   create mode 100644 test/hooks/bin/writer.labgrid-trini.ti-k3
>   create mode 100755 test/hooks/bin/writer.rk3288_raw
>   create mode 100755 test/hooks/bin/writer.rpi_mount
>   create mode 100755 test/hooks/bin/writer.sunxi_raw
>   create mode 100755 test/hooks/bin/writer.ti-k3_mount
>   create mode 100755 test/hooks/bin/writer.ti-omap_mount
>   create mode 100755 test/hooks/bin/writer.zynq_mount
>   create mode 100644 test/hooks/contrib/src/.gitignore
>   create mode 100644 test/hooks/contrib/src/README.txt
>   create mode 100755 test/hooks/contrib/src/build.sh
>   create mode 100644 test/hooks/contrib/src/phidgets-relay.c
>   create mode 100644 test/hooks/contrib/udev/swarren-lx1/99-ubtest.rules
>   create mode 100644 test/hooks/py/OLI01/u_boot_boardenv_mx6qsabrelite_na.py
>   create mode 120000 test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_4.py
>   create mode 100644 test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_arm64.py
>   create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_jetson_tk1_na.py
>   create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_p2371_2180_na.py
>   create mode 100644 test/hooks/py/swarren-lx1/u_boot_boardenv_p2771_0000_500_na.py
>   create mode 100644 test/hooks/py/travis-ci/travis_tftp.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_M5208EVBE_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2500_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2600_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta64_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta64el_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_malta_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_maltael_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_ae3xx_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64be_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_ax25_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_loongarch64_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_spl_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_spl_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_64_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_qemu_xtensa_dc233c_na.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_i82557c_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_pcnet_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_rtl8139_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_tulip_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_sdcard_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_spi_nor_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca15_tc2_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca9x4_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_xilinx_versal_virt_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_xilinx_zynq_virt_qemu.py
>   create mode 100644 test/hooks/py/travis-ci/u_boot_boardenv_zynq_zc702_qemu.py
> 


^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-05  7:00 ` neil.armstrong
@ 2025-05-05 12:58   ` Simon Glass
  2025-05-05 13:45     ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-05 12:58 UTC (permalink / raw)
  To: Neil Armstrong; +Cc: U-Boot Mailing List, Tom Rini, Heinrich Schuchardt

Hi Neil,

On Mon, 5 May 2025 at 09:06, <neil.armstrong@linaro.org> wrote:
>
> Hi,
>
> On 02/05/2025 04:50, Simon Glass wrote:
> > During a recent discussion with Heinrich we discussed why the hooks are
> > kept in a separate repo.
> >
> > The amount of code is small, a tenth of the size of the recently added
> > lwip, just by way of example. Testing is a critical part of U-Boot and
> > one of the things that distinguishes it from firmware projects that have
> > not kept up in this area. By having the tests somewhere else, we are
> > signalling that it is unusual, or difficult, or optional.
> >
> > The hooks mechanism also needs something of an update to take account of
> > real boards in 2025. That will be much easier to undertake if the code
> > that test/py talks to is in the same repo.
> >
> > This series brings the hook files in as first-class citizens of U-Boot.
>
> So this will definitely remove the ability to have test hooks out of the
> U-boot tree ?

No, not at all. I think Tom had the same thought, but I'm not sure where it
is coming from. You can of course put the hooks wherever you like, since
you have to specify the path for them anyway.

>This is a major regression, and I do not want my test hooks
> to be in the main u-boot tree for plenty of reasons, the main reasons is
> that I need flexibility to handle my lab boards and I can't wait multiple
> weeks to have the hooks fixed in the main tree.
>
> This could be enhanced, but I agree with Tom, it's a bad idea to merge
> them in the main tree.

Are there any other reasons, beside the misunderstanding here?

Regards,
Simon

>
> Neil
>
> >
> > If we do go ahead with this, I will send a different series which has
> > separate commits (with correct author) in the u-boot-test-hooks repo.
> >
> >
> > Simon Glass (3):
> >    test: Bring in the test hooks
> >    doc: Tidy up the hooks documentation
> >    CI: Update to use the hooks in the U-Boot repo
> >
> >   .azure-pipelines.yml                          |  15 +-
> >   .gitlab-ci.yml                                |  16 +-
> >   doc/develop/index.rst                         |   1 +
> >   doc/develop/py_testing.rst                    |  22 +-
> >   doc/develop/test_hooks.rst                    | 306 ++++++++++++++++++
> >   test/hooks/bin/OLI01/conf.mx6qsabrelite_na    |  26 ++
> >   .../conf.integratorcp_cm926ejs_qemu           |  27 ++
> >   test/hooks/bin/bill-the-cat/conf.qemu_mips_na |  28 ++
> >   .../bill-the-cat/conf.vexpress_ca15_tc2_qemu  |  27 ++
> >   .../bin/common-config.cros-servo-dut-control  |  69 ++++
> >   test/hooks/bin/common.labgrid-trini           |  35 ++
> >   test/hooks/bin/console.fvp                    |  28 ++
> >   test/hooks/bin/console.labgrid-sjg            |  42 +++
> >   test/hooks/bin/console.labgrid-trini          |  24 ++
> >   test/hooks/bin/console.picocom                |  42 +++
> >   test/hooks/bin/console.qemu                   |  35 ++
> >   test/hooks/bin/download.imx_usb               |  23 ++
> >   test/hooks/bin/download.l4t-exec-uboot        |  25 ++
> >   test/hooks/bin/download.tegra-uboot-flasher   |  24 ++
> >   test/hooks/bin/ellesmere/common-labgrid-sjg   |  46 +++
> >   test/hooks/bin/ellesmere/conf.all             |  24 ++
> >   .../hooks/bin/ellesmere/conf.evb-ast2500_qemu |  11 +
> >   test/hooks/bin/ellesmere/conf.qemu-riscv32_na |   1 +
> >   .../bin/ellesmere/conf.qemu-riscv32_spl_na    |   1 +
> >   test/hooks/bin/ellesmere/conf.qemu-riscv64_na |   1 +
> >   test/hooks/bin/ellesmere/conf.qemu-x86_64_na  |   1 +
> >   test/hooks/bin/ellesmere/conf.qemu-x86_na     |   1 +
> >   test/hooks/bin/ellesmere/conf.qemu_arm64_na   |   1 +
> >   .../bin/ellesmere/conf.qemu_arm64_spl_na      |   1 +
> >   test/hooks/bin/ellesmere/conf.qemu_arm_na     |   1 +
> >   test/hooks/bin/ellesmere/conf.qemu_arm_spl_na |   1 +
> >   test/hooks/bin/flash.em100                    |  30 ++
> >   test/hooks/bin/flash.fiptool                  |  22 ++
> >   test/hooks/bin/flash.flashair                 |  45 +++
> >   test/hooks/bin/flash.labgrid-trini.sd-mux     |  31 ++
> >   test/hooks/bin/flash.none                     |  21 ++
> >   test/hooks/bin/flash.qemu_gen_padded_image    |  15 +
> >   test/hooks/bin/flash.recovery_l4t             |  44 +++
> >   test/hooks/bin/flash.sdwire_common_mount      |  80 +++++
> >   .../bin/flash.sdwire_digital-loggers_raw      |  41 +++
> >   test/hooks/bin/flash.sdwire_poweroff_mount    |  32 ++
> >   test/hooks/bin/flash.sdwire_poweroff_raw      |  42 +++
> >   test/hooks/bin/flash.sdwire_relay_mount       |  34 ++
> >   test/hooks/bin/flashair.rpi                   |  47 +++
> >   test/hooks/bin/flashair.ti-omap               |  26 ++
> >   test/hooks/bin/getrole.labgrid-sjg            |  34 ++
> >   .../kea/conf.Linksprite_pcDuino3_sjg-pcduino3 |  33 ++
> >   .../bin/kea/conf.chromebook_link_sjg-link     |  30 ++
> >   .../bin/kea/conf.chromebook_samus_sjg-samus   |  30 ++
> >   test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1    |  38 +++
> >   .../bin/kea/conf.minnowmax_sjg-minnowmax      |  33 ++
> >   .../hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc |  35 ++
> >   test/hooks/bin/kea/conf.rock2_sjg-rock2       |  33 ++
> >   test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b  |  34 ++
> >   test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b      |  34 ++
> >   .../bin/kea/conf.zynq_zybo_sjg-zynq_zybo      |  44 +++
> >   .../conf.am62x_beagleplay_a53_na              |  30 ++
> >   .../konsulko-labgrid/conf.am64x_evm_a53_na    |  30 ++
> >   .../bin/konsulko-labgrid/conf.rpi_4_32b_na    |   1 +
> >   test/hooks/bin/konsulko-labgrid/conf.rpi_4_na |   1 +
> >   .../bin/konsulko-labgrid/conf.rpi_arm64_na    |  25 ++
> >   test/hooks/bin/poweroff.digital-loggers       |  22 ++
> >   test/hooks/bin/poweroff.manual                |  21 ++
> >   test/hooks/bin/poweroff.none                  |  22 ++
> >   test/hooks/bin/poweroff.phidgets              |  37 +++
> >   test/hooks/bin/poweroff.pm342                 |  21 ++
> >   test/hooks/bin/poweroff.ykush                 |  23 ++
> >   test/hooks/bin/poweron.digital-loggers        |  22 ++
> >   test/hooks/bin/poweron.manual                 |  21 ++
> >   test/hooks/bin/poweron.none                   |  22 ++
> >   test/hooks/bin/poweron.phidgets               |  32 ++
> >   test/hooks/bin/poweron.pm342                  |  24 ++
> >   test/hooks/bin/poweron.ykush                  |  23 ++
> >   test/hooks/bin/push-flashair.py               | 118 +++++++
> >   test/hooks/bin/qemu.swtpm                     |  23 ++
> >   test/hooks/bin/recovery.manual                |  23 ++
> >   test/hooks/bin/recovery.phidgets              |  29 ++
> >   test/hooks/bin/recovery.pm342                 |  26 ++
> >   test/hooks/bin/recovery.relay                 |  39 +++
> >   test/hooks/bin/recovery.usbrelay              |  32 ++
> >   test/hooks/bin/release.labgrid-sjg            |  22 ++
> >   test/hooks/bin/release.none                   |  22 ++
> >   test/hooks/bin/reset.cros_servo               |  23 ++
> >   test/hooks/bin/reset.digital-loggers          |  25 ++
> >   test/hooks/bin/reset.labgrid-trini            |  24 ++
> >   test/hooks/bin/reset.none                     |  30 ++
> >   test/hooks/bin/reset.pm342                    |  21 ++
> >   test/hooks/bin/reset.recovery_download        |  36 +++
> >   test/hooks/bin/reset.usbrelay                 |  26 ++
> >   test/hooks/bin/reset.ykush                    |  25 ++
> >   test/hooks/bin/swarren-lx1/conf.jetson-tk1_na |  36 +++
> >   test/hooks/bin/swarren-lx1/conf.p2371-2180_na |  57 ++++
> >   .../bin/swarren-lx1/conf.p2771-0000-500_na    |  32 ++
> >   test/hooks/bin/travis-ci/conf.M5208EVBE_qemu  |  27 ++
> >   test/hooks/bin/travis-ci/conf.coreboot_qemu   |  28 ++
> >   .../hooks/bin/travis-ci/conf.evb-ast2500_qemu |  11 +
> >   .../hooks/bin/travis-ci/conf.evb-ast2600_qemu |  13 +
> >   .../travis-ci/conf.integratorcp_cm926ejs_qemu |  27 ++
> >   test/hooks/bin/travis-ci/conf.malta64_qemu    |  30 ++
> >   test/hooks/bin/travis-ci/conf.malta64el_qemu  |  31 ++
> >   test/hooks/bin/travis-ci/conf.malta_qemu      |  30 ++
> >   test/hooks/bin/travis-ci/conf.maltael_qemu    |  31 ++
> >   test/hooks/bin/travis-ci/conf.qemu-ae3xx_na   |  27 ++
> >   .../hooks/bin/travis-ci/conf.qemu-arm-sbsa_na |  27 ++
> >   test/hooks/bin/travis-ci/conf.qemu-ax25_na    |  27 ++
> >   .../bin/travis-ci/conf.qemu-loongarch64_na    |  12 +
> >   test/hooks/bin/travis-ci/conf.qemu-ppce500_na |  27 ++
> >   test/hooks/bin/travis-ci/conf.qemu-riscv32_na |  11 +
> >   .../bin/travis-ci/conf.qemu-riscv32_spl_na    |  11 +
> >   test/hooks/bin/travis-ci/conf.qemu-riscv64_na |  11 +
> >   .../bin/travis-ci/conf.qemu-riscv64_spl_na    |  11 +
> >   test/hooks/bin/travis-ci/conf.qemu-x86_64_na  |  27 ++
> >   test/hooks/bin/travis-ci/conf.qemu-x86_na     |  27 ++
> >   .../bin/travis-ci/conf.qemu-xtensa-dc233c_na  |  12 +
> >   test/hooks/bin/travis-ci/conf.qemu_arm64_na   |  30 ++
> >   .../bin/travis-ci/conf.qemu_arm64_spl_na      |  32 ++
> >   .../bin/travis-ci/conf.qemu_arm64_tpl_na      |  29 ++
> >   test/hooks/bin/travis-ci/conf.qemu_arm64be_na |  13 +
> >   test/hooks/bin/travis-ci/conf.qemu_arm_na     |  30 ++
> >   test/hooks/bin/travis-ci/conf.qemu_arm_spl_na |  31 ++
> >   test/hooks/bin/travis-ci/conf.qemu_mips64_na  |  28 ++
> >   .../hooks/bin/travis-ci/conf.qemu_mips64el_na |  28 ++
> >   test/hooks/bin/travis-ci/conf.qemu_mips_na    |  28 ++
> >   test/hooks/bin/travis-ci/conf.qemu_mipsel_na  |  28 ++
> >   .../bin/travis-ci/conf.r2dplus_i82557c_qemu   |  27 ++
> >   .../bin/travis-ci/conf.r2dplus_pcnet_qemu     |  27 ++
> >   .../bin/travis-ci/conf.r2dplus_rtl8139_qemu   |  27 ++
> >   .../bin/travis-ci/conf.r2dplus_tulip_qemu     |  27 ++
> >   .../conf.sifive_unleashed_sdcard_qemu         |  11 +
> >   .../conf.sifive_unleashed_spi-nor_qemu        |  11 +
> >   .../bin/travis-ci/conf.vexpress_ca15_tc2_qemu |  27 ++
> >   .../bin/travis-ci/conf.vexpress_ca9x4_qemu    |  27 ++
> >   .../travis-ci/conf.vexpress_fvp_bloblist_na   |   1 +
> >   test/hooks/bin/travis-ci/conf.vexpress_fvp_na |  29 ++
> >   .../travis-ci/conf.xilinx_versal_virt_qemu    |  27 ++
> >   .../bin/travis-ci/conf.xilinx_zynq_virt_qemu  |  27 ++
> >   test/hooks/bin/travis-ci/conf.xtfpga_qemu     |  27 ++
> >   test/hooks/bin/travis-ci/conf.zynq_zc702_qemu |  27 ++
> >   test/hooks/bin/u-boot-test-common             |  36 +++
> >   test/hooks/bin/u-boot-test-console            |  25 ++
> >   test/hooks/bin/u-boot-test-flash              |  25 ++
> >   test/hooks/bin/u-boot-test-getrole            |  38 +++
> >   test/hooks/bin/u-boot-test-power-off          |  25 ++
> >   test/hooks/bin/u-boot-test-power-on           |  25 ++
> >   test/hooks/bin/u-boot-test-release            |  26 ++
> >   test/hooks/bin/u-boot-test-reset              |  25 ++
> >   test/hooks/bin/wait_raw_device                |  34 ++
> >   test/hooks/bin/writer.imx_raw                 |  39 +++
> >   test/hooks/bin/writer.labgrid-trini.rpi       |  46 +++
> >   test/hooks/bin/writer.labgrid-trini.ti-k3     |  35 ++
> >   test/hooks/bin/writer.rk3288_raw              |  40 +++
> >   test/hooks/bin/writer.rpi_mount               |  43 +++
> >   test/hooks/bin/writer.sunxi_raw               |  36 +++
> >   test/hooks/bin/writer.ti-k3_mount             |  36 +++
> >   test/hooks/bin/writer.ti-omap_mount           |  29 ++
> >   test/hooks/bin/writer.zynq_mount              |  36 +++
> >   test/hooks/contrib/src/.gitignore             |   1 +
> >   test/hooks/contrib/src/README.txt             |  13 +
> >   test/hooks/contrib/src/build.sh               |   7 +
> >   test/hooks/contrib/src/phidgets-relay.c       |  81 +++++
> >   .../contrib/udev/swarren-lx1/99-ubtest.rules  |  89 +++++
> >   .../OLI01/u_boot_boardenv_mx6qsabrelite_na.py |  39 +++
> >   .../konsulko-labgrid/u_boot_boardenv_rpi_4.py |   1 +
> >   .../u_boot_boardenv_rpi_arm64.py              |  84 +++++
> >   .../u_boot_boardenv_jetson_tk1_na.py          | 110 +++++++
> >   .../u_boot_boardenv_p2371_2180_na.py          | 110 +++++++
> >   .../u_boot_boardenv_p2771_0000_500_na.py      |  73 +++++
> >   test/hooks/py/travis-ci/travis_tftp.py        |  31 ++
> >   .../u_boot_boardenv_M5208EVBE_qemu.py         |   6 +
> >   .../u_boot_boardenv_evb_ast2500_qemu.py       |   5 +
> >   .../u_boot_boardenv_evb_ast2600_qemu.py       |   4 +
> >   .../travis-ci/u_boot_boardenv_malta64_qemu.py |   5 +
> >   .../u_boot_boardenv_malta64el_qemu.py         |   5 +
> >   .../travis-ci/u_boot_boardenv_malta_qemu.py   |   5 +
> >   .../travis-ci/u_boot_boardenv_maltael_qemu.py |   5 +
> >   .../u_boot_boardenv_qemu_ae3xx_na.py          |   6 +
> >   .../u_boot_boardenv_qemu_arm64_na.py          |  12 +
> >   .../u_boot_boardenv_qemu_arm64be_na.py        |  10 +
> >   .../travis-ci/u_boot_boardenv_qemu_arm_na.py  |  12 +
> >   .../travis-ci/u_boot_boardenv_qemu_ax25_na.py |   6 +
> >   .../u_boot_boardenv_qemu_loongarch64_na.py    |  11 +
> >   .../u_boot_boardenv_qemu_riscv32_na.py        |  10 +
> >   .../u_boot_boardenv_qemu_riscv32_spl_na.py    |  10 +
> >   .../u_boot_boardenv_qemu_riscv64_na.py        |  10 +
> >   .../u_boot_boardenv_qemu_riscv64_spl_na.py    |  10 +
> >   .../u_boot_boardenv_qemu_x86_64_na.py         |  12 +
> >   .../travis-ci/u_boot_boardenv_qemu_x86_na.py  |  12 +
> >   .../u_boot_boardenv_qemu_xtensa_dc233c_na.py  |   6 +
> >   .../u_boot_boardenv_r2dplus_i82557c_qemu.py   |   6 +
> >   .../u_boot_boardenv_r2dplus_pcnet_qemu.py     |   6 +
> >   .../u_boot_boardenv_r2dplus_rtl8139_qemu.py   |   6 +
> >   .../u_boot_boardenv_r2dplus_tulip_qemu.py     |   6 +
> >   ...t_boardenv_sifive_unleashed_sdcard_qemu.py |  10 +
> >   ..._boardenv_sifive_unleashed_spi_nor_qemu.py |  10 +
> >   .../u_boot_boardenv_vexpress_ca15_tc2_qemu.py |  10 +
> >   .../u_boot_boardenv_vexpress_ca9x4_qemu.py    |  10 +
> >   ...u_boot_boardenv_xilinx_versal_virt_qemu.py |   1 +
> >   .../u_boot_boardenv_xilinx_zynq_virt_qemu.py  |   3 +
> >   .../u_boot_boardenv_zynq_zc702_qemu.py        |   3 +
> >   199 files changed, 5340 insertions(+), 27 deletions(-)
> >   create mode 100644 doc/develop/test_hooks.rst
> >   create mode 100644 test/hooks/bin/OLI01/conf.mx6qsabrelite_na
> >   create mode 100644
test/hooks/bin/bill-the-cat/conf.integratorcp_cm926ejs_qemu
> >   create mode 100644 test/hooks/bin/bill-the-cat/conf.qemu_mips_na
> >   create mode 100644
test/hooks/bin/bill-the-cat/conf.vexpress_ca15_tc2_qemu
> >   create mode 100755 test/hooks/bin/common-config.cros-servo-dut-control
> >   create mode 100644 test/hooks/bin/common.labgrid-trini
> >   create mode 100644 test/hooks/bin/console.fvp
> >   create mode 100644 test/hooks/bin/console.labgrid-sjg
> >   create mode 100755 test/hooks/bin/console.labgrid-trini
> >   create mode 100644 test/hooks/bin/console.picocom
> >   create mode 100644 test/hooks/bin/console.qemu
> >   create mode 100644 test/hooks/bin/download.imx_usb
> >   create mode 100644 test/hooks/bin/download.l4t-exec-uboot
> >   create mode 100755 test/hooks/bin/download.tegra-uboot-flasher
> >   create mode 100755 test/hooks/bin/ellesmere/common-labgrid-sjg
> >   create mode 100644 test/hooks/bin/ellesmere/conf.all
> >   create mode 100644 test/hooks/bin/ellesmere/conf.evb-ast2500_qemu
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv32_spl_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-riscv64_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_64_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu-x86_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm64_spl_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_na
> >   create mode 120000 test/hooks/bin/ellesmere/conf.qemu_arm_spl_na
> >   create mode 100644 test/hooks/bin/flash.em100
> >   create mode 100644 test/hooks/bin/flash.fiptool
> >   create mode 100644 test/hooks/bin/flash.flashair
> >   create mode 100644 test/hooks/bin/flash.labgrid-trini.sd-mux
> >   create mode 100644 test/hooks/bin/flash.none
> >   create mode 100755 test/hooks/bin/flash.qemu_gen_padded_image
> >   create mode 100644 test/hooks/bin/flash.recovery_l4t
> >   create mode 100644 test/hooks/bin/flash.sdwire_common_mount
> >   create mode 100644 test/hooks/bin/flash.sdwire_digital-loggers_raw
> >   create mode 100644 test/hooks/bin/flash.sdwire_poweroff_mount
> >   create mode 100644 test/hooks/bin/flash.sdwire_poweroff_raw
> >   create mode 100644 test/hooks/bin/flash.sdwire_relay_mount
> >   create mode 100644 test/hooks/bin/flashair.rpi
> >   create mode 100644 test/hooks/bin/flashair.ti-omap
> >   create mode 100755 test/hooks/bin/getrole.labgrid-sjg
> >   create mode 100644
test/hooks/bin/kea/conf.Linksprite_pcDuino3_sjg-pcduino3
> >   create mode 100644 test/hooks/bin/kea/conf.chromebook_link_sjg-link
> >   create mode 100644 test/hooks/bin/kea/conf.chromebook_samus_sjg-samus
> >   create mode 100644 test/hooks/bin/kea/conf.jetson-tk1_sjg-tk1
> >   create mode 100644 test/hooks/bin/kea/conf.minnowmax_sjg-minnowmax
> >   create mode 100644 test/hooks/bin/kea/conf.orangepi_pc_sjg-opi_pc
> >   create mode 100644 test/hooks/bin/kea/conf.rock2_sjg-rock2
> >   create mode 100644 test/hooks/bin/kea/conf.rpi_3_32b_sjg-rpi_3b
> >   create mode 100644 test/hooks/bin/kea/conf.rpi_3_sjg-rpi_3b
> >   create mode 100644 test/hooks/bin/kea/conf.zynq_zybo_sjg-zynq_zybo
> >   create mode 100644
test/hooks/bin/konsulko-labgrid/conf.am62x_beagleplay_a53_na
> >   create mode 100644
test/hooks/bin/konsulko-labgrid/conf.am64x_evm_a53_na
> >   create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_32b_na
> >   create mode 120000 test/hooks/bin/konsulko-labgrid/conf.rpi_4_na
> >   create mode 100644 test/hooks/bin/konsulko-labgrid/conf.rpi_arm64_na
> >   create mode 100644 test/hooks/bin/poweroff.digital-loggers
> >   create mode 100644 test/hooks/bin/poweroff.manual
> >   create mode 100755 test/hooks/bin/poweroff.none
> >   create mode 100644 test/hooks/bin/poweroff.phidgets
> >   create mode 100644 test/hooks/bin/poweroff.pm342
> >   create mode 100644 test/hooks/bin/poweroff.ykush
> >   create mode 100644 test/hooks/bin/poweron.digital-loggers
> >   create mode 100644 test/hooks/bin/poweron.manual
> >   create mode 100755 test/hooks/bin/poweron.none
> >   create mode 100644 test/hooks/bin/poweron.phidgets
> >   create mode 100644 test/hooks/bin/poweron.pm342
> >   create mode 100644 test/hooks/bin/poweron.ykush
> >   create mode 100755 test/hooks/bin/push-flashair.py
> >   create mode 100755 test/hooks/bin/qemu.swtpm
> >   create mode 100644 test/hooks/bin/recovery.manual
> >   create mode 100644 test/hooks/bin/recovery.phidgets
> >   create mode 100644 test/hooks/bin/recovery.pm342
> >   create mode 100755 test/hooks/bin/recovery.relay
> >   create mode 100755 test/hooks/bin/recovery.usbrelay
> >   create mode 100644 test/hooks/bin/release.labgrid-sjg
> >   create mode 100644 test/hooks/bin/release.none
> >   create mode 100644 test/hooks/bin/reset.cros_servo
> >   create mode 100644 test/hooks/bin/reset.digital-loggers
> >   create mode 100755 test/hooks/bin/reset.labgrid-trini
> >   create mode 100644 test/hooks/bin/reset.none
> >   create mode 100644 test/hooks/bin/reset.pm342
> >   create mode 100644 test/hooks/bin/reset.recovery_download
> >   create mode 100644 test/hooks/bin/reset.usbrelay
> >   create mode 100644 test/hooks/bin/reset.ykush
> >   create mode 100644 test/hooks/bin/swarren-lx1/conf.jetson-tk1_na
> >   create mode 100644 test/hooks/bin/swarren-lx1/conf.p2371-2180_na
> >   create mode 100644 test/hooks/bin/swarren-lx1/conf.p2771-0000-500_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.M5208EVBE_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.coreboot_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2500_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.evb-ast2600_qemu
> >   create mode 100644
test/hooks/bin/travis-ci/conf.integratorcp_cm926ejs_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.malta64_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.malta64el_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.malta_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.maltael_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ae3xx_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-arm-sbsa_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ax25_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-loongarch64_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-ppce500_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv32_spl_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-riscv64_spl_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_64_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-x86_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu-xtensa-dc233c_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_spl_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64_tpl_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm64be_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_arm_spl_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips64el_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mips_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.qemu_mipsel_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_i82557c_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_pcnet_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_rtl8139_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.r2dplus_tulip_qemu
> >   create mode 100644
test/hooks/bin/travis-ci/conf.sifive_unleashed_sdcard_qemu
> >   create mode 100644
test/hooks/bin/travis-ci/conf.sifive_unleashed_spi-nor_qemu
> >   create mode 100644
test/hooks/bin/travis-ci/conf.vexpress_ca15_tc2_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_ca9x4_qemu
> >   create mode 120000
test/hooks/bin/travis-ci/conf.vexpress_fvp_bloblist_na
> >   create mode 100644 test/hooks/bin/travis-ci/conf.vexpress_fvp_na
> >   create mode 100644
test/hooks/bin/travis-ci/conf.xilinx_versal_virt_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.xilinx_zynq_virt_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.xtfpga_qemu
> >   create mode 100644 test/hooks/bin/travis-ci/conf.zynq_zc702_qemu
> >   create mode 100755 test/hooks/bin/u-boot-test-common
> >   create mode 100755 test/hooks/bin/u-boot-test-console
> >   create mode 100755 test/hooks/bin/u-boot-test-flash
> >   create mode 100755 test/hooks/bin/u-boot-test-getrole
> >   create mode 100755 test/hooks/bin/u-boot-test-power-off
> >   create mode 100755 test/hooks/bin/u-boot-test-power-on
> >   create mode 100755 test/hooks/bin/u-boot-test-release
> >   create mode 100755 test/hooks/bin/u-boot-test-reset
> >   create mode 100644 test/hooks/bin/wait_raw_device
> >   create mode 100755 test/hooks/bin/writer.imx_raw
> >   create mode 100644 test/hooks/bin/writer.labgrid-trini.rpi
> >   create mode 100644 test/hooks/bin/writer.labgrid-trini.ti-k3
> >   create mode 100755 test/hooks/bin/writer.rk3288_raw
> >   create mode 100755 test/hooks/bin/writer.rpi_mount
> >   create mode 100755 test/hooks/bin/writer.sunxi_raw
> >   create mode 100755 test/hooks/bin/writer.ti-k3_mount
> >   create mode 100755 test/hooks/bin/writer.ti-omap_mount
> >   create mode 100755 test/hooks/bin/writer.zynq_mount
> >   create mode 100644 test/hooks/contrib/src/.gitignore
> >   create mode 100644 test/hooks/contrib/src/README.txt
> >   create mode 100755 test/hooks/contrib/src/build.sh
> >   create mode 100644 test/hooks/contrib/src/phidgets-relay.c
> >   create mode 100644 test/hooks/contrib/udev/swarren-lx1/99-ubtest.rules
> >   create mode 100644
test/hooks/py/OLI01/u_boot_boardenv_mx6qsabrelite_na.py
> >   create mode 120000
test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_4.py
> >   create mode 100644
test/hooks/py/konsulko-labgrid/u_boot_boardenv_rpi_arm64.py
> >   create mode 100644
test/hooks/py/swarren-lx1/u_boot_boardenv_jetson_tk1_na.py
> >   create mode 100644
test/hooks/py/swarren-lx1/u_boot_boardenv_p2371_2180_na.py
> >   create mode 100644
test/hooks/py/swarren-lx1/u_boot_boardenv_p2771_0000_500_na.py
> >   create mode 100644 test/hooks/py/travis-ci/travis_tftp.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_M5208EVBE_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2500_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_evb_ast2600_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_malta64_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_malta64el_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_malta_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_maltael_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_ae3xx_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm64be_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_arm_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_ax25_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_loongarch64_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv32_spl_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_riscv64_spl_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_64_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_x86_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_qemu_xtensa_dc233c_na.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_i82557c_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_pcnet_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_rtl8139_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_r2dplus_tulip_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_sdcard_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_sifive_unleashed_spi_nor_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca15_tc2_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_vexpress_ca9x4_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_xilinx_versal_virt_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_xilinx_zynq_virt_qemu.py
> >   create mode 100644
test/hooks/py/travis-ci/u_boot_boardenv_zynq_zc702_qemu.py
> >
>

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-05 12:58   ` Simon Glass
@ 2025-05-05 13:45     ` Tom Rini
  2025-05-05 15:34       ` Simon Glass
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-05 13:45 UTC (permalink / raw)
  To: Simon Glass; +Cc: Neil Armstrong, U-Boot Mailing List, Heinrich Schuchardt

[-- Attachment #1: Type: text/plain, Size: 2548 bytes --]

On Mon, May 05, 2025 at 02:58:06PM +0200, Simon Glass wrote:
> Hi Neil,
> 
> On Mon, 5 May 2025 at 09:06, <neil.armstrong@linaro.org> wrote:
> >
> > Hi,
> >
> > On 02/05/2025 04:50, Simon Glass wrote:
> > > During a recent discussion with Heinrich we discussed why the hooks are
> > > kept in a separate repo.
> > >
> > > The amount of code is small, a tenth of the size of the recently added
> > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > one of the things that distinguishes it from firmware projects that have
> > > not kept up in this area. By having the tests somewhere else, we are
> > > signalling that it is unusual, or difficult, or optional.
> > >
> > > The hooks mechanism also needs something of an update to take account of
> > > real boards in 2025. That will be much easier to undertake if the code
> > > that test/py talks to is in the same repo.
> > >
> > > This series brings the hook files in as first-class citizens of U-Boot.
> >
> > So this will definitely remove the ability to have test hooks out of the
> > U-boot tree ?
> 
> No, not at all. I think Tom had the same thought, but I'm not sure where it
> is coming from. You can of course put the hooks wherever you like, since
> you have to specify the path for them anyway.
> 
> >This is a major regression, and I do not want my test hooks
> > to be in the main u-boot tree for plenty of reasons, the main reasons is
> > that I need flexibility to handle my lab boards and I can't wait multiple
> > weeks to have the hooks fixed in the main tree.
> >
> > This could be enhanced, but I agree with Tom, it's a bad idea to merge
> > them in the main tree.
> 
> Are there any other reasons, beside the misunderstanding here?

I don't think there's a misunderstanding here. If I follow what you're
saying, you want the hooks to primarily exist in the main source tree.
Yes, of course someone could maintain them out of tree instead. But
that's adding pain to that set of users. And I'm not sure what the
benefit is to anyone else to move them in-tree. We're making the project
CI path a tiny bit easier (but for what is also a small case) at the
expense of all of the other cases.

If we must save two steps in the case of testing new changes for CI, we
could add the u-boot-test-hooks repository as another git subtree. This
would make it easy to test new CI changes at the expense of making it
more costly (a git subtree resync) when we want to update the hooks
repository.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-05 13:45     ` Tom Rini
@ 2025-05-05 15:34       ` Simon Glass
  2025-05-05 16:22         ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-05 15:34 UTC (permalink / raw)
  To: Tom Rini; +Cc: Neil Armstrong, U-Boot Mailing List, Heinrich Schuchardt

Hi Tom,

On Mon, May 5, 2025, 15:45 Tom Rini <trini@konsulko.com> wrote:
>
> On Mon, May 05, 2025 at 02:58:06PM +0200, Simon Glass wrote:
> > Hi Neil,
> >
> > On Mon, 5 May 2025 at 09:06, <neil.armstrong@linaro.org> wrote:
> > >
> > > Hi,
> > >
> > > On 02/05/2025 04:50, Simon Glass wrote:
> > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > kept in a separate repo.
> > > >
> > > > The amount of code is small, a tenth of the size of the recently added
> > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > one of the things that distinguishes it from firmware projects that have
> > > > not kept up in this area. By having the tests somewhere else, we are
> > > > signalling that it is unusual, or difficult, or optional.
> > > >
> > > > The hooks mechanism also needs something of an update to take account of
> > > > real boards in 2025. That will be much easier to undertake if the code
> > > > that test/py talks to is in the same repo.
> > > >
> > > > This series brings the hook files in as first-class citizens of U-Boot.
> > >
> > > So this will definitely remove the ability to have test hooks out of the
> > > U-boot tree ?
> >
> > No, not at all. I think Tom had the same thought, but I'm not sure where it
> > is coming from. You can of course put the hooks wherever you like, since
> > you have to specify the path for them anyway.
> >
> > >This is a major regression, and I do not want my test hooks
> > > to be in the main u-boot tree for plenty of reasons, the main reasons is
> > > that I need flexibility to handle my lab boards and I can't wait multiple
> > > weeks to have the hooks fixed in the main tree.
> > >
> > > This could be enhanced, but I agree with Tom, it's a bad idea to merge
> > > them in the main tree.
> >
> > Are there any other reasons, beside the misunderstanding here?
>
> I don't think there's a misunderstanding here. If I follow what you're
> saying, you want the hooks to primarily exist in the main source tree.
> Yes, of course someone could maintain them out of tree instead. But
> that's adding pain to that set of users.

People maintain them out-of-tree today. They can simply keep doing so.
I am not sure what you are getting at here.

> And I'm not sure what the
> benefit is to anyone else to move them in-tree. We're making the project
> CI path a tiny bit easier (but for what is also a small case) at the
> expense of all of the other cases.

Did you see Heinrich's email?

>
> If we must save two steps in the case of testing new changes for CI, we
> could add the u-boot-test-hooks repository as another git subtree. This
> would make it easy to test new CI changes at the expense of making it
> more costly (a git subtree resync) when we want to update the hooks
> repository.

I don't see how a subtree would help though. It's not as if some other
project is using it, upstream of U-Boot.

- Simon

> --
> Tom

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-05 15:34       ` Simon Glass
@ 2025-05-05 16:22         ` Tom Rini
  0 siblings, 0 replies; 25+ messages in thread
From: Tom Rini @ 2025-05-05 16:22 UTC (permalink / raw)
  To: Simon Glass; +Cc: Neil Armstrong, U-Boot Mailing List, Heinrich Schuchardt

[-- Attachment #1: Type: text/plain, Size: 4194 bytes --]

On Mon, May 05, 2025 at 05:34:58PM +0200, Simon Glass wrote:
> Hi Tom,
> 
> On Mon, May 5, 2025, 15:45 Tom Rini <trini@konsulko.com> wrote:
> >
> > On Mon, May 05, 2025 at 02:58:06PM +0200, Simon Glass wrote:
> > > Hi Neil,
> > >
> > > On Mon, 5 May 2025 at 09:06, <neil.armstrong@linaro.org> wrote:
> > > >
> > > > Hi,
> > > >
> > > > On 02/05/2025 04:50, Simon Glass wrote:
> > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > kept in a separate repo.
> > > > >
> > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > one of the things that distinguishes it from firmware projects that have
> > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > signalling that it is unusual, or difficult, or optional.
> > > > >
> > > > > The hooks mechanism also needs something of an update to take account of
> > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > that test/py talks to is in the same repo.
> > > > >
> > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > >
> > > > So this will definitely remove the ability to have test hooks out of the
> > > > U-boot tree ?
> > >
> > > No, not at all. I think Tom had the same thought, but I'm not sure where it
> > > is coming from. You can of course put the hooks wherever you like, since
> > > you have to specify the path for them anyway.
> > >
> > > >This is a major regression, and I do not want my test hooks
> > > > to be in the main u-boot tree for plenty of reasons, the main reasons is
> > > > that I need flexibility to handle my lab boards and I can't wait multiple
> > > > weeks to have the hooks fixed in the main tree.
> > > >
> > > > This could be enhanced, but I agree with Tom, it's a bad idea to merge
> > > > them in the main tree.
> > >
> > > Are there any other reasons, beside the misunderstanding here?
> >
> > I don't think there's a misunderstanding here. If I follow what you're
> > saying, you want the hooks to primarily exist in the main source tree.
> > Yes, of course someone could maintain them out of tree instead. But
> > that's adding pain to that set of users.
> 
> People maintain them out-of-tree today. They can simply keep doing so.
> I am not sure what you are getting at here.

Yes. People use the tree, today. Likely pulling in changes and merging
them to their local branch as needed. That's no longer possible if the
repository goes away and instead is in the main U-Boot tree. Or were you
thinking it would be maintained as a mirror of what goes in mainline?

> > And I'm not sure what the
> > benefit is to anyone else to move them in-tree. We're making the project
> > CI path a tiny bit easier (but for what is also a small case) at the
> > expense of all of the other cases.
> 
> Did you see Heinrich's email?

Yes, and I replied.

> > If we must save two steps in the case of testing new changes for CI, we
> > could add the u-boot-test-hooks repository as another git subtree. This
> > would make it easy to test new CI changes at the expense of making it
> > more costly (a git subtree resync) when we want to update the hooks
> > repository.
> 
> I don't see how a subtree would help though. It's not as if some other
> project is using it, upstream of U-Boot.

It would solve the problem of "need to test changes in CI easier"
without breaking the regular use case of "separate lab infrastructure
from the project". Perhaps the problem really is that configuring the
hooks also looks for data that's in the hooks repository.

But all of that said, this still feels like a step backwards. You don't
put more projects in a single repository, maintaining and using multiple
repositories is easy now, we aren't stuck in RCCS / CVS land anymore.
Heck, the reason I point out subtree is that is how you manage these
kind of problems. Even more so for parts of the code where it's easier
to say that yes, multiple people can have write access.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-03 14:29               ` Simon Glass
@ 2025-05-05 18:18                 ` Tom Rini
  2025-05-06 13:23                   ` Simon Glass
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-05 18:18 UTC (permalink / raw)
  To: Simon Glass; +Cc: Heinrich Schuchardt, U-Boot Mailing List

[-- Attachment #1: Type: text/plain, Size: 7770 bytes --]

On Sat, May 03, 2025 at 08:29:13AM -0600, Simon Glass wrote:
> Hi Tom,
> 
> On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com> wrote:
> >
> > On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt wrote:
> > > On 5/2/25 21:30, Tom Rini wrote:
> > > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> > > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > > > > > Hi Tom,
> > > > > > >
> > > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > > > > >
> > > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > > > > >
> > > > > > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > > > > > kept in a separate repo.
> > > > > > > > >
> > > > > > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > > > > > one of the things that distinguishes it from firmware projects that have
> > > > > > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > > > > > signalling that it is unusual, or difficult, or optional.
> > > > > > > > >
> > > > > > > > > The hooks mechanism also needs something of an update to take account of
> > > > > > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > > > > > that test/py talks to is in the same repo.
> > > > > > > > >
> > > > > > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > > > > >
> > > > > > > > > If we do go ahead with this, I will send a different series which has
> > > > > > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > > > > >
> > > > > > > > I think bringing more projects directly in to the repository is a bad
> > > > > > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > > > > > subtree that's maintained outside of the project (same as the dts
> > > > > > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > > > > > - Remove needless examples from the tree.
> > > > > > > > - Not include personal labs directly in the tree.
> > > > > > > >
> > > > > > > > That last one is why I really think this is a bad idea. The point of
> > > > > > > > having the hooks standalone is so that any given lab can easily add
> > > > > > > > support for their lab and manage it, without worrying about disclosing
> > > > > > > > internal layout. There's going to be hard coded default passwords there.
> > > > >
> > > > > Secrets MUST NEVER reside in git repos.
> > > > >
> > > > > I can't imagine that such irresponsible habits would be practiced by any
> > > > > accountable developer.
> > > >
> > > > I agree it shouldn't be done. And just this week was the most recent
> > > > time I've seen a company do that internally, because it's internal and
> > > > was just a temporary thing. We helped them stop needing to do that, but
> > > > assuming it never happens is a bad idea.
> > > >
> > > > > Please, have a look at
> > > > >
> > > > > https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > > https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > > >
> > > > > to see how to do it properly.
> > > > >
> > > > > The same is true for a private lab:
> > > > > Use environment variables that are coming from outside the repository.
> > > > >
> > > > > > > > There's going to be repository secrets there. That kind of information
> > > > > > > > really should not be in a public repository. Integrating the hooks with
> > > > > > > > mainline will make lab management harder, not easier. The point of the
> > > > > > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > > > > >
> > > > > > > > I think this is all why no, we should not go down this path.
> > > > > > >
> > > > > > > Is it worth discussing this, or is your mind made up? I have some
> > > > > > > thoughts on the last one.
> > > > > >
> > > > > > I think it's a terrible idea that I already said:
> > > > > > > But sure, lets "Say Yes".
> > > > > >
> > > > > > But please do spend time explaining your thoughts and perhaps others
> > > > > > will also agree with you and I'll feel less bad taking this in?
> 
> Well firstly, we should bring in the whole git history so I don't
> believe these patches should be applied as is. I did push a branch[1]
> but can send the commands if it helps.

I don't see how that's relevant here, but OK.

> > > > > Currently when changing a test hook I have to go through these steps:
> > > > >
> > > > > * fork u-boot-test-hooks
> > > > > * push a commit to my fork
> > > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > > * commit the change code.denx.de
> > > > > * create a merge request for github.com/u-boot/u-boot
> > > > >
> > > > > If the test hooks were in the same repo as main U-Boot, I could save two
> > > > > steps.
> > > >
> > > > Yes, that's true, the steps for updating our CI are a little bit longer.
> > > > I would be happy to make u-boot-test-hooks more widely writable (so it
> > > > would instead be pushing to a branch for step 1+2). But I'm also
> > > > concerned with external labs (which is both the origin of these scripts,
> > > > and where they're also used).
> > > >
> > > > Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> > > > That has subdirectories for both "sage" and "lootbox" (the two lab
> > > > hosts), and in turn py and bin subdirectories for each. There's no value
> > > > in publishing these changes as there's nothing unique about the
> > > > platforms there, which aren't already in the mainline u-boot-test-hooks.
> > > >
> > > > How should I manage these changes moving forward?
> > >
> > > You could create two branches based on origin/master u-boot:
> > >
> > > One for maintaining your test lab specific u-boot-test changes and one for
> > > your private u-boot code changes.
> > >
> > > Check out the lab specific u-boot-test branch for steering the tests of the
> > > u-boot code branch.
> >
> > So now for a lab you need to maintain a branch of U-Boot itself, and
> > then to test you need to merge your lab support in? And then if there's
> > problems work back what git hash you tested on, if reporting either
> > problems, or as part of the "wouldn't it be nice to collect results
> > idea" work backwards from there? And bisecting problems then becomes a
> > real nightmare since each step requires a merge.
> 
> If you have your own hook scripts, they don't have to be in the U-Boot
> tree. That is entirely up to you. In my case I would want them in the
> tree, but in your case you can put them somewhere else.  You can even

But we shouldn't have more "ellesmere" stuff in the tree. That's a
problem. No ones lab should directly be in upstream. We should be
documenting and providing examples for others to use. Perhaps that
fundamental confusion is why you're suggesting this path?

> put them inside the U-Boot directory but without adding them to git,
> if that helps. But we set up the 'PATH' variable to where things are.
> If we need to change things to make this easier for people, we can.
> I'm really not seeing any nightmares here at all.

I don't see how PATH is relevant here either. That won't pick up any of
the configuration files. Might just be able to get away with two
directories in PYTHONPATH instead of one.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-05 18:18                 ` Tom Rini
@ 2025-05-06 13:23                   ` Simon Glass
  2025-05-06 16:25                     ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-06 13:23 UTC (permalink / raw)
  To: Tom Rini; +Cc: Heinrich Schuchardt, U-Boot Mailing List

Hi Tom,

On Mon, 5 May 2025 at 20:18, Tom Rini <trini@konsulko.com> wrote:
>
> On Sat, May 03, 2025 at 08:29:13AM -0600, Simon Glass wrote:
> > Hi Tom,
> >
> > On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com> wrote:
> > >
> > > On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt wrote:
> > > > On 5/2/25 21:30, Tom Rini wrote:
> > > > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> > > > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > > > > > > Hi Tom,
> > > > > > > >
> > > > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > > > > > >
> > > > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > > > > > >
> > > > > > > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > > > > > > kept in a separate repo.
> > > > > > > > > >
> > > > > > > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > > > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > > > > > > one of the things that distinguishes it from firmware projects that have
> > > > > > > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > > > > > > signalling that it is unusual, or difficult, or optional.
> > > > > > > > > >
> > > > > > > > > > The hooks mechanism also needs something of an update to take account of
> > > > > > > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > > > > > > that test/py talks to is in the same repo.
> > > > > > > > > >
> > > > > > > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > > > > > >
> > > > > > > > > > If we do go ahead with this, I will send a different series which has
> > > > > > > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > > > > > >
> > > > > > > > > I think bringing more projects directly in to the repository is a bad
> > > > > > > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > > > > > > subtree that's maintained outside of the project (same as the dts
> > > > > > > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > > > > > > - Remove needless examples from the tree.
> > > > > > > > > - Not include personal labs directly in the tree.
> > > > > > > > >
> > > > > > > > > That last one is why I really think this is a bad idea. The point of
> > > > > > > > > having the hooks standalone is so that any given lab can easily add
> > > > > > > > > support for their lab and manage it, without worrying about disclosing
> > > > > > > > > internal layout. There's going to be hard coded default passwords there.
> > > > > >
> > > > > > Secrets MUST NEVER reside in git repos.
> > > > > >
> > > > > > I can't imagine that such irresponsible habits would be practiced by any
> > > > > > accountable developer.
> > > > >
> > > > > I agree it shouldn't be done. And just this week was the most recent
> > > > > time I've seen a company do that internally, because it's internal and
> > > > > was just a temporary thing. We helped them stop needing to do that, but
> > > > > assuming it never happens is a bad idea.
> > > > >
> > > > > > Please, have a look at
> > > > > >
> > > > > > https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > > > https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > > > >
> > > > > > to see how to do it properly.
> > > > > >
> > > > > > The same is true for a private lab:
> > > > > > Use environment variables that are coming from outside the repository.
> > > > > >
> > > > > > > > > There's going to be repository secrets there. That kind of information
> > > > > > > > > really should not be in a public repository. Integrating the hooks with
> > > > > > > > > mainline will make lab management harder, not easier. The point of the
> > > > > > > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > > > > > >
> > > > > > > > > I think this is all why no, we should not go down this path.
> > > > > > > >
> > > > > > > > Is it worth discussing this, or is your mind made up? I have some
> > > > > > > > thoughts on the last one.
> > > > > > >
> > > > > > > I think it's a terrible idea that I already said:
> > > > > > > > But sure, lets "Say Yes".
> > > > > > >
> > > > > > > But please do spend time explaining your thoughts and perhaps others
> > > > > > > will also agree with you and I'll feel less bad taking this in?
> >
> > Well firstly, we should bring in the whole git history so I don't
> > believe these patches should be applied as is. I did push a branch[1]
> > but can send the commands if it helps.
>
> I don't see how that's relevant here, but OK.
>
> > > > > > Currently when changing a test hook I have to go through these steps:
> > > > > >
> > > > > > * fork u-boot-test-hooks
> > > > > > * push a commit to my fork
> > > > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > > > * commit the change code.denx.de
> > > > > > * create a merge request for github.com/u-boot/u-boot
> > > > > >
> > > > > > If the test hooks were in the same repo as main U-Boot, I could save two
> > > > > > steps.
> > > > >
> > > > > Yes, that's true, the steps for updating our CI are a little bit longer.
> > > > > I would be happy to make u-boot-test-hooks more widely writable (so it
> > > > > would instead be pushing to a branch for step 1+2). But I'm also
> > > > > concerned with external labs (which is both the origin of these scripts,
> > > > > and where they're also used).
> > > > >
> > > > > Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> > > > > That has subdirectories for both "sage" and "lootbox" (the two lab
> > > > > hosts), and in turn py and bin subdirectories for each. There's no value
> > > > > in publishing these changes as there's nothing unique about the
> > > > > platforms there, which aren't already in the mainline u-boot-test-hooks.
> > > > >
> > > > > How should I manage these changes moving forward?
> > > >
> > > > You could create two branches based on origin/master u-boot:
> > > >
> > > > One for maintaining your test lab specific u-boot-test changes and one for
> > > > your private u-boot code changes.
> > > >
> > > > Check out the lab specific u-boot-test branch for steering the tests of the
> > > > u-boot code branch.
> > >
> > > So now for a lab you need to maintain a branch of U-Boot itself, and
> > > then to test you need to merge your lab support in? And then if there's
> > > problems work back what git hash you tested on, if reporting either
> > > problems, or as part of the "wouldn't it be nice to collect results
> > > idea" work backwards from there? And bisecting problems then becomes a
> > > real nightmare since each step requires a merge.
> >
> > If you have your own hook scripts, they don't have to be in the U-Boot
> > tree. That is entirely up to you. In my case I would want them in the
> > tree, but in your case you can put them somewhere else.  You can even
>
> But we shouldn't have more "ellesmere" stuff in the tree. That's a
> problem. No ones lab should directly be in upstream. We should be
> documenting and providing examples for others to use. Perhaps that
> fundamental confusion is why you're suggesting this path?

I don't see why ellesmere shouldn't be in there. It is a lab used for
U-Boot and therefore part of the project, as I see it. If we end up
with lots of labs from people then we can worry about that problem
then. Today, we have the opposite problem: not enough labs.

>
> > put them inside the U-Boot directory but without adding them to git,
> > if that helps. But we set up the 'PATH' variable to where things are.
> > If we need to change things to make this easier for people, we can.
> > I'm really not seeing any nightmares here at all.
>
> I don't see how PATH is relevant here either. That won't pick up any of
> the configuration files. Might just be able to get away with two
> directories in PYTHONPATH instead of one.

PATH is enough to run a hook script. Yes you need PYTHONPATH as well
if you have stuff in those files. Nothing changes.

But Neil's comment was 'So this will definitely remove the ability to
have test hooks out of the U-boot tree ?', not 'Do I still have to set
my PYTHONPATH / PATH' to where my tree is ?'.

Regards,
Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-06 13:23                   ` Simon Glass
@ 2025-05-06 16:25                     ` Tom Rini
  2025-05-06 18:10                       ` Simon Glass
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-06 16:25 UTC (permalink / raw)
  To: Simon Glass; +Cc: Heinrich Schuchardt, U-Boot Mailing List

[-- Attachment #1: Type: text/plain, Size: 9980 bytes --]

On Tue, May 06, 2025 at 03:23:59PM +0200, Simon Glass wrote:
> Hi Tom,
> 
> On Mon, 5 May 2025 at 20:18, Tom Rini <trini@konsulko.com> wrote:
> >
> > On Sat, May 03, 2025 at 08:29:13AM -0600, Simon Glass wrote:
> > > Hi Tom,
> > >
> > > On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com> wrote:
> > > >
> > > > On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt wrote:
> > > > > On 5/2/25 21:30, Tom Rini wrote:
> > > > > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> > > > > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > > > > > > > Hi Tom,
> > > > > > > > >
> > > > > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > > > > > > >
> > > > > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > > > > > > >
> > > > > > > > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > > > > > > > kept in a separate repo.
> > > > > > > > > > >
> > > > > > > > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > > > > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > > > > > > > one of the things that distinguishes it from firmware projects that have
> > > > > > > > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > > > > > > > signalling that it is unusual, or difficult, or optional.
> > > > > > > > > > >
> > > > > > > > > > > The hooks mechanism also needs something of an update to take account of
> > > > > > > > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > > > > > > > that test/py talks to is in the same repo.
> > > > > > > > > > >
> > > > > > > > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > > > > > > >
> > > > > > > > > > > If we do go ahead with this, I will send a different series which has
> > > > > > > > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > > > > > > >
> > > > > > > > > > I think bringing more projects directly in to the repository is a bad
> > > > > > > > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > > > > > > > subtree that's maintained outside of the project (same as the dts
> > > > > > > > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > > > > > > > - Remove needless examples from the tree.
> > > > > > > > > > - Not include personal labs directly in the tree.
> > > > > > > > > >
> > > > > > > > > > That last one is why I really think this is a bad idea. The point of
> > > > > > > > > > having the hooks standalone is so that any given lab can easily add
> > > > > > > > > > support for their lab and manage it, without worrying about disclosing
> > > > > > > > > > internal layout. There's going to be hard coded default passwords there.
> > > > > > >
> > > > > > > Secrets MUST NEVER reside in git repos.
> > > > > > >
> > > > > > > I can't imagine that such irresponsible habits would be practiced by any
> > > > > > > accountable developer.
> > > > > >
> > > > > > I agree it shouldn't be done. And just this week was the most recent
> > > > > > time I've seen a company do that internally, because it's internal and
> > > > > > was just a temporary thing. We helped them stop needing to do that, but
> > > > > > assuming it never happens is a bad idea.
> > > > > >
> > > > > > > Please, have a look at
> > > > > > >
> > > > > > > https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > > > > https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > > > > >
> > > > > > > to see how to do it properly.
> > > > > > >
> > > > > > > The same is true for a private lab:
> > > > > > > Use environment variables that are coming from outside the repository.
> > > > > > >
> > > > > > > > > > There's going to be repository secrets there. That kind of information
> > > > > > > > > > really should not be in a public repository. Integrating the hooks with
> > > > > > > > > > mainline will make lab management harder, not easier. The point of the
> > > > > > > > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > > > > > > >
> > > > > > > > > > I think this is all why no, we should not go down this path.
> > > > > > > > >
> > > > > > > > > Is it worth discussing this, or is your mind made up? I have some
> > > > > > > > > thoughts on the last one.
> > > > > > > >
> > > > > > > > I think it's a terrible idea that I already said:
> > > > > > > > > But sure, lets "Say Yes".
> > > > > > > >
> > > > > > > > But please do spend time explaining your thoughts and perhaps others
> > > > > > > > will also agree with you and I'll feel less bad taking this in?
> > >
> > > Well firstly, we should bring in the whole git history so I don't
> > > believe these patches should be applied as is. I did push a branch[1]
> > > but can send the commands if it helps.
> >
> > I don't see how that's relevant here, but OK.
> >
> > > > > > > Currently when changing a test hook I have to go through these steps:
> > > > > > >
> > > > > > > * fork u-boot-test-hooks
> > > > > > > * push a commit to my fork
> > > > > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > > > > * commit the change code.denx.de
> > > > > > > * create a merge request for github.com/u-boot/u-boot
> > > > > > >
> > > > > > > If the test hooks were in the same repo as main U-Boot, I could save two
> > > > > > > steps.
> > > > > >
> > > > > > Yes, that's true, the steps for updating our CI are a little bit longer.
> > > > > > I would be happy to make u-boot-test-hooks more widely writable (so it
> > > > > > would instead be pushing to a branch for step 1+2). But I'm also
> > > > > > concerned with external labs (which is both the origin of these scripts,
> > > > > > and where they're also used).
> > > > > >
> > > > > > Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> > > > > > That has subdirectories for both "sage" and "lootbox" (the two lab
> > > > > > hosts), and in turn py and bin subdirectories for each. There's no value
> > > > > > in publishing these changes as there's nothing unique about the
> > > > > > platforms there, which aren't already in the mainline u-boot-test-hooks.
> > > > > >
> > > > > > How should I manage these changes moving forward?
> > > > >
> > > > > You could create two branches based on origin/master u-boot:
> > > > >
> > > > > One for maintaining your test lab specific u-boot-test changes and one for
> > > > > your private u-boot code changes.
> > > > >
> > > > > Check out the lab specific u-boot-test branch for steering the tests of the
> > > > > u-boot code branch.
> > > >
> > > > So now for a lab you need to maintain a branch of U-Boot itself, and
> > > > then to test you need to merge your lab support in? And then if there's
> > > > problems work back what git hash you tested on, if reporting either
> > > > problems, or as part of the "wouldn't it be nice to collect results
> > > > idea" work backwards from there? And bisecting problems then becomes a
> > > > real nightmare since each step requires a merge.
> > >
> > > If you have your own hook scripts, they don't have to be in the U-Boot
> > > tree. That is entirely up to you. In my case I would want them in the
> > > tree, but in your case you can put them somewhere else.  You can even
> >
> > But we shouldn't have more "ellesmere" stuff in the tree. That's a
> > problem. No ones lab should directly be in upstream. We should be
> > documenting and providing examples for others to use. Perhaps that
> > fundamental confusion is why you're suggesting this path?
> 
> I don't see why ellesmere shouldn't be in there. It is a lab used for
> U-Boot and therefore part of the project, as I see it. If we end up
> with lots of labs from people then we can worry about that problem
> then. Today, we have the opposite problem: not enough labs.

You're also unaware of the number of labs we have because today there's
no need for them to post anything. And no, your lab specific
configuration is not appropriate or useful in the general project. This
is another example of you having a problem seeing the difference between
"this is good for me" and "this is good for the project". Reference
material should be associated with the project in one way or another,
not your specific lab.

> > > put them inside the U-Boot directory but without adding them to git,
> > > if that helps. But we set up the 'PATH' variable to where things are.
> > > If we need to change things to make this easier for people, we can.
> > > I'm really not seeing any nightmares here at all.
> >
> > I don't see how PATH is relevant here either. That won't pick up any of
> > the configuration files. Might just be able to get away with two
> > directories in PYTHONPATH instead of one.
> 
> PATH is enough to run a hook script. Yes you need PYTHONPATH as well
> if you have stuff in those files. Nothing changes.
> 
> But Neil's comment was 'So this will definitely remove the ability to
> have test hooks out of the U-boot tree ?', not 'Do I still have to set
> my PYTHONPATH / PATH' to where my tree is ?'.

Yes, I think you don't see how everyone else uses this then. If everyone
else has to set PATH to point to an out of tree copy of
u-boot-test-hooks which is no longer maintained what has anyone gained?

I'm open to suggestions on making the workflow Heinrich outlined for
hooks easier, I'm happy to make the repository writable to other
custodians, but moving them in-tree makes lots of problems and seemingly
solves few.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-06 16:25                     ` Tom Rini
@ 2025-05-06 18:10                       ` Simon Glass
  2025-05-06 19:27                         ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-06 18:10 UTC (permalink / raw)
  To: Tom Rini; +Cc: Heinrich Schuchardt, U-Boot Mailing List

Hi Tom,

On Tue, 6 May 2025 at 18:25, Tom Rini <trini@konsulko.com> wrote:
>
> On Tue, May 06, 2025 at 03:23:59PM +0200, Simon Glass wrote:
> > Hi Tom,
> >
> > On Mon, 5 May 2025 at 20:18, Tom Rini <trini@konsulko.com> wrote:
> > >
> > > On Sat, May 03, 2025 at 08:29:13AM -0600, Simon Glass wrote:
> > > > Hi Tom,
> > > >
> > > > On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com> wrote:
> > > > >
> > > > > On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt wrote:
> > > > > > On 5/2/25 21:30, Tom Rini wrote:
> > > > > > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> > > > > > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > > > > > > > > Hi Tom,
> > > > > > > > > >
> > > > > > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > > > > > > > >
> > > > > > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > > > > > > > >
> > > > > > > > > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > > > > > > > > kept in a separate repo.
> > > > > > > > > > > >
> > > > > > > > > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > > > > > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > > > > > > > > one of the things that distinguishes it from firmware projects that have
> > > > > > > > > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > > > > > > > > signalling that it is unusual, or difficult, or optional.
> > > > > > > > > > > >
> > > > > > > > > > > > The hooks mechanism also needs something of an update to take account of
> > > > > > > > > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > > > > > > > > that test/py talks to is in the same repo.
> > > > > > > > > > > >
> > > > > > > > > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > > > > > > > >
> > > > > > > > > > > > If we do go ahead with this, I will send a different series which has
> > > > > > > > > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > > > > > > > >
> > > > > > > > > > > I think bringing more projects directly in to the repository is a bad
> > > > > > > > > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > > > > > > > > subtree that's maintained outside of the project (same as the dts
> > > > > > > > > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > > > > > > > > - Remove needless examples from the tree.
> > > > > > > > > > > - Not include personal labs directly in the tree.
> > > > > > > > > > >
> > > > > > > > > > > That last one is why I really think this is a bad idea. The point of
> > > > > > > > > > > having the hooks standalone is so that any given lab can easily add
> > > > > > > > > > > support for their lab and manage it, without worrying about disclosing
> > > > > > > > > > > internal layout. There's going to be hard coded default passwords there.
> > > > > > > >
> > > > > > > > Secrets MUST NEVER reside in git repos.
> > > > > > > >
> > > > > > > > I can't imagine that such irresponsible habits would be practiced by any
> > > > > > > > accountable developer.
> > > > > > >
> > > > > > > I agree it shouldn't be done. And just this week was the most recent
> > > > > > > time I've seen a company do that internally, because it's internal and
> > > > > > > was just a temporary thing. We helped them stop needing to do that, but
> > > > > > > assuming it never happens is a bad idea.
> > > > > > >
> > > > > > > > Please, have a look at
> > > > > > > >
> > > > > > > > https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > > > > > https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > > > > > >
> > > > > > > > to see how to do it properly.
> > > > > > > >
> > > > > > > > The same is true for a private lab:
> > > > > > > > Use environment variables that are coming from outside the repository.
> > > > > > > >
> > > > > > > > > > > There's going to be repository secrets there. That kind of information
> > > > > > > > > > > really should not be in a public repository. Integrating the hooks with
> > > > > > > > > > > mainline will make lab management harder, not easier. The point of the
> > > > > > > > > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > > > > > > > >
> > > > > > > > > > > I think this is all why no, we should not go down this path.
> > > > > > > > > >
> > > > > > > > > > Is it worth discussing this, or is your mind made up? I have some
> > > > > > > > > > thoughts on the last one.
> > > > > > > > >
> > > > > > > > > I think it's a terrible idea that I already said:
> > > > > > > > > > But sure, lets "Say Yes".
> > > > > > > > >
> > > > > > > > > But please do spend time explaining your thoughts and perhaps others
> > > > > > > > > will also agree with you and I'll feel less bad taking this in?
> > > >
> > > > Well firstly, we should bring in the whole git history so I don't
> > > > believe these patches should be applied as is. I did push a branch[1]
> > > > but can send the commands if it helps.
> > >
> > > I don't see how that's relevant here, but OK.
> > >
> > > > > > > > Currently when changing a test hook I have to go through these steps:
> > > > > > > >
> > > > > > > > * fork u-boot-test-hooks
> > > > > > > > * push a commit to my fork
> > > > > > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > > > > > * commit the change code.denx.de
> > > > > > > > * create a merge request for github.com/u-boot/u-boot
> > > > > > > >
> > > > > > > > If the test hooks were in the same repo as main U-Boot, I could save two
> > > > > > > > steps.
> > > > > > >
> > > > > > > Yes, that's true, the steps for updating our CI are a little bit longer.
> > > > > > > I would be happy to make u-boot-test-hooks more widely writable (so it
> > > > > > > would instead be pushing to a branch for step 1+2). But I'm also
> > > > > > > concerned with external labs (which is both the origin of these scripts,
> > > > > > > and where they're also used).
> > > > > > >
> > > > > > > Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> > > > > > > That has subdirectories for both "sage" and "lootbox" (the two lab
> > > > > > > hosts), and in turn py and bin subdirectories for each. There's no value
> > > > > > > in publishing these changes as there's nothing unique about the
> > > > > > > platforms there, which aren't already in the mainline u-boot-test-hooks.
> > > > > > >
> > > > > > > How should I manage these changes moving forward?
> > > > > >
> > > > > > You could create two branches based on origin/master u-boot:
> > > > > >
> > > > > > One for maintaining your test lab specific u-boot-test changes and one for
> > > > > > your private u-boot code changes.
> > > > > >
> > > > > > Check out the lab specific u-boot-test branch for steering the tests of the
> > > > > > u-boot code branch.
> > > > >
> > > > > So now for a lab you need to maintain a branch of U-Boot itself, and
> > > > > then to test you need to merge your lab support in? And then if there's
> > > > > problems work back what git hash you tested on, if reporting either
> > > > > problems, or as part of the "wouldn't it be nice to collect results
> > > > > idea" work backwards from there? And bisecting problems then becomes a
> > > > > real nightmare since each step requires a merge.
> > > >
> > > > If you have your own hook scripts, they don't have to be in the U-Boot
> > > > tree. That is entirely up to you. In my case I would want them in the
> > > > tree, but in your case you can put them somewhere else.  You can even
> > >
> > > But we shouldn't have more "ellesmere" stuff in the tree. That's a
> > > problem. No ones lab should directly be in upstream. We should be
> > > documenting and providing examples for others to use. Perhaps that
> > > fundamental confusion is why you're suggesting this path?
> >
> > I don't see why ellesmere shouldn't be in there. It is a lab used for
> > U-Boot and therefore part of the project, as I see it. If we end up
> > with lots of labs from people then we can worry about that problem
> > then. Today, we have the opposite problem: not enough labs.
>
> You're also unaware of the number of labs we have because today there's
> no need for them to post anything. And no, your lab specific
> configuration is not appropriate or useful in the general project. This
> is another example of you having a problem seeing the difference between
> "this is good for me" and "this is good for the project". Reference
> material should be associated with the project in one way or another,
> not your specific lab.

That's not quite it. I don't mind seeing other people's labs and in
fact it would help a lot. You ended up sending me an email with lots
of stuff after I had floundered around for hours trying to
reverse-engineer a test. If it had been in-tree I would have solved it
in 5 minutes.

>
> > > > put them inside the U-Boot directory but without adding them to git,
> > > > if that helps. But we set up the 'PATH' variable to where things are.
> > > > If we need to change things to make this easier for people, we can.
> > > > I'm really not seeing any nightmares here at all.
> > >
> > > I don't see how PATH is relevant here either. That won't pick up any of
> > > the configuration files. Might just be able to get away with two
> > > directories in PYTHONPATH instead of one.
> >
> > PATH is enough to run a hook script. Yes you need PYTHONPATH as well
> > if you have stuff in those files. Nothing changes.
> >
> > But Neil's comment was 'So this will definitely remove the ability to
> > have test hooks out of the U-boot tree ?', not 'Do I still have to set
> > my PYTHONPATH / PATH' to where my tree is ?'.
>
> Yes, I think you don't see how everyone else uses this then. If everyone
> else has to set PATH to point to an out of tree copy of
> u-boot-test-hooks which is no longer maintained what has anyone gained?

Perhaps access to some useful examples. But they certainly have not
lost anything.

>
> I'm open to suggestions on making the workflow Heinrich outlined for
> hooks easier, I'm happy to make the repository writable to other
> custodians, but moving them in-tree makes lots of problems and seemingly
> solves few.

At this point I believe the hooks should be in-tree and I have not
heard any real argument here yet. Neil had the wrong end of the stick
and your argument is that people who don't want their hooks in the
tree won't gained anything by being allowed to put them in the
tree...well, sure.

If there is any compelling argument, I'd really like to hear it.

Regards,
Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-06 18:10                       ` Simon Glass
@ 2025-05-06 19:27                         ` Tom Rini
  2025-05-09 13:52                           ` Simon Glass
  0 siblings, 1 reply; 25+ messages in thread
From: Tom Rini @ 2025-05-06 19:27 UTC (permalink / raw)
  To: Simon Glass; +Cc: Heinrich Schuchardt, U-Boot Mailing List

[-- Attachment #1: Type: text/plain, Size: 12061 bytes --]

On Tue, May 06, 2025 at 08:10:30PM +0200, Simon Glass wrote:
> Hi Tom,
> 
> On Tue, 6 May 2025 at 18:25, Tom Rini <trini@konsulko.com> wrote:
> >
> > On Tue, May 06, 2025 at 03:23:59PM +0200, Simon Glass wrote:
> > > Hi Tom,
> > >
> > > On Mon, 5 May 2025 at 20:18, Tom Rini <trini@konsulko.com> wrote:
> > > >
> > > > On Sat, May 03, 2025 at 08:29:13AM -0600, Simon Glass wrote:
> > > > > Hi Tom,
> > > > >
> > > > > On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com> wrote:
> > > > > >
> > > > > > On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt wrote:
> > > > > > > On 5/2/25 21:30, Tom Rini wrote:
> > > > > > > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich Schuchardt wrote:
> > > > > > > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > > > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass wrote:
> > > > > > > > > > > Hi Tom,
> > > > > > > > > > >
> > > > > > > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <trini@konsulko.com> wrote:
> > > > > > > > > > > >
> > > > > > > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon Glass wrote:
> > > > > > > > > > > >
> > > > > > > > > > > > > During a recent discussion with Heinrich we discussed why the hooks are
> > > > > > > > > > > > > kept in a separate repo.
> > > > > > > > > > > > >
> > > > > > > > > > > > > The amount of code is small, a tenth of the size of the recently added
> > > > > > > > > > > > > lwip, just by way of example. Testing is a critical part of U-Boot and
> > > > > > > > > > > > > one of the things that distinguishes it from firmware projects that have
> > > > > > > > > > > > > not kept up in this area. By having the tests somewhere else, we are
> > > > > > > > > > > > > signalling that it is unusual, or difficult, or optional.
> > > > > > > > > > > > >
> > > > > > > > > > > > > The hooks mechanism also needs something of an update to take account of
> > > > > > > > > > > > > real boards in 2025. That will be much easier to undertake if the code
> > > > > > > > > > > > > that test/py talks to is in the same repo.
> > > > > > > > > > > > >
> > > > > > > > > > > > > This series brings the hook files in as first-class citizens of U-Boot.
> > > > > > > > > > > > >
> > > > > > > > > > > > > If we do go ahead with this, I will send a different series which has
> > > > > > > > > > > > > separate commits (with correct author) in the u-boot-test-hooks repo.
> > > > > > > > > > > >
> > > > > > > > > > > > I think bringing more projects directly in to the repository is a bad
> > > > > > > > > > > > idea. Your example of lwip isn't applicable because it's a read-only
> > > > > > > > > > > > subtree that's maintained outside of the project (same as the dts
> > > > > > > > > > > > subtree). But sure, lets "Say Yes". That said, we still need to:
> > > > > > > > > > > > - Remove needless examples from the tree.
> > > > > > > > > > > > - Not include personal labs directly in the tree.
> > > > > > > > > > > >
> > > > > > > > > > > > That last one is why I really think this is a bad idea. The point of
> > > > > > > > > > > > having the hooks standalone is so that any given lab can easily add
> > > > > > > > > > > > support for their lab and manage it, without worrying about disclosing
> > > > > > > > > > > > internal layout. There's going to be hard coded default passwords there.
> > > > > > > > >
> > > > > > > > > Secrets MUST NEVER reside in git repos.
> > > > > > > > >
> > > > > > > > > I can't imagine that such irresponsible habits would be practiced by any
> > > > > > > > > accountable developer.
> > > > > > > >
> > > > > > > > I agree it shouldn't be done. And just this week was the most recent
> > > > > > > > time I've seen a company do that internally, because it's internal and
> > > > > > > > was just a temporary thing. We helped them stop needing to do that, but
> > > > > > > > assuming it never happens is a bad idea.
> > > > > > > >
> > > > > > > > > Please, have a look at
> > > > > > > > >
> > > > > > > > > https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > > > > > > https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > > > > > > >
> > > > > > > > > to see how to do it properly.
> > > > > > > > >
> > > > > > > > > The same is true for a private lab:
> > > > > > > > > Use environment variables that are coming from outside the repository.
> > > > > > > > >
> > > > > > > > > > > > There's going to be repository secrets there. That kind of information
> > > > > > > > > > > > really should not be in a public repository. Integrating the hooks with
> > > > > > > > > > > > mainline will make lab management harder, not easier. The point of the
> > > > > > > > > > > > existing labs in u-boot-test-hooks is to provide samples.
> > > > > > > > > > > >
> > > > > > > > > > > > I think this is all why no, we should not go down this path.
> > > > > > > > > > >
> > > > > > > > > > > Is it worth discussing this, or is your mind made up? I have some
> > > > > > > > > > > thoughts on the last one.
> > > > > > > > > >
> > > > > > > > > > I think it's a terrible idea that I already said:
> > > > > > > > > > > But sure, lets "Say Yes".
> > > > > > > > > >
> > > > > > > > > > But please do spend time explaining your thoughts and perhaps others
> > > > > > > > > > will also agree with you and I'll feel less bad taking this in?
> > > > >
> > > > > Well firstly, we should bring in the whole git history so I don't
> > > > > believe these patches should be applied as is. I did push a branch[1]
> > > > > but can send the commands if it helps.
> > > >
> > > > I don't see how that's relevant here, but OK.
> > > >
> > > > > > > > > Currently when changing a test hook I have to go through these steps:
> > > > > > > > >
> > > > > > > > > * fork u-boot-test-hooks
> > > > > > > > > * push a commit to my fork
> > > > > > > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > > > > > > * commit the change code.denx.de
> > > > > > > > > * create a merge request for github.com/u-boot/u-boot
> > > > > > > > >
> > > > > > > > > If the test hooks were in the same repo as main U-Boot, I could save two
> > > > > > > > > steps.
> > > > > > > >
> > > > > > > > Yes, that's true, the steps for updating our CI are a little bit longer.
> > > > > > > > I would be happy to make u-boot-test-hooks more widely writable (so it
> > > > > > > > would instead be pushing to a branch for step 1+2). But I'm also
> > > > > > > > concerned with external labs (which is both the origin of these scripts,
> > > > > > > > and where they're also used).
> > > > > > > >
> > > > > > > > Today, I have both a "konsulko" branch of u-boot-test-hooks, internally.
> > > > > > > > That has subdirectories for both "sage" and "lootbox" (the two lab
> > > > > > > > hosts), and in turn py and bin subdirectories for each. There's no value
> > > > > > > > in publishing these changes as there's nothing unique about the
> > > > > > > > platforms there, which aren't already in the mainline u-boot-test-hooks.
> > > > > > > >
> > > > > > > > How should I manage these changes moving forward?
> > > > > > >
> > > > > > > You could create two branches based on origin/master u-boot:
> > > > > > >
> > > > > > > One for maintaining your test lab specific u-boot-test changes and one for
> > > > > > > your private u-boot code changes.
> > > > > > >
> > > > > > > Check out the lab specific u-boot-test branch for steering the tests of the
> > > > > > > u-boot code branch.
> > > > > >
> > > > > > So now for a lab you need to maintain a branch of U-Boot itself, and
> > > > > > then to test you need to merge your lab support in? And then if there's
> > > > > > problems work back what git hash you tested on, if reporting either
> > > > > > problems, or as part of the "wouldn't it be nice to collect results
> > > > > > idea" work backwards from there? And bisecting problems then becomes a
> > > > > > real nightmare since each step requires a merge.
> > > > >
> > > > > If you have your own hook scripts, they don't have to be in the U-Boot
> > > > > tree. That is entirely up to you. In my case I would want them in the
> > > > > tree, but in your case you can put them somewhere else.  You can even
> > > >
> > > > But we shouldn't have more "ellesmere" stuff in the tree. That's a
> > > > problem. No ones lab should directly be in upstream. We should be
> > > > documenting and providing examples for others to use. Perhaps that
> > > > fundamental confusion is why you're suggesting this path?
> > >
> > > I don't see why ellesmere shouldn't be in there. It is a lab used for
> > > U-Boot and therefore part of the project, as I see it. If we end up
> > > with lots of labs from people then we can worry about that problem
> > > then. Today, we have the opposite problem: not enough labs.
> >
> > You're also unaware of the number of labs we have because today there's
> > no need for them to post anything. And no, your lab specific
> > configuration is not appropriate or useful in the general project. This
> > is another example of you having a problem seeing the difference between
> > "this is good for me" and "this is good for the project". Reference
> > material should be associated with the project in one way or another,
> > not your specific lab.
> 
> That's not quite it. I don't mind seeing other people's labs and in
> fact it would help a lot. You ended up sending me an email with lots
> of stuff after I had floundered around for hours trying to
> reverse-engineer a test. If it had been in-tree I would have solved it
> in 5 minutes.

Yes, we need better documentation. This has been known for some time.
It's somewhere on my TODO list to follow up on the RFC I sent before.

> > > > > put them inside the U-Boot directory but without adding them to git,
> > > > > if that helps. But we set up the 'PATH' variable to where things are.
> > > > > If we need to change things to make this easier for people, we can.
> > > > > I'm really not seeing any nightmares here at all.
> > > >
> > > > I don't see how PATH is relevant here either. That won't pick up any of
> > > > the configuration files. Might just be able to get away with two
> > > > directories in PYTHONPATH instead of one.
> > >
> > > PATH is enough to run a hook script. Yes you need PYTHONPATH as well
> > > if you have stuff in those files. Nothing changes.
> > >
> > > But Neil's comment was 'So this will definitely remove the ability to
> > > have test hooks out of the U-boot tree ?', not 'Do I still have to set
> > > my PYTHONPATH / PATH' to where my tree is ?'.
> >
> > Yes, I think you don't see how everyone else uses this then. If everyone
> > else has to set PATH to point to an out of tree copy of
> > u-boot-test-hooks which is no longer maintained what has anyone gained?
> 
> Perhaps access to some useful examples. But they certainly have not
> lost anything.
> 
> >
> > I'm open to suggestions on making the workflow Heinrich outlined for
> > hooks easier, I'm happy to make the repository writable to other
> > custodians, but moving them in-tree makes lots of problems and seemingly
> > solves few.
> 
> At this point I believe the hooks should be in-tree and I have not
> heard any real argument here yet. Neil had the wrong end of the stick
> and your argument is that people who don't want their hooks in the
> tree won't gained anything by being allowed to put them in the
> tree...well, sure.
> 
> If there is any compelling argument, I'd really like to hear it.

I think the best compelling argument is that you continue to have the
wrong end of the stick yourself as your labgrid implementation bears
little resemblance to how the rest of the hooks are implemented and
used, based on your comments about how nothing would be lost and there
would be no problems.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-06 19:27                         ` Tom Rini
@ 2025-05-09 13:52                           ` Simon Glass
  2025-05-09 14:41                             ` Tom Rini
  0 siblings, 1 reply; 25+ messages in thread
From: Simon Glass @ 2025-05-09 13:52 UTC (permalink / raw)
  To: Tom Rini; +Cc: Heinrich Schuchardt, U-Boot Mailing List

Hi Tom,

On Tue, 6 May 2025 at 21:28, Tom Rini <trini@konsulko.com> wrote:
>
> On Tue, May 06, 2025 at 08:10:30PM +0200, Simon Glass wrote:
> > Hi Tom,
> >
> > On Tue, 6 May 2025 at 18:25, Tom Rini <trini@konsulko.com> wrote:
> > >
> > > On Tue, May 06, 2025 at 03:23:59PM +0200, Simon Glass wrote:
> > > > Hi Tom,
> > > >
> > > > On Mon, 5 May 2025 at 20:18, Tom Rini <trini@konsulko.com> wrote:
> > > > >
> > > > > On Sat, May 03, 2025 at 08:29:13AM -0600, Simon Glass wrote:
> > > > > > Hi Tom,
> > > > > >
> > > > > > On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com>
wrote:
> > > > > > >
> > > > > > > On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt
wrote:
> > > > > > > > On 5/2/25 21:30, Tom Rini wrote:
> > > > > > > > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich
Schuchardt wrote:
> > > > > > > > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > > > > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass
wrote:
> > > > > > > > > > > > Hi Tom,
> > > > > > > > > > > >
> > > > > > > > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <
trini@konsulko.com> wrote:
> > > > > > > > > > > > >
> > > > > > > > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon
Glass wrote:
> > > > > > > > > > > > >
> > > > > > > > > > > > > > During a recent discussion with Heinrich we
discussed why the hooks are
> > > > > > > > > > > > > > kept in a separate repo.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > The amount of code is small, a tenth of the
size of the recently added
> > > > > > > > > > > > > > lwip, just by way of example. Testing is a
critical part of U-Boot and
> > > > > > > > > > > > > > one of the things that distinguishes it from
firmware projects that have
> > > > > > > > > > > > > > not kept up in this area. By having the tests
somewhere else, we are
> > > > > > > > > > > > > > signalling that it is unusual, or difficult, or
optional.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > The hooks mechanism also needs something of an
update to take account of
> > > > > > > > > > > > > > real boards in 2025. That will be much easier
to undertake if the code
> > > > > > > > > > > > > > that test/py talks to is in the same repo.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > This series brings the hook files in as
first-class citizens of U-Boot.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > If we do go ahead with this, I will send a
different series which has
> > > > > > > > > > > > > > separate commits (with correct author) in the
u-boot-test-hooks repo.
> > > > > > > > > > > > >
> > > > > > > > > > > > > I think bringing more projects directly in to the
repository is a bad
> > > > > > > > > > > > > idea. Your example of lwip isn't applicable
because it's a read-only
> > > > > > > > > > > > > subtree that's maintained outside of the project
(same as the dts
> > > > > > > > > > > > > subtree). But sure, lets "Say Yes". That said, we
still need to:
> > > > > > > > > > > > > - Remove needless examples from the tree.
> > > > > > > > > > > > > - Not include personal labs directly in the tree.
> > > > > > > > > > > > >
> > > > > > > > > > > > > That last one is why I really think this is a bad
idea. The point of
> > > > > > > > > > > > > having the hooks standalone is so that any given
lab can easily add
> > > > > > > > > > > > > support for their lab and manage it, without
worrying about disclosing
> > > > > > > > > > > > > internal layout. There's going to be hard coded
default passwords there.
> > > > > > > > > >
> > > > > > > > > > Secrets MUST NEVER reside in git repos.
> > > > > > > > > >
> > > > > > > > > > I can't imagine that such irresponsible habits would be
practiced by any
> > > > > > > > > > accountable developer.
> > > > > > > > >
> > > > > > > > > I agree it shouldn't be done. And just this week was the
most recent
> > > > > > > > > time I've seen a company do that internally, because it's
internal and
> > > > > > > > > was just a temporary thing. We helped them stop needing
to do that, but
> > > > > > > > > assuming it never happens is a bad idea.
> > > > > > > > >
> > > > > > > > > > Please, have a look at
> > > > > > > > > >
> > > > > > > > > >
https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > > > > > > >
https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > > > > > > > >
> > > > > > > > > > to see how to do it properly.
> > > > > > > > > >
> > > > > > > > > > The same is true for a private lab:
> > > > > > > > > > Use environment variables that are coming from outside
the repository.
> > > > > > > > > >
> > > > > > > > > > > > > There's going to be repository secrets there.
That kind of information
> > > > > > > > > > > > > really should not be in a public repository.
Integrating the hooks with
> > > > > > > > > > > > > mainline will make lab management harder, not
easier. The point of the
> > > > > > > > > > > > > existing labs in u-boot-test-hooks is to provide
samples.
> > > > > > > > > > > > >
> > > > > > > > > > > > > I think this is all why no, we should not go down
this path.
> > > > > > > > > > > >
> > > > > > > > > > > > Is it worth discussing this, or is your mind made
up? I have some
> > > > > > > > > > > > thoughts on the last one.
> > > > > > > > > > >
> > > > > > > > > > > I think it's a terrible idea that I already said:
> > > > > > > > > > > > But sure, lets "Say Yes".
> > > > > > > > > > >
> > > > > > > > > > > But please do spend time explaining your thoughts and
perhaps others
> > > > > > > > > > > will also agree with you and I'll feel less bad
taking this in?
> > > > > >
> > > > > > Well firstly, we should bring in the whole git history so I
don't
> > > > > > believe these patches should be applied as is. I did push a
branch[1]
> > > > > > but can send the commands if it helps.
> > > > >
> > > > > I don't see how that's relevant here, but OK.
> > > > >
> > > > > > > > > > Currently when changing a test hook I have to go
through these steps:
> > > > > > > > > >
> > > > > > > > > > * fork u-boot-test-hooks
> > > > > > > > > > * push a commit to my fork
> > > > > > > > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > > > > > > > * commit the change code.denx.de
> > > > > > > > > > * create a merge request for github.com/u-boot/u-boot
> > > > > > > > > >
> > > > > > > > > > If the test hooks were in the same repo as main U-Boot,
I could save two
> > > > > > > > > > steps.
> > > > > > > > >
> > > > > > > > > Yes, that's true, the steps for updating our CI are a
little bit longer.
> > > > > > > > > I would be happy to make u-boot-test-hooks more widely
writable (so it
> > > > > > > > > would instead be pushing to a branch for step 1+2). But
I'm also
> > > > > > > > > concerned with external labs (which is both the origin of
these scripts,
> > > > > > > > > and where they're also used).
> > > > > > > > >
> > > > > > > > > Today, I have both a "konsulko" branch of
u-boot-test-hooks, internally.
> > > > > > > > > That has subdirectories for both "sage" and "lootbox"
(the two lab
> > > > > > > > > hosts), and in turn py and bin subdirectories for each.
There's no value
> > > > > > > > > in publishing these changes as there's nothing unique
about the
> > > > > > > > > platforms there, which aren't already in the mainline
u-boot-test-hooks.
> > > > > > > > >
> > > > > > > > > How should I manage these changes moving forward?
> > > > > > > >
> > > > > > > > You could create two branches based on origin/master u-boot:
> > > > > > > >
> > > > > > > > One for maintaining your test lab specific u-boot-test
changes and one for
> > > > > > > > your private u-boot code changes.
> > > > > > > >
> > > > > > > > Check out the lab specific u-boot-test branch for steering
the tests of the
> > > > > > > > u-boot code branch.
> > > > > > >
> > > > > > > So now for a lab you need to maintain a branch of U-Boot
itself, and
> > > > > > > then to test you need to merge your lab support in? And then
if there's
> > > > > > > problems work back what git hash you tested on, if reporting
either
> > > > > > > problems, or as part of the "wouldn't it be nice to collect
results
> > > > > > > idea" work backwards from there? And bisecting problems then
becomes a
> > > > > > > real nightmare since each step requires a merge.
> > > > > >
> > > > > > If you have your own hook scripts, they don't have to be in the
U-Boot
> > > > > > tree. That is entirely up to you. In my case I would want them
in the
> > > > > > tree, but in your case you can put them somewhere else.  You
can even
> > > > >
> > > > > But we shouldn't have more "ellesmere" stuff in the tree. That's a
> > > > > problem. No ones lab should directly be in upstream. We should be
> > > > > documenting and providing examples for others to use. Perhaps that
> > > > > fundamental confusion is why you're suggesting this path?
> > > >
> > > > I don't see why ellesmere shouldn't be in there. It is a lab used
for
> > > > U-Boot and therefore part of the project, as I see it. If we end up
> > > > with lots of labs from people then we can worry about that problem
> > > > then. Today, we have the opposite problem: not enough labs.
> > >
> > > You're also unaware of the number of labs we have because today
there's
> > > no need for them to post anything. And no, your lab specific
> > > configuration is not appropriate or useful in the general project.
This
> > > is another example of you having a problem seeing the difference
between
> > > "this is good for me" and "this is good for the project". Reference
> > > material should be associated with the project in one way or another,
> > > not your specific lab.
> >
> > That's not quite it. I don't mind seeing other people's labs and in
> > fact it would help a lot. You ended up sending me an email with lots
> > of stuff after I had floundered around for hours trying to
> > reverse-engineer a test. If it had been in-tree I would have solved it
> > in 5 minutes.
>
> Yes, we need better documentation. This has been known for some time.
> It's somewhere on my TODO list to follow up on the RFC I sent before.
>
> > > > > > put them inside the U-Boot directory but without adding them to
git,
> > > > > > if that helps. But we set up the 'PATH' variable to where
things are.
> > > > > > If we need to change things to make this easier for people, we
can.
> > > > > > I'm really not seeing any nightmares here at all.
> > > > >
> > > > > I don't see how PATH is relevant here either. That won't pick up
any of
> > > > > the configuration files. Might just be able to get away with two
> > > > > directories in PYTHONPATH instead of one.
> > > >
> > > > PATH is enough to run a hook script. Yes you need PYTHONPATH as well
> > > > if you have stuff in those files. Nothing changes.
> > > >
> > > > But Neil's comment was 'So this will definitely remove the ability
to
> > > > have test hooks out of the U-boot tree ?', not 'Do I still have to
set
> > > > my PYTHONPATH / PATH' to where my tree is ?'.
> > >
> > > Yes, I think you don't see how everyone else uses this then. If
everyone
> > > else has to set PATH to point to an out of tree copy of
> > > u-boot-test-hooks which is no longer maintained what has anyone
gained?
> >
> > Perhaps access to some useful examples. But they certainly have not
> > lost anything.
> >
> > >
> > > I'm open to suggestions on making the workflow Heinrich outlined for
> > > hooks easier, I'm happy to make the repository writable to other
> > > custodians, but moving them in-tree makes lots of problems and
seemingly
> > > solves few.
> >
> > At this point I believe the hooks should be in-tree and I have not
> > heard any real argument here yet. Neil had the wrong end of the stick
> > and your argument is that people who don't want their hooks in the
> > tree won't gained anything by being allowed to put them in the
> > tree...well, sure.
> >
> > If there is any compelling argument, I'd really like to hear it.
>
> I think the best compelling argument is that you continue to have the
> wrong end of the stick yourself as your labgrid implementation bears
> little resemblance to how the rest of the hooks are implemented and
> used, based on your comments about how nothing would be lost and there
> would be no problems.

There are good reasons for that and I have explained some of them at
length. I continue to feel that the current test hooks need a refresh too,
but it is too hard to take that on while the hooks are out-of-tree.

Since I'm not hearing any strong arguments against, I'm planning to pull
the hooks into my tree, at least. It seems best to preserve the commit
history, so I'll do that too. It is something like 170 commits.

Regards,
Simon

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 0/3] RFC: test: Bring in the test hooks
  2025-05-09 13:52                           ` Simon Glass
@ 2025-05-09 14:41                             ` Tom Rini
  0 siblings, 0 replies; 25+ messages in thread
From: Tom Rini @ 2025-05-09 14:41 UTC (permalink / raw)
  To: Simon Glass; +Cc: Heinrich Schuchardt, U-Boot Mailing List

[-- Attachment #1: Type: text/plain, Size: 13881 bytes --]

On Fri, May 09, 2025 at 03:52:29PM +0200, Simon Glass wrote:
> Hi Tom,
> 
> On Tue, 6 May 2025 at 21:28, Tom Rini <trini@konsulko.com> wrote:
> >
> > On Tue, May 06, 2025 at 08:10:30PM +0200, Simon Glass wrote:
> > > Hi Tom,
> > >
> > > On Tue, 6 May 2025 at 18:25, Tom Rini <trini@konsulko.com> wrote:
> > > >
> > > > On Tue, May 06, 2025 at 03:23:59PM +0200, Simon Glass wrote:
> > > > > Hi Tom,
> > > > >
> > > > > On Mon, 5 May 2025 at 20:18, Tom Rini <trini@konsulko.com> wrote:
> > > > > >
> > > > > > On Sat, May 03, 2025 at 08:29:13AM -0600, Simon Glass wrote:
> > > > > > > Hi Tom,
> > > > > > >
> > > > > > > On Fri, 2 May 2025 at 14:04, Tom Rini <trini@konsulko.com>
> wrote:
> > > > > > > >
> > > > > > > > On Fri, May 02, 2025 at 09:42:56PM +0200, Heinrich Schuchardt
> wrote:
> > > > > > > > > On 5/2/25 21:30, Tom Rini wrote:
> > > > > > > > > > On Fri, May 02, 2025 at 07:19:18PM +0200, Heinrich
> Schuchardt wrote:
> > > > > > > > > > > On 5/2/25 17:06, Tom Rini wrote:
> > > > > > > > > > > > On Fri, May 02, 2025 at 08:49:12AM -0600, Simon Glass
> wrote:
> > > > > > > > > > > > > Hi Tom,
> > > > > > > > > > > > >
> > > > > > > > > > > > > On Fri, 2 May 2025 at 08:34, Tom Rini <
> trini@konsulko.com> wrote:
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > On Thu, May 01, 2025 at 08:50:16PM -0600, Simon
> Glass wrote:
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > > During a recent discussion with Heinrich we
> discussed why the hooks are
> > > > > > > > > > > > > > > kept in a separate repo.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > The amount of code is small, a tenth of the
> size of the recently added
> > > > > > > > > > > > > > > lwip, just by way of example. Testing is a
> critical part of U-Boot and
> > > > > > > > > > > > > > > one of the things that distinguishes it from
> firmware projects that have
> > > > > > > > > > > > > > > not kept up in this area. By having the tests
> somewhere else, we are
> > > > > > > > > > > > > > > signalling that it is unusual, or difficult, or
> optional.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > The hooks mechanism also needs something of an
> update to take account of
> > > > > > > > > > > > > > > real boards in 2025. That will be much easier
> to undertake if the code
> > > > > > > > > > > > > > > that test/py talks to is in the same repo.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > This series brings the hook files in as
> first-class citizens of U-Boot.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > If we do go ahead with this, I will send a
> different series which has
> > > > > > > > > > > > > > > separate commits (with correct author) in the
> u-boot-test-hooks repo.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > I think bringing more projects directly in to the
> repository is a bad
> > > > > > > > > > > > > > idea. Your example of lwip isn't applicable
> because it's a read-only
> > > > > > > > > > > > > > subtree that's maintained outside of the project
> (same as the dts
> > > > > > > > > > > > > > subtree). But sure, lets "Say Yes". That said, we
> still need to:
> > > > > > > > > > > > > > - Remove needless examples from the tree.
> > > > > > > > > > > > > > - Not include personal labs directly in the tree.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > That last one is why I really think this is a bad
> idea. The point of
> > > > > > > > > > > > > > having the hooks standalone is so that any given
> lab can easily add
> > > > > > > > > > > > > > support for their lab and manage it, without
> worrying about disclosing
> > > > > > > > > > > > > > internal layout. There's going to be hard coded
> default passwords there.
> > > > > > > > > > >
> > > > > > > > > > > Secrets MUST NEVER reside in git repos.
> > > > > > > > > > >
> > > > > > > > > > > I can't imagine that such irresponsible habits would be
> practiced by any
> > > > > > > > > > > accountable developer.
> > > > > > > > > >
> > > > > > > > > > I agree it shouldn't be done. And just this week was the
> most recent
> > > > > > > > > > time I've seen a company do that internally, because it's
> internal and
> > > > > > > > > > was just a temporary thing. We helped them stop needing
> to do that, but
> > > > > > > > > > assuming it never happens is a bad idea.
> > > > > > > > > >
> > > > > > > > > > > Please, have a look at
> > > > > > > > > > >
> > > > > > > > > > >
> https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions
> > > > > > > > > > >
> https://tsi-ccdoc.readthedocs.io/en/master/ResOps/2019/gitlab/07_pass-build-secrets.html
> > > > > > > > > > >
> > > > > > > > > > > to see how to do it properly.
> > > > > > > > > > >
> > > > > > > > > > > The same is true for a private lab:
> > > > > > > > > > > Use environment variables that are coming from outside
> the repository.
> > > > > > > > > > >
> > > > > > > > > > > > > > There's going to be repository secrets there.
> That kind of information
> > > > > > > > > > > > > > really should not be in a public repository.
> Integrating the hooks with
> > > > > > > > > > > > > > mainline will make lab management harder, not
> easier. The point of the
> > > > > > > > > > > > > > existing labs in u-boot-test-hooks is to provide
> samples.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > I think this is all why no, we should not go down
> this path.
> > > > > > > > > > > > >
> > > > > > > > > > > > > Is it worth discussing this, or is your mind made
> up? I have some
> > > > > > > > > > > > > thoughts on the last one.
> > > > > > > > > > > >
> > > > > > > > > > > > I think it's a terrible idea that I already said:
> > > > > > > > > > > > > But sure, lets "Say Yes".
> > > > > > > > > > > >
> > > > > > > > > > > > But please do spend time explaining your thoughts and
> perhaps others
> > > > > > > > > > > > will also agree with you and I'll feel less bad
> taking this in?
> > > > > > >
> > > > > > > Well firstly, we should bring in the whole git history so I
> don't
> > > > > > > believe these patches should be applied as is. I did push a
> branch[1]
> > > > > > > but can send the commands if it helps.
> > > > > >
> > > > > > I don't see how that's relevant here, but OK.
> > > > > >
> > > > > > > > > > > Currently when changing a test hook I have to go
> through these steps:
> > > > > > > > > > >
> > > > > > > > > > > * fork u-boot-test-hooks
> > > > > > > > > > > * push a commit to my fork
> > > > > > > > > > > * update both .gitlab-ci.yaml and .azure-pipelines.yaml
> > > > > > > > > > > * commit the change code.denx.de
> > > > > > > > > > > * create a merge request for github.com/u-boot/u-boot
> > > > > > > > > > >
> > > > > > > > > > > If the test hooks were in the same repo as main U-Boot,
> I could save two
> > > > > > > > > > > steps.
> > > > > > > > > >
> > > > > > > > > > Yes, that's true, the steps for updating our CI are a
> little bit longer.
> > > > > > > > > > I would be happy to make u-boot-test-hooks more widely
> writable (so it
> > > > > > > > > > would instead be pushing to a branch for step 1+2). But
> I'm also
> > > > > > > > > > concerned with external labs (which is both the origin of
> these scripts,
> > > > > > > > > > and where they're also used).
> > > > > > > > > >
> > > > > > > > > > Today, I have both a "konsulko" branch of
> u-boot-test-hooks, internally.
> > > > > > > > > > That has subdirectories for both "sage" and "lootbox"
> (the two lab
> > > > > > > > > > hosts), and in turn py and bin subdirectories for each.
> There's no value
> > > > > > > > > > in publishing these changes as there's nothing unique
> about the
> > > > > > > > > > platforms there, which aren't already in the mainline
> u-boot-test-hooks.
> > > > > > > > > >
> > > > > > > > > > How should I manage these changes moving forward?
> > > > > > > > >
> > > > > > > > > You could create two branches based on origin/master u-boot:
> > > > > > > > >
> > > > > > > > > One for maintaining your test lab specific u-boot-test
> changes and one for
> > > > > > > > > your private u-boot code changes.
> > > > > > > > >
> > > > > > > > > Check out the lab specific u-boot-test branch for steering
> the tests of the
> > > > > > > > > u-boot code branch.
> > > > > > > >
> > > > > > > > So now for a lab you need to maintain a branch of U-Boot
> itself, and
> > > > > > > > then to test you need to merge your lab support in? And then
> if there's
> > > > > > > > problems work back what git hash you tested on, if reporting
> either
> > > > > > > > problems, or as part of the "wouldn't it be nice to collect
> results
> > > > > > > > idea" work backwards from there? And bisecting problems then
> becomes a
> > > > > > > > real nightmare since each step requires a merge.
> > > > > > >
> > > > > > > If you have your own hook scripts, they don't have to be in the
> U-Boot
> > > > > > > tree. That is entirely up to you. In my case I would want them
> in the
> > > > > > > tree, but in your case you can put them somewhere else.  You
> can even
> > > > > >
> > > > > > But we shouldn't have more "ellesmere" stuff in the tree. That's a
> > > > > > problem. No ones lab should directly be in upstream. We should be
> > > > > > documenting and providing examples for others to use. Perhaps that
> > > > > > fundamental confusion is why you're suggesting this path?
> > > > >
> > > > > I don't see why ellesmere shouldn't be in there. It is a lab used
> for
> > > > > U-Boot and therefore part of the project, as I see it. If we end up
> > > > > with lots of labs from people then we can worry about that problem
> > > > > then. Today, we have the opposite problem: not enough labs.
> > > >
> > > > You're also unaware of the number of labs we have because today
> there's
> > > > no need for them to post anything. And no, your lab specific
> > > > configuration is not appropriate or useful in the general project.
> This
> > > > is another example of you having a problem seeing the difference
> between
> > > > "this is good for me" and "this is good for the project". Reference
> > > > material should be associated with the project in one way or another,
> > > > not your specific lab.
> > >
> > > That's not quite it. I don't mind seeing other people's labs and in
> > > fact it would help a lot. You ended up sending me an email with lots
> > > of stuff after I had floundered around for hours trying to
> > > reverse-engineer a test. If it had been in-tree I would have solved it
> > > in 5 minutes.
> >
> > Yes, we need better documentation. This has been known for some time.
> > It's somewhere on my TODO list to follow up on the RFC I sent before.
> >
> > > > > > > put them inside the U-Boot directory but without adding them to
> git,
> > > > > > > if that helps. But we set up the 'PATH' variable to where
> things are.
> > > > > > > If we need to change things to make this easier for people, we
> can.
> > > > > > > I'm really not seeing any nightmares here at all.
> > > > > >
> > > > > > I don't see how PATH is relevant here either. That won't pick up
> any of
> > > > > > the configuration files. Might just be able to get away with two
> > > > > > directories in PYTHONPATH instead of one.
> > > > >
> > > > > PATH is enough to run a hook script. Yes you need PYTHONPATH as well
> > > > > if you have stuff in those files. Nothing changes.
> > > > >
> > > > > But Neil's comment was 'So this will definitely remove the ability
> to
> > > > > have test hooks out of the U-boot tree ?', not 'Do I still have to
> set
> > > > > my PYTHONPATH / PATH' to where my tree is ?'.
> > > >
> > > > Yes, I think you don't see how everyone else uses this then. If
> everyone
> > > > else has to set PATH to point to an out of tree copy of
> > > > u-boot-test-hooks which is no longer maintained what has anyone
> gained?
> > >
> > > Perhaps access to some useful examples. But they certainly have not
> > > lost anything.
> > >
> > > >
> > > > I'm open to suggestions on making the workflow Heinrich outlined for
> > > > hooks easier, I'm happy to make the repository writable to other
> > > > custodians, but moving them in-tree makes lots of problems and
> seemingly
> > > > solves few.
> > >
> > > At this point I believe the hooks should be in-tree and I have not
> > > heard any real argument here yet. Neil had the wrong end of the stick
> > > and your argument is that people who don't want their hooks in the
> > > tree won't gained anything by being allowed to put them in the
> > > tree...well, sure.
> > >
> > > If there is any compelling argument, I'd really like to hear it.
> >
> > I think the best compelling argument is that you continue to have the
> > wrong end of the stick yourself as your labgrid implementation bears
> > little resemblance to how the rest of the hooks are implemented and
> > used, based on your comments about how nothing would be lost and there
> > would be no problems.
> 
> There are good reasons for that and I have explained some of them at
> length. I continue to feel that the current test hooks need a refresh too,
> but it is too hard to take that on while the hooks are out-of-tree.
 
> Since I'm not hearing any strong arguments against, I'm planning to pull
> the hooks into my tree, at least. It seems best to preserve the commit
> history, so I'll do that too. It is something like 170 commits.

How about you don't make your personal tree even more different from
mainline? I swear, I really think you should just leave. I am sick and
tired of this.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2025-05-09 14:41 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-02  2:50 [PATCH 0/3] RFC: test: Bring in the test hooks Simon Glass
2025-05-02  2:50 ` [PATCH 1/3] " Simon Glass
2025-05-02  2:50 ` [PATCH 2/3] doc: Tidy up the hooks documentation Simon Glass
2025-05-02  2:50 ` [PATCH 3/3] CI: Update to use the hooks in the U-Boot repo Simon Glass
2025-05-02  4:18   ` Heinrich Schuchardt
2025-05-02 14:33 ` [PATCH 0/3] RFC: test: Bring in the test hooks Tom Rini
2025-05-02 14:49   ` Simon Glass
2025-05-02 15:06     ` Tom Rini
2025-05-02 17:19       ` Heinrich Schuchardt
2025-05-02 19:30         ` Tom Rini
2025-05-02 19:42           ` Heinrich Schuchardt
2025-05-02 20:04             ` Tom Rini
2025-05-03 14:29               ` Simon Glass
2025-05-05 18:18                 ` Tom Rini
2025-05-06 13:23                   ` Simon Glass
2025-05-06 16:25                     ` Tom Rini
2025-05-06 18:10                       ` Simon Glass
2025-05-06 19:27                         ` Tom Rini
2025-05-09 13:52                           ` Simon Glass
2025-05-09 14:41                             ` Tom Rini
2025-05-05  7:00 ` neil.armstrong
2025-05-05 12:58   ` Simon Glass
2025-05-05 13:45     ` Tom Rini
2025-05-05 15:34       ` Simon Glass
2025-05-05 16:22         ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.