Skip to content

Poc x280 - #2189

Draft
NobodyNo0ne wants to merge 1 commit into
linuxboot:masterfrom
NobodyNo0ne:Poc_x280
Draft

Poc x280#2189
NobodyNo0ne wants to merge 1 commit into
linuxboot:masterfrom
NobodyNo0ne:Poc_x280

Conversation

@NobodyNo0ne

@NobodyNo0ne NobodyNo0ne commented Aug 21, 2026

Copy link
Copy Markdown

EDIT:

CircleCI has ACTUALLY been looked at
Restored the rest of Heads
No longer 152 behind
CoreBoot version specified to 25.12
Deguard tool updated to version that added X280 support (for X280 delta)

HOTP is on hold. Mine doesn't work, and Librem keys are out of stock, I need to ask for a quote from NitroKey.

In the meantime, I have noticed an issue where it only shows 4GB of RAM. In my case, my X280 has 16GB. Suboptimal.

From my testing, TOTP should be fully functional. The only changes I made between the config for the heads payload for T480 to the X280 related to i915, since otherwise it would complain about not finding the display, and being unuseable

I think this PR is finally at a stage where I would have created the draft, if I knew they were public.

Now aware Draft PRs are visible

Original Post:

I have a port of heads for the x280. PR as draft since I have not:
Tested HOTP (I do not have a dongle YET)
Tested reproducibility (circleci)

I also need to change a couple things, since the coreboot version is currently labelled simply as 'x280'.

I had to use a different coreboot version since 25.09 did not seem to support the x280, and I am not cut out for backporting.

Do tell me if I am missing anything.

I would also like to thank @AlguienSasaki for helping me, and for his LibreBoot port.


Edits by @tlaurion

  • When doing ports requiring patches being ported, always remember using
./docker_repro.sh make BOARD=xyz real.remove_canary_files-extract_patch_rebuild_what_changed
./docker_repro.sh make BOARD=xyz

@NobodyNo0ne

NobodyNo0ne commented Aug 21, 2026

Copy link
Copy Markdown
Author

Looking at what GitHub has just told me here CircleCI in fact does NOT work (I did NOT realise drafted PRs can be seen)

@tlaurion

Copy link
Copy Markdown
Collaborator

Ouch @NobodyNo0ne some cleanup will need to take place here. No clue why you impact 282 files with 33 commits and glancing over, i cannot explain how you come to this.

You deleted blobs/* files, which circleci depends on to download blobs needed by buikds (ME etc) which are not found which is why CircleCI fails. Also ou have not read porting guide https://osresearch.net/Porting/ nor https://osresearch.net/Development please do so first then add question here.

@NobodyNo0ne

NobodyNo0ne commented Aug 21, 2026

Copy link
Copy Markdown
Author

Ouch @NobodyNo0ne some cleanup will need to take place here. No clue why you impact 282 files with 33 commits and glancing over, i cannot explain how you come to this.

You deleted blobs/* files, which circleci depends on to download blobs needed by buikds (ME etc) which are not found which is why CircleCI fails. Also ou have not read porting guide https://osresearch.net/Porting/ nor https://osresearch.net/Development please do so first then add question here.

I did read it but if I am honest with you I just completely ignored CircleCI while porting. Many files impacted because I removed many files that were not X280 related over porting.
I also did not realise you could see draft PRs I was going to fix some of these GLARING problems hoping they were not brought into the limelight yet. I don't quite know how to respond.

^
TL;DR make a separate repo with just your stuff, and then merge it into heads, and THEN do a PR, and save yourself some dignity.

@NobodyNo0ne

Copy link
Copy Markdown
Author

I'm working on making this PR not an absolute mess, sorry about all this I thought it worked like an E-Mail draft.

@NobodyNo0ne

NobodyNo0ne commented Aug 22, 2026

Copy link
Copy Markdown
Author

PR is now no longer an absolute mess. I think.

  1. I hopefully have my commits verified. <- botched this a little bit but I got there in the end
  2. 25.12 needs the patch. this was a waste of a commit

@NobodyNo0ne
NobodyNo0ne force-pushed the Poc_x280 branch 2 times, most recently from 4b23454 to 9f42a3b Compare August 25, 2026 17:43
@tlaurion

Copy link
Copy Markdown
Collaborator

@NobodyNo0ne this pr is not based on origin/master of this repo, please git fetch origin/master, git rebase --signoff origin/master

@tlaurion

Copy link
Copy Markdown
Collaborator

on ab932f9

As discussed on matrix,

Added patch for SPI lock, changed config to not lock on build, added proper readme, signed commits properly. There may be more patches in order, especially for build (otherwise real.clean removes a bunch of the coreboot 25.12 directory and its a pain to get it all back.

As per matrix thread disscussion (for posterity)

Use Makefile helpers to reduce copile time and pain points; by using

./docker_repro.sh make BOARD=EOL_x280-maximized real.remove_canary_files-extract_patch_rebuild_what_changed
./docker_repro.sh make BOARD=EOL_x280-maximized

Makefile comments:

heads/Makefile

Lines 1148 to 1165 in 7902f1f

real.remove_canary_files-extract_patch_rebuild_what_changed:
@echo "Removing .canary files (build stamps) to force rebuild of board configurations."
@echo "The next 'make' will then re-extract packages, re-apply patches, and rebuild changed targets (date-based)."
@echo "It will also reinstall the necessary files under './install'."
@echo "Limitations: If a patch creates a file in an extracted package directory, this approach may fail without further manual actions."
@echo "In such cases, Git will inform you about the file that couldn't be created as expected. Simply delete those files and relaunch the build."
@echo "This approach economizes time since most build artifacts do not need to be rebuilt, as the file dates should be the same as when you originally built them."
@echo "Only a minimal time is needed for rebuilding, which is also good for your SSD."
@echo "*** USE THIS APPROACH FIRST ***"
@echo "Removing ./build .canary files..."
@find ./build/ -type f -name ".canary" -print -delete || true
@echo "Removing install/*/* content..."
@find ./install/*/* -print -exec rm -rf {} + 2>/dev/null || true
@echo "Removing coreboot board related artifact directory: $(build)/$(coreboot_dir)"
rm -rf "$(build)/$(coreboot_dir)"
@echo "Removing coreboot board related artifacts directory $(board_build)"
rm -rf "$(board_build)"
$(call overwrite_canary_if_coreboot_git)

@NobodyNo0ne
NobodyNo0ne force-pushed the Poc_x280 branch 2 times, most recently from 0f174bc to dd719aa Compare August 25, 2026 23:03
@tlaurion tlaurion added the port new board addition from existing coreboot port label Aug 25, 2026
@tlaurion

tlaurion commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

From OP

HOTP is on hold. Mine doesn't work, and Librem keys are out of stock, and Nitrokey deliveries/orders are on hold outside the EU. this was rather short lived.

Nitrokey: @nestire @jans23 some problems shipping nk3 outside of EU?

Purism: @JonathonHall-Purism some Librem keys devices in production?

Thanks for updating, if there is issues tell me I'll open and pin issue under Heads, was not aware.

Cc @NobodyNo0ne

@jans23

jans23 commented Aug 26, 2026

Copy link
Copy Markdown

Nitrokey does ship worldwide but temporarily you have to request a quote for outside of the EU.

@tlaurion

tlaurion commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

You reported on matrix thread that 4gb ram only was seen, reported by https://ticket.coreboot.org/issues/627 and fixed by https://review.coreboot.org/c/coreboot/+/91170

This means you will need to drop a patch on top of 25.12 since 25.12 was not really complete for x280, through gerrit's "Download ->Format patch" instructions git fetch https://review.coreboot.org/coreboot refs/changes/70/91170/5 && git format-patch -1 --stdout FETCH_HEAD > where_you_want_the_patch.patch

Attention: this will clone coreboot into working directory.

Something like the following, where XXXX needs to be the next patch number to be applied in proper order from the coreboot patches dir (change paths as needed):

mkdir ~/coreboot-test/
cd ~/coreboot-test/
git fetch https://review.coreboot.org/coreboot refs/changes/70/91170/5 && git format-patch -1 --stdout FETCH_HEAD > XXXX-mb_lenovo_sklkbl_spd-Fix_integer_overflow_91170.patch
mv XXXX-mb_lenovo_sklkbl_spd-Fix_integer_overflow_91170.patch ~/path_to_heads/patches/coreboot-25.12-patches/

And then

./docker_repro.sh make BOARD=EOL_x280-maximized real.remove_canary_files-extract_patch_rebuild_what_changed
./docker_repro.sh make BOARD=EOL_x280-maximized

@tlaurion

Copy link
Copy Markdown
Collaborator

c1b6293

No problem having it staging in this PR until heads-wiki pr is created and changes moved there, but once ready, you will have to clean the git history (git squash/amend/fixup+signoff) so that the final PR doesn't include those changes in it's final state (git keeps all files history, so your jpg and whatnot would otherwise make the repository size bigger for everyone in the future to download even it those were never needed).

Comment thread blobs/xx80/x280_me.bin Outdated
Comment thread blobs/xx80/x280_tb.bin Outdated
Comment thread patches/coreboot-25.12/0000-empty-placeholder.patch Outdated
Comment thread x280_images/1-screws.jpg Outdated
Comment thread x280_images/2_battery.jpg Outdated
Comment thread x280_images/3a_chips.jpg Outdated
Comment thread x280_images/3b_chips.jpg Outdated
Comment thread x280_images/4_cmos.jpg Outdated
Comment thread x280_images/x280-heads-reownership-screen.png Outdated
Comment thread README.md
Comment thread .circleci/config.yml Outdated
Comment thread .circleci/config.yml Outdated
Comment thread .circleci/config.yml Outdated
Comment thread .circleci/config.yml
Comment thread .circleci/config.yml
Comment thread .circleci/config.yml Outdated

@tlaurion tlaurion left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First thourough review, missing linux and coreboot configs, saving in oldconfigs and validating linux config not depending on t480 linux one are relevant. Please beat me at it and check at helpers under modules/coreboot and modules/linux to save in oldconfig and have a _defconfig sitting in repo alongside the oldconfig version so board configs can easily be compared. Good work here @NobodyNo0ne and @AlguienSasaki

Specific helpers (./docker_repro.sh make BOARD=xyz [helper] where [helper] might create changes to commit:

  • coreboot.save_in_defconfig_format_backup
  • coreboot.save_in_oldconfig_format_in_place
  • linux.save_in_olddefconfig_format_in_place

@tlaurion

Copy link
Copy Markdown
Collaborator

Please create PR against heads-wiki to be merged at the same time as this PR final review+merge for disasssembly, and reuse template of t480/t480s there see https://osresearch.net/T480s-maximized-flashing/ https://osresearch.net/T480-maximized-flashing/ and https://osresearch.net/Contributing-to-Heads-wiki/

Note anything needing to change under https://osresearch.net/Porting/ per your porting effort to help other ports and making me redundant, thanks!

@NobodyNo0ne

Copy link
Copy Markdown
Author

Please create PR against heads-wiki to be merged at the same time as this PR final review+merge for disasssembly, and reuse template of t480/t480s there see https://osresearch.net/T480s-maximized-flashing/ https://osresearch.net/T480-maximized-flashing/ and https://osresearch.net/Contributing-to-Heads-wiki/

Note anything needing to change under https://osresearch.net/Porting/ per your porting effort to help other ports and making me redundant, thanks!

I think the main issue is that I am just bad at reading documentation... doing most of my work at 10pm-5am is not helpful either, but that is also my fault.
I have a draft PR for heads-wiki now. I used the template from the T480s page. I should dwell over it more though.

@NobodyNo0ne

NobodyNo0ne commented Aug 27, 2026

Copy link
Copy Markdown
Author

Looked at the CircleCI logs, No rule to make target '../../../blobs/xx80/x280_ifd.bin'
And no blobs allowed in repo. This will be fun.

Either I figure out how to derive the IFD from https://download.lenovo.com/pccbbs/mobiles/n20uj44w.exe or I have an epiphany. It's just a YAML file why am I fighting for my life over it

I have unironically read the docs

# NEW_BOARD is based on `X.Y.Z`. coreboot release, not sharing any buildstack from now, depend on muscl-cross cache
      - build:
          name: NEW_BOARD-hotp-maximized
          target: NEW_BOARD-hotp-maximized
          subcommand: ""
          requires:
            - x86-musl-cross-make

I know this exists

I somehow, not only failed to fix CircleCI for the X280, but also broke it for other boards.

No problem having it staging in this PR until heads-wiki pr is created and changes moved there, but once ready, you will have to clean the git history (git squash/amend/fixup+signoff) so that the final PR doesn't include those changes in it's final state (git keeps all files history, so your jpg and whatnot would otherwise make the repository size bigger for everyone in the future to download even it those were never needed).

==> ./build/x86/log/coreboot-25.12.log <==
make -C "/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized" -C /root/heads/build/x86/coreboot-25.12 obj=/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized DOTCONFIG=/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized/.config XGCCPATH=/root/heads/build/x86/coreboot-25.12/util/crossgcc/xgcc/bin/  BUILD_TIMELESS=1 -j8 --load-average=12 
make[1]: Entering directory '/root/heads/build/x86/coreboot-25.12'
Updating git submodules.
error: pathspec '3rdparty/cmocka' did not match any file(s) known to git
error: pathspec '3rdparty/blobs' did not match any file(s) known to git
error: pathspec '3rdparty/intel-microcode' did not match any file(s) known to git
error: pathspec '3rdparty/fsp' did not match any file(s) known to git
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig
make[1]: *** No rule to make target '../../../blobs/xx80/x280_ifd.bin', needed by 'EOL_x280-hotp-maximized/fmap-template.fmd'.  Stop.
make[1]: *** Waiting for unfinished jobs....
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/lex.yy.c_shipped EOL_x280-hotp-maximized/util/sconfig/lex.yy.c
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/sconfig.tab.h_shipped EOL_x280-hotp-maximized/util/sconfig/sconfig.tab.h
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/sconfig.tab.c_shipped EOL_x280-hotp-maximized/util/sconfig/sconfig.tab.c
make[1]: Leaving directory '/root/heads/build/x86/coreboot-25.12'

Exited with code exit status 1

make sure no blobs are in repo in final PR

are you sure? CircleCI no longer works, it seems to expect it, and there are blobs present in upstream repo.

https://github.com/linuxboot/heads/tree/master/blobs/xx80
https://github.com/linuxboot/heads/blob/master/blobs/xx80/t480s_ifd.bin

@NobodyNo0ne
NobodyNo0ne force-pushed the Poc_x280 branch 2 times, most recently from 6b0b529 to cb2a634 Compare August 27, 2026 13:30
@tlaurion

Copy link
Copy Markdown
Collaborator

Looked at the CircleCI logs, No rule to make target '../../../blobs/xx80/x280_ifd.bin' And no blobs allowed in repo. This will be fun.

Either I figure out how to derive the IFD from https://download.lenovo.com/pccbbs/mobiles/n20uj44w.exe or I have an epiphany. It's just a YAML file why am I fighting for my life over it

I have unironically read the docs

# NEW_BOARD is based on `X.Y.Z`. coreboot release, not sharing any buildstack from now, depend on muscl-cross cache
      - build:
          name: NEW_BOARD-hotp-maximized
          target: NEW_BOARD-hotp-maximized
          subcommand: ""
          requires:
            - x86-musl-cross-make

I know this exists

I somehow, not only failed to fix CircleCI for the X280, but also broke it for other boards.

No problem having it staging in this PR until heads-wiki pr is created and changes moved there, but once ready, you will have to clean the git history (git squash/amend/fixup+signoff) so that the final PR doesn't include those changes in it's final state (git keeps all files history, so your jpg and whatnot would otherwise make the repository size bigger for everyone in the future to download even it those were never needed).

==> ./build/x86/log/coreboot-25.12.log <==
make -C "/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized" -C /root/heads/build/x86/coreboot-25.12 obj=/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized DOTCONFIG=/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized/.config XGCCPATH=/root/heads/build/x86/coreboot-25.12/util/crossgcc/xgcc/bin/  BUILD_TIMELESS=1 -j8 --load-average=12 
make[1]: Entering directory '/root/heads/build/x86/coreboot-25.12'
Updating git submodules.
error: pathspec '3rdparty/cmocka' did not match any file(s) known to git
error: pathspec '3rdparty/blobs' did not match any file(s) known to git
error: pathspec '3rdparty/intel-microcode' did not match any file(s) known to git
error: pathspec '3rdparty/fsp' did not match any file(s) known to git
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig
make[1]: *** No rule to make target '../../../blobs/xx80/x280_ifd.bin', needed by 'EOL_x280-hotp-maximized/fmap-template.fmd'.  Stop.
make[1]: *** Waiting for unfinished jobs....
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/lex.yy.c_shipped EOL_x280-hotp-maximized/util/sconfig/lex.yy.c
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/sconfig.tab.h_shipped EOL_x280-hotp-maximized/util/sconfig/sconfig.tab.h
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/sconfig.tab.c_shipped EOL_x280-hotp-maximized/util/sconfig/sconfig.tab.c
make[1]: Leaving directory '/root/heads/build/x86/coreboot-25.12'

Exited with code exit status 1

make sure no blobs are in repo in final PR

are you sure? CircleCI no longer works, it seems to expect it, and there are blobs present in upstream repo.

https://github.com/linuxboot/heads/tree/master/blobs/xx80 https://github.com/linuxboot/heads/blob/master/blobs/xx80/t480s_ifd.bin

gbe and ifd considered "cofiguration blobs", gbe can be generated and are under blob dir, me can't. ifd are historically coming from a donor board as can be seen with git history for all blobs files.

Sorry if wasn't clear and made you loose time.

Signed-off-by: NobodyNo0ne <akbarov2007@gmail.com>
@NobodyNo0ne

Copy link
Copy Markdown
Author

Looked at the CircleCI logs, No rule to make target '../../../blobs/xx80/x280_ifd.bin' And no blobs allowed in repo. This will be fun.
Either I figure out how to derive the IFD from https://download.lenovo.com/pccbbs/mobiles/n20uj44w.exe or I have an epiphany. It's just a YAML file why am I fighting for my life over it
I have unironically read the docs

# NEW_BOARD is based on `X.Y.Z`. coreboot release, not sharing any buildstack from now, depend on muscl-cross cache
      - build:
          name: NEW_BOARD-hotp-maximized
          target: NEW_BOARD-hotp-maximized
          subcommand: ""
          requires:
            - x86-musl-cross-make

I know this exists
I somehow, not only failed to fix CircleCI for the X280, but also broke it for other boards.

No problem having it staging in this PR until heads-wiki pr is created and changes moved there, but once ready, you will have to clean the git history (git squash/amend/fixup+signoff) so that the final PR doesn't include those changes in it's final state (git keeps all files history, so your jpg and whatnot would otherwise make the repository size bigger for everyone in the future to download even it those were never needed).

==> ./build/x86/log/coreboot-25.12.log <==
make -C "/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized" -C /root/heads/build/x86/coreboot-25.12 obj=/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized DOTCONFIG=/root/heads/build/x86/coreboot-25.12/EOL_x280-hotp-maximized/.config XGCCPATH=/root/heads/build/x86/coreboot-25.12/util/crossgcc/xgcc/bin/  BUILD_TIMELESS=1 -j8 --load-average=12 
make[1]: Entering directory '/root/heads/build/x86/coreboot-25.12'
Updating git submodules.
error: pathspec '3rdparty/cmocka' did not match any file(s) known to git
error: pathspec '3rdparty/blobs' did not match any file(s) known to git
error: pathspec '3rdparty/intel-microcode' did not match any file(s) known to git
error: pathspec '3rdparty/fsp' did not match any file(s) known to git
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig/
mkdir -p EOL_x280-hotp-maximized/util/sconfig
make[1]: *** No rule to make target '../../../blobs/xx80/x280_ifd.bin', needed by 'EOL_x280-hotp-maximized/fmap-template.fmd'.  Stop.
make[1]: *** Waiting for unfinished jobs....
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/lex.yy.c_shipped EOL_x280-hotp-maximized/util/sconfig/lex.yy.c
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/sconfig.tab.h_shipped EOL_x280-hotp-maximized/util/sconfig/sconfig.tab.h
cp /root/heads/build/x86/coreboot-25.12/util/sconfig/sconfig.tab.c_shipped EOL_x280-hotp-maximized/util/sconfig/sconfig.tab.c
make[1]: Leaving directory '/root/heads/build/x86/coreboot-25.12'

Exited with code exit status 1

make sure no blobs are in repo in final PR

are you sure? CircleCI no longer works, it seems to expect it, and there are blobs present in upstream repo.
https://github.com/linuxboot/heads/tree/master/blobs/xx80 https://github.com/linuxboot/heads/blob/master/blobs/xx80/t480s_ifd.bin

gbe and ifd considered "cofiguration blobs", gbe can be generated and are under blob dir, me can't. ifd are historically coming from a donor board as can be seen with git history for all blobs files.

Sorry if wasn't clear and made you loose time.

Oh.
Thanks for clarifying though.
I, hopefully correctly, set the X280 as coreboot 25.12 seed, undid the regression where I just removed m900 from the .yml file, fixed musl hashes, created defconfig. I hope I corrected everything there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

input for docs port new board addition from existing coreboot port

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants