Re: [PATCH v5 0/3] Support multiplexed main SMBus interface on SB800

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Christian,

On Sat, 23 Jan 2016 14:47:27 +0100, fetzerch wrote:
> On 22.01.2016 13:50, Jean Delvare wrote:
> > On Thu, 19 Nov 2015 20:13:46 +0100, Christian Fetzer wrote:
> >> The patched driver is running stable on the machine, given that ic2_piix4 is
> >> loaded before jc42 and w83795. If jc42 is loaded before i2c_piix4 calling
> >> sensors triggers some errors:
> >>     ERROR: Can't get value of subfeature temp1_min_alarm: Can't read
> >>
> >> While the kernel log shows:
> >>     i2c i2c-1: Transaction (pre): CNT=0c, CMD=05, ADD=31, DAT0=03, DAT1=c0
> >>     i2c i2c-1: Error: no response!
> >>     i2c i2c-1: Transaction (post): CNT=0c, CMD=05, ADD=31, DAT0=ff, DAT1=ff
> >> Unfortunately I don't know how to tackle this specific issue.
> > 
> > I think I can explain it. In piix4_setup_sb800() you touch the
> > SB800_PIIX4_SMB_IDX port without first taking the mutex that protects
> > it. You only take the mutex on transactions (in piix4_access_sb800) not
> > during initialization. If self-probing I2C device drivers such as jc42
> > are already loaded before you load i2c-piix4, then as soon as the first
> > SMBus port is registered, i2c-core will try to attach I2C devices to
> > it, while at the same time i2c-piix4 is registering the second SMBus
> > port. So SB800_PIIX4_SMB_IDX is changed while piix4_access_sb800
> > accesses it and chaos happens.
> > 
> > I think if we had proper locking in piix4_setup_sb800() then you should
> > be able to load jc42 first and then i2c-piix4 and it should work fine.
> 
> Since the problem remains even after your patch, I'll try to provide
> more information about the issue.
> 
> If i2c_piix4 is loaded before jc42 and w83795 things work as they should
> and sensors prints values from all modules.
> 
> If w83795 is loaded before i2c_piix4, the w83795adg is not detected. I'm
> not sure though if this is because of i2c_piix4 or just a shortcoming in
> the w83795 module.

The w83795 driver works fine for many users including myself for years.
So definitely this is related to the i2c-piix4 driver.

> If jc42 is loaded before i2c_piix4 then the problem described above
> occurs. It seems that jc42 tries to read from all multiplexed ports.
> This is the full sensors output:
> 
> jc42-i2c-0-18
> Adapter: SMBus PIIX4 adapter SDA0 at 0b00
> RAM1 Temp:    +26.8°C  (low  =  +0.0°C)
>                        (high = +60.0°C, hyst = +54.0°C)
>                        (crit = +70.0°C, hyst = +64.0°C)
> 
> jc42-i2c-0-19
> Adapter: SMBus PIIX4 adapter SDA0 at 0b00
> RAM2 Temp:    +26.5°C  (low  =  +0.0°C)
>                        (high = +60.0°C, hyst = +54.0°C)
>                        (crit = +70.0°C, hyst = +64.0°C)
> 
> k10temp-pci-00c3
> Adapter: PCI adapter
> CPU Temp:     +30.6°C  (high = +70.0°C)
>                        (crit = +100.0°C, hyst = +95.0°C)
> 
> jc42-i2c-1-18
> Adapter: SMBus PIIX4 adapter SDA2 at 0b00
> ERROR: Can't get value of subfeature temp1_min_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_max_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_crit_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_min: Can't read
> ERROR: Can't get value of subfeature temp1_max: Can't read
> ERROR: Can't get value of subfeature temp1_max_hyst: Can't read
> ERROR: Can't get value of subfeature temp1_crit: Can't read
> ERROR: Can't get value of subfeature temp1_crit_hyst: Can't read
> temp1:            N/A  (low  =  +0.0°C)
>                        (high =  +0.0°C, hyst =  +0.0°C)
>                        (crit =  +0.0°C, hyst =  +0.0°C)
> 
> jc42-i2c-1-19
> Adapter: SMBus PIIX4 adapter SDA2 at 0b00
> ERROR: Can't get value of subfeature temp1_min_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_max_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_crit_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_min: Can't read
> ERROR: Can't get value of subfeature temp1_max: Can't read
> ERROR: Can't get value of subfeature temp1_max_hyst: Can't read
> ERROR: Can't get value of subfeature temp1_crit: Can't read
> ERROR: Can't get value of subfeature temp1_crit_hyst: Can't read
> temp1:            N/A  (low  =  +0.0°C)
>                        (high =  +0.0°C, hyst =  +0.0°C)
>                        (crit =  +0.0°C, hyst =  +0.0°C)
> 
> jc42-i2c-2-18
> Adapter: SMBus PIIX4 adapter SDA3 at 0b00
> ERROR: Can't get value of subfeature temp1_min_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_max_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_crit_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_min: Can't read
> ERROR: Can't get value of subfeature temp1_max: Can't read
> ERROR: Can't get value of subfeature temp1_max_hyst: Can't read
> ERROR: Can't get value of subfeature temp1_crit: Can't read
> ERROR: Can't get value of subfeature temp1_crit_hyst: Can't read
> temp1:            N/A  (low  =  +0.0°C)
>                        (high =  +0.0°C, hyst =  +0.0°C)
>                        (crit =  +0.0°C, hyst =  +0.0°C)
> 
> jc42-i2c-2-19
> Adapter: SMBus PIIX4 adapter SDA3 at 0b00
> ERROR: Can't get value of subfeature temp1_min_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_max_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_crit_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_min: Can't read
> ERROR: Can't get value of subfeature temp1_max: Can't read
> ERROR: Can't get value of subfeature temp1_max_hyst: Can't read
> ERROR: Can't get value of subfeature temp1_crit: Can't read
> ERROR: Can't get value of subfeature temp1_crit_hyst: Can't read
> temp1:            N/A  (low  =  +0.0°C)
>                        (high =  +0.0°C, hyst =  +0.0°C)
>                        (crit =  +0.0°C, hyst =  +0.0°C)
> 
> jc42-i2c-3-18
> Adapter: SMBus PIIX4 adapter SDA4 at 0b00
> ERROR: Can't get value of subfeature temp1_min_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_max_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_crit_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_min: Can't read
> ERROR: Can't get value of subfeature temp1_max: Can't read
> ERROR: Can't get value of subfeature temp1_max_hyst: Can't read
> ERROR: Can't get value of subfeature temp1_crit: Can't read
> ERROR: Can't get value of subfeature temp1_crit_hyst: Can't read
> temp1:            N/A  (low  =  +0.0°C)
>                        (high =  +0.0°C, hyst =  +0.0°C)
>                        (crit =  +0.0°C, hyst =  +0.0°C)
> 
> jc42-i2c-3-19
> Adapter: SMBus PIIX4 adapter SDA4 at 0b00
> ERROR: Can't get value of subfeature temp1_min_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_max_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_crit_alarm: Can't read
> ERROR: Can't get value of subfeature temp1_min: Can't read
> ERROR: Can't get value of subfeature temp1_max: Can't read
> ERROR: Can't get value of subfeature temp1_max_hyst: Can't read
> ERROR: Can't get value of subfeature temp1_crit: Can't read
> ERROR: Can't get value of subfeature temp1_crit_hyst: Can't read
> temp1:            N/A  (low  =  +0.0°C)
>                        (high =  +0.0°C, hyst =  +0.0°C)
>                        (crit =  +0.0°C, hyst =  +0.0°C)

It means that the autodetection function of the jc42 driver returned
success, allowing the driver to instantiate jc42 devices on each of
them. This means that SMBus port 0 was selected at that time even
though the kernel believed port 2 then 3 then 4 was selected. Later on
(when you run "sensors") port selection works properly so the jc42
driver returns error as intended for non-existent devices.

Where is the W83795ADG device when it is properly detected?

I looked at the code again but can't see any obvious problem left after
applying my patch.

One thing that bothers me is that pins for SMBus ports may be shared
with other functions. The "AMD SB810/850 Southbridge Databook" document
shows that all SMBus ports are shared with at least GPIOs and port 4
also with PS/2 function. Unfortunately I can't find any document
explaining how to check which function is assigned to each pin.

-- 
Jean Delvare
SUSE L3 Support
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux