FreeBSD ACPI project

Introduction

The acpi driver provides support for the Intel/Microsoft/Compaq/Toshiba ACPI standard. This support includes platform hardware discovery (superseding the PnP and PCI BIOS), as well as power management (superseding APM) and other features. ACPI core support is provided by the ACPI-CA reference implementation from Intel.

Information on using and debugging ACPI can be found in the man page.

TODO

High Priority Tasks

Task

Responsible

Last updated

Priority

Notes

Save/Restore PCI capabilities lists and MSI config space

Nate Lawson

August 3, 2006

In progress

Investigate disabling the LAPIC timer when using ACPI C2-3 states. Otherwise, the system hangs and no timer interrupts occur while idle.

August 3, 2006

Not done

acpi_cpu — Finish work on CPU driver

_CST re-evaluation

Nate Lawson

December 4, 2004

Not done

Needs testing/debugging

Fix shared user of a P_BLK (refcount)

Nate Lawson

December 4, 2004

Not done

Disable acpi_cpu taking over idling if only C1 available

Nate Lawson

December 4, 2004

Not done

I still want to keep acpi_cpu in the loop on SMP systems so we should leave this as-is for now

eject methods — implement eject and dynamic reprobing of acpi namespace

Nate Lawson

December 4, 2004

Needs testing

Medium Priority Tasks

Task

Responsible

Last updated

Priority

Notes

Hotkey/backlight/sound generic driver -- Add a driver that generalizes the various device-specific ways of adjusting backlight, sound volume, hotkey support, etc. It should provide generic sysctls for these and attach to the hw-specific drivers (acpi_video, acpi_asus, acpi_toshiba, etc.)

Not done

Low Priority Tasks

Task

Responsible

Last updated

Priority

Notes

Implement X suspend/resume notification. Currently, the X server on FreeBSD is not notified of a suspend. We explicitly switch to a VTY on syscons before resume to get the server to save and then restore all the registers. This works for many systems but not if the display is left in less initialized at resume than the VTY switch code can handle. There is an interface (in the X server bsd_apm.c) for doing ioctls to find out about the suspend. First, check if this file is built on FreeBSD as it appears to only be built on NetBSD. Then implement the ioctls in both apm and acpi (on the apm compat device). Here is a patch to help the X file compile. For acpi, we do not want a user process dying to hold up the suspend process so implement the notification with a timeout. That is, if the kernel generates a APM_STANDBY_REQ notification and it doesn't receive a APM_IOC_STANDBY within say 5 seconds, continue the suspend process. This is needed for standby when X is not running, for instance, or when an emergency suspend is generated by a battery going critical.

Not done

Examine the two video resume hacks (int 0x10, lcall 0xc000). Linux has begun to test calling the "lcall" VESA reset after PCI devices (including the video card) have been fully resumed, including power state set to PS0. This works for many Radeon cards but fails for others. We could implement this in vm86 calls from a proper video driver resume method. Investigate integrate the techniques used by the Radeontool port in video resume.

Not done

ACPI-CA should really enable GPEs before calling \_WAK. Currently it does the opposite. This does not match the ACPI spec where \_WAK should be called after the system is up and running (\_BFS is what should be called as soon as possible after waking.)

Not done

Potential ASL bug: We may need to work around some systems having the S3 object listed under the LPC bus device (PNP0A03) instead of root (\). This is ACPI-CA's responsibility.

Not done

For systems that fail to power off, try using the suspend code (acpi_SetSleepState) instead.

Not done

See if we can enable EC access early even if an ECDT is not present. The _INI method for some ECs accesses the EC region even though _REG has not been called since the region is not initialized yet. It is likely that Windows hard-codes the EC resources and enables the region before initializing the device even though this is not allowed by the spec.

Not done

Implement reset register functionality for rebooting systems that lack a keyboard controller (see ACPI v2 FADT->ResetRegister).

Not done

Be sure not to try to disable ACPI on systems that do not have SMI_CMD or ACPI_ENABLE/DISABLE values in the FADT. The ia64 machines specify ACPI-only (no legacy mode) so they have 0 for these values and we should not enable/disable ACPI on them. Doing so gives a "failed to switch modes" warning but no real problems, apparently.

Not done

Check our implementation of AcpiOsDerivePciId(). It is probably not quite right. Compare against Linux.

Not done

Run instructions on cpu0 for suspend/resume. We currently do this for shutdown in kern_shutdown.c:boot(). This will also be required for SMP cpufreq drivers that set the frequency via a CPU-specific MSR.

Not done

Traverse local reference (scope) types in namespace when probing devices.

Not done

Implement support for _PRS/_SRS and dependent functions. This will allow serial port configuration to occur.

Not done

Add EC burst mode -- Code was written before to add burst mode to the EC. Unfortunately, it had to be disabled since it did not appear to work on all systems. Perhaps on some systems do not function correctly without burst mode, so it will be added back with some logic to fallback if it fails.

Not done

Intel firmware seems to describe the PCI root bridge where chipset configuration space lives with _STA=="0x8". The spec says this means "functional, but not present". The current code ignores things that are "not present" ( msg). It is suggested that this should be handled by not attaching a driver to the device (i.e. bridge) but probe its children. Present on Big Sur and Bull systems.

Not done

Re-work device wake setup to not be recursive. The acpi_wake_sysctl_walk() syscall has to call itself to handle child devices on other busses (PCI). This should probably be changed to be a DEVMETHOD.

Not done

device_power -- Add a "power" argument to devctl(8) that allows a device to be set into various low power or off states.

Not done

device_eject -- Add a devctl(8) program that has an "eject" argument. Allow users to eject various object names ("/dev/cdrom", "/mnt/flashdrive", "wi0", "pci0:2:0"). Call the appropriate _EJD and _EJx methods if appropriate.

Warner Losh, John Baldwin, and Takanori Watanabe

In progress

suspend to disk -- Implement a suspend/resume from disk mechanism. Possibly use the dump functions to dump pages to disk, then use ACPI to put the system in S4 or power-off. Resume would require changes to the loader to load the memory image directly and then begin executing again.

Not done

HP/Toshiba Satellite driver -- Enabling the extra one-touch/multimedia keys, console blanking, battery and temperature reporting, etc. Get an idea of what is needed from the Linux OMKE project

Not done

ASL capture bootable CD-R -- Build a set of scripts to generate a bootable CD-R. It should have a GENERIC kernel and acpidump/iasl as well as all support libraries. Replace init with a script such that booting the CD generates an acpidump -t -d > machine.asl and dmesg > machine.dmesg in an MFS partition. Then burn this info to a second track on the CD-R. This will make an easy way to take a batch of CDRWs to the local computer store, place them in the CDRW drive, boot FreeBSD and get the ASL.

Not done

ASL Explorer -- Graphical utility for examining the output of acpidump(8). Contact Nate Lawson for info about the design if you are interested in implementing this.

Not done

Document acpi kernel interfaces -- Document the interfaces for drivers found in acpivar.h.

Not done

KTR support for ACPI debug messages -- Use the KTR logging facility instead of printf for ACPI debugging messages. This would allow more verbose messages and fast dumping.

Not done

Add support for the real-time clock (RTC) to use to wake or power-on systems at a certain time of day.

Not done

Quiesce USB when no device is attached (see Linux UHCI) -- this would help such systems use C3 more, saving power with USB loaded. While at it, fix uhci suspend/resume.

Not done

Completed

Add methods to get/set ints acpi_EvaluateInteger only gets an int. Update api to get/set so that every consumer does not end up defining their own.

Mark Santcroos

Fix getenv_string. Does not seem to work in sys/dev/acpica/Osd/OsdTable.c. Turned out the name should not end in "_name".

Mark Santcroos and Peter Grehan

acpi_video manpage. See appendix B of the ACPI 2.0 spec for info on what this driver does as well as look at the sysctls it exports.

Mark Santcroos

fd0 not working on Intel boards. The floppy device did not work due to the _CRS object on some systems splitting the IO port into three 2 port resources (6 ports total). Fix committed to sys/isa/fd.c to work with this type of resource specification.

Nate Lawson and John Baldwin

Some BIOSs use 0x3f2-0x3f5 as the port range -- the real range is 0x3f0-0x3f5, 0x3f7. Workaround committed.

Warner Losh

ACPI Debugging Handbook Page -- Introduction to ACPI for new users as well as how to assist us in fixing problems as they arise.

Nate Lawson and Tom Rhodes

acpi_video driver (njl) -- Imported.

Nate Lawson and Taku YAMAMOTO (driver author)

BIOS blacklist -- implement a mechanism and specific quirks to disable features or ACPI entirely on known broken systems. If a custom DSDT is loaded, do not check it against the blacklist (since a user may fix the DSDT without changing the vendor/revision fields.) Add blacklist option for disabling acpi on certain systems.

Nate Lawson

acpi_toshiba man page -- Driver submitted by Hiroyuki Aizu and committed. All it needs is someone to try it out and document the sysctls.

Philip Paeps

Invalid PBLK length workaround -- Accept a PBLK of length 5 (spec says 6). Only enable C2 for this though. Some people may be using 7 to indicate another C3 state but we do not support the extra state.

Nate Lawson

Check EcSpacehandler to make sure it is correct for multi-byte access. Found off-by-one in that the last address (0xff) could never be written or read.

Pick a default MS OS to claim -- Too much ASL depends on a MS OS string so we should masquerade as the most accurate one. Picked Win2k™ ("Microsoft Windows NT™"), then reverted once _OSI support was available. ACPI-CA still has a default of "Microsoft Windows NT™".

Nate Lawson

Handle DPF resource types in acpi_pcib.c -- Some _PRS values are bracketed with start/end dependent function resource descriptors. Parse/skip them to fix PCI IRQ routing.

Nate Lawson

acpi_toshiba updates -- Implement support for DSSX which appears to be the only way to do display switching (other than acpi_video).

Nate Lawson

ASUS driver -- Driver for ASUS ACPI extras (hotkeys). Similar to the acpi4asus.sf.net Linux project.

Philip Paeps

Fix sysctls for debug layer/level -- setting from usermode via a sysctl did not work.

Nate Lawson

Make lid and sleep button sysctls default to min(supported_states) -- lid switch now defaults to NONE, sleep button to minimum sleep state available.

Nate Lawson

newbus attachments for cpu -- Get cpu devices under newbus so drivers like cpufreq can probe/attach.

Nate Lawson

Make CPU cx_lowest sysctl more readable -- Use C[1-9] instead of the index value.

Nate Lawson

Update EC GLK check -- Use the handle from the table to read _GLK instead of always defaulting to using the global lock.

Nate Lawson

Merge ECDT/EC probe

Nate Lawson

_INI methods -- run for all devices, not just Device objects. ACPI-CA now calls _INI for Devices, ThermalZones and Processors.

Fix acpidump failing on several systems -- acpidump(8) fails on some systems. I suspect this may be in how we search low memory for the RSDP. Changed to only search EBDA (1 KB pointed to by 16 bit pointer at 0x40E) and high memory (0xE0000 - 0xFFFFF) according to the spec (section 5.2.2).

Nate Lawson

Fix apm compat interface -- Hacked around this in the userland utility by marking values >= 255 as "unknown".

Nate Lawson

Update GPE code to handle general device wake -- Also, disable GPEs that are not valid when entering a new sleep state. Without this, GPEs for the lid left enabled on a Thinkpad™ X22 restart the system after power off. Add userland interface for enabling device wake (done as per-device sysctls).

Nate Lawson

Fix shutdown routines to not poke all the events (causes auto power on for some people). Workaround is to set hw.acpi.disable_on_poweroff="0". Now that GPEs are properly disabled based on _PRW during suspend and poweroff, we can hopefully remove the call to acpi_Disable() in the poweroff path. We now handle the reboot case also by hooking device_shutdown().

Nate Lawson

Cleanup acpidump/boot EBDA lengths.

Nate Lawson

Fix acpi_cpu busy refcount -- We no longer use a refcount but instead avoid doing any housekeeping after re-enabling interrupts at the end of acpi_cpu_idle(). Otherwise, the context switch after unmasking ints could disrupt device state.

Nate Lawson

Do not print an error message for _PR0 method -- If not present, do not print an error in switch_consumer.

Nate Lawson

acpi sysresource probing -- Probe/attach acpi resources in the acpi bus and then dole it out to children as necessary. Requires rman(9). Includes more sophisticated handling of device ordering in scan.

Nate Lawson

Update ACPI blacklist -- Read entries from various OS's and add them to our blacklist table.

Nate Lawson, Mark Santcroos

Fix general wake code -- remove use of device_t flags as they may collide with the driver. Use an acpi ivar instead. Fix for non-acpi devices as well by using a bus walk routine instead of device_suspend. Add code to turn on appropriate power resources. Disable EC in shutdown path.

Nate Lawson

Fix drivers and the apm compat interface -- Currently, the apm compat interface expects byte values but the ABI used is a set of u_ints and an int. Either the apm or acpi battery drivers (or both) are setting the value to -1, which results in 0xffffffff being passed back as the current state. Really, only 255 should be returned in this case. The apm userland utility marks values >= 255 as "unknown" to work around this. But really the underlying drivers should be fixed.

Warner Losh

Fix EC timeouts -- move to a sx lock to cover EcWait instead of a mutex so we can hold it across msleep. This fixed the timed out errors that occurred occasionally for some users.

Nate Lawson

Package all info on how to do an ACPI import -- done and handed off to Mark Santcroos for inclusion in the acpi projects website.

Nate Lawson

ACPI floppy driver probing -- Add a fdc_acpi_probe method to enumerate floppies using _FDE, _FDI methods.

Nate Lawson

Rework ACPI PCI link support -- _DIS all links, ignore invalid _CRS, ignore _STA, assume _SRS succeeds.

Nate Lawson

Fix EISA probe not to write to registers. Turns out an inb actually triggers the boot hang. Patch committed to only probe the first slot; however, this breaks the Adaptec VLB adapter (not EISA). Justin T. Gibbs is fixing that device's probe. Done.

Nate Lawson

Giant-free locking -- Remove dependency on Giant.

Nate Lawson

Add SSDT support to acpidump(8) -- Right now we only dump the fixed tables and DSDT. Change acpidump(8) to dump the SSDT tables. It currently concatenates them with the DSDT.

Marcel Moolenaar

Change shutdown path -- do not use smp_rendezvous() since it acquires a spinlock. Instead, MI code should run the shutdown path only on the BSP and all other processors should be halted.

Peter Wemm

Turn ACPI and PCI devices off or to a lower power state in suspend and back on again in resume. Override the default of D3 with the value the BIOS specifies in _SxD, if present. Skip serial devices (PNP05xx) since they seem to hang when set to D3 and may require special driver support. Also skip non-type 0 PCI devices (i.e., bridges) since they don't seem to handle being powered off.

Nate Lawson

Giant-free locking.

Nate Lawson

newbus attachments for cpu — get cpu devices under newbus so drivers like cpufreq can probe/attach.

Nate Lawson

Write initial drivers: ICH SpeedStep, ACPI performance, ACPI throttling, Enhanced SpeedStep, P4 TCC.

Nate Lawson

Add bus methods/ivars for child attachments to both acpi and legacy cpu devices

Nate Lawson

Design sysctl interface.

Nate Lawson

Design notify interface for Px changes.

Nate Lawson

Update power_profile to use cpufreq.

Nate Lawson

Import powerd.

Nate Lawson

Fujitsu driver -- Driver for Fujitsu laptop extras. Just needs to be cleaned up (use acpi_UserNotify instead of the signal stuff) and imported.

Mark Santcroos

IBM Thinkpad extras driver -- Driver for Thinkpad hotkeys.

Takanori Watanabe

Call _S0D on resume (power up?).

Nate Lawson

Implement the int 10h resume hack that Linux has since we do not have that yet. It is unclear how effective it is but some systems do require it.

Nate Lawson

Check our DWORD access to EC regions, including endianness. Currently, we treat DWORD access as little-endian, which makes sense on PCs. It's really not correct to do use access other than BYTE for EC space but some ASL uses DWORD. Also, we should test what happens for AnyAccess reads/writes to EC space since some ASL does this too. The existing implementation seems correct.

Nate Lawson

Implement passive cooling in ACPI thermal. It should use the cpufreq interface to cool the processor, based on the various _PSV settings. Also, we need to implement variable polling intervals for thermal zones based on both the passive settings and polling explicitly specified in the ASL.

Hajimu UMEMOTO

Fix stray irq 9 on reboot -- AcpiTerminate -> AcpiEvTerminate unhooks the SCI and then we get a stray irq. Debug why. Also, disable/ re-enable acpi gives "SCI already attached". Check flags for AcpiDisable vs. AcpiTerminate. This looks uncommon and does not cause any problems so it will be ignored for now.

Nate Lawson

Add smart battery support -- Smart batteries use the SMBus to communicate data instead of the embedded controller for control-method batteries. Newer ACER laptops have this and it will be needed for battery status on them. This is rather difficult since it involves interfacing with the SMBus drivers (likely need some kobj methods for this.)

Nate Lawson

References

Advanced Configuration and Power Interface Specification


CategoryProject

ACPI (last edited 2023-01-29T13:53:56+0000 by GrahamPerrin)