Re: [PATCH 0/2] i2c: i801: Detect SPD Write Disable and expose as adapter quirk
From: Mark Pearson
Date: Mon May 04 2026 - 17:42:58 EST
Hi Tinsae
Sorry for the long delay in reply
On Thu, Apr 23, 2026, at 7:21 AM, TINSAE TADESSE wrote:
> On Tue, Apr 21, 2026 at 8:56 PM Mark Pearson <mpearson@xxxxxxxxx> wrote:
>>
>> Hi Tinsae,
>>
>> On Sat, Feb 21, 2026, at 4:57 AM, TINSAE TADESSE wrote:
>> > On Thu, Feb 5, 2026 at 1:29 PM Tinsae Tadesse
>> > <tinsaetadesse2015@xxxxxxxxx> wrote:
>> >>
>> >> Hi I2C and HWMON maintainers,
>> >>
>> >> Intel i801 SMBus controllers feature a "SPD Write Disable" bit
>> >> in the SMBHSTCFG register. When set by firmware, the hardware
>> >> silently blocks all write transactions to the SPD EEPROM
>> >> address range (0x50-0x57) while allowing reads to succeed.
>> >>
>> >> This creates a significant issue for the spd5118 hwmon driver.
>> >> The SPD5118 requires write access for switching between
>> >> register pages to read temperature data, and for cache
>> >> synchronization during suspend/resume. When SPD Write Disable
>> >> is set and the spd5118 driver attempts write transactions, the
>> >> bus will generate a storm of SMBus DEV_ERR messages.
>> >>
>> >> This patch series proposes a generic solution by:
>> >> 1. Introducing a new adapter quirk flag in include/linux/i2c.h
>> >> to communicate this hardware restriction.
>> >> 2. Modifying drivers/i2c/i2c-i801.c to detect the SPD Write
>> >> Disable bit and set the quirk flag.
>> >> 3. Modifying drivers/hwmon/spd5118.c to check for this quirk
>> >> during probe and fail cleanly, as write access is mandatory.
>> >>
>> >> By using this mechanism, we avoid embedding device-specific
>> >> policies in the controller driver and provide client drivers
>> >> with the necessary information to make an informed decision.
>> >>
>> >> Tinsae Tadesse (2):
>> >> i2c: i801: Detect SPD Write Disable and expose as adapter quirk
>> >> hwmon: spd5118: Fail probe if SPD writes are disabled
>> >>
>> >> drivers/hwmon/spd5118.c | 15 +++++++++++++++
>> >> drivers/i2c/busses/i2c-i801.c | 16 +++++++++++++++-
>> >> include/linux/i2c.h | 3 +++
>> >> 3 files changed, 33 insertions(+), 1 deletion(-)
>> >>
>> >> --
>> >> 2.52.0
>> >>
>> >
>>
>> I'm hitting a very similar problem on all the Lenovo 2026 Linux certified platforms.
>> Your patch is great, and I wanted to add a tested-by tag to say it fixed the issue for me, but it doesn't quite unfortunately.
>>
>> I added this change (hack?) in i2c-smbus.c to take advantage of your changes and fix the issue that I'm seeing:
>>
>> void i2c_register_spd_write_enable(struct i2c_adapter *adap)
>> {
>> - i2c_register_spd(adap, false);
>> + if (adap->quirks && adap->quirks->flags & I2C_AQ_SPD_WRITE_DISABLED)
>> + i2c_register_spd(adap, true);
>> + else
>> + i2c_register_spd(adap, false);
>> }
>>
>> What do you think? Any side effects or impacts you can foresee based on your testing?
>>
>> Maintainers - would love your opinion too. I suspect this may become a common issue.
>>
>> Mark
>
> Hi Mark,
>
> Thank you for suggesting this fix, and I apologize for the delayed response :)
>
>> What do you think? Any side effects or impacts you can foresee based on your testing?
>
> I think that fix looks okay; however, it would be helpful to know which kernel
> driver was the source of your error. Additionally, having the kernel
> debug logs would help pinpoint the exact place of the problem.
>
It was on 7.0, built from Linus's tree.
I can pull up logs - but it's just when reading the DDR SPD get's triggered so not terribly useful.
For me it gets triggered from i801_probe_optional_targets
>> I added this change (hack?) in i2c-smbus.c to take advantage of your changes and fix the issue that I'm seeing.
>
> The goal of this patch series, as you can see from the RFC, was to
> "avoid embedding device-specific policies in the controller driver and
> provide client driver with the necessary information to make an informed
> decision on whether it can operate or not under SPD Write Disable."
> Therefore, I would rather have this check in the client driver's probe function,
> rather than in the SMBus controller driver.
>
Fair enough.
What about having it in the i2c-i801 driver? Something like:
- i2c_register_spd_write_enable(&priv->adapter);
+ if (priv->adapter.quirks && priv->adapter.quirks->flags & I2C_AQ_SPD_WRITE_DISABLED)
+ i2c_register_spd_write_disable(&priv->adapter);
+ else
+ i2c_register_spd_write_enable(&priv->adapter);
Would that be better? (there are two places in that file where this change is needed)
I confirmed this did fix it for me :)
Mark