Skip to content

[WIP] LoongArch: Add ACPI compatibility for LPC I/O space reservation#19

Draft
elysia-best wants to merge 1 commit intoAOSC-Tracking:aosc/v6.18.4from
multiarchstore:aosc-6.18.4
Draft

[WIP] LoongArch: Add ACPI compatibility for LPC I/O space reservation#19
elysia-best wants to merge 1 commit intoAOSC-Tracking:aosc/v6.18.4from
multiarchstore:aosc-6.18.4

Conversation

@elysia-best
Copy link
Copy Markdown

@elysia-best elysia-best commented Jan 16, 2026

This patch adds essential compatibility support for ACPI-based systems running on older firmware. Some older computers with Kunlun firmware still rely on this mechanism and are unlikely to receive futher firmeware updates. This change ensures proper LPC I/O space reservation across for them.

@elysia-best elysia-best marked this pull request as draft January 16, 2026 12:47
@elysia-best elysia-best changed the title AOSCOS: LoongArch: Add ACPI compatibility for ISA I/O space reservation [WIP] LoongArch: Add ACPI compatibility for ISA I/O space reservation Jan 16, 2026
@MingcongBai
Copy link
Copy Markdown

Eww. This probably calls for a better (even DMI-specific) quirk...

pr_warn("Failed to allocate fwnode for legacy ISA\n");
return 0;
}
if (add_legacy_isa_io(fwnode, LOONGSON_LIO_BASE, ISA_IOSIZE)) {
Copy link
Copy Markdown

@xry111 xry111 Jan 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this patch can be merged as-is.

Both 7A1000 and 7A2000 manuals state that 0x18000000-0x1800ffff (64K) is for "LPC I/O", but this patch reserves 0x18000000-0x18003fff (16K). The only reference I can find about this 16K range is the 2K1000 ISA controller which is obviously unrelated to any desktop platform. The macro name ("ISA_IOSIZE") also seems something for 2K1000 now.

We need some detailed analysis of the issue and maybe some research on the ACPI specification.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, a fast search for ISA_IOSIZE shows that this marco was introduced in initial commits for LoongArch support at torvalds@7153c3c

It didn't explain why this marco should be 16K rather than 64K. Additionally, ISA_IOSIZE is also used in loongnix's patch for this issue. I agree that this issue needs more analysis :)

@elysia-best
Copy link
Copy Markdown
Author

Add a DMI check for my tested board. This list can be extended in the futuer if more boards need this workaround.

This patch adds essential compatibility support for ACPI-based systems running on older firmware. Many older computers with old firmware still rely on this mechanism and are unlikely to receive futher firmeware updates. This change ensures proper ISA I/O space reservation across for them.

Use DMI to judge if the system needs patching.

Signed-off-by: Yinan Qin <a.elysia@proton.me>
@xry111
Copy link
Copy Markdown

xry111 commented Jan 19, 2026

If the issue isn't limited to BPI system (i.e. also reproducible with the correct UEFI boot process) we expect to make the quirk upstream. Then don't use legacy_boot.c which is not upstream.

I think adding it to arch/loongarch/pci/pci.c as a PCI quirk against some 7A1000/2000 device (which one??1) would be better. Taking twinhead_reserve_killing_zone() in arch/x86/pci/fixup.c as an example.

Footnotes

  1. I considered 0014:7a0c (the LPC controller which is supposed to use this memory range) but it's not enabled on all of my systems (so the PCI enumeration doesn't find it at all). Now I'm actually wondering if the problem is that LPC controller is not really supported by your firmware but it mistakenly enables the controller. Would you kindly prove or disprove my guess by running lspci on your system?

@elysia-best
Copy link
Copy Markdown
Author

running lspci on your system?

Sure, here is the output for that

(ssh)elysia@elysia-loong64-pc [ linux@aosc-6.17.7 ] ! lspci -vvv -s "00:17.0"
00:17.0 ISA bridge: Loongson Technology LLC 2K2000 / 7A1000/2000 Chipset LPC Controller (rev 01)
        Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 255
        NUMA node: 0

@elysia-best
Copy link
Copy Markdown
Author

elysia-best commented Jan 20, 2026

P.S. Crash log using unpatched kernel is uploaded here panic.log

@MingcongBai
Copy link
Copy Markdown

If the issue isn't limited to BPI system (i.e. also reproducible with the correct UEFI boot process) we expect to make the quirk upstream. Then don't use legacy_boot.c which is not upstream.

I think adding it to arch/loongarch/pci/pci.c as a PCI quirk against some 7A1000/2000 device (which one??1) would be better. Taking twinhead_reserve_killing_zone() in arch/x86/pci/fixup.c as an example.

Footnotes

1. I considered 0014:7a0c (the LPC controller which is supposed to use this memory range) but it's not enabled on all of my systems (so the PCI enumeration doesn't find it at all).  Now I'm actually wondering if the problem is that LPC controller is not really supported by your firmware but it mistakenly enables the controller.  Would you kindly prove or disprove my guess by running lspci on your system? [↩](#user-content-fnref-1-51f062ee28523434e3552b4035399ba3)

Any update on this?

@xry111
Copy link
Copy Markdown

xry111 commented Feb 1, 2026

My guess is if the firmware enables LPC, it should describe how it requires this memory range in DSDT like

        Device (LPC)
        {
            Name (_ADR, 0x00170000)  // _ADR: Address (PCI device 17 function 0)
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                Memory32Fixed (ReadOnly,
                    0x18000000,         // Address Base
                    0x00010000,         // Address Length
                )
            })
        }

Are there any systems where LPC is enabled and AOSC can boot?

@elysia-best
Copy link
Copy Markdown
Author

elysia-best commented Feb 28, 2026

DSDT-ref.zip
DSDT.zip

Update: by using DSDT-ref, Linux 6.12.54 booted normally. Thus, I guess that there's something wrong with the configuration of IT8786 in DSDT, as the platform where DSDT-ref.zip was taken from did not have this chip.

Note: IT8786 is related to Device UAR1 to 3 and LPT, etc., in the original DSDT.

Edit 2026/3/1: By changing OperationRegion (ITE1, SystemIO, 0x2E, 0x02) to OperationRegion (ITE1, SystemMemory, 0x1800002E, 0x02),kernel booted normally. This is exactly what this patch have done :(

Edit 2026/3/25: Forgot to upload updated dsdt file.
DSDT-original-patch-systemio.zip

@xry111
Copy link
Copy Markdown

xry111 commented Feb 28, 2026

DSDT-ref.zip DSDT.zip

Update: by using DSDT-ref, Linux 6.12.54 booted normally. Thus, I guess that there's something wrong with the configuration of IT8786 in DSDT, as the platform where DSDT-ref.zip was taken from did not have this chip.

Note: IT8786 is related to Device UAR1 to 3 and LPT, etc., in the original DSDT.

We observed this on a 3B6000M board too. Its vendor claims the support of community distro is "value-added service" and so refuses to help.

@elysia-best elysia-best changed the title [WIP] LoongArch: Add ACPI compatibility for ISA I/O space reservation [WIP] LoongArch: Add ACPI compatibility for LPC I/O space reservation Mar 1, 2026
MingcongBai pushed a commit that referenced this pull request Mar 29, 2026
When running ./tools/testing/selftests/mm/split_huge_page_test multiple
times with /sys/kernel/mm/transparent_hugepage/shmem_enabled and
/sys/kernel/mm/transparent_hugepage/enabled set as always the following BUG
occurs:

[  232.728858] ------------[ cut here ]------------
[  232.729458] kernel BUG at mm/memory.c:2276!
[  232.729726] Oops: invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN PTI
[  232.730217] CPU: 19 UID: 60578 PID: 1497 Comm: llvmpipe-9 Not tainted 7.0.0-rc1mm-new+ #19 PREEMPT(lazy)
[  232.730855] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.17.0-9.fc43 06/10/2025
[  232.731360] RIP: 0010:walk_to_pmd+0x29e/0x3c0
[  232.731569] Code: d8 5b 5d 41 5c 41 5d 41 5e 41 5f c3 cc cc cc cc 48 89 ea 48 89 de 4c 89 f7 e8 ae 85 ff ff 85 c0 0f 84 1f fe ff ff 31 db eb d0 <0f> 0b 48 89 ea 48 89 de 4c 89 f7 e8 92 8b ff ff 85 c0 75 e8 48 b8
[  232.732614] RSP: 0000:ffff8881aa6ff9a8 EFLAGS: 00010282
[  232.732991] RAX: 8000000142e002e7 RBX: ffff8881433cae10 RCX: dffffc0000000000
[  232.733362] RDX: 0000000000000000 RSI: 00007fb47840b000 RDI: 8000000142e002e7
[  232.733801] RBP: 00007fb47840b000 R08: 0000000000000000 R09: 1ffff110354dff46
[  232.734168] R10: fffffbfff0cb921d R11: 00000000910da5ce R12: 1ffffffff0c1fcdd
[  232.734459] R13: 1ffffffff0c23f36 R14: ffff888171628040 R15: 0000000000000000
[  232.734861] FS:  00007fb4907f86c0(0000) GS:ffff888791f2c000(0000) knlGS:0000000000000000
[  232.735265] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  232.735548] CR2: 00007fb47840be00 CR3: 000000015e6dc000 CR4: 00000000000006f0
[  232.736031] Call Trace:
[  232.736273]  <TASK>
[  232.736500]  get_locked_pte+0x1f/0xa0
[  232.736878]  insert_pfn+0x9f/0x350
[  232.737190]  ? __pfx_pat_pagerange_is_ram+0x10/0x10
[  232.737614]  ? __pfx_insert_pfn+0x10/0x10
[  232.737990]  ? __pfx_css_rstat_updated+0x10/0x10
[  232.738281]  ? __pfx_pfn_modify_allowed+0x10/0x10
[  232.738552]  ? lookup_memtype+0x62/0x180
[  232.738761]  vmf_insert_pfn_prot+0x14b/0x340
[  232.739012]  ? __pfx_vmf_insert_pfn_prot+0x10/0x10
[  232.739247]  ? __pfx___might_resched+0x10/0x10
[  232.739475]  drm_gem_shmem_fault.cold+0x18/0x39
[  232.739677]  ? rcu_read_unlock+0x20/0x70
[  232.739882]  __do_fault+0x251/0x7b0
[  232.740028]  do_fault+0x6e1/0xc00
[  232.740167]  ? __lock_acquire+0x590/0xc40
[  232.740335]  handle_pte_fault+0x439/0x760
[  232.740498]  ? mtree_range_walk+0x252/0xae0
[  232.740669]  ? __pfx_handle_pte_fault+0x10/0x10
[  232.740899]  __handle_mm_fault+0xa02/0xf30
[  232.741066]  ? __pfx___handle_mm_fault+0x10/0x10
[  232.741255]  ? find_vma+0xa1/0x120
[  232.741403]  handle_mm_fault+0x2bf/0x8f0
[  232.741564]  do_user_addr_fault+0x2d3/0xed0
[  232.741736]  ? trace_page_fault_user+0x1bf/0x240
[  232.741969]  exc_page_fault+0x87/0x120
[  232.742124]  asm_exc_page_fault+0x26/0x30
[  232.742288] RIP: 0033:0x7fb4d73ed546
[  232.742441] Code: 66 41 0f 6f fb 66 44 0f 6d dc 66 44 0f 6f c6 66 41 0f 6d f1 66 0f 6c fc 66 45 0f 6c c1 66 44 0f 6f c9 66 0f 6d ca 66 0f db f0 <66> 0f df 04 08 66 44 0f 6c ca 66 45 0f db c2 66 44 0f df 10 66 44
[  232.743193] RSP: 002b:00007fb4907f68a0 EFLAGS: 00010206
[  232.743565] RAX: 00007fb47840aa00 RBX: 00007fb4d73ec070 RCX: 0000000000001400
[  232.743871] RDX: 0000000000002800 RSI: 0000000000003c00 RDI: 0000000000000001
[  232.744150] RBP: 0000000000000004 R08: 0000000000001400 R09: 00007fb4d73ec060
[  232.744433] R10: 000055f0261a4288 R11: 00007fb4c013da40 R12: 0000000000000008
[  232.744712] R13: 0000000000000000 R14: 4332322132212110 R15: 0000000000000004
[  232.746616]  </TASK>
[  232.746711] Modules linked in: nft_nat nft_masq veth bridge stp llc snd_seq_dummy snd_hrtimer snd_seq snd_seq_device snd_timer snd soundcore overlay rfkill nf_conntrack_netbios_ns nf_conntrack_broadcast nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables qrtr ppdev 9pnet_virtio 9pnet parport_pc i2c_piix4 netfs pcspkr parport i2c_smbus joydev sunrpc vfat fat loop dm_multipath nfnetlink vsock_loopback vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport zram lz4hc_compress vmw_vmci lz4_compress vsock e1000 bochs serio_raw ata_generic pata_acpi scsi_dh_rdac scsi_dh_emc scsi_dh_alua i2c_dev fuse qemu_fw_cfg
[  232.749308] ---[ end trace 0000000000000000 ]---
[  232.749507] RIP: 0010:walk_to_pmd+0x29e/0x3c0
[  232.749692] Code: d8 5b 5d 41 5c 41 5d 41 5e 41 5f c3 cc cc cc cc 48 89 ea 48 89 de 4c 89 f7 e8 ae 85 ff ff 85 c0 0f 84 1f fe ff ff 31 db eb d0 <0f> 0b 48 89 ea 48 89 de 4c 89 f7 e8 92 8b ff ff 85 c0 75 e8 48 b8
[  232.750428] RSP: 0000:ffff8881aa6ff9a8 EFLAGS: 00010282
[  232.750645] RAX: 8000000142e002e7 RBX: ffff8881433cae10 RCX: dffffc0000000000
[  232.750954] RDX: 0000000000000000 RSI: 00007fb47840b000 RDI: 8000000142e002e7
[  232.751232] RBP: 00007fb47840b000 R08: 0000000000000000 R09: 1ffff110354dff46
[  232.751514] R10: fffffbfff0cb921d R11: 00000000910da5ce R12: 1ffffffff0c1fcdd
[  232.751837] R13: 1ffffffff0c23f36 R14: ffff888171628040 R15: 0000000000000000
[  232.752124] FS:  00007fb4907f86c0(0000) GS:ffff888791f2c000(0000) knlGS:0000000000000000
[  232.752441] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  232.752674] CR2: 00007fb47840be00 CR3: 000000015e6dc000 CR4: 00000000000006f0
[  232.752983] Kernel panic - not syncing: Fatal exception
[  232.753510] Kernel Offset: disabled
[  232.754643] ---[ end Kernel panic - not syncing: Fatal exception ]---

This happens when two concurrent page faults occur within the same PMD range.
One fault installs a PMD mapping through vmf_insert_pfn_pmd(), while the other
attempts to install a PTE mapping via vmf_insert_pfn(). The bug is
triggered because a pmd_trans_huge is not expected when walking the page
table inside vmf_insert_pfn.

Avoid this race by adding a huge_fault callback to drm_gem_shmem_vm_ops so that
PMD-sized mappings are handled through the appropriate huge page fault path.

Fixes: 211b9a3 ("drm/shmem-helper: Map huge pages in fault handler")
Signed-off-by: Pedro Demarchi Gomes <pedrodemargomes@gmail.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Link: https://patch.msgid.link/20260319015224.46896-1-pedrodemargomes@gmail.com
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants