[TRACKING] Framework AMD Ryzen 7040 Series lid wakeup behavior feedback

FYI the s2idle script does some stuff that will help you decode them.

On FW16 it should be these:

2024-06-28 11:48:52,936 DEBUG:	I2C HID devices
2024-06-28 11:48:52,936 DEBUG:	| "PIXA3854:00 093A:0274 Mouse" [PIXA3854] : \_SB_.I2CD.TPAD
2024-06-28 11:48:52,936 DEBUG:	└─"PIXA3854:00 093A:0274 Touchpad" [PIXA3854] : \_SB_.I2CD.TPAD
1 Like

I suppose one solution is to add a script that during wakeup, if the lid is closed, make it go back to sleep again immediately.
Suspend is a difficult animal to deal with, because there are so many different use cases. One solution will not suit everyone. So, some people would want to use this script, and some would not.
My use case is simple. I would be happy if the only thing that woke up the laptop was me pressing the power button.
There is also the use case where I have plugged in external keyboard, mouse, screen and wish the laptop to stay powered on with the lid closed. But, one cannot get at the laptop power button with the lid closed so that use case is a problem to start with.

Name one use case where I would want to wake my laptop from sleep using the internal track pad while the lid is closed.

related: XKCD 1172

Edit: no, I do not think squeeze to wake counts.

4 Likes

Well, one could probably write a script to disable the keyboard and touchpad when going into suspend, leaving only the power button left to wake up, and then have a script on wakeup to enable the keyboard and touchpad.
For Linux, there is a feature called “unbind” and “bind” that can be used to obtain the above functionality.
E.g. the following stops the keyboard working for 5 seconds (tested on a FW16):

echo 1-4 >/sys/bus/usb/drivers/usb/unbind; sleep 5; echo 1-4 >/sys/bus/usb/drivers/usb/bind

The following stops the mouse working for 5 seconds (tested on a FW16)
echo AMDI0010:03 >/sys/bus/platform/drivers/i2c_designware/unbind; sleep 5; echo AMDI0010:03 >/sys/bus/platform/drivers/i2c_designware/bind

The following script disables the keyboard and trackpad during suspend on a FW16.
You can wake up the laptop by pressing the power key.
I tested by clicking on: “Power icon” → suspend.

Here is a script to do it:
Create the file: /usr/lib/systemd/system-sleep/keyboard-mouse-disable-sleep

#!/bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin

case "$1" in
	pre)	echo AMDI0010:03 >/sys/bus/platform/drivers/i2c_designware/unbind
		echo 1-4 >/sys/bus/usb/drivers/usb/unbind
		exit 0
		;;
	post)	echo AMDI0010:03 >/sys/bus/platform/drivers/i2c_designware/bind
		echo 1-4 >/sys/bus/usb/drivers/usb/bind
		exit 0
		;;
 	*)	exit 1
		;;
esac

Note: The script is not perfect. It leaves the lights on on the keyboard during suspend, so uses 5W during suspend instead of the normal 2W. I will add the turning the lights off, when I find out how.

You can turn off the USB wakeup files for keyboard and I2C wakeup files for trackpad and it can block them from waking the system.

But I personally feel this is something the EC should be doing when the lid is closed to not let any events go through.

1 Like

How can you make the laptop, when suspended NOT to wake up when a key is pressed regardless of whether the lid is closed or not

on windows: you can disable that in the settings
on Linux: it can be disabled in config files, try to follow the advice by @Mario_Limonciello.

I have done a script in a previous post above that I view as a workaround.
I.e. it disables the Keyboard and Trackpad during sleep, so that neither can wake from sleep.
For me, it is a good work around until the a firmware update can fix this.

This is a bit of overkill IMO; you should just be able to change the power/wakeup sysfs file for applicable USB and I2C devices, which can then be done with a udev rule instead of a script.

https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-power#:~:text=The%20%2Fsys%2Fdevices%2F...%2Fpower%2Fwakeup%20attribute%20allows%20the%20user%20space%20to,or%20disable%20it%20to%20do%20that%20as%20desired.

True, that is another way of doing it:
E.g. For the FW16

echo disabled > /sys/devices/pci0000:00/0000:00:08.1/0000:c1:00.3/usb1/1-4/1-4.3/power/wakeup
echo disabled > /sys/devices/platform/AMDI0010:03/i2c-1/i2c-PIXA3854:00/power/wakeup

I don’t think it’s an overkill since if you can press a key or touchpad, you can press the power button. Disabling the keyboard and touchpad on suspend regardless of whether the lid is closed allows further power saving.

1 Like

But fully disabling vs disabling wakeup is my point. Just turn off wakeup and it can be done with a udev rule.

1 Like

Here are some of the things that can wakeup from sleep, there are others also.

Keyboard (when pressed):
echo disabled > /sys/devices/pci0000:00/0000:00:08.1/0000:c1:00.3/usb1/1-4/1-4.3/power/wakeup
Touchpad (when pressed):
echo disabled > /sys/devices/platform/AMDI0010:03/i2c-1/i2c-PIXA3854:00/power/wakeup
Power button (when pressed):
echo disabled >/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/power/wakeup
LID (when opening):
echo disabled >/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/PNP0C09:00/PNP0C0D:00/power/wakeup
BATTERY (when low on charge):
echo disabled >/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:4b/PNP0C0A:00/power/wakeup

I guess the purpose of the BATTERY one is if one has suspended and sleeping and the battery gets too low to sustain it, it should really wake up and hibernate.
But if the hibernate is not working, it will just wake up and maybe get hot.

My preference that I would use is disable the Keyboard, Touchpad and LID open, leaving me to use the power button if I wish it to wake up.
At least this way, when I open the lid, and it is already awake, I know something must have gone wrong.

1 Like

For anyone interested:
Udev rules to disable keyboard and trackpad messing with stuff:

ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="32ac", ATTRS{idProduct}=="0012", ATTR{power/wakeup}="disabled", ATTR{driver/1-1.1.1.4/power/wakeup}="disabled"
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="32ac", ATTRS{idProduct}=="0014", ATTR{power/wakeup}="disabled", ATTR{driver/1-1.1.1.4/power/wakeup}="disabled"

you can figure out your device ids using lsusb and grep/less

However I still have not figured out a udev rule for the trackpad. This is how far I have gotten so far:

ACTION=="add", SUBSYSTEM=="i2c", DRIVERS=="i2c_hid_acpi", ATTRS{ID_INPUT_TOUCHPAD}=="1", ATTRS{ID_INPUT_TOUCHPAD}=="1", ATTR{power/wakeup}="disabled", ATTR{driver/1-1.1.1.4/power/wakeup}="disabled"

feel free to point out the error in this.

6 Likes

But at least disabling keyboard wake seems to be good enough to not have it wake in my backpack.

2 Likes

Is there a timeline for this being resolved for good in firmware?

Because this proposed workaround is causing other issues.

1 Like

Wow what a saga with this one since October 2023. A lot of good investigative work! This seems like it might be ideally setup as a future design specification with criteria like when lid is closed the laptop cannot be woken up by onboard input devices. My FW13 AMD is very new to me so I hadn’t yet uncovered any of this behavior myself. It would be nice to see this fixed in the firmware.

Yes! We are in the process of releasing a bios update for AMD 13in Ryzen 7040 where this is going to be fixed! We found there was some BIOS code that was running on wake up causing this issue and it was finally root caused a few weeks ago, and we have a fix!

11 Likes

Will there be a BIOS fix for the FW16 too?

5 Likes