I've been trying to figure out how to get my GPD Pocket 3 to sleep properly.
I saw that currently, s2_idleis used, with a comment that when a commit makes it to the kernel, s3 should work.
I wanted to ask, was anything done to check that the kernel fix allows the GPD Pocket 3 specifically to sleep? I've tried "everything" on mine, including a newer kernel (5.17), and haven't had any luck.
Hi @bobobo1618, I have a Pocket 3, a Win Max 2020 (i5-1035G7), a Win Max 2021 Intel (i7-1195G7), and a Win Max 2021 AMD (Ryzen 7 4800U). I do testing for various distros.
The Intel GPD models have always done the same thing that the Pocket 3 currently does when suspending from S3 sleep.
The thing is, it already does sleep properly. The device has no issues under GNU/Linux to successfully S3 suspend. It also is able to resume out of S3 sleep. Everything resumes properly, except the internal display stays black.
If you plug in an external display into either the HDMI or USB-C port, it'll turn on properly and show your desktop. If you have sshd enabled, you should be able to remotely log into your machine. Audio works fine. You can still control the internal display's backlight after resuming from S3 sleep. You could even "use your computer blind" and bring up a terminal and type sudo reboot if you wanted to, and your machine would reboot normally.
To make things even worse, the Linux kernel thinks everything has resumed successfully... The logs show NO ERRORS at all....
Yes, setting sleep mode to s2idle in the kernelopts technically is better than nothing, but I wouldn't put it in any case or backpack while it's in S2 sleep. It'll eventually overheat...
And no, that commit didn't seem to work when I tried it in 5.18.0-rc2, and I really wish it had .
GPD's ACPI tables have always been a bit of a "black box" for the Linux kernel, unfortunately. To be fair, they built their machines purely to run Windows, and they contain all the things necessary to do that.
The most likely issue, as far as I can tell, is the I2C Lontium LT7911D converter that converts the DisplayPort output from the Intel Iris Xe graphics into the MIPI-DSI that the display panel then shows on your screen.
This chip is present in the 2021 Intel Win Max as well as the Pocket 3, which is why you get the black screen from S3 resume, but the kernel seems to think that everything has been resumed properly.
The original Win Max doesn't use this chip. It uses the TV080WUM-NL0, which the Linux kernel has had drivers for for quite a few years now...
I have looked in quite a few branches of the Linux kernel, and there doesn't seem to be any mention of the LT7911D in it at all (there are drivers for other Lontium chips, though). This means that potentially someone will have to write a driver from scratch, reverse-engineer the Windows driver, or someone at Lontium could "do the right thing" and submit their code to Linus' tree. That way, no Linux-based OS would have this issue ever again.
I'm pretty sure there's some sort of driver (or initialising code) in the BIOS, which is why it initialises properly from cold boot. But it then hands the display over to the Linux kernel (or Windows), which then takes care of the display functions, and Linux just has no idea what it even is, let alone how to reset it after waking from sleep...
The Windows drivers work fine, but they only come in binary format, not source code. If there was an accessible copy of the source code, it would take a week max to get a driver into the Mainline kernel, and problem solved.
What I have tried already:
Overriding the EDID for DSI-1 with the following EDIDs I dumped from working models:
GPD Win Max 2020 EDID:
edid-decode (hex):
00 ff ff ff ff ff ff 00 09 e5 03 00 03 00 00 00
01 1d 01 03 80 0b 11 78 2f 00 00 a0 57 49 9b 26
10 48 4f 00 00 00 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 c2 1a 20 50 30 00 10 50 10 10
32 00 6c ac 00 00 00 18 00 00 00 fc 00 54 56 30
38 30 57 55 4d 2d 4e 4c 30 0a 00 00 00 fd 00 3c
3c 10 10 07 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c3
----------------
Block 0, Base EDID:
EDID Structure Version & Revision: 1.3
Vendor & Product Identification:
Manufacturer: BOE
Model: 3
Serial Number: 3
Made in: week 1 of 2019
Basic Display Parameters & Features:
Digital display
Maximum image size: 11 cm x 17 cm
Gamma: 2.20
DPMS levels: Off
RGB color display
Default (sRGB) color space is primary color space
First detailed timing is the preferred timing
Supports GTF timings within operating range
Color Characteristics:
Red : 0.6250, 0.3398
Green: 0.2851, 0.6054
Blue : 0.1484, 0.0625
White: 0.2812, 0.3085
Established Timings I & II: none
Standard Timings: none
Detailed Timing Descriptors:
DTD 1: 800x1280 60.062 Hz 5:8 77.841 kHz 68.500 MHz (108 mm x 172 mm)
Hfront 16 Hsync 16 Hback 48 Hpol N
Vfront 3 Vsync 2 Vback 11 Vpol N
Display Product Name: 'TV080WUM-NL0'
Display Range Limits:
Monitor ranges (GTF): 60-60 Hz V, 16-16 kHz H, max dotclock 70 MHz
Empty Descriptor
Checksum: 0xc3
GPD Win Max 2021 AMD
edid-decode (hex):
00 ff ff ff ff ff ff 00 02 96 00 08 59 51 00 00
24 1f 01 03 a5 0b 11 78 3a f6 3d a3 55 4e 9e 27
0d 47 4a 21 08 00 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 bb 1a 20 50 30 00 10 50 10 10
84 00 20 00 35 00 00 1e 00 00 00 fe 00 4c 54 37
39 31 31 44 31 38 31 32 30 33 00 00 00 fd 00 18
50 14 64 0a 00 0a 20 20 20 20 20 20 00 00 00 fc
00 4c 54 37 39 31 31 44 0a 20 20 20 20 20 00 11
----------------
Block 0, Base EDID:
EDID Structure Version & Revision: 1.3
Vendor & Product Identification:
Manufacturer: @TV
Model: 2048
Serial Number: 20825
Made in: week 36 of 2021
Basic Display Parameters & Features:
Digital display
DFP 1.x compatible TMDS
Maximum image size: 11 cm x 17 cm
Gamma: 2.20
DPMS levels: Off
Undefined display color type
First detailed timing is the preferred timing
Color Characteristics:
Red : 0.6396, 0.3349
Green: 0.3056, 0.6191
Blue : 0.1523, 0.0537
White: 0.2802, 0.2900
Established Timings I & II:
DMT 0x04: 640x480 59.940 Hz 4:3 31.469 kHz 25.175 MHz
DMT 0x09: 800x600 60.317 Hz 4:3 37.879 kHz 40.000 MHz
DMT 0x10: 1024x768 60.004 Hz 4:3 48.363 kHz 65.000 MHz
Standard Timings: none
Detailed Timing Descriptors:
DTD 1: 800x1280 60.001 Hz 5:8 77.761 kHz 68.430 MHz (800 mm x 1280 mm)
Hfront 16 Hsync 16 Hback 48 Hpol P
Vfront 8 Vsync 4 Vback 4 Vpol P
Alphanumeric Data String: 'LT7911D181203'
Display Range Limits:
Monitor ranges (GTF): 24-80 Hz V, 20-100 kHz H, max dotclock 100 MHz
Display Product Name: 'LT7911D'
Checksum: 0x11
Using the EDID from the AMD Win Max did not work, which is surprising, because the AMD version of the Win Max can reinitialise the display from S3 sleep perfectly, and I assumed that the 2021 Win Max Intel had the same components...
What I am still trying, but with little success:
Patching the i915 drivers to reset the i2c pins one by one until the display turns back on. Essentially playing "russian roulette" with GPIO pins (obviously, don't do this unless you know what you're doing, and you don't care if you break your machine...)
Trying to find any kind of firmware/driver (even in source code) for the LT7911D.
So, unless you're interested in writing a driver and submitting a merge request (please please PLEASE go for it if you are ), you're just going to have to wait until someone commits a driver, unfortunately....
I hope I've explained this well enough, so that you know what's going on
I do remember that my Dell 9350 had issues not waking up the display after resume back in 2015/2016 when it was first released. It was soon fixed and it was the same story: suspend/resume works, just the display does not wake up because of some GPIO pin fiddling was required.
I was worried that Pocket3 is not as "simple" as this, because it looks like that Intel removed S3 support entirely and replaced with S0ix. However, Linux still indicates that Pocket3 has S3 support while S0ix is not there. So I am confused and really wish that the problem is only the screen resume.
In that case, if we had similar issue with laptops in 2015, why can't we do the same fix once again for this machine?
The repo containing that lt7911d.c file has a lot of missing links in it, so I’m still going through all of them. Haven’t had a successful build yet, but it’s only a matter of time.
An interesting thing about that driver is that it’s written as a camera module. But in any case, the reset pins are in the code, so it’s basically just trial and error from here on out.
There wouldn’t be. GPD appears to have connected it as an intermediary module between the GPU and the DSI panel. In a perfect world, the GPU would reset it properly (and the Windows drivers seem to do that, but I still have no idea why….), but not if the Linux kernel doesn’t know it’s actually there….
Hopefully this will help….
Oh brilliant!
Any chance of the verbose output of that?
(I have a nasty habit of purging Windows from my machines as soon as I get my hands on them….)
Maybe because it is connected directly to DSI interface without eDP to MIPI converter.
Also, apparently, intel DSI driver doesn't understand EDID. I was unable to pass binary dumped from windows to it.
Here is a full binary as base64 string since I can't attach binary files:
Changing the resolution, even to a non-standard one, does not produce the same black screen as when resuming from S3 sleep
You can turn the display off and on (even repeatedly over and over again), and it behaves normally, and doesn’t show the black screen
I could be wrong, though…
———
The ACPI tables do have some entries for things that the Linux kernel does not recognise, so there is a chance that one of those is the elusive reset that we’ve been looking for….
I've had 10 builds where lt7911d.c wasn't even touched, and I'm trying to get it included in the kernel. I also have another build where I'm trying to include it as a module.