Bug 213345 - i801_smbus: Timeout waiting for interrupt, driver can't access SMBus
Summary: i801_smbus: Timeout waiting for interrupt, driver can't access SMBus
Status: NEW
Alias: None
Product: Drivers
Classification: Unclassified
Component: I2C (show other bugs)
Hardware: All Linux
: P1 low
Assignee: Drivers/I2C virtual user
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-06-05 17:32 UTC by Johannes Penßel
Modified: 2024-05-04 22:01 UTC (History)
5 users (show)

See Also:
Kernel Version: 5.10.27-5.14-rc3
Subsystem:
Regression: No
Bisected commit-id:


Attachments
dmesg (76.95 KB, text/plain)
2021-06-05 17:32 UTC, Johannes Penßel
Details
DSDT.dsl (1.78 MB, text/x-csrc)
2021-08-22 11:10 UTC, Johannes Penßel
Details
dmidecode output (22.09 KB, text/plain)
2024-05-04 02:22 UTC, ruirui.yang
Details

Description Johannes Penßel 2021-06-05 17:32:15 UTC
Created attachment 297185 [details]
dmesg

Problem: On boot, i801_smbus reports these errors:
[    3.221208] i801_smbus 0000:00:1f.4: SPD Write Disable is set
[    3.221247] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt

[    3.423566] i801_smbus 0000:00:1f.4: Timeout waiting for interrupt!
[    3.423569] i801_smbus 0000:00:1f.4: Transaction timeout
[    3.425564] i801_smbus 0000:00:1f.4: Failed terminating the transaction
[    3.425603] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!

Tested on Arch Linux / Gentoo, kernel 5.10.27, 5.12.x
HW: Lenovo Ideapad 5 15ITL05 i5-1135G7, latest firmware

Attempted fixes so far: disabling all other drivers accessing SMBus, using different SMBus access methods

lspci -k reports the driver loading correctly:
00:1f.4 SMBus: Intel Corporation Tiger Lake-LP SMBus Controller (rev 20)
        Subsystem: Lenovo Tiger Lake-LP SMBus Controller
        Kernel driver in use: i801_smbus
        Kernel modules: i2c_i801

lm_sensors seems to have issues detecting SMBus:
Found unknown SMBus adapter 8086:a0a3 at 0000:00:1f.4.

i2cdetect -F output:
Functionalities implemented by /dev/i2c-12:
I2C                              no
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               no
SMBus Block Write                yes
SMBus Block Read                 yes
SMBus Block Process Call         yes
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes
Comment 1 Johannes Penßel 2021-06-05 17:37:45 UTC
Note: accessing the SMBus device via i2cdetect causes the flood of "i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!" error messages seen in dmesg.
Comment 2 Johannes Penßel 2021-08-22 11:10:26 UTC
Created attachment 298413 [details]
DSDT.dsl

DSDT.dsl file for Lenovo IdeaPad 5 15ITL05 extracted from the latest FHCN57WW firmware.
Comment 3 Johannes Penßel 2021-08-22 11:12:01 UTC
https://lore.kernel.org/linux-i2c/CAJCQCtTB+KW596A1Q+Ds6u9uvUrqeOSmer6qKv7g+xRYijGS3A@mail.gmail.com/

This report describes the same issue on a Thinkpad Carbon X1 7th gen running Linux 5.14-rc3. Maybe this is a Lenovo-specific problem?
Comment 4 Mateusz Jończyk 2022-01-09 18:48:45 UTC
Hello,

Did you try using a "i2c-i801.disable_features=0x10" Linux kernel cmdline option to disable usage of interrupts in the driver?

In the dmesg you have:
[    3.221208] i801_smbus 0000:00:1f.4: SPD Write Disable is set
[    3.221247] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
[    3.222484] i2c i2c-12: 2/2 memory slots populated (from DMI)
[...]
[    3.423566] i801_smbus 0000:00:1f.4: Timeout waiting for interrupt!
[    3.423569] i801_smbus 0000:00:1f.4: Transaction timeout
[    3.425564] i801_smbus 0000:00:1f.4: Failed terminating the transaction
[    3.425603] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!

It is possible that the SMBus hangs while trying to access SPD EEPROM chips located on RAM modules. So blacklisting the "eeprom" and "at24" modules may help here.

Why do you specifically want to access SMBus / the I2C bus? Is there a piece of hardware on the laptop that does not work?
Comment 5 Mateusz Jończyk 2022-01-09 18:59:52 UTC
Try also blacklisting the "i2c-i801" module and loading it manually ("modprobe i2c-i801 disable_features=0x10") after the laptop has finished booting. The problems may be caused by something other accessing the i2c bus during boot.
Comment 6 Luis Ortega 2024-01-21 15:28:46 UTC
Hello. I did the "boot with the cmdline option" thing and "blacklist and then modprobe" thing so far, and I've seen this pop up on dmesg

[  104.545429] i801_smbus 0000:00:1f.4: Interrupt disabled by user
[  104.545691] i801_smbus 0000:00:1f.4: SPD Write Disable is set
[  104.545714] i801_smbus 0000:00:1f.4: SMBus using polling
[  104.546865] i2c i2c-14: 2/2 memory slots populated (from DMI)
[  104.549764] iTCO_vendor_support: vendor-support=0
[  104.747810] i801_smbus 0000:00:1f.4: Transaction timeout
[  104.749912] i801_smbus 0000:00:1f.4: Failed terminating the transaction
[  104.749970] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  104.760558] iTCO_wdt iTCO_wdt: Found a Intel PCH TCO device (Version=6, TCOBASE=0x0400)
[  104.760629] iTCO_wdt iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0)

I'll try blacklisting those other modules next
Comment 7 Luis Ortega 2024-01-21 15:36:31 UTC
It didn't do anything, and I noticed that those modules don't even get loaded by default (they're not in lsmod output on a normal boot)
Also, forgot to say, I have the exact same laptop, but with an i7-1165g7 instead.
Comment 8 ruirui.yang 2024-04-19 08:22:57 UTC
I got similar issue on thinkpad X1 gen9 with latest 6.9.0-rc4+
Git bisect the first bad commit is "13e3a512a29001c  i2c: smbus: Support up to 8 SPD EEPROMs
"

modprobe without param:
[ 1290.401393] i801_smbus 0000:00:1f.4: SPD Write Disable is set
[ 1290.401486] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
[ 1290.403340] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1290.403383] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1290.403410] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1290.403437] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1290.403465] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1290.403492] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1290.403519] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1290.403546] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!

with param 
[ 1314.568785] i801_smbus 0000:00:1f.4: Interrupt disabled by user
[ 1314.568837] i801_smbus 0000:00:1f.4: SPD Write Disable is set
[ 1314.568894] i801_smbus 0000:00:1f.4: SMBus using polling
[ 1314.570230] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1314.570257] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1314.570283] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1314.570310] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1314.570336] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1314.570362] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1314.570389] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[ 1314.570415] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
Comment 9 Mateusz Jończyk 2024-04-25 19:36:10 UTC
Hello,

> I got similar issue on thinkpad X1 gen9 with latest 6.9.0-rc4+
> Git bisect the first bad commit is "13e3a512a29001c  i2c: smbus: Support up
> to 8 SPD EEPROMs
> "

Please report it to linux-i2c@vger.kernel.org while CCing the email addresses from description of this commit.

I suspect that
commit 13e3a512a29001c ("i2c: smbus: Support up to 8 SPD EEPROMs")
only triggered a problem that was present earlier. Does running i2cdetect on a kernel without this problem (like Linux 6.8) trigger this bug?

Greetings,
Mateusz
Comment 10 ruirui.yang 2024-05-01 07:25:36 UTC
Thanks for reporting this to mail list, I tried i2cdetect on old kernel, did not see errors. But I'm not familar with i2c, not sure which option do you want me to try. Anyway, here is some output.
# i2cdetect -l
i2c-0	i2c       	Synopsys DesignWare I2C adapter 	I2C adapter
i2c-1	smbus     	SMBus I801 adapter at efa0      	SMBus adapter
i2c-2	i2c       	i915 gmbus dpa                  	I2C adapter
i2c-3	i2c       	i915 gmbus dpb                  	I2C adapter
i2c-4	i2c       	i915 gmbus dpc                  	I2C adapter
i2c-5	i2c       	i915 gmbus tc1                  	I2C adapter
i2c-6	i2c       	i915 gmbus tc2                  	I2C adapter
i2c-7	i2c       	i915 gmbus tc3                  	I2C adapter
i2c-8	i2c       	i915 gmbus tc4                  	I2C adapter
i2c-9	i2c       	i915 gmbus tc5                  	I2C adapter
i2c-10	i2c       	i915 gmbus tc6                  	I2C adapter
i2c-11	i2c       	AUX A/DDI A/PHY A               	I2C adapter
i2c-12	i2c       	AUX USBC1/DDI TC1/PHY TC1       	I2C adapter
i2c-13	i2c       	AUX USBC2/DDI TC2/PHY TC2       	I2C adapter
i2c-14	i2c       	AUX USBC3/DDI TC3/PHY TC3       	I2C adapter
i2c-15	i2c       	AUX USBC4/DDI TC4/PHY TC4       	I2C adapter

# i2cdetect -y 11
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- 37 -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

# i2cdetect -F 11
Functionalities implemented by /dev/i2c-11:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 yes
SMBus Block Process Call         yes
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes

# uname -r
6.7.9-200.fc39.x86_64
Comment 11 Mateusz Jończyk 2024-05-01 08:18:19 UTC
Please check

i2cdetect 0
i2cdetect 1
dmidecode

How many RAM modules does this computer have?
Comment 12 Heiner Kallweit 2024-05-01 09:49:19 UTC
(In reply to ruirui.yang from comment #8)
> I got similar issue on thinkpad X1 gen9 with latest 6.9.0-rc4+
> Git bisect the first bad commit is "13e3a512a29001c  i2c: smbus: Support up
> to 8 SPD EEPROMs
> "
> 

The mentioned commit showed up in 6.8 only, but the problem reports date back to at least 5.12. So I don't think this commit is the culprit.
Please bisect between last known good kernel and 5.12.
Comment 13 ruirui.yang 2024-05-03 13:59:55 UTC
6.6 kernel works fine.

# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x08-0x77.
Continue? [Y/n] Y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
# i2cdetect 1
Warning: Can't use SMBus Quick Write command, will skip some addresses
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x08-0x77.
Continue? [Y/n] Y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                                                 
10:                                                 
20:                                                 
30: -- -- -- -- -- -- -- --                         
40:                                                 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60:                                                 
70:
Comment 14 ruirui.yang 2024-05-04 02:22:56 UTC
Created attachment 306261 [details]
dmidecode output
Comment 15 ruirui.yang 2024-05-04 02:33:02 UTC
5.12 kernel works fine to me so I think it might be different problem although the symptom is similar.  I do not think I can bisect betwen 5.12 and 6.x since all works fine, the first bad commit is clear to me with my original bisect.
Comment 16 Heiner Kallweit 2024-05-04 08:10:01 UTC
According to the dmidecode output you have 8 memory slots, each populated with a 4GB DIMM. Is this correct?
Then with previous kernel versions you should have seen the warning "Systems with more than 4 memory slots not supported yet".
Comment 17 ruirui.yang 2024-05-04 08:21:45 UTC
It is hard to know, the laptop is a thinkpad x1 gen9, according to below article the memory is soldered to the motherboard. But it said that the memory works in quad-channel mode, so not sure if it is just 4 channels.  I have never seen the warnings, but I can have a quick test with 6.6 kernel.
https://laptopmedia.com/highlights/inside-lenovo-thinkpad-x1-carbon-9th-gen-disassembly-and-upgrade-options/
Comment 18 ruirui.yang 2024-05-04 08:23:40 UTC
Yes! I see the warnings with 6.6 kernel:
[    1.591594] i2c i2c-0: 8/8 memory slots populated (from DMI)
[    1.593214] i2c i2c-0: Systems with more than 4 memory slots not supported yet, not instantiating SPD
Comment 19 Mateusz Jończyk 2024-05-04 08:33:25 UTC
> --- Comment #13 from ruirui.yang@linux.dev ---
> 6.6 kernel works fine.
>
> # i2cdetect 0
> [...]
> # i2cdetect 1
> [...]

Are there any warning messages in dmesg generated while you run i2cdetect?
Comment 20 ruirui.yang 2024-05-04 08:36:34 UTC
Yes, there are something printed below:
[  777.551328] i801_smbus 0000:00:1f.4: Transaction timeout
[  777.553555] i801_smbus 0000:00:1f.4: Failed terminating the transaction
[  777.553674] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.553752] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.553824] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.553895] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.553964] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554036] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554108] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554187] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554264] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554336] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554408] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554481] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554552] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554623] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554695] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554767] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554838] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554908] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.554980] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555051] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555122] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555224] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555302] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555387] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555463] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555539] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555614] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555689] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555765] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555836] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555908] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.555980] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556050] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556121] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556193] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556264] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556336] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556408] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556478] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556552] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556624] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556696] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556766] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556837] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556909] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.556977] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557049] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557119] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557189] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557259] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557331] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557402] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557471] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557543] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557614] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557687] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557759] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557830] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557899] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.557970] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558041] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558112] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558183] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558254] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558325] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558396] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558467] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558536] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558585] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558623] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558658] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558696] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558731] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558766] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558801] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558837] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558872] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558907] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558942] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.558977] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559012] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559047] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559082] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559117] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559152] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559196] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559233] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559271] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559306] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559342] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559378] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559417] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559455] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559490] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559525] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559560] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559596] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559631] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559666] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559701] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559736] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559771] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559806] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559844] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559879] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559914] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559949] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.559984] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.560019] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.560055] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[  777.560090] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
Comment 21 ruirui.yang 2024-05-04 08:40:35 UTC
Hmm, comment #20 is a reply to comment #19, will use "reply" to quote the questions later.
Comment 22 Heiner Kallweit 2024-05-04 10:08:59 UTC
Seems that for whatever reason bit SMBHSTSTS_HOST_BUSY is constantly set.
It should be automatically cleared by the host after each SMBUS operation.

Could you please test the following?
It's no proper fix, it's just to test whether manually resetting the bit on i801 driver load helps.


diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
index a7c0c8710..a521bd4a3 100644
--- a/drivers/i2c/busses/i2c-i801.c
+++ b/drivers/i2c/busses/i2c-i801.c
@@ -1683,6 +1683,8 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
 		outb_p(inb_p(SMBAUXCTL(priv)) &
 		       ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
 
+	outb_p(SMBHSTSTS_HOST_BUSY, SMBHSTSTS(priv));
+
 	/* Default timeout in interrupt mode: 200 ms */
 	priv->adapter.timeout = HZ / 5;
 
-- 
2.45.0
Comment 23 ruirui.yang 2024-05-04 11:03:04 UTC
(In reply to Heiner Kallweit from comment #22)
> Seems that for whatever reason bit SMBHSTSTS_HOST_BUSY is constantly set.
> It should be automatically cleared by the host after each SMBUS operation.
> 
> Could you please test the following?
> It's no proper fix, it's just to test whether manually resetting the bit on
> i801 driver load helps.

Hi, with the changes, I still got the SMBus busy messages below:
[~]$ uname -r
6.9.0-rc6+
[~]$ dmesg|grep i801
[    1.563819] i801_smbus 0000:00:1f.4: enabling device (0000 -> 0003)
[    1.565938] i801_smbus 0000:00:1f.4: SPD Write Disable is set
[    1.569900] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
[    1.776346] i801_smbus 0000:00:1f.4: Transaction timeout
[    1.780426] i801_smbus 0000:00:1f.4: Failed terminating the transaction
[    1.782933] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[    1.785568] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[    1.787947] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[    1.790513] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[    1.792779] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[    1.794917] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
[    1.797100] i801_smbus 0000:00:1f.4: SMBus is busy, can't use it!
Comment 24 Heiner Kallweit 2024-05-04 21:39:17 UTC
OK, so it can start a transaction, but transaction doesn't finish.
Looks like BIOS might have switched off some clock needed for SMBUS.
First (failed) SMBUS access attempt is when the ee1004 driver is probed.
Before the referenced change this driver wasn't instantiated (due to >4 memory slots).

Having said that I think that the SMBUS wasn't usable also before. You could check under 6.6 with i2cdetect, and whether you can access the SPD EEPROM's from userspace.

Simple workaround would be to blacklist ee1004 and/or i801.
Comment 25 Heiner Kallweit 2024-05-04 22:01:27 UTC
Following more than 3 yrs old post for a Gen8 model seems to indicate that SMBUS access on this machine type has been problematic for years.

https://forums.lenovo.com/topic/findpost/27/5048595/5181539

The bisect just points to the change that revealed the problem.

Note You need to log in before you can comment on or make changes to this bug.