===============
v1.8 (Aug 2026)
===============

This document describes the changes included in flashrom release v1.8.0.
It has been 6 months since previous release and in that time we got 100+ commits
from 21 authors, thank you!

Download
========

flashrom v1.8.0 can be downloaded in the following ways:

Anonymous checkout from the git repository at https://review.coreboot.org/flashrom.git
(tag TODO)

A tarball is available for download at TODO
(signature TODO)

fingerprint: TODO

New feature
===========

Repeated reads
--------------

``--read-repeated[=<count>] [<file>]``: Read the flash chip multiple times
(default: 3, minimum: 3) and use majority voting to detect unstable
connections. Deduplicates read results to minimise memory usage. If a file
is given and a strict majority is found, saves the majority content to it.
Useful for diagnosing flaky SPI wiring or unreliable programmers.

Bugs fixed
==========

Internal programmer no longer exits when ECAM is unavailable
------------------------------------------------------------

On Intel PCH100+ systems the flash enable code opens a second libpci
accessor with ``PCI_ACCESS_ECAM``. Mapping the ECAM region requires access
to a physical range the kernel commonly reserves for a driver (PNP0C02),
which ``CONFIG_IO_STRICT_DEVMEM`` denies. libpci reports this through its
error handler, which by contract does not return and by default terminates
the process, so flashrom died with::

  pcilib: Cannot map ecam region: Operation not permitted.

before probing anything, with no command line option to work around it.
Every kernel built with ``CONFIG_IO_STRICT_DEVMEM=y`` was affected, which
is the default in most distributions.

An ECAM initialisation failure is now caught and the 0xcf8/0xcfc port I/O
access is used instead. ECAM is still tried first, so machines that need
it keep using it.

See https://ticket.coreboot.org/issues/643

Programmers updates
===================

New: fault injection for testing
--------------------------------

``fault`` -- A fault injection programmer that wraps an existing backend
(e.g. ``dummy``) and injects deterministic, reproducible faults. Supports
bit corruption, short reads, write failures, write lies (silent no-ops),
and partial writes. Uses a seeded PRNG for reproducibility. Intended for
testing verification logic and retry mechanisms under realistic failure
conditions.

linux_mtd: ignore_read_errors parameter
---------------------------------------

Some controllers refuse to read firmware-protected ranges (e.g. Intel PCH protected range registers) and fail the
whole read. With the optional ``ignore_read_errors=yes`` parameter unreadable blocks are replaced by the erased
value (usually ``0xff``) and a warning is printed, allowing the accessible remainder of the flash to be dumped::

        flashrom -p linux_mtd:dev=N,ignore_read_errors=yes -r dump.bin

Note that this suppresses every read error reported by the kernel, not only refusals caused by firmware-protected
ranges. Any block that cannot be read, for whatever reason, is replaced by the erased value, so the resulting dump
may differ from the actual flash contents.

dediprog: Support target 3 (socket)
-----------------------------------

Example to read W25R256JW with SF600::

	flashrom -p dediprog:voltage=1.8V,target=3 -c W25R256JW -r dump.bin

libflashrom
===========

The error code ``ERROR_FLASHROM_PREPARE_FLASH_ACCESS`` (``-3``) is now returned
for all operations in case when ``prepare_flash_access`` failed and the operation itself has not started.

``libflashrom.h`` updated to document the error code for:

``flashrom_flash_erase``

``flashrom_image_read``

``flashrom_image_write``

``flashrom_image_verify``

Added support
=============

* Nova Lake SoC

* Sophos XG 230r2 board

* BY25D20/40

* FM25W128

* IS25LP032
* IS25LQ032

* MX25L3236D
* MX25LM51245G

* P25D32SH

* S25FL512S -> marked as tested

* ST M9532

* W25Q01JV
* W77{Q,T}128NW -> marked tested

* XM25RH128C
* XM25RU256C -> added WP support and mark tested

* ZB25VQ16

Special case:

ST M9532
--------

This chip has to be used in a slightly different way than most SPI flash chips,
for two reasons:

* **No probing / auto-detection.** The M95320 has no ``RDID`` instruction and
  therefore no electronic signature to read back, so flashrom cannot identify
  it automatically. The chip must be selected explicitly on the command line
  and forced, for example::

      flashrom -p <programmer> -c M95320 --force -r backup.bin

  Because the chip cannot be probed, running a plain probe (for instance while
  probing every known chip) will report::

      Probing for ST M95320, 4 kB: failed! flashrom has no probe function for this flash chip.

  This message is expected and simply means the chip cannot be detected on its
  own; it does not indicate a hardware or connection problem. Use
  ``-c M95320 --force`` to talk to the chip.

* **2-byte addressing.** The M95320 uses a 16-bit (2-byte) address for its
  read and program instructions instead of the usual 24-bit (3-byte) address.

Note that on this chip only reading has been verified on real hardware so far while
write and erase are implemented but untested.

New features of flashchips support
==================================

2-byte addressing
-----------------

``FEATURE_ADDR_2BYTE`` marks a chip that uses a 16-bit (2-byte) address in its read and program instructions
rather than the default 24-bit (3-byte) address. This is used by small SPI EEPROMs such as
``ST M95320`` (parts up to 64 KiB in the M95xxx family).
When set, ``spi_prepare_address()`` emits only two address bytes.

New decoder function
--------------------

New decoder function ``decode_range_spi25_bp3_to_1_16`` implements
protection range calculation for SPI chips where BP values below 3 mean no protection
and BP=3 starts at 1/16 of the chip.

Multi-die flash chips
---------------------

Support is added for some of the multi-die flash chips.

Two new fields are added in the ``struct flashchip`` definition:

* ``.die_size`` - Size of a single die in kilobytes. Set for multi-die chips.

* ``.die_select`` - callback for die selection. Different vendors can use
  different opcodes and methods to select active dies.

This enables future support for multi-die flash chips without affecting existing single-die
chip support.

New feature flag ``FEATURE_STATUS_PER_DIE`` supports multi-die chips which have status register per die.
This flag need to be used together with new fields ``die_size`` and ``die_select``.

Feature currently enabled for models ``W77Q128NW`` and ``W77T128NW``.

Dropping old programmers
========================

We made a list of old programmers that are candidates for being dropped in v2.0.0 (Jan 2027):

* rayer_spi
* atavia
* atapromise
* nic3com
* gfxnvidia
* satasii
* nicrealtek
* nicnatsemi
* satamv
* drkaiser
* atahpt
* it8212
* developerbox_spi

**The release v1.8.0 will be the last to have all of them. In the next release some of them will be dropped.**

More details:

* in the `announcement <https://mail.coreboot.org/archives/list/flashrom@flashrom.org/thread/2GOOX22M4NPVKTCBFU7FMUNSF3BVTATA/>`_
* in `Gerrit <https://review.coreboot.org/q/topic:%22delete-prog-in-v2.0.0%22>`_

util/flashrom_tester deleted
============================

This util has not been maintained in the upstream tree for 2+ years,
and its status in the upstream tree was unknown.

It is actively maintained in the chromium flashrom fork, and used by the dev team there.
There were no users of this util outside of chromium flashrom fork.

Misc updates
============

* platform: Use a single liner for flashrom endianness defines in meson
* platform: Remove intermediate variable in meson
* delay: Remove imprecise internal_sleep function
* progress bar: Improve the warning text when current exceeds total
* cli_classic: Initialize time_start and time_end to zero
* libflashrom: Fix print format specifiers
* helpers.h: Extract helper declarations to a separate header
* platform/endian: Rename+move platform.h to platform/endian.h
* Move all comments about struct flashchip from flashchips.c to flash.h
* dmi: Avoid redefinition of _POSIX_C_SOURCE
* subprojects/cmocka: Update to fix compilation in gcc 15.2.1
* platform/udelay: Extract windows implementation to a separate file
* tests: Replace deprecated assertions with backward compatible ones
* include/platform/: Unify header guards style
* platform/i2c: Move platform dependent code to the platform folder
* custom_baud.h: Unify header guards style
* serial.h: Unify header guards style
* tests: Add basic chip test for chip with FEATURE_STATUS_PER_DIE
* libflashrom: fix build on big-endian targets
* platform/udelay: Extract libpayload implementation to a separate file
* meson_cross: Add a libpayload cross compiling example
* platform/string: Move platform dependent code to a separate file
* gitignore: Ignore meson .wraplock
* ich_descriptors: Guess Wildcat Lake from descriptor content
* cli_classic: Extract alloc_flashsize_buf() helper
* MAINTAINERS: Update programmers file paths in programmers/ directory
* platform/string: Use meson to detect string functions availability
* ch347_spi: Fix misleading error when spispeed is not specified
* platform/meson: Move platform PCI detection to platform/meson.build
* doc: Add includes ordering guidelines
* Use platform/string.h instead of string.h
* serprog: change requested mapping... warning to debug only for spi
* log.h: Extract log declarations to a separate header
* parallel: Avoid performing read/write twice on the same data
* ft2232_spi: Factor out find_ft2232_dev() lookup
* raiden_debug_spi: Extract shared transfer error reporters
* helpers: Add shared parse_voltage() helper
* tests: Add initial set of tests for parse_voltage() function
* i2c_helper: Add shared i2c_write_buffer()/i2c_read_buffer()
* i2c_helper: Add shared i2c_require_allow_brick() helper
* tests: Add unit tests for i2c_require_allow_brick()
* Reorder imports to comply with coding style guidelines
* platform/i2c: Use meson declare dependency to expose platform code
* jedec: Factor out chip reset sequence in probe_jedec
* jedec: Replace magic command bytes with named JEDEC defines
* usb_device: Factor out device revision logging
* helpers_fileio: Factor out file metadata retrieval
* print: Factor out wrapped multiline name token printing
* platform/i2c: Add CONFIG_I2C_HELPER to gate i2c helper code
* programmer: Factor out master shutdown registration
* tests: Tests for invalid input for parse_voltage()
* tests: Add ch347_spi lifecycle and probe tests
* tests: Exercise ch341a and ch347 through the fault programmer
* nicintel: Rename bar fields to match other par_master drivers
* tests: Remove unnecessary mocking for dummyflasher tests
* usb_device: Factor out USB interface claim and revision logging
* par_mmio: Add shared MMIO accessors for parallel PCI drivers
* tests/chip.c: Refactor to use default_layout from flash context
* 94507: raiden: Remove accidental debug print
* linux_mtd: Fix out-of-bounds write in read_sysfs_string()
* linux_mtd: Simplify setup and drop dead code
* internal: Report when the Linux MTD path is used instead of the chipset
