summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica
Commit message (Collapse)AuthorAgeFilesLines
...
* Despite several examples in the kernel, the third argument ofdwmalone2007-06-041-1/+1
| | | | | | | | | | | | | sysctl_handle_int is not sizeof the int type you want to export. The type must always be an int or an unsigned int. Remove the instances where a sizeof(variable) is passed to stop people accidently cut and pasting these examples. In a few places this was sysctl_handle_int was being used on 64 bit types, which would truncate the value to be exported. In these cases use sysctl_handle_quad to export them and change the format to Q so that sysctl(1) can still print them.
* Disable CPU idle states during suspend and reenable them during resume.njl2007-06-031-2/+29
| | | | | | | | | | While in the suspend path, this means the idle thread will just return immediately rather than trying to enter C1-n. This helps in the case where the chipset is powered down before the rest of the system and reads from the cpu sleep registers begin returning immediately, causing the logic that catches bad C2/C3 behavior to kick in. Observed on my Panasonic Y4. MFC after: 3 days
* Fix a bug introduced in the per-CPU Cx states commit. The wrong loop varnjl2007-06-021-30/+27
| | | | | | | | (j/i) was being used and it was being incremented, not decremented as before. Factor out this code into a common function and call it from both the common and per-CPU case. MFC after: 1 day
* AcpiAcquireGlobalLock() can sometimes sleep if the mutex is contested.njl2007-06-021-13/+10
| | | | | | | | | | | | | | | | The global lock is a memory region shared with the BIOS and thus has some strange behavior like the fact that the sleep is 1 ms max. We use standard mutexes to synchronize with the SCI so acquiring the global lock after locking the mutex resulted in a witness warning. To deal with this for now, acquire the global lock before all other locks, similar to Giant. This should fix the witness "sleeping with mutex held" issue on boot that occurred after the last ACPI-CA import. In the future, we hope to move to the new mutex interface in ACPI-CA instead of the pseudo-semaphore version we have now. Reviewed by: jkim
* Use ACPICA defined value for notification rather than locally defined one.takawata2007-05-311-8/+3
|
* Remove "acpi_bus_number: can't get _ADR" message. It usually appears asnjl2007-05-311-10/+7
| | | | | | | we traverse \_SB and \ in the namespace, which won't have _ADR anyway. Use a proper extern instead of our own private copy. MFC after: 1 week
* Add a sysctl, 'debug.acpi.suspend_bounce', that causes the system to bouncenjl2007-05-251-0/+8
| | | | | | | | | back in a simulated resume instead of entering the requested suspend state. This helps in testing drivers separately from the acpi suspend code. To test your drivers, set debug.acpi.suspend_bounce=1 and then run acpiconf -s3 (or 4). MFC after: 1 day
* Fix a logic bug added in last commit where PNP0103 devices would no longernjl2007-05-161-17/+22
| | | | | | be probed but table-based devs would be ok. General style cleanup also. MFC after: 5 days
* Add ACPI HPET table support.takawata2007-05-153-2/+42
| | | | Reviewed by:njl
* Set the debug.acpi.acpi_ca_version sysctl even if ACPI support is notmarks2007-05-081-2/+2
| | | | available.
* Revamp the MSI/MSI-X code a bit to achieve two main goals:jhb2007-05-022-5/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Simplify the amount of work that has be done for each architecture by pushing more of the truly MI code down into the PCI bus driver. - Don't bind MSI-X indicies to IRQs so that we can allow a driver to map multiple MSI-X messages into a single IRQ when handling a message shortage. The changes include: - Add a new pcib_if method: PCIB_MAP_MSI() which is called by the PCI bus to calculate the address and data values for a given MSI/MSI-X IRQ. The x86 nexus drivers map this into a call to a new 'msi_map()' function in msi.c that does the mapping. - Retire the pcib_if method PCIB_REMAP_MSIX() and remove the 'index' parameter from PCIB_ALLOC_MSIX(). MD code no longer has any knowledge of the MSI-X index for a given MSI-X IRQ. - The PCI bus driver now stores more MSI-X state in a child's ivars. Specifically, it now stores an array of IRQs (called "message vectors" in the code) that have associated address and data values, and a small virtual version of the MSI-X table that specifies the message vector that a given MSI-X table entry uses. Sparse mappings are permitted in the virtual table. - The PCI bus driver now configures the MSI and MSI-X address/data registers directly via custom bus_setup_intr() and bus_teardown_intr() methods. pci_setup_intr() invokes PCIB_MAP_MSI() to determine the address and data values for a given message as needed. The MD code no longer has to call back down into the PCI bus code to set these values from the nexus' bus_setup_intr() handler. - The PCI bus code provides a callout (pci_remap_msi_irq()) that the MD code can call to force the PCI bus to re-invoke PCIB_MAP_MSI() to get new values of the address and data fields for a given IRQ. The x86 MSI code uses this when an MSI IRQ is moved to a different CPU, requiring a new value of the 'address' field. - The x86 MSI psuedo-driver loses a lot of code, and in fact the separate MSI/MSI-X pseudo-PICs are collapsed down into a single MSI PIC driver since the only remaining diff between the two is a substring in a bootverbose printf. - The PCI bus driver will now restore MSI-X state (including programming entries in the MSI-X table) on device resume. - The interface for pci_remap_msix() has changed. Instead of accepting indices for the allocated vectors, it accepts a mini-virtual table (with a new length parameter). This table is an array of u_ints, where each value specifies which allocated message vector to use for the corresponding MSI-X message. A vector of 0 forces a message to not have an associated IRQ. The device may choose to only use some of the IRQs assigned, in which case the unused IRQs must be at the "end" and will be released back to the system. This allows a driver to use the same remap table for different shortage values. For example, if a driver wants 4 messages, it can use the same remap table (which only uses the first two messages) for the cases when it only gets 2 or 3 messages and in the latter case the PCI bus will release the 3rd IRQ back to the system. MFC after: 1 month
* Use a tighter check to see if a resource allocation request is for ajhb2007-04-251-1/+1
| | | | | | | | | | specific request and thus should first try to be allocated from the sys_resource pool. This avoids using the sys_resource pool for wildcard requests that have bounded ranges coming from cbb(4) and Host-PCI pcib(4) drivers. Tested by: Andrea Bittau <a.bittau of cs.ucl.ac.uk fame> Sleuthing by: Andrea Bittau as well
* Optimize sx locks to use simple atomic operations for the common cases ofjhb2007-03-311-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | obtaining and releasing shared and exclusive locks. The algorithms for manipulating the lock cookie are very similar to that rwlocks. This patch also adds support for exclusive locks using the same algorithm as mutexes. A new sx_init_flags() function has been added so that optional flags can be specified to alter a given locks behavior. The flags include SX_DUPOK, SX_NOWITNESS, SX_NOPROFILE, and SX_QUITE which are all identical in nature to the similar flags for mutexes. Adaptive spinning on select locks may be enabled by enabling the ADAPTIVE_SX kernel option. Only locks initialized with the SX_ADAPTIVESPIN flag via sx_init_flags() will adaptively spin. The common cases for sx_slock(), sx_sunlock(), sx_xlock(), and sx_xunlock() are now performed inline in non-debug kernels. As a result, <sys/sx.h> now requires <sys/lock.h> to be included prior to <sys/sx.h>. The new kernel option SX_NOINLINE can be used to disable the aforementioned inlining in non-debug kernels. The size of struct sx has changed, so the kernel ABI is probably greatly disturbed. MFC after: 1 month Submitted by: attilio Tested by: kris, pjd
* Re-enable the HPET timer after a resume.njl2007-03-281-0/+13
| | | | | Submitted by: Andrea Bittau <a.bittau@cs.ucl.ac.uk> MFC after: 3 days
* - Use '*h' instead of 'struct acpi_spinlock' for sizeof[1].jkim2007-03-261-2/+2
| | | | | | | - Add a missing 'else' for 'if'[2]. Requested by: njl[1] Submitted by: njl[2]
* Correct ACPI semaphore function parameters.jkim2007-03-261-4/+4
|
* Free the handle, not the lock. Pointy hat to me.jkim2007-03-261-1/+1
|
* Correct ACPI spinlock function parameters and use known ACPI spinlock names.jkim2007-03-261-20/+25
|
* Use a unique name for each mutex now that acpi-ca is creating more thannjl2007-03-261-2/+11
| | | | | | | | one (hardware & global lock). This should address witness complaints that a duplicate mutex is being acquired. Be sure to free the mutex to fix a potential memory leak. MFC after: 3 days
* Catch up with ACPI-CA 20070320 import.jkim2007-03-2220-236/+229
|
* Change acpi's handling of suballocating system resources to be a littlejhb2007-03-211-55/+39
| | | | | | | | | simpler. It now can just use rman_is_region_manager() during acpi_release_resource() to see if the the resource is suballocated from a system resource. Also, the driver no longer needs MD knowledge about how to setup bus space tags and handles when doing a suballocation, but can simply rely on bus_activate_resource() in the parent setting all that up.
* Tweak the probe/attach order of devices on the x86 nexus devices.jhb2007-03-201-1/+1
| | | | | Various BIOS-related psuedo-devices are added at an order of 5. acpi0 is added at an order of 10, and legacy0 is added at an order of 11.
* If we got an OBE/IBF event, we failed to re-enable the GPE. This wouldnjl2007-03-201-5/+14
| | | | | | | | | cause the EC to stop handling future events because the GPE stayed masked. Set a flag when queueing a GPE handler since it will ultimately re-enable the GPE. In all other cases, re-enable it ourselves. I reworked the patch from the submitter. Submitted by: Rong-en Fan <grafan@gmail.com>
* Disable burst mode by default. Testing has shown that while it works onnjl2007-03-181-2/+2
| | | | | | | most systems, it causes the EC not to respond for some Acer and Compaq/HP laptops. This is the default value for Linux also. For systems that need it, burst mode can be enabled via the tunable/sysctl: debug.acpi.ec.burst="1"
* Only enter the debugger on a Fatal op if this is a debug build of thenjl2007-03-141-1/+3
| | | | | | | acpi module. Also clean up print of args a little. This was accidentally committed as 1.9.2.3 in the stable branch. Since it is harmless, I will let the "insta-MFC" stand unless there is a problem.
* Check the _TMP value for sanity also. On some systems (HP NX laptops), thenjl2007-03-051-3/+10
| | | | | | EC occasionally times out and provides bogus values (3000C). This change prevents those systems from prematurely shutting down while we work on the underlying problem. Also, bump the sanity value to 0...200C from 0...150C.
* Rework EC I/O approach. Implement burst mode, including proper handling ofnjl2007-02-271-109/+206
| | | | | | | | | | | | | | | | | case where it asynchronously exits burst mode on its own. Handle different values of hz in sleep loop. Provide more debugging options to tune EC behavior. These tunables/sysctls may be temporary and are not for user access if the EC is working properly. Burst mode is now on by default for testing and the poll interval has been increased from 100 to 500 us and total timeout from 100 to 500 ms. Hopefully this should be the first step of addressing reports of timeout errors during battery or thermal access, especially on HP/Compaq laptops. It is reasonably stable and should not cause a loss of functionality or performance on systems that were previously working. Testing shows an increase of responsiveness by ~75% on one system. PR: kern/98171
* Use 'pause' in several places rather than trying to tsleep() on NULL (whichjhb2007-02-231-2/+1
| | | | | | triggers a KASSERT) or local variables. In the case of kern_ndis, the tsleep() actually used a common sleep address (curproc) making it susceptible to a premature wakeup.
* o break newbus api: add a new argument of type driver_filter_t topiso2007-02-231-1/+1
| | | | | | | | | | | | | bus_setup_intr() o add an int return code to all fast handlers o retire INTR_FAST/IH_FAST For more info: http://docs.freebsd.org/cgi/getmsg.cgi?fetch=465712+0+current/freebsd-current Reviewed by: many Approved by: re@
* Improve readability of the version string.njl2007-02-221-1/+1
|
* Add missing function trace for debug prints.njl2007-01-231-0/+2
|
* Expand the MSI/MSI-X API to address some deficiencies in the MSI-X support.jhb2007-01-222-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - First off, device drivers really do need to know if they are allocating MSI or MSI-X messages. MSI requires allocating powerof2() messages for example where MSI-X does not. To address this, split out the MSI-X support from pci_msi_count() and pci_alloc_msi() into new driver-visible functions pci_msix_count() and pci_alloc_msix(). As a result, pci_msi_count() now just returns a count of the max supported MSI messages for the device, and pci_alloc_msi() only tries to allocate MSI messages. To get a count of the max supported MSI-X messages, use pci_msix_count(). To allocate MSI-X messages, use pci_alloc_msix(). pci_release_msi() still handles both MSI and MSI-X messages, however. As a result of this change, drivers using the existing API will only use MSI messages and will no longer try to use MSI-X messages. - Because MSI-X allows for each message to have its own data and address values (and thus does not require all of the messages to have their MD vectors allocated as a group), some devices allow for "sparse" use of MSI-X message slots. For example, if a device supports 8 messages but the OS is only able to allocate 2 messages, the device may make the best use of 2 IRQs if it enables the messages at slots 1 and 4 rather than default of using the first N slots (or indicies) at 1 and 2. To support this, add a new pci_remap_msix() function that a driver may call after a successful pci_alloc_msix() (but before allocating any of the SYS_RES_IRQ resources) to allow the allocated IRQ resources to be assigned to different message indices. For example, from the earlier example, after pci_alloc_msix() returned a value of 2, the driver would call pci_remap_msix() passing in array of integers { 1, 4 } as the new message indices to use. The rid's for the SYS_RES_IRQ resources will always match the message indices. Thus, after the call to pci_remap_msix() the driver would be able to access the first message in slot 1 at SYS_RES_IRQ rid 1, and the second message at slot 4 at SYS_RES_IRQ rid 4. Note that the message slots/indices are 1-based rather than 0-based so that they will always correspond to the rid values (SYS_RES_IRQ rid 0 is reserved for the legacy INTx interrupt). To support this API, a new PCIB_REMAP_MSIX() method was added to the pcib interface to change the message index for a single IRQ. Tested by: scottl
* Clean up some debug prints from last commit and move one under boot -v.njl2007-01-151-6/+5
| | | | Reminded by: bruno
* Fix LINT and ACPI_DEBUG builds and add print for use of flush cache inst.njl2007-01-081-5/+8
|
* Re-work Cx handling to be per-cpu and asymmetrical, fixing support onnjl2007-01-076-209/+324
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | modern dual-core systems as well. - Parse the _CST packages for each cpu and track all the states individually, on a per-cpu basis. - Revert to generic FADT/P_BLK based Cx control if the _CST package is not present on all cpus. In that case, the new driver will still support per-cpu Cx state handling. The driver will determine the highest Cx level that can be supported by all the cpus and configure the available Cx state based on that. - Fixed the case where multiple cpus in the system share the same registers for Cx state handling. To do that, added a new flag parameter to the acpi_PkgGas and acpi_bus_alloc_gas functions that enable the caller to add the RF_SHAREABLE flag. This flag could also be useful to other callers (acpi_throttle?) in the tree but this change is not yet made. - For Core Duo cpus, both cores seems to be taken out of C3 state when any one of the cores need to transition out. This broke the short sleep detection logic. It is disabled now if there is more than one cpu in the system for now as it fixed it in my case. This quirk may need to be re-enabled later differently. - Added support to control cx_lowest on a per-cpu basis. There is still a generic cx_lowest to enable changing cx_lowest for all cpus with a single sysctl and for ease of use. Sample output for the new sysctl: dev.cpu.0.cx_supported: C1/1 C2/1 C3/57 dev.cpu.0.cx_lowest: C3 dev.cpu.0.cx_usage: 0.00% 43.16% 56.83% dev.cpu.1.cx_supported: C1/1 C2/1 C3/57 dev.cpu.1.cx_lowest: C3 dev.cpu.1.cx_usage: 0.00% 45.65% 54.34% hw.acpi.cpu.cx_lowest: C3 This work was done by Stephane E. Potvin with some simple reworking by myself. Thank you. Submitted by: Stephane E. Potvin <sepotvin / videotron.ca> MFC after: 2 weeks
* ACPIIO_BATT_GET_UNITS would always return ENXIO. However, it should neverimp2006-12-221-0/+1
| | | | | | | | return an error since it returns a count of battery devices in the system. Set it to 0 explicitly, since it is the only switch branch that doesn't set it. # I guess no one uses it.
* Give Host-PCI bridge drivers their own pcib_alloc_msi() andjhb2006-12-121-2/+26
| | | | | | pcib_alloc_msix() methods instead of using the method from the generic PCI-PCI bridge driver as the PCI-PCI methods will be gaining some PCI-PCI specific logic soon.
* First cut at MI support for PCI Message Signalled Interrupts (MSI):jhb2006-11-132-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Add 3 new functions to the pci_if interface along with suitable wrappers to provide the device driver visible API: - pci_alloc_msi(dev, int *count) backed by PCI_ALLOC_MSI(). '*count' here is an in and out parameter. The driver stores the desired number of messages in '*count' before calling the function. On success, '*count' holds the number of messages allocated to the device. Also on success, the driver can access the messages as SYS_RES_IRQ resources starting at rid 1. Note that the legacy INTx interrupt resource will not be available when using MSI. Note that this function will allocate either MSI or MSI-X messages depending on the devices capabilities and the 'hw.pci.enable_msix' and 'hw.pci.enable_msi' tunables. Also note that the driver should activate the memory resource that holds the MSI-X table and pending bit array (PBA) before calling this function if the device supports MSI-X. - pci_release_msi(dev) backed by PCI_RELEASE_MSI(). This function releases the messages allocated for this device. All of the SYS_RES_IRQ resources need to be released for this function to succeed. - pci_msi_count(dev) backed by PCI_MSI_COUNT(). This function returns the maximum number of MSI or MSI-X messages supported by this device. MSI-X is preferred if present, but this function will honor the 'hw.pci.enable_msix' and 'hw.pci.enable_msi' tunables. This function should return the largest value that pci_alloc_msi() can return (assuming the MD code is able to allocate sufficient backing resources for all of the messages). - Add default implementations for these 3 methods to the pci_driver generic PCI bus driver. (The various other PCI bus drivers such as for ACPI and OFW will inherit these default implementations.) This default implementation depends on 4 new pcib_if methods that bubble up through the PCI bridges to the MD code to allocate IRQ values and perform any needed MD setup code needed: - PCIB_ALLOC_MSI() attempts to allocate a group of MSI messages. - PCIB_RELEASE_MSI() releases a group of MSI messages. - PCIB_ALLOC_MSIX() attempts to allocate a single MSI-X message. - PCIB_RELEASE_MSIX() releases a single MSI-X message. - Add default implementations for these 4 methods that just pass the request up to the parent bus's parent bridge driver and use the default implementation in the various MI PCI bridge drivers. - Add MI functions for use by MD code when managing MSI and MSI-X interrupts: - pci_enable_msi(dev, address, data) programs the MSI capability address and data registers for a group of MSI messages - pci_enable_msix(dev, index, address, data) initializes a single MSI-X message in the MSI-X table - pci_mask_msix(dev, index) masks a single MSI-X message - pci_unmask_msix(dev, index) unmasks a single MSI-X message - pci_pending_msix(dev, index) returns true if the specified MSI-X message is currently pending - Save the MSI capability address and data registers in the pci_cfgreg block in a PCI devices ivars and restore the values when a device is resumed. Note that the MSI-X table is not currently restored during resume. - Add constants for MSI-X register offsets and fields. - Record interesting data about any MSI-X capability blocks we come across in the pci_cfgreg block in the ivars for PCI devices. Tested on: em (i386, MSI), bce (amd64/i386, MSI), mpt (amd64, MSI-X) Reviewed by: scottl, grehan, jfv MFC after: 2 months
* Reformat the bootverbose messages that dump out the status of pci_linkjhb2006-11-091-16/+16
| | | | | | devices during attach to be more compact. MFC after: 1 week
* Disable an overly-verbose warning message by default.hrs2006-09-241-3/+6
| | | | | Suggested by: njl MFC after: 3 days
* Fix a sign bug in acpi_release_resource(). acpi_sysres_find() returns !=jhb2006-09-211-1/+1
| | | | NULL if the specified resource is a sub-alloc of a system resource.
* Give the ACPI I/O rman's unique description strings to make 'devinfo -u'jhb2006-09-111-2/+2
| | | | | | output less confusing. MFC after: 3 days
* Support Celsius (nn.nC), Fahrenheit (nn.nF) and Kelvin (nnnn) toume2006-09-031-1/+0
| | | | | | | specify temperature. Reviewed by: njl MFC after: 3 days
* First pass at allowing memory to be mapped using cache modes other thanjhb2006-08-111-2/+2
| | | | | | | | | | | | | | | | | | | | WB (write-back) on x86 via control bits in PTEs and PDEs (including making use of the PAT MSR). Changes include: - A new pmap_mapdev_attr() function for amd64 and i386 which takes an additional parameter (relative to pmap_mapdev()) specifying the cache mode for this mapping. Note that on amd64 only WB mappings are done with the direct map, all other modes result in a private mapping. - pmap_mapdev() on i386 and amd64 now defaults to using UC (uncached) mappings rather than WB. Previously we relied on the BIOS setting up MTRR's to enforce memio regions being treated as UC. This might make hw.cbb_start_memory unnecessary in some cases now for example. - A new pmap_mapbios()/pmap_unmapbios() API has been added to allow places that used pmap_mapdev() to map non-device memory (such as ACPI tables) to do so using WB as before. - A new pmap_change_attr() function for amd64 and i386 that changes the caching mode for a range of KVA. Reviewed by: alc
* Raise the quality of the HPET timer to 2000 so it will be the preferreddes2006-08-111-1/+1
| | | | | | choice on systems which support it. No objection by: phk
* Improve the way we'll detect video devices as per ACPI 3.0.bruno2006-08-101-21/+51
| | | | | | | | | PR: 100271 Requested by: john AT utzweb DOT net Submitted by: hrs Reviewed by: njl Approved by: njl MFC after: 3 days
* Remove the global dock variable. Each dock device should be able tonjl2006-08-081-38/+33
| | | | | | function independently. This change is not only load-tested since I don't have hardware that supports acpi_dock. Clean up comments and a name a few constants.
* When a user uses a hint to specify the IRQ for a link device, accept IRQsjhb2006-08-071-5/+13
| | | | | | | | | that aren't listed as valid in the link device's set of possible IRQs. This allows the hints to be used to work around broken BIOSes that don't specify the correct ste of possible IRQs. A warning is issued in the dmesg in this case to be consistent with the $PIR handling code. MFC after: 1 week
* Add a new sysctl, hw.acpi.handle_reboot. If set, acpi will attempt tonjl2006-07-292-2/+7
| | | | | | | | perform the reboot action via the reset register instead of our legacy method. Default is 0 (use legacy). This is needed because some systems hang on reboot even though they claim to support the reset register. MFC after: 2 days
* Add support for overriding the values for _CRT, _HOT, and _PSV via sysctl.njl2006-07-251-13/+55
| | | | | | | | Prevent casual modification by requiring hw.acpi.thermal.user_override to be set first. Fix printing of negative temperatures in the K->C conversion. Document the remaining thermal sysctls. MFC after: 3 days
OpenPOWER on IntegriCloud