# # Test to trigger periodically ACPI suspend and resume and periodically # trying to restart graphic driver, ps/2, ahci and nvme driver. # # Main test hardware so far: # - Lenovo X201 - resume of intel/display + AHCI + PS/2 working # - Lenovo T490 - resume of intel/display + NVME + PS/2 working + GPU # - Qemu - resume happens, vesa_fb_drv fails, ahci fails, nvme fails # # Not working: vesa_fb_drv nor boot_fb_drv after resume # Untested: all other drivers, e.g. nic, wifi, sd_card, usb ... all others # # UART via Intel AMT SOL is most the time not working after resume. Using # it may hang up the boot for unknown reasons. On X201 it must not be used to # get reliable resume results! However using PCMCIA serial card in X201 seems # ok. # # Thereby, by default serial output is disabled by this script for non Qemu. assert_spec x86 if { ![have_spec hw] && ![have_spec nova] } { puts "Platform is unsupported." exit 0 } if {[have_spec nova]} { # enable logmem to get kernel logs in memory proc kernel_output { } { return "novga logmem" } } # serial is not ever usable on hardware after resume, avoid hang by now if {![have_include "power_on/qemu"]} { # switch off serial device usage by kernel and core proc boot_output { } { return "" } } # non Intel machines have no GPU support, e.g. Qemu and AMD set board_non_intel [expr [have_include "power_on/qemu"]] set use_gpu_client 1 set use_gpe "no" set use_ahci 0 set use_nvme 0 proc priority_timer { } { return {priority="0"} } proc priority_base { } { return {priority="-1"} } proc priority_config { } { return {priority="-1"} } proc priority_gui { } { return {priority="-1"} } proc priority_wm { } { return {priority="-2"} } proc priority_log { } { return {priority="-2"} } proc priority_drivers { } { return {priority="-2"} } proc priority_scenario { } { return {priority="-3"} } proc display_config { } { global board_non_intel if {$board_non_intel} { return { } return $return_display } return { } } proc gui_config { } { set return_gui "" append return_gui { } return $return_gui } proc input_config { } { return { } } proc log_output { } { set return_log "" append return_log { } append_if [have_spec nova] return_log { } return $return_log } proc ahci_config { } { global use_ahci set return_ahci "" if {!$use_ahci} { return $return_ahci } append return_ahci { } append return_ahci { } return $return_ahci } proc nvme_config { } { global use_nvme set return_nvme "" if {!$use_nvme} { return $return_nvme } append return_nvme { } append return_nvme { } return $return_nvme } proc gpu_config { } { global board_non_intel if {$board_non_intel} return set return_gpu "" append return_gpu { } return $return_gpu } proc gpu_client { } { global board_non_intel global use_gpu_client if { $board_non_intel || !$use_gpu_client } return set return_gpu "" append return_gpu { } return $return_gpu } build { core timer init lib/ld server/report_rom server/dynamic_rom server/rom_filter drivers/acpi drivers/platform drivers/framebuffer/intel/pc drivers/framebuffer/vesa drivers/framebuffer/boot drivers/gpu/intel drivers/ahci drivers/nvme app/acpica app/pci_decode app/block_tester test/suspend } create_boot_directory import_from_depot [depot_user]/src/init \ [depot_user]/src/nitpicker \ [depot_user]/src/ps2_drv \ [depot_user]/pkg/themed_wm \ [depot_user]/pkg/terminal \ [depot_user]/src/terminal_log \ [depot_user]/src/event_filter \ [depot_user]/raw/drivers_interactive-pc \ [depot_user]/src/report_rom \ [depot_user]/src/dynamic_rom \ [depot_user]/src/nano3d \ [depot_user]/src/log_core if {$use_gpu_client} { import_from_depot [depot_user]/pkg/glmark2 } set config "" append config { } [ gpu_config] { } [ gui_config] { } [ log_output] { } [ gpu_client] { } [ ahci_config] { } [ nvme_config] { } [display_config] { } [input_config] { } install_config $config build_boot_image [build_artifacts] # qemu machine model q35 and multiple CPUs don't work with NOVA kernel # # src/lapic.cpp Acpi::delay(2) spins on PM_TMR forever # # According to qemu monitor "info mtree", # # address-space: I/O # 0000000000000000-000000000000ffff (prio 0, i/o): io # ... # 0000000000000600-000000000000067f (prio 0, i/o): ich9-pm # 0000000000000600-0000000000000603 (prio 0, i/o): acpi-evt # 0000000000000604-0000000000000605 (prio 0, i/o): acpi-cnt # 0000000000000608-000000000000060b (prio 0, i/o): acpi-tmr # 0000000000000620-000000000000062f (prio 0, i/o): acpi-gpe0 # 0000000000000630-0000000000000637 (prio 0, i/o): acpi-smi # 0000000000000660-000000000000067f (prio 0, i/o): sm-tco # # address-space: I/O # 0000000000000000-000000000000ffff (prio 0, i/o): io # 0000000000000000-0000000000000003 (prio 0, i/o): acpi-evt # 0000000000000004-0000000000000005 (prio 0, i/o): acpi-cnt # 0000000000000008-000000000000000b (prio 0, i/o): acpi-tmr # 0000000000000020-000000000000002f (prio 0, i/o): acpi-gpe0 # 0000000000000030-0000000000000037 (prio 0, i/o): acpi-smi # 0000000000000060-000000000000007f (prio 0, i/o): sm-tco # # the "ich9-pm" device behind/attached on a LPC PCI device # # ./hw/isa/lpc_ich9.c # ./hw/acpi/ich9.c: memory_region_init(&pm->io, OBJECT(lpc_pci), "ich9-pm", ICH9_PMIO_SIZE) # # is not at the right i/o space right location anymore. It seems that the # parent of ich9-pm stays disabled ... # # Further debugging shows: # # qemu/roms/seabios/src/resume.c s3_resume -> pci_resume # qemu/roms/seabios/src/fw/pciinit.c pci_resume # # In pci_resume the mmcfg and q35 and ich9-pm for PCIe is tried to be # re-enabled, but actually the calls never hit in Qemu. # It seems that mch_mmconfig_setup should use I/O PCI access in order to # enable MMIO PCI MMCFG access. # append qemu_args "-smp 1" if {[have_include "power_on/qemu"] && $use_ahci} { append qemu_args " -device ahci,id=ahci " append qemu_args " -drive id=disk,file=bin/ext2.raw,format=raw,if=none" append qemu_args " -device ide-hd,drive=disk,bus=ahci.0 " # # Build EXT2-file-system image # set mke2fs [installed_command mke2fs] set dd [installed_command dd] catch { exec $dd if=/dev/zero of=bin/ext2.raw bs=1M count=16 } catch { exec $mke2fs -F bin/ext2.raw } } if {[have_include "power_on/qemu"] && $use_nvme} { # # Create raw image # set dd [installed_command dd] catch { exec $dd if=/dev/zero of=bin/nvme.raw bs=1M count=32 } append qemu_args " -device pcie-root-port,id=root_port1 " append qemu_args " -drive id=nvme0,file=bin/nvme.raw,format=raw,if=none " append qemu_args " -device nvme,drive=nvme0,serial=fnord,id=nvme0n1,bus=root_port1 " } run_genode_until forever