Linux Power Management development
 help / color / mirror / Atom feed
From: Fourhundred Thecat <400thecat@ik.me>
To: Mario Limonciello <superm1@gmail.com>,
	Mario Limonciello <mario.limonciello@amd.com>,
	platform-driver-x86@vger.kernel.org
Cc: linux-pm@vger.kernel.org, Shyam-sundar.S-k@amd.com,
	hansg@kernel.org, ilpo.jarvinen@linux.intel.com,
	rafael@kernel.org
Subject: Re: [BUG] s2idle: unrecoverable sleep on ThinkPad P16s Gen 4 AMD, (Strix Point) when more than 16 logical CPUs are online
Date: Tue, 29 Sep 2026 07:57:26 +0200	[thread overview]
Message-ID: <edd73c8b-904e-077a-6e77-0348f4ca5aa7@ik.me> (raw)
In-Reply-To: <cbcb15b6-b576-a6be-f190-9014ec02a805@ik.me>

On 2026-09-29 07:43, Fourhundred Thecat wrote:
> On 2026-09-26 20:29, Mario Limonciello wrote:
>>> Captured acpidumps for all three configurations. Your hunch was right 
>>> that the IVRS table is still created with AmdVt disabled, but it is 
>>> not identical - and the difference looks like the actual mechanism.
>>
>> OK.  That makes a lot of sense for this issue now.
>>
>>>
>>> Summary, all with the IOMMU enabled and 24 CPUs online:
>>>
>>>    config          IVinfo      IVRS len   IVMDs   MSFT0201 in IVRS 
>>> MSFT0201 ACPI dev   SSDTs
>>>    both enabled    0x00203043  0x216      3       yes yes 
>>>                  29
>>>    AmdVt off       0x00203041  0x1F6      2       yes yes 
>>>                  29
>>>    Pluton off      0x00203043  0x216      3       yes NO 
>>>                  28
>>>
>>> AmdVt off changes two things. The IVinfo word loses bit 0x2, the 
>>> DmaRemap bit you already parse at offset 36. And the table is 32 
>>> bytes shorter because one IVMD disappears:
>>>
>>>    both enabled:
>>>      IVMD DeviceId=0060 Flags=07 Start=0x7D900000 Len=0x100000
>>>      IVMD DeviceId=C507 Flags=08 Start=0x6B400000 Len=0x20000
>>>      IVMD DeviceId=C100 Flags=08 Start=0x6B1F5000 Len=0x28000
>>>
>>>    AmdVt off:
>>>      IVMD DeviceId=C507 Flags=08 Start=0x6B400000 Len=0x20000
>>>      IVMD DeviceId=C100 Flags=08 Start=0x6B1F5000 Len=0x28000
>>>
>>> DeviceId 0x0060 is MSFT0201:
>>>
>>>    AMD-Vi: ivrs, add hid:MSFT0201, uid:1, rdevid:0x60
>>>
>>> and Flags 0x07 is unity mapped with read and write. So disabling AMD 
>>> virtualization removes Pluton's unity mapped DMA region from IVRS, 
>>> while the device is still declared in IVRS, still present as an ACPI 
>>> device, and still attached to iommu group 0:
>>>
>>>    platform MSFT0201:00: Adding to iommu group 0
>>>
>>> That would leave Pluton's DMA translated with nothing mapped for it, 
>>> which fits every observation: it only breaks with the IOMMU enabled, 
>>> amd_iommu=off is the only thing that fixes it, and neither 
>>> intremap=off nor iommu=pt helps, since iommu=pt gives other devices 
>>> identity domains but the IVMD is how firmware asks for one for this 
>>> device specifically.
>>>
>>> Pluton off is a different failure. The IVRS is byte identical to the 
>>> working case, IVMD 0060 included, but one SSDT is gone and with it 
>>> the MSFT0201 ACPI device. Your existing check already catches that 
>>> case correctly:
>>>
>>>    found_iommu=True  found_acpi=False
>>>    -> IOMMU is misconfigured: missing MSFT0201 ACPI device
>>>
>>> The AmdVt case is the one that slips through. In check_iommu():
>>>
>>>    if not found_ivrs_dmar and not found_ivrs_msft0201:
>>>
>>> with AmdVt off, found_ivrs_dmar is False because bit 0x2 is cleared, 
>>> but found_ivrs_msft0201 is True, so the and makes it pass and the 
>>> tool reports "IOMMU properly configured" on a machine that cannot be 
>>> woken.
>>>
>>> So to answer your question about keying off something else: yes, and 
>>> I think the signal is "IVRS declares an ACPI HID device but provides 
>>> no IVMD covering its device id". That needs no vendor attributes and 
>>> no DMI matching. The device id sits 3 bytes before the HID string in 
>>> the type 0xF0 entry, and IVMDs are subtable types 0x20/0x21/0x22 with 
>>> the device id at entry offset 4:
>>>
>>>    devid = struct.unpack_from("<H", data, data.find(b"MSFT0201") - 3)[0]
>>>    off = 48
>>>    while off + 4 <= len(data):
>>>        length = struct.unpack_from("<H", data, off + 2)[0]
>>>        if length == 0:
>>>            break
>>>        if data[off] in (0x20, 0x21, 0x22):
>>>            if struct.unpack_from("<H", data, off + 4)[0] == devid:
>>>                mapped = True
>>>                break
>>>        off += length
>>>
>>> I checked this against all three dumps: it reports mapped for both- 
>>> enabled and Pluton-off, and unmapped for AmdVt-off. Note that it 
>>> would contradict test_check_iommu_no_dma_protection_BUT_msft0201, 
>>> which currently asserts that MSFT0201 in IVRS is an acceptable 
>>> substitute for pre-boot DMA protection, so whether to change that 
>>> semantic is your call.
>>>
>>> I am happy to send you the three acpidumps, with the extracted and 
>>> disassembled tables and a record of the BIOS settings each was taken 
>>> under.
>>>
>>> Beyond that I have to stop here. This has taken the better part of a 
>>> week, a lot of forced power cycles, and around $700 in LLM tokens 
>>> working through it, and I am out of time and energy to take it 
>>> further. The machine works now with AMD virtualization and Pluton 
>>> enabled, which is a perfectly acceptable outcome for me.
>>>
>>> Everything I found is in this thread, and I hope the IVRS observation 
>>> is useful to you or to whoever picks it up. Thanks for the help 
>>> getting here - the amd-s2idle tool, the pointer to e9f850ba66cd, and 
>>> the suggestion to reset the BIOS were all what moved it forward.
>>>
>>>
>> I've opened up a PR that should hopefully adjust the tool against your 
>> failure cases.  Would you be able to confirm this against your system?
> 
> I am not able to test anything anymore. I have erased the debugging 
> setup that I had on my laptop, and reinstalled it clean. I no longer 
> have the claude history and the debugging tools. And I cannot do it 
> without claude (nothing we did made any sense to me)
> 
>> https://github.com/superm1/amd-debug-tools/pull/58
>>
>> If it doesn't work, can you please send me the acpidumps and I'll adjust.
> 
> but hopefully you can make sense of the attached  acpidumps
> 
> thank you,

looks like my previous email bounced because .tar.xz attachment
so I have uploaded the file here:

https://www.swisstransfer.com/dl/01a0ebbb-a094-725c-b9f1-8a8ba0d1da11

  reply	other threads:[~2026-09-29  5:57 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-22 13:43 [BUG] s2idle: unrecoverable sleep on ThinkPad P16s Gen 4 AMD, (Strix Point) when more than 16 logical CPUs are online Fourhundred Thecat
2026-09-22 14:47 ` Mario Limonciello
2026-09-23  5:58   ` Fourhundred Thecat
2026-09-23 12:41     ` Mario Limonciello
2026-09-23 13:51       ` Fourhundred Thecat
2026-09-23 14:36         ` Mario Limonciello
2026-09-23 16:12           ` Fourhundred Thecat
2026-09-23 16:15             ` Mario Limonciello
2026-09-23 16:20               ` Mario Limonciello
2026-09-23 16:37                 ` Fourhundred Thecat
2026-09-23 16:41                   ` Mario Limonciello
2026-09-23 16:54                     ` Fourhundred Thecat
2026-09-23 16:59                       ` Mario Limonciello
2026-09-23 18:02                         ` Fourhundred Thecat
2026-09-23 18:11                           ` Mario Limonciello
2026-09-23 18:14                             ` Fourhundred Thecat
2026-09-23 18:25                               ` Mario Limonciello
2026-09-23 18:39                                 ` Fourhundred Thecat
2026-09-23 18:57                                   ` Mario Limonciello
2026-09-23 19:13                                     ` Fourhundred Thecat
2026-09-23 19:20                                       ` Mario Limonciello
2026-09-23 20:26                                         ` Fourhundred Thecat
2026-09-23 20:48                                           ` Fourhundred Thecat
2026-09-23 21:10                                             ` Mario Limonciello
2026-09-24  5:36                                               ` Fourhundred Thecat
2026-09-25  7:05                                               ` Fourhundred Thecat
2026-09-25 13:30                                                 ` Mario Limonciello
2026-09-26  4:13                                                   ` Fourhundred Thecat
2026-09-26 18:29                                                     ` Mario Limonciello
2026-09-29  5:43                                                       ` Fourhundred Thecat
2026-09-29  5:57                                                         ` Fourhundred Thecat [this message]
2026-09-29 13:37                                                           ` Mario Limonciello

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=edd73c8b-904e-077a-6e77-0348f4ca5aa7@ik.me \
    --to=400thecat@ik.me \
    --cc=Shyam-sundar.S-k@amd.com \
    --cc=hansg@kernel.org \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=linux-pm@vger.kernel.org \
    --cc=mario.limonciello@amd.com \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=superm1@gmail.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox