Compare commits

..

22 Commits
fuse ... snap

Author SHA1 Message Date
Simon Glass
90acabc390 emulation: Drop the snap description
To allow us to build for an EFI snap, drop the QEMU description. The
snapcraft files are kept in separate repos:

  https://code.launchpad.net/~sjg1/u-boot/+git/u-boot-concept-efi
  https://code.launchpad.net/~sjg1/u-boot/+git/u-boot-concept-qemu/+ref/master

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-22 12:24:24 -06:00
Simon Glass
a3d82ed485 Merge branch 'snap' into 'master'
emulation: snap: Add python3-setuptools

See merge request u-boot/u-boot!128
2025-07-22 15:19:11 +00:00
Simon Glass
f999808c5c emulation: snap: Add python3-setuptools
Add a missing build-package which did not show up in local testing.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-22 09:16:43 -06:00
Simon Glass
fc213cf3b5 Merge branch 'snap' into 'master'
emulation: Add a snap description

See merge request u-boot/u-boot!127
2025-07-22 14:08:52 +00:00
Simon Glass
c6cd58b4a5 emulation: Add a snap description
To enable building U-Boot for QEMU as a snap, add an initial snapcraft
file.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-22 08:08:05 -06:00
Simon Glass
53d438936d Merge branch 'labf' into 'master'
test/py: Minor improvement to labgrid integration

See merge request u-boot/u-boot!126
2025-07-22 03:38:22 +00:00
Simon Glass
4e875bf63e sandbox: Drop expect_reset from restart_uboot_with_flags()
No caller uses this argument, so drop it.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:45:43 -06:00
Simon Glass
f9f05c7237 hooks: Allow writing the console log to a file
Labgrid has a --log-output option to allow writing its log output to a
file. Add a way to control this from Labgrid's U-Boot scripts.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
d40c8f0b87 test/py: Fix a spurious tab in get_details()
One line is indented with tab instead of space. Fix it.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
327d8cb960 hooks: Pass the verbose flag to labgrid
The V variable includes the -v flag if verbose operation is requested
in Labgrid. Add it to the console cmdline.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
4674784f5b test/py: Provide an option to abort on an exception
It is quite tricky to debug problems in the test.py code itself, as when
something goes wrong the exception failure is caught and reported as a
test failure.

Add a -E option to simplify debugging.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:44:01 -06:00
Simon Glass
6776eb2133 beagleplay: Drop EFI self-tests
These don't actually seem to work, since the rest cannot be handled by
the lab. Disable them.

   Preparing for reset. Press any key...
   FAILED:
   test/py/tests/test_efi_selftest.py:20: in test_efi_selftest_base
       raise Exception('Failures occurred during the EFI selftest')
   E   Exception: Failures occurred during the EFI selftest 48053.8 ms

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-21 16:43:20 -06:00
Simon Glass
290829cc0d Merge branch 'devops' into 'master'
CI: Automate final release workflow with version bumping

See merge request u-boot/u-boot!125
2025-07-18 12:07:44 +00:00
Simon Glass
6a3532c0db CI: Automate final release workflow with version bumping
Introduce a new CI job in .gitlab-ci-release.yml to automate the
creation of project releases.

This change implements two new jobs in .gitlab-ci-release.yml:

1. A version:bump job that runs on a schedule. On the first Monday of an
even-numbered month, it automatically updates the VERSION and PATCHLEVEL
in the Makefile and pushes the change to the master branch.

2. A release:create job that is triggered by the version bump commit. It
creates the final GitLab Release and corresponding Git tag on the commit
containing the updated Makefile.

This ensures that the repository's version is correctly updated and
committed just before the official release tag is applied, creating a
clean and reliable release history.

This single job, designed to run on a schedule, contains logic to:

  - create a final release (e.g. 2025.08) on the first Monday of an
    even-numbered month.
  - create a release candidate (e.g. 2025.07-rc1) on all other
    scheduled days.

This uses official release-cli to create both the git tag and the
corresponding GitLab Release entry automatically.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-18 05:32:55 -06:00
Simon Glass
0c856610a9 Merge branch 'devops' into 'master'
CI: Automate releases with a scheduled job

See merge request u-boot/u-boot!113
2025-07-18 02:44:45 +00:00
Simon Glass
75360e4c45 CI: Automate releases with a scheduled job
Introduce a new CI job in .gitlab-ci-release.yml to automate the
creation of project releases.

This single job, designed to run on a schedule, contains logic to:

  - create a final release (e.g. 2025.08) on the first Monday of an
    even-numbered month.
  - create a release candidate (e.g. 2025.07-rc1) on all other
    scheduled days.

This uses official release-cli to create both the git tag and the
corresponding GitLab Release entry automatically.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-18 02:44:28 +00:00
Simon Glass
5799c8f9b1 Merge branch 'play' into 'master'
CI: Add a beagleplay board

See merge request u-boot/u-boot!124
2025-07-18 02:43:51 +00:00
Simon Glass
a00a473657 CI: Add a beagleplay board
This board is interesting since it has two separate U-Boot builds. Add
it to the sjg lab.

Add the required support for a second build directory.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-17 20:42:00 -06:00
Simon Glass
d3e3575148 Merge branch 'fix-spl' into 'master'
spl: Finish rename of jump_to_image_no_args()

See merge request u-boot/u-boot!123
2025-07-18 01:51:19 +00:00
Simon Glass
dbe7b5ae23 spl: Finish rename of jump_to_image_no_args()
Some uses of this weak function were missed. Fix them.

Signed-off-by: Simon Glass <sjg@chromium.org>
Fixes: e2670b665d
2025-07-17 18:30:01 -06:00
Simon Glass
630c46362a Merge branch 'colib' into 'master'
test: Check booting via a script on an ARM board

See merge request u-boot/u-boot!122
2025-07-15 23:16:10 +00:00
Simon Glass
7c4ce04b1d test: Check booting via a script on an ARM board
Use the Colibri-iMX8x board to check that booting with a U-Boot script
works as expected.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-12 19:04:54 -06:00
13 changed files with 434 additions and 1000 deletions

73
.gitlab-ci-release.yml Normal file
View File

@@ -0,0 +1,73 @@
# .gitlab-ci-release.yml
# Job to automatically update the version in the Makefile and push a commit.
# This runs on a schedule and only acts when a final release is due.
version:bump:
stage: version_bump
image: alpine:3.18 # A small image with git and bash
rules:
# Run only on scheduled pipelines targeting the 'master' branch.
- if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_REF_NAME == "master"'
script:
- |
echo "Checking if a final release is scheduled today..."
MONTH=$(date +%-m)
DAY_OF_WEEK=$(date +%-u)
DAY_OF_MONTH=$(date +%-d)
# Only proceed on the first Monday of an even-numbered month.
if ! { [ $((MONTH % 2)) -eq 0 ] && [ "$DAY_OF_WEEK" -eq 1 ] && [ "$DAY_OF_MONTH" -le 7 ]; }; then
echo "Not a final release day. Nothing to do."
exit 0
fi
echo "✅ Final release day detected. Updating Makefile..."
# Set up Git
apk add --no-cache git
git config --global user.name "GitLab CI"
git config --global user.email "gitlab-ci@${CI_SERVER_HOST}"
# Set the new version details
NEW_VERSION=$(date +%Y)
NEW_PATCHLEVEL=$(printf "%02d" $MONTH)
# Use sed to update the Makefile
sed -i "s/^VERSION = .*/VERSION = $NEW_VERSION/" Makefile
sed -i "s/^PATCHLEVEL = .*/PATCHLEVEL = $NEW_PATCHLEVEL/" Makefile
sed -i "s/^SUBLEVEL = .*/SUBLEVEL =/" Makefile
sed -i "s/^EXTRAVERSION = .*/EXTRAVERSION =/" Makefile
# If there are no changes, exit.
if git diff --quiet Makefile; then
echo "Makefile is already up-to-date."
exit 0
fi
# Commit and push the changes
echo "Pushing version bump to master branch..."
git add Makefile
COMMIT_MESSAGE="chore: Bump version to $NEW_VERSION.$NEW_PATCHLEVEL"
git commit -m "$COMMIT_MESSAGE"
# The GIT_WRITE_TOKEN is a variable you need to create (see setup below)
git push "https://gitlab-ci-token:${GIT_WRITE_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git" HEAD:master
# Job to create the release. This job now triggers from the commit pushed by the 'version:bump' job.
release:create:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
# Run only on commits to master with a specific commit message.
- if: '$CI_COMMIT_BRANCH == "master" && $CI_COMMIT_MESSAGE =~ /^chore: Bump version to/'
script:
- |
echo "🚀 Release commit detected. Creating GitLab Release..."
# Extract the tag name directly from the commit message (e.g., "2025.08")
TAG_NAME=$(echo "$CI_COMMIT_MESSAGE" | sed -n 's/chore: Bump version to //p')
RELEASE_TITLE="Release $TAG_NAME"
release-cli create \
--name "$RELEASE_TITLE" \
--tag-name "$TAG_NAME" \
--description "Automated release created by GitLab CI for commit $CI_COMMIT_SHORT_SHA." \
--ref "$CI_COMMIT_SHA"

View File

@@ -1,5 +1,8 @@
# SPDX-License-Identifier: GPL-2.0+
include:
- local: '.gitlab-ci-release.yml'
variables:
DEFAULT_TAG: ""
MIRROR_DOCKER: docker.io
@@ -24,6 +27,8 @@ stages:
- test.py
- sjg-lab
- world build
- version_bump
- release
.buildman_and_testpy_template: &buildman_and_testpy_dfn
stage: test.py
@@ -633,7 +638,8 @@ coreboot test.py:
fi;
fi
- export SRC="$(pwd)"
- export OUT="${SRC}/build/${BOARD}"
- export OUT="${SRC}/build/${ROLE}"
- export OUT_EXTRA="${SRC}/build/${ROLE}_extra"
- export PATH=$PATH:~/bin
- export PATH=$PATH:test/hooks/bin
@@ -648,7 +654,8 @@ coreboot test.py:
vars="-V build-adjust ${ADJUST}";
fi
- ${SRC}/test/py/test.py --role ${ROLE} --build-dir "${OUT}"
--capture=tee-sys -k "not bootstd ${TEST_PY_TEST_SPEC}" || ret=$?
--build-dir-extra ${OUT_EXTRA} --capture=tee-sys
-k "not bootstd ${TEST_PY_TEST_SPEC}" || ret=$?
- U_BOOT_BOARD_IDENTITY="${ROLE}" u-boot-test-release || true
- if [[ $ret -ne 0 ]]; then
exit $ret;
@@ -656,8 +663,8 @@ coreboot test.py:
artifacts:
when: always
paths:
- "build/${BOARD}/test-log.html"
- "build/${BOARD}/multiplexed_log.css"
- "build/${ROLE}/test-log.html"
- "build/${ROLE}/multiplexed_log.css"
expire_in: 1 week
rpi3:
@@ -842,3 +849,8 @@ vbe:
variables:
ROLE: vbe
<<: *lab_dfn
play:
variables:
ROLE: play
<<: *lab_dfn

View File

@@ -136,7 +136,7 @@ void release_resources_for_core_shutdown(void)
}
}
void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
void __noreturn jump_to_image(struct spl_image_info *spl_image)
{
typedef void __noreturn (*image_entry_noargs_t)(void);
struct ti_sci_handle *ti_sci = get_ti_sci_handle();

View File

@@ -347,7 +347,7 @@ uintptr_t get_stm32mp_bl2_dtb(void)
}
#ifdef CONFIG_XPL_BUILD
void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
void __noreturn jump_to_image(struct spl_image_info *spl_image)
{
typedef void __noreturn (*image_entry_stm32_t)(u32 romapi);
uintptr_t romapi = get_stm32mp_rom_api_table();

View File

@@ -112,7 +112,7 @@ static int load_from_image(struct spl_image_info *spl_image,
log_info("Reading from pos %lx size %lx\n", pos, size);
/*
* Set up spl_image to boot from jump_to_image_no_args(). Allocate this
* Set up spl_image to boot from jump_to_image(). Allocate this
* outside the RAM buffer (i.e. don't use strdup()).
*/
fname = state->prog_fname ? state->prog_fname : state->argv[0];

View File

@@ -53,7 +53,6 @@ CONFIG_SPL_DM_MAILBOX=y
CONFIG_SPL_POWER_DOMAIN=y
CONFIG_SPL_RAM_DEVICE=y
CONFIG_SPL_YMODEM_SUPPORT=y
CONFIG_CMD_BOOTEFI_SELFTEST=y
CONFIG_CMD_NVEDIT_EFI=y
CONFIG_CMD_DFU=y
CONFIG_CMD_GPIO=y

View File

@@ -1,8 +0,0 @@
.. SPDX-License-Identifier: GPL-2.0+
.. Copyright 2025 Simon Glass <sjg@chromium.org>
FUSE - Filesystem in Userspace
==============================
.. kernel-doc:: include/linux/fuse.h
:internal:

View File

@@ -13,7 +13,6 @@ U-Boot API documentation
efi
event
fs
fuse
getopt
interrupt
led

File diff suppressed because it is too large Load Diff

View File

@@ -38,6 +38,6 @@
exec labgrid-client -V do-bootstrap ${bootstrap:-1} -V do-build ${build:-1} \
-V do-send ${send:-0} -V do-clean ${clean:-0} ${vars} \
-V process-limit ${BUILDMAN_PROCESS_LIMIT:-0} \
-V process-limit ${BUILDMAN_PROCESS_LIMIT:-0} ${log_output} ${V} \
-r "${U_BOOT_BOARD_IDENTITY}" ${strategy} ${verbose} -a console \
${console_log}

View File

@@ -87,6 +87,9 @@ def pytest_addoption(parser):
help='Compile U-Boot before running tests')
parser.addoption('--buildman', default=False, action='store_true',
help='Use buildman to build U-Boot (assuming --build is given)')
parser.addoption(
'-E', '--allow-exceptions', '-E', default=False, action='store_true',
help='Avoid catching exceptions with test failures')
parser.addoption('--gdbserver', default=None,
help='Run sandbox under gdbserver. The argument is the channel '+
'over which gdbserver should communicate, e.g. localhost:1234')
@@ -167,7 +170,7 @@ def get_details(config):
if build_dir_extra:
env['U_BOOT_BUILD_DIR_EXTRA'] = build_dir_extra
# Make sure the script sees that it is being run from pytest
# Make sure the script sees that it is being run from pytest
env['U_BOOT_SOURCE_DIR'] = source_dir
proc = subprocess.run(cmd, stdout=subprocess.PIPE,
@@ -336,6 +339,7 @@ def pytest_configure(config):
ubconfig.connection_ok = True
ubconfig.timing = config.getoption('timing')
ubconfig.role = config.getoption('role')
ubconfig.allow_exceptions = config.getoption('allow_exceptions')
env_vars = (
'board_type',
@@ -507,6 +511,9 @@ def ubman(request):
if not ubconfig.connection_ok:
pytest.skip('Cannot get target connection')
return None
if ubman_fix.config.allow_exceptions:
ubman_fix.ensure_spawned()
return ubman_fix
try:
ubman_fix.ensure_spawned()
except OSError as err:
@@ -880,20 +887,23 @@ def pytest_runtest_protocol(item, nextitem):
test_list.append(item.name)
tests_not_run.remove(item.name)
try:
if ubman_fix.config.allow_exceptions:
msg_log(msg)
except:
# If something went wrong with logging, it's better to let the test
# process continue, which may report other exceptions that triggered
# the logging issue (e.g. ubman_fix.log wasn't created). Hence, just
# squash the exception. If the test setup failed due to e.g. syntax
# error somewhere else, this won't be seen. However, once that issue
# is fixed, if this exception still exists, it will then be logged as
# part of the test's stdout.
import traceback
print('Exception occurred while logging runtest status:')
traceback.print_exc()
# FIXME: Can we force a test failure here?
else:
try:
msg_log(msg)
except:
# If something went wrong with logging, it's better to let the test
# process continue, which may report other exceptions that triggered
# the logging issue (e.g. ubman_fix.log wasn't created). Hence, just
# squash the exception. If the test setup failed due to e.g. syntax
# error somewhere else, this won't be seen. However, once that issue
# is fixed, if this exception still exists, it will then be logged
# as part of the test's stdout.
import traceback
print('Exception occurred while logging runtest status:')
traceback.print_exc()
# FIXME: Can we force a test failure here?
log.end_section(item.name)

View File

@@ -60,14 +60,11 @@ class ConsoleSandbox(ConsoleBase):
cmd += self.sandbox_flags
return Spawn(cmd, cwd=self.config.source_dir, decode_signal=True)
def restart_uboot_with_flags(self, flags, expect_reset=False, use_dtb=True):
def restart_uboot_with_flags(self, flags, use_dtb=True):
"""Run U-Boot with the given command-line flags
Args:
flags: List of flags to pass, each a string
expect_reset: Boolean indication whether this boot is expected
to be reset while the 1st boot process after main boot before
prompt. False by default.
use_dtb: True to use a device tree file, False to run without one
Returns:
@@ -77,7 +74,7 @@ class ConsoleSandbox(ConsoleBase):
try:
self.sandbox_flags = flags
self.use_dtb = use_dtb
return self.restart_uboot(expect_reset)
return self.restart_uboot(False)
finally:
self.sandbox_flags = []
self.use_dtb = True

View File

@@ -59,3 +59,18 @@ def test_distro(ubman):
ubman.p.expect(['Welcome to .*Ubuntu 24.04.1 LTS.*!'])
ubman.restart_uboot()
@pytest.mark.boardspec('colibri-imx8x')
@pytest.mark.role('colibrimx8')
def test_distro_script(ubman):
"""Test that a selected board can boot into Llinux using a script"""
with ubman.log.section('boot'):
ubman.run_command('boot', wait_for_prompt=False)
# This is the start of userspace
ubman.p.expect(['Welcome to TDX Wayland'])
# Shortly later, we should see this banner
ubman.p.expect(['Colibri-iMX8X_Reference-Multimedia-Image'])
ubman.restart_uboot()