All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Miroslav Bendík" <miroslav.bendik@gmail.com>
To: linux-i2c@vger.kernel.org, linux-input@vger.kernel.org
Cc: Andrew Duggan <aduggan@synaptics.com>,
	Benjamin Tissoires <btissoir@redhat.com>,
	Hans de Goede <hdegoede@redhat.com>,
	Wolfram Sang <wsa@kernel.org>,
	Andrea Ippolito <andrea.ippo@gmail.com>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>
Subject: Re: Wrong piix4_smbus address / slow trackpoint on Thinkpad P14s gen 2 (AMD)
Date: Sat, 12 Feb 2022 18:42:07 +0100	[thread overview]
Message-ID: <5105b392-dee9-85fb-eeba-75c7c951d295@gmail.com> (raw)
In-Reply-To: <CAPoEpV0ZSidL6aMXvB6LN1uS-3CUHS4ggT8RwFgmkzzCiYJ-XQ@mail.gmail.com>

Hello,
i think, that SMBus works now pretty good and last problem is screaming 
interrupt from synaptics (1000 irq/s). I need little help to solve this 
problem.

Little summary first:

On this thinkpad is synaptics trackpoint/touchpad connected to PIIX4. To 
enable RMI4 mode, SMBus driver should support host notify protocol. I 
have added support of host notify and replaced active waiting 
transaction with completer + interrupt. Driver is now pretty stable and 
works way better, than old implementation. For example i2c-detect shows 
real devices (previous transaction code showed all addresses from 0x1c 
as active). Patch on following link is still hack, has hardcoded IRQ and 
supports host notifications and interrupts only on auxiliary port. I can 
implement other ports later.

Patch: 
https://lore.kernel.org/all/c9b0b147-2907-ff41-4f13-464b3b891c50@wisdomtech.sk/
This patch includes PM register access using MMIO: 
https://lore.kernel.org/all/20210715221828.244536-1-Terry.Bowman@amd.com/

Now i can load psmouse synaptics_intertouch=1 and everything works 
great, but it uses 5% CPU and interrupt is called 1000/s. I have changed 
interrupt from rising edge to active low (it's PCIE, PCIE has active 
low) and i have many times checked if all interrupt bits are cleared in 
interrupt request. Yes, they are always cleared. Interrupts are 
generated only after first touch if i have compiled only F12. If i 
compile F03, then interrupts are generated immediately after load of 
psmouse. After unload, interrupts are not generated (i2c-piix4 still 
loaded).

On this machine I2C is accessible using GPIO 19(SCL), 20(SDA). Using 
kernel thread with RT priority on isolated core i have tried to record 
pin values on GPIO pins. Latency is too high to record all transferred 
data. Some state changes are lost (approximately 1/50 bits). Not too low 
to read reliably all data, but good enough to see what happens at bus 
level. Here is recorded file: 
https://mireq.linuxos.sk/kernel/thinkpad_p14s/i2c_scl_sda.xz.

Every byte is sample, first bit is SCL, second SDA. Sample rate is cca 
500 000 Hz, but often drops under 100 000 (lost bit).

On this screenshot is typical activity on bus: 
https://mireq.linuxos.sk/kernel/thinkpad_p14s/i2c_1.png (pulseview with 
imported raw file)

Zoom to two packet is here: 
https://mireq.linuxos.sk/kernel/thinkpad_p14s/i2c_2.png

First packet is SMBus host notify. Address 0x08 is SMBus host address 
and 0x58 is address of synaptics (0x2c << 1). Second packet is reading 
of interrupt status registers. Data 02 is length of interrupt status 
register (9 bits) and last 2 bytes are zero (idle, when moving cursor, 
then interrupt status register contains one bit set).

Zoomed out: https://mireq.linuxos.sk/kernel/thinkpad_p14s/i2c_3.png

Before transaction SMBus slave state machine is disabled and after 
transaction enabled. If notification is received when state machine is 
disabled, then device writes only address and don't get response. If 
driver runs with always enabled slave state machine, then output will 
contain only notify + read interrupt status pairs and no separate 
addresses, but with this mode bus collisions occur more often.

Here is dmesg output: https://pastebin.com/RdDYHJn0

Cursor is moved until 2862.8, then i have not touched trackpoint.

Idle device don't produce bus collisions. Moving cursor produces 
collisions, but sample rate is stable 100Hz, which is way better, than 
<40 Hz with PS/2 mode. I don't know how to solve collisions. Maybe they 
are related to not silenced host notifications.

If i were to be optimistic, then i would say that clearing interrupt 
vector will solve all problems. According old RMI4 documentation, 
reading from interrupt status register should clear interrupts (status 
register is cleared), but this don't prevent device form sending host 
notifications. Maybe exists new way to disable interrupts. I don't know, 
i have no access to current documentation.

My device has this signature:
Synaptics, product: TM3471-030, fw id: 3418235

Any help welcome.

      parent reply	other threads:[~2022-02-12 17:42 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-11 12:14 Wrong piix4_smbus address / slow trackpoint on Thinkpad P14s gen 2 (AMD) Miroslav Bendik
2022-01-05 17:57 ` Miroslav Bendík
2022-01-06 12:57   ` Wolfram Sang
2022-01-06 17:54     ` Miroslav Bendík
2022-01-06 18:27   ` Andrea Ippolito
2022-01-07  5:41     ` Miroslav Bendík
2022-01-06 12:52 ` Wolfram Sang
2022-01-08 18:42 ` Miroslav Bendík
2022-01-11 12:35   ` Wolfram Sang
2022-02-12 17:42 ` Miroslav Bendík [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5105b392-dee9-85fb-eeba-75c7c951d295@gmail.com \
    --to=miroslav.bendik@gmail.com \
    --cc=aduggan@synaptics.com \
    --cc=andrea.ippo@gmail.com \
    --cc=btissoir@redhat.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=wsa@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.