macsmc-input: poll MSLD for lid state, fix spurious s2idle wake#509
macsmc-input: poll MSLD for lid state, fix spurious s2idle wake#509areofyl wants to merge 54 commits into
Conversation
b69f911 to
1affd03
Compare
1affd03 to
36eff9f
Compare
Certain Broadcom bluetooth chips (bcm4377/bcm4378/bcm438) need ACL streams carrying audio to be set as "high priority" using a vendor specific command to prevent 10-ish second-long dropouts whenever something does a device scan. This patch sends the command when the socket priority is set to TC_PRIO_INTERACTIVE, as BlueZ does for audio. From experimenting with the hardware - this command is not suitable for per-skb priority switching, as prioritization is done on the handle level, with this command reconfiguring certain radio timings, and dropping to low priority in order to send a low packet on the same handle as an audio stream is being played on causes the same kind of dropout it is supposed to avoid. In addition, the hardware is rather picky about when this command can be sent, as sending it during connection open results in a timeout. The vendor stacks solve it by having high-level visibility into what a connection is used for and sending it from userspace when it is known that an audio stream is about to start. As we can't have that visibility without introducing a new ioctl, the socket priority is used as proxy. Reviewed-by: Neal Gompa <neal@gompa.dev> Signed-off-by: Sasha Finkelstein <k@chaosmail.tech>
This reverts commit 30fcc49.
Certain Broadcom bluetooth chips (bcm4377/bcm4378/bcm438) need ACL streams carrying audio to be set as "high priority" using a vendor specific command to prevent 10-ish second-long dropouts whenever something does a device scan. This patch sends the command when the socket priority is set to TC_PRIO_INTERACTIVE, as BlueZ does for audio. Signed-off-by: Sasha Finkelstein <fnkl.kernel@gmail.com>
The current approach of silently disabling all rust drivers if the toolchain is missing results in users that try to compile their own kernels getting a "successful" build and then being confused about where did their drivers go. In comparison, missing openssl results in a build failure, not a disappearance of everything that depends on it. This also means that allyesconfig will depend on rust, but since the rust experiment concluded with "rust is here to stay", i believe that allyesconfig should be building rust drivers too. Signed-off-by: Sasha Finkelstein <k@chaosmail.tech>
Signed-off-by: Janne Grunau <j@jannau.net>
Signed-off-by: Janne Grunau <j@jannau.net>
Signed-off-by: Janne Grunau <j@jannau.net>
List trackpad firmware files and activate MTP devices nodes on all t6030, t6031 and t6034 based MacBooks. Signed-off-by: Janne Grunau <j@jannau.net>
Signed-off-by: Sasha Finkelstein <k@chaosmail.tech>
…g cycles Signed-off-by: Janne Grunau <j@jannau.net>
Signed-off-by: Janne Grunau <j@jannau.net>
Signed-off-by: Janne Grunau <j@jannau.net>
HDP status for DisplayPort alt-mode is signaled data_status. Track changes to have a debounced HPD to forward to the DRM KMS driver. Signed-off-by: Janne Grunau <j@jannau.net>
This is not how dp-altmode support should be implemented but it works for new. Requires a "displayport" property in the connector node with a phandle of the connector. Signed-off-by: Janne Grunau <j@jannau.net>
Enable DP alt mode for all M1 devices: - Mac Mini (M1): USB-C port next to the HDMI port - Macbook Pro (M1, 13-inch): front left USB-C port - Macbook Air (M1, 13-inch): front left USB-C port - iMac (M1, 2 USB-C ports): back left USB-C port - iMac (M1, 4 USB-C ports): back right middle USB-C port Signed-off-by: Janne Grunau <j@jannau.net>
Works around missing suspend/resume handling in ATC phy for DP-altmode. Signed-off-by: Janne Grunau <j@jannau.net>
Enable DP alt mode for the front left USB-C port of Macbook Air 13 (M2, 13/15-inch) and Macbook Pro (M2, 13-inch). Can't easily enabled on on the M2 Mac Mini since dcpext is used for the HDMI port and dcp bringup is troublesome. Signed-off-by: Janne Grunau <j@jannau.net>
Works around missing suspend/resume handling in ATC phy for DP-altmode. Signed-off-by: Janne Grunau <j@jannau.net>
Needs more testing, maybe a little unstable and somehow limits the HDMI out to 1280x720 (to be verified). Using dcp as display coproc since dcpext is used for the HDMI port. Signed-off-by: Janne Grunau <j@jannau.net>
Works around missing suspend/resume handling in ATC phy for DP-altmode. Signed-off-by: Janne Grunau <j@jannau.net>
Blessed dp-altmode port is front left port on j314/j316/j414/j416. Signed-off-by: Janne Grunau <j@jannau.net>
…ways on Works around missing suspend/resume handling in ATC phy for DP-altmode. Signed-off-by: Janne Grunau <j@jannau.net>
DP alt mode for Mac Studio, the blessed port is the back left middle port (second closest USB-C port to the power connector). Signed-off-by: Janne Grunau <j@jannau.net>
…s on Works around missing suspend/resume handling in ATC phy for DP-altmode. Signed-off-by: Janne Grunau <j@jannau.net>
DP alt mode for Mac Mini M2 Pro, the blessed port is the back right middle port (second closest USB-C port to the power connector). Signed-off-by: Janne Grunau <j@jannau.net>
|
With this patch, my m1pro does not wake up automatically if i open the lid (with no external screen connected). It did that before. I then need to press the power button for ~1 second for it to turn on again. Previously a short tap on the power button was enough. |
Yeah I'm sorry about that. Lid wake is a known limitation of s2idle on Apple Silicon. Workqueues are frozen during suspend so the kernel can't poll the lid sensor. If it seemed to work before, it was likely a coincidence (the SMC fires spurious events that can wake the system around the same time). There's no clean fix for this without upstream changes to how the SMC delivers lid events. |
SMC lid events (0x7203) show up in the SMC firmware syslog but never get delivered to Linux via RTKit notifications, so lid open/close is invisible to userspace. Switch to polling the MSLD key every second with a delayed_work and reporting SW_LID when it changes. 2-poll debounce because MSLD bounces during DP disconnect events. Also fixes spurious wake: the SMC fires a fake BTN_TOUCHID press+release within ~1ms of entering s2idle. Skip the first 2 button events after pm_prepare, real presses after that go through normally. Other fixes: - Add remove callback (old driver had none, leaked notifier + work) - pm_complete cancels and reschedules lid_work so polling survives suspend/resume cycles - Expose MSLD as sysfs attribute (msld_state) for debugging - Init pending_lid_state from MSLD at probe Tested on M1 MacBook Air (J313), fairydust 6.18.10. Signed-off-by: areofyl <areofyl@users.noreply.github.com>
36eff9f to
7b924fd
Compare
|
On which device are you seeing this? I've never noticed this before and just tested this with uart and Please provide a description on how you noticed the issue and how your device behaves ideally with relevant kernel logs around suspend / lid events. I assume you added a log statement in |
|
This is on an M1 MacBook Air (t8103) running Gentoo with the fairydust kernel. I don't have UART set up so my logs are from journalctl, but I can try to get better captures. The issue I hit was the SMC firing a spurious BTN_TOUCHID press+release about 1ms after entering s2idle, which would immediately wake the system back up. The ignore counter in my patch skips those first 2 events so the system stays asleep. I didn't realize lid events were being delivered reliably via notifications on other machines. On mine they seemed inconsistent, which is why I added MSLD polling. If lid wake works fine through the existing event path on MBA and 14-inch MBP, this polling approach is probably wrong and I should narrow the fix to just the spurious button handling. I'll try to get proper logs with the stock kernel showing the spurious wake and post them here. |
SMC lid events (0x7203) show up in the SMC firmware syslog but never actually get delivered to Linux via RTKit notifications. So lid open/close is completely invisible to userspace and logind never knows to suspend.
This switches to polling the MSLD key every second with a delayed_work and reporting SW_LID changes to the input subsystem. Added a 2-poll debounce because MSLD bounces during DP disconnect events.
Also fixes the spurious wake issue. The SMC fires a fake BTN_TOUCHID press+release within ~1ms of entering s2idle (this started happening after plugging in an external monitor, presumably changes some internal SMC state). The original upstream code passes that straight to pm_wakeup_dev_event which wakes the system instantly. Fixed by skipping the first 2 button events after pm_prepare, real presses after that go through normally.
Other stuff:
Tested on M1 MacBook Air (J313), fairydust 6.18.10. Lid close/open, suspend, power button wake all working.