On 5/6/25 5:58 PM, Eric Auger wrote:
> Hi Gustavo,
>
> On 5/5/25 3:26 PM, Gustavo Romero wrote:
>> Hi Eric,
>>
>> On 4/28/25 07:25, Eric Auger wrote:
>>> This series enables APCI PCI hotplug/hotunplug on ARM
>>> and makes it default for 10.1 machine type. This aligns with
>>> x86 q35 machine. Expected benefits should be similar to
>>> those listed in [1].
>>>
>>> The infrastructure used in x86 is heavily reused and a
>>> huge part of the series consists in moving code from
>>> hw/i386/acpi-build.c to a generic place and slightly
>>> adapting it to make it usable on ARM. The DSDT table is
>>> augmented to support ACPI PCI hotplug elements.
>>>
>>> On ARM we use use a GED event to notify the OS about
>>> hotplug events.
>>>
>>> I have not noticed any tests/qtest/bios-tables-test failures
>>> neither on x86 nor ARM. x86 DSDT table has not changed.
>>> ARM DSDT table definitively has but there are no tests
>>> impacted. ARM misses hotplug tests that do exist on x86. This
>>> most probably should be considered in the future.
>>>
>>> Best Regards
>>>
>>> Eric
>>>
>>> This series can be found at:
>>> https://github.com/eauger/qemu/tree/arm-acpi-pcihp-rfc
>>>
>>> [1] [PATCH v6 0/6] Use ACPI PCI hot-plug for Q35
>>> https://lore.kernel.org/all/20210713004205.775386-1-jus...@redhat.com/
>>
>> I've just started to review your series and went to a quick smoke test
>> by hotplugging a net adapter and got the following kernel internal error:
>>
>> (qemu) device_add virtio-net-pci,bus=pcie.1,addr=0,id=na
>> (qemu) [ 64.165411] pci 0000:01:00.0: [1af4:1041] type 00 class
>> 0x020000
>> [ 64.165895] pci 0000:01:00.0: reg 0x14: [mem 0x00000000-0x00000fff]
>> [ 64.166259] pci 0000:01:00.0: reg 0x20: [mem 0x00000000-0x00003fff
>> 64bit pref]
>> [ 64.166658] pci 0000:01:00.0: reg 0x30: [mem 0x00000000-0x0003ffff
>> pref]
>> [ 64.167153] pci 0000:01:00.0: enabling Extended Tags
>> [ 64.179972] Internal error: synchronous external abort:
>> 0000000096000050 [#1] SMP
>> [ 64.180719] Modules linked in: aes_ce_blk aes_ce_cipher polyval_ce
>> polyval_generic ghash_ce gf128mul sha2_ce binfmt_misc sha256_arm64
>> sha1_ce nls_ascii nls_cp437 vfat fat evdev cfg80211 rfkill loop fuse
>> efi_pstore drm dm_mod dax configfs efivarfs qemu_fw_cfg ip_tables
>> x_tables autofs4 ext4 crc16 mbcache jbd2 crc32c_generic virtio_scsi
>> virtio_net scsi_mod net_failover failover virtio_blk scsi_common
>> crct10dif_ce crct10dif_common virtio_pci virtio_pci_legacy_dev
>> virtio_pci_modern_dev virtio_mmio
>> [ 64.183656] CPU: 0 PID: 23 Comm: kworker/u2:1 Not tainted
>> 6.1.0-30-arm64 #1 Debian 6.1.124-1
>> [ 64.184071] Hardware name: QEMU QEMU Virtual Machine, BIOS
>> edk2-stable202408-prebuilt.qemu.org 08/13/2024
>> [ 64.184759] Workqueue: kacpi_hotplug acpi_hotplug_work_fn
>> [ 64.185320] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS
>> BTYPE=--)
>> [ 64.185737] pc : acpi_ex_system_memory_space_handler+0x290/0x300
>> [ 64.186175] lr : acpi_ev_address_space_dispatch+0x124/0x334
>> [ 64.186490] sp : ffff80000a6bb3b0
>> [ 64.186663] x29: ffff80000a6bb3b0 x28: ffff0003fcbb08b8 x27:
>> 0000000000000000
>> [ 64.187126] x26: ffff0003fcbb0288 x25: ffff80000a6bb568 x24:
>> 0000000000000001
>> [ 64.187499] x23: ffff80000a6bb568 x22: 0000000000000004 x21:
>> ffff0000c206cb00
>> [ 64.187885] x20: 00000000090c0014 x19: 0000000000000020 x18:
>> 0000000000000000
>> [ 64.188265] x17: 0000000000000000 x16: 0000000000000000 x15:
>> 0000000000000000
>> [ 64.188640] x14: 0000000000000000 x13: 4d43c3194dea1791 x12:
>> 4d7a3553e5c937d0
>> [ 64.189003] x11: 0000000000000001 x10: 0000000000000000 x9 :
>> ffff800008735b34
>> [ 64.189383] x8 : 0000000000000001 x7 : ffff80000873c850 x6 :
>> 00000000000000f8
>> [ 64.189778] x5 : ffff0000c206cb00 x4 : 0000000000000000 x3 :
>> 00000000090c0018
>> [ 64.190163] x2 : ffff80000a9af014 x1 : 00000000090c0018 x0 :
>> 0000000000000001
>> [ 64.190734] Call trace:
>> [ 64.191086] acpi_ex_system_memory_space_handler+0x290/0x300
>> [ 64.191696] acpi_ev_address_space_dispatch+0x124/0x334
>> [ 64.192042] acpi_ex_access_region+0xe4/0x2e0
>> [ 64.192287] acpi_ex_field_datum_io+0x88/0x200
>> [ 64.192509] acpi_ex_write_with_update_rule+0xd4/0x120
>> [ 64.192793] acpi_ex_insert_into_field+0x210/0x2b0
>> [ 64.193048] acpi_ex_write_data_to_field+0xa0/0x190
>> [ 64.193298] acpi_ex_store_object_to_node+0x150/0x240
>> [ 64.193527] acpi_ex_store+0x144/0x300
>> [ 64.193726] acpi_ex_opcode_1A_1T_1R+0x218/0x580
>> [ 64.193971] acpi_ds_exec_end_op+0x24c/0x4b0
>> [ 64.194227] acpi_ps_parse_loop+0x100/0x6a0
>> [ 64.194477] acpi_ps_parse_aml+0x94/0x3b0
>> [ 64.194674] acpi_ps_execute_method+0x128/0x25c
>> [ 64.194922] acpi_ns_evaluate+0x1f0/0x2d0
>> [ 64.195148] acpi_evaluate_object+0x138/0x2d0
>> [ 64.195380] acpi_evaluate_dsm+0xb8/0x134
>> [ 64.195613] acpi_check_dsm+0x34/0xdc
>> [ 64.195822] smbios_attr_is_visible+0x5c/0xb0
>> [ 64.196089] internal_create_group+0xd0/0x3d0
>> [ 64.196335] internal_create_groups+0x58/0xe0
>> [ 64.196584] sysfs_create_groups+0x20/0x30
>> [ 64.196813] device_add_groups+0x18/0x2c
>> [ 64.197039] bus_add_device+0x48/0x160
>> [ 64.197260] device_add+0x3a4/0x85c
>> [ 64.197463] pci_device_add+0x308/0x660
>> [ 64.197680] pci_scan_single_device+0xe4/0x114
>> [ 64.197941] pci_scan_slot+0x70/0x1fc
>> [ 64.198155] acpiphp_rescan_slot+0x90/0xa4
>> [ 64.198366] acpiphp_hotplug_notify+0x2a8/0x300
>> [ 64.198584] acpi_device_hotplug+0x138/0x4c0
>> [ 64.198819] acpi_hotplug_work_fn+0x2c/0x4c
>> [ 64.199045] process_one_work+0x1f4/0x460
>> [ 64.199277] worker_thread+0x188/0x4e0
>> [ 64.199492] kthread+0xe0/0xe4
>> [ 64.199671] ret_from_fork+0x10/0x20
>> [ 64.200114] Code: f90002e0 52800000 17ffff97 f94002e0 (b9000040)
>> [ 64.200820] ---[ end trace 0000000000000000 ]---
>>
>> (qemu)
>>
>> This is a Debian Bookworm stock kernel 6.1. I built QEMU from your GH
>> branch.
>>
>> The machine was started with:
>>
>> ./qemu-system-aarch64 -m 16G -nographic -machine
>> type=virt,gic-version=max -cpu cortex-a57 -initrd
>> /mnt/initrd.img-6.1.0-30-arm64 -kernel /mnt/vmlinuz-6.1.0-30-arm64
>> -append "root=/dev/vda1 console=ttyAMA0,115200 acpi=force" -device
>> virtio-scsi-pci -device virtio-blk-pci,drive=root -drive
>> if=none,id=root,file=/mnt/debian-12-nocloud-arm64.qcow2 -device
>> pcie-root-port,id=pcie.1,chassis=1,slot=1 -bios
>> ./pc-bios/edk2-aarch64-code.fd
>>
>> ./pc-bios/edk2-aarch64-code.fd is the one found under ./build dir, so
>> nothing special.
>
> I have just tested debian-12-nocloud-arm64.qcow2 which features
> 6.1.0-34-arm64 + edk2-aarch64-code.fd and I am able to
> hotplug/hot-unplug the virtio-net-pci device. Can you retry without
>
> -initrd /mnt/initrd.img-6.1.0-30-arm64 -kernel
> /mnt/vmlinuz-6.1.0-30-arm64 -append "root=/dev/vda1
> console=ttyAMA0,115200 acpi=force" ?
Also tried with an upstream kernel 6.15-rc3 and it works for me:
/home/augere/UPSTREAM/acpipcihp-qemu/build/qemu-system-aarch64 -M
virt,acpi-pcihp=on,gic-version=host -cpu max -smp 8 -m
16G,maxmem=32G,slots=3 -display none --enable-kvm -serial
tcp:localhost:4444,server -device
pcie-root-port,bus=pcie.0,chassis=1,id=pcie.1,addr=0x2.0x0 -device
pcie-root-port,bus=pcie.0,chassis=2,id=pcie.2,addr=0x3.0x0 -device
pcie-root-port,bus=pcie.0,chassis=3,id=pcie.3,addr=0x4.0x0 -device
pcie-root-port,bus=pcie.0,chassis=4,id=pcie.4,addr=0x5.0x0 -device
pcie-root-port,bus=pcie.0,chassis=5,id=pcie.5,addr=0x6.0x0 -netdev
tap,id=nic1,script=/home/augere/TEST/SCRIPTS/qemu-ifup,downscript=/home/augere/TEST/SCRIPTS/qemu-ifdown
-qmp unix:/home/augere/TEST/QEMU/qmp-sock,server,nowait -drive
file=/home/nfs_vm/UEFI/edk2-aarch64-code.fd,if=pflash,format=raw,unit=0,readonly=on
-drive file=/home/nfs_vm/UEFI/vars,if=pflash,format=raw,unit=1 -device
virtio-blk-pci,bus=pcie.4,drive=drv0,id=virtio-disk0,bootindex=1,werror=stop,rerror=stop
-drive
file=/home/nfs_vm/IMAGES/aarch64/debian-12-nocloud-arm64.qcow2,format=qcow2,if=none,cache=writethrough,id=drv0
-kernel /home/nfs_vm/BOOT/aarch64/vmlinuz-6.15.0-rc3-acpi-hp-guest+
-initrd /home/nfs_vm/BOOT/aarch64/initrd.img-6.15.0-rc3-acpi-hp-guest+
-append 'root=/dev/vda1 console=ttyAMA0,115200 acpi=force earlyprintk
iommu.strict=no acpi=force' -net none -d guest_errors
(QEMU) device_add driver=virtio-net-pci bus=pcie.1 netdev=nic1
mac=6a:f5:10:b1:3d:d3 id=net
Cheers
Eric
>
> Cheers
>
> Eric
>>
>> It seems Linux acpi crashed when ingesting the _DSM method but I could
>> not
>> figure out what exactly in it could cause it.
>>
>>
>> Cheers,
>> Gustavo
>>
>>>
>>> Eric Auger (24):
>>> hw/pci/pcie_port: Fix pcie_slot_is_hotpluggbale_bus typo
>>> hw/acpi/ged: Fix wrong identation
>>> hw/i386/acpi-build: Fix build_append_notfication_callback typo
>>> hw/i386/acpi-build: Make aml_pci_device_dsm() static
>>> hw/arm/virt: Introduce machine state acpi pcihp flags and props
>>> hw/acpi: Rename and move build_x86_acpi_pci_hotplug to pcihp
>>> hw/pci-host/gpex-acpi: Add native_pci_hotplug arg to
>>> acpi_dsdt_add_pci_osc
>>> hw/pci-host/gpex-acpi: Split host bridge OSC and DSM generation
>>> hw/pci-host/gpex-acpi: Propagate hotplug type info from virt machine
>>> downto gpex
>>> hw/i386/acpi-build: Turn build_q35_osc_method into a generic method
>>> hw/pci-host/gpex-acpi: Use build_pci_host_bridge_osc_method
>>> hw/i386/acpi-build: Introduce build_append_pcihp_resources() helper
>>> hw/acpi/pcihp: Add an AmlRegionSpace arg to build_acpi_pci_hotplug
>>> hw/i386/acpi-build: Move build_append_notification_callback to pcihp
>>> hw/i386/acpi-build: Move remaining pcihp generic functions to pcihp
>>> hw/i386/acpi-build: Introduce and use acpi_get_pci_host
>>> hw/arm/virt-acpi-build: Add DSDT additions for PCI hotplug
>>> hw/acpi/ged: Prepare the device to react to PCI hotplug events
>>> hw/acpi/ged: Call pcihp plug callbacks in hotplug handler
>>> implementation
>>> hw/acpi/ged: Support migration of AcpiPciHpState
>>> hw/core/sysbus: Introduce sysbus_mmio_map_name() helper
>>> hw/arm/virt: Let virt support pci hotplug/unplug GED event
>>> hw/arm/virt: Plug pcihp hotplug/hotunplug callbacks
>>> hw/arm/virt: Use ACPI PCI hotplug by default
>>>
>>> hw/i386/acpi-build.h | 4 -
>>> include/hw/acpi/aml-build.h | 2 +
>>> include/hw/acpi/generic_event_device.h | 5 +
>>> include/hw/acpi/pci.h | 4 +-
>>> include/hw/acpi/pcihp.h | 14 +
>>> include/hw/arm/virt.h | 4 +
>>> include/hw/pci-host/gpex.h | 1 +
>>> include/hw/sysbus.h | 1 +
>>> hw/acpi/aml-build.c | 50 +++
>>> hw/acpi/generic_event_device.c | 64 +++-
>>> hw/acpi/pci.c | 20 ++
>>> hw/acpi/pcihp.c | 428 +++++++++++++++++++++-
>>> hw/arm/virt-acpi-build.c | 26 ++
>>> hw/arm/virt.c | 100 +++++-
>>> hw/core/sysbus.c | 11 +
>>> hw/i386/acpi-build.c | 475 +------------------------
>>> hw/pci-host/gpex-acpi.c | 75 +---
>>> hw/pci/pcie_port.c | 4 +-
>>> hw/arm/Kconfig | 2 +
>>> 19 files changed, 748 insertions(+), 542 deletions(-)
>>>
>>
>