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.

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(-)



Reply via email to