You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
This commit is contained in:
@@ -0,0 +1,356 @@
|
||||
#
|
||||
# ACPI Configuration
|
||||
#
|
||||
|
||||
menu "ACPI (Advanced Configuration and Power Interface) Support"
|
||||
depends on !X86_VISWS
|
||||
depends on !IA64_HP_SIM
|
||||
depends on IA64 || X86
|
||||
|
||||
config ACPI
|
||||
bool "ACPI Support"
|
||||
depends on IA64 || X86
|
||||
|
||||
default y
|
||||
---help---
|
||||
Advanced Configuration and Power Interface (ACPI) support for
|
||||
Linux requires an ACPI compliant platform (hardware/firmware),
|
||||
and assumes the presence of OS-directed configuration and power
|
||||
management (OSPM) software. This option will enlarge your
|
||||
kernel by about 70K.
|
||||
|
||||
Linux ACPI provides a robust functional replacement for several
|
||||
legacy configuration and power management interfaces, including
|
||||
the Plug-and-Play BIOS specification (PnP BIOS), the
|
||||
MultiProcessor Specification (MPS), and the Advanced Power
|
||||
Management (APM) specification. If both ACPI and APM support
|
||||
are configured, whichever is loaded first shall be used.
|
||||
|
||||
The ACPI SourceForge project contains the latest source code,
|
||||
documentation, tools, mailing list subscription, and other
|
||||
information. This project is available at:
|
||||
<http://sourceforge.net/projects/acpi>
|
||||
|
||||
Linux support for ACPI is based on Intel Corporation's ACPI
|
||||
Component Architecture (ACPI CA). For more information see:
|
||||
<http://developer.intel.com/technology/iapc/acpi>
|
||||
|
||||
ACPI is an open industry specification co-developed by Compaq,
|
||||
Intel, Microsoft, Phoenix, and Toshiba. The specification is
|
||||
available at:
|
||||
<http://www.acpi.info>
|
||||
|
||||
config ACPI_BOOT
|
||||
bool
|
||||
depends on ACPI || X86_HT
|
||||
default y
|
||||
|
||||
if ACPI
|
||||
|
||||
config ACPI_INTERPRETER
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
|
||||
if ACPI_INTERPRETER
|
||||
|
||||
config ACPI_SLEEP
|
||||
bool "Sleep States (EXPERIMENTAL)"
|
||||
depends on X86
|
||||
depends on EXPERIMENTAL && PM
|
||||
default y
|
||||
---help---
|
||||
This option adds support for ACPI suspend states.
|
||||
|
||||
With this option, you will be able to put the system "to sleep".
|
||||
Sleep states are low power states for the system and devices. All
|
||||
of the system operating state is saved to either memory or disk
|
||||
(depending on the state), to allow the system to resume operation
|
||||
quickly at your request.
|
||||
|
||||
Although this option sounds really nifty, barely any of the device
|
||||
drivers have been converted to the new driver model and hence few
|
||||
have proper power management support.
|
||||
|
||||
This option is not recommended for anyone except those doing driver
|
||||
power management development.
|
||||
|
||||
config ACPI_SLEEP_PROC_FS
|
||||
bool
|
||||
depends on ACPI_SLEEP && PROC_FS
|
||||
default y
|
||||
|
||||
config ACPI_AC
|
||||
tristate "AC Adapter"
|
||||
depends on X86
|
||||
default m
|
||||
help
|
||||
This driver adds support for the AC Adapter object, which indicates
|
||||
whether a system is on AC, or not. Typically, only mobile systems
|
||||
have this object, since desktops are always on AC.
|
||||
|
||||
config ACPI_BATTERY
|
||||
tristate "Battery"
|
||||
depends on X86
|
||||
default m
|
||||
help
|
||||
This driver adds support for battery information through
|
||||
/proc/acpi/battery. If you have a mobile system with a battery,
|
||||
say Y.
|
||||
|
||||
config ACPI_BUTTON
|
||||
tristate "Button"
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver registers for events based on buttons, such as the
|
||||
power, sleep, and lid switch. In the future, a daemon will read
|
||||
/proc/acpi/event and perform user-defined actions such as shutting
|
||||
down the system. Until then, you can cat it, and see output when
|
||||
a button is pressed.
|
||||
|
||||
config ACPI_VIDEO
|
||||
tristate "Video"
|
||||
depends on EXPERIMENTAL
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver implement the ACPI Extensions For Display Adapters
|
||||
for integrated graphics devices on motherboard, as specified in
|
||||
ACPI 2.0 Specification, Appendix B, allowing to perform some basic
|
||||
control like defining the video POST device, retrieving EDID information
|
||||
or to setup a video output, etc.
|
||||
Note that this is an ref. implementation only. It may or may not work
|
||||
for your integrated video device.
|
||||
|
||||
config ACPI_FAN
|
||||
tristate "Fan"
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver adds support for ACPI fan devices, allowing user-mode
|
||||
applications to perform basic fan control (on, off, status).
|
||||
|
||||
config ACPI_PROCESSOR
|
||||
tristate "Processor"
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
help
|
||||
This driver installs ACPI as the idle handler for Linux, and uses
|
||||
ACPI C2 and C3 processor states to save power, on systems that
|
||||
support it.
|
||||
|
||||
config ACPI_HOTPLUG_CPU
|
||||
bool "Processor Hotplug (EXPERIMENTAL)"
|
||||
depends on ACPI_PROCESSOR && HOTPLUG_CPU && EXPERIMENTAL
|
||||
depends on !IA64_SGI_SN
|
||||
select ACPI_CONTAINER
|
||||
default n
|
||||
---help---
|
||||
Select this option if your platform support physical CPU hotplug.
|
||||
|
||||
config ACPI_THERMAL
|
||||
tristate "Thermal Zone"
|
||||
depends on ACPI_PROCESSOR
|
||||
default m
|
||||
help
|
||||
This driver adds support for ACPI thermal zones. Most mobile and
|
||||
some desktop systems support ACPI thermal zones. It is HIGHLY
|
||||
recommended that this option be enabled, as your processor(s)
|
||||
may be damaged without it.
|
||||
|
||||
config ACPI_NUMA
|
||||
bool "NUMA support"
|
||||
depends on NUMA
|
||||
depends on (IA64 || X86_64)
|
||||
default y if IA64_GENERIC || IA64_SGI_SN2
|
||||
|
||||
config ACPI_ASUS
|
||||
tristate "ASUS/Medion Laptop Extras"
|
||||
depends on X86
|
||||
default m
|
||||
---help---
|
||||
This driver provides support for extra features of ACPI-compatible
|
||||
ASUS laptops. As some of Medion laptops are made by ASUS, it may also
|
||||
support some Medion laptops (such as 9675 for example). It makes all
|
||||
the extra buttons generate standard ACPI events that go through
|
||||
/proc/acpi/events, and (on some models) adds support for changing the
|
||||
display brightness and output, switching the LCD backlight on and off,
|
||||
and most importantly, allows you to blink those fancy LEDs intended
|
||||
for reporting mail and wireless status.
|
||||
|
||||
Note: display switching code is currently considered EXPERIMENTAL,
|
||||
toying with these values may even lock your machine.
|
||||
|
||||
All settings are changed via /proc/acpi/asus directory entries. Owner
|
||||
and group for these entries can be set with asus_uid and asus_gid
|
||||
parameters.
|
||||
|
||||
More information and a userspace daemon for handling the extra buttons
|
||||
at <http://sourceforge.net/projects/acpi4asus/>.
|
||||
|
||||
If you have an ACPI-compatible ASUS laptop, say Y or M here. This
|
||||
driver is still under development, so if your laptop is unsupported or
|
||||
something works not quite as expected, please use the mailing list
|
||||
available on the above page (acpi4asus-user@lists.sourceforge.net)
|
||||
|
||||
config ACPI_IBM
|
||||
tristate "IBM ThinkPad Laptop Extras"
|
||||
depends on X86
|
||||
default m
|
||||
---help---
|
||||
This is a Linux ACPI driver for the IBM ThinkPad laptops. It adds
|
||||
support for Fn-Fx key combinations, Bluetooth control, video
|
||||
output switching, ThinkLight control, UltraBay eject and more.
|
||||
For more information about this driver see <file:Documentation/ibm-acpi.txt>
|
||||
and <http://ibm-acpi.sf.net/> .
|
||||
|
||||
If you have an IBM ThinkPad laptop, say Y or M here.
|
||||
|
||||
config ACPI_TOSHIBA
|
||||
tristate "Toshiba Laptop Extras"
|
||||
depends on X86
|
||||
default m
|
||||
---help---
|
||||
This driver adds support for access to certain system settings
|
||||
on "legacy free" Toshiba laptops. These laptops can be recognized by
|
||||
their lack of a BIOS setup menu and APM support.
|
||||
|
||||
On these machines, all system configuration is handled through the
|
||||
ACPI. This driver is required for access to controls not covered
|
||||
by the general ACPI drivers, such as LCD brightness, video output,
|
||||
etc.
|
||||
|
||||
This driver differs from the non-ACPI Toshiba laptop driver (located
|
||||
under "Processor type and features") in several aspects.
|
||||
Configuration is accessed by reading and writing text files in the
|
||||
/proc tree instead of by program interface to /dev. Furthermore, no
|
||||
power management functions are exposed, as those are handled by the
|
||||
general ACPI drivers.
|
||||
|
||||
More information about this driver is available at
|
||||
<http://memebeam.org/toys/ToshibaAcpiDriver>.
|
||||
|
||||
If you have a legacy free Toshiba laptop (such as the Libretto L1
|
||||
series), say Y.
|
||||
|
||||
config ACPI_CUSTOM_DSDT
|
||||
bool "Include Custom DSDT"
|
||||
depends on !STANDALONE
|
||||
default n
|
||||
help
|
||||
Thist option is to load a custom ACPI DSDT
|
||||
If you don't know what that is, say N.
|
||||
|
||||
config ACPI_CUSTOM_DSDT_FILE
|
||||
string "Custom DSDT Table file to include"
|
||||
depends on ACPI_CUSTOM_DSDT
|
||||
default ""
|
||||
help
|
||||
Enter the full path name to the file wich includes the AmlCode declaration.
|
||||
|
||||
config ACPI_BLACKLIST_YEAR
|
||||
int "Disable ACPI for systems before Jan 1st this year"
|
||||
depends on ACPI_INTERPRETER
|
||||
default 0
|
||||
help
|
||||
enter a 4-digit year, eg. 2001 to disable ACPI by default
|
||||
on platforms with DMI BIOS date before January 1st that year.
|
||||
"acpi=force" can be used to override this mechanism.
|
||||
|
||||
Enter 0 to disable this mechanism and allow ACPI to
|
||||
run by default no matter what the year. (default)
|
||||
|
||||
config ACPI_DEBUG
|
||||
bool "Debug Statements"
|
||||
depends on !IA64_SGI_SN
|
||||
default n
|
||||
help
|
||||
The ACPI driver can optionally report errors with a great deal
|
||||
of verbosity. Saying Y enables these statements. This will increase
|
||||
your kernel size by around 50K.
|
||||
|
||||
config ACPI_BUS
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
|
||||
config ACPI_EC
|
||||
bool
|
||||
depends on X86
|
||||
default y
|
||||
help
|
||||
This driver is required on some systems for the proper operation of
|
||||
the battery and thermal drivers. If you are compiling for a
|
||||
mobile system, say Y.
|
||||
|
||||
config ACPI_POWER
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
|
||||
config ACPI_PCI
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default PCI
|
||||
|
||||
config ACPI_SYSTEM
|
||||
bool
|
||||
depends on !IA64_SGI_SN
|
||||
default y
|
||||
help
|
||||
This driver will enable your system to shut down using ACPI, and
|
||||
dump your ACPI DSDT table using /proc/acpi/dsdt.
|
||||
|
||||
endif # ACPI_INTERPRETER
|
||||
|
||||
config X86_PM_TIMER
|
||||
bool "Power Management Timer Support"
|
||||
depends on X86
|
||||
depends on ACPI_BOOT && EXPERIMENTAL
|
||||
depends on !X86_64
|
||||
default n
|
||||
help
|
||||
The Power Management Timer is available on all ACPI-capable,
|
||||
in most cases even if ACPI is unusable or blacklisted.
|
||||
|
||||
This timing source is not affected by powermanagement features
|
||||
like aggressive processor idling, throttling, frequency and/or
|
||||
voltage scaling, unlike the commonly used Time Stamp Counter
|
||||
(TSC) timing source.
|
||||
|
||||
So, if you see messages like 'Losing too many ticks!' in the
|
||||
kernel logs, and/or you are using this on a notebook which
|
||||
does not yet have an HPET, you should say "Y" here.
|
||||
|
||||
config ACPI_CONTAINER
|
||||
tristate "ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default (ACPI_HOTPLUG_MEMORY || ACPI_HOTPLUG_CPU || ACPI_HOTPLUG_IO)
|
||||
---help---
|
||||
This is the ACPI generic container driver which supports
|
||||
ACPI0004, PNP0A05 and PNP0A06 devices
|
||||
|
||||
config ACPI_HOTPLUG_MEMORY
|
||||
tristate "Memory Hotplug"
|
||||
depends on ACPI
|
||||
depends on MEMORY_HOTPLUG
|
||||
default n
|
||||
help
|
||||
This driver adds supports for ACPI Memory Hotplug. This driver
|
||||
provides support for fielding notifications on ACPI memory
|
||||
devices (PNP0C80) which represent memory ranges that may be
|
||||
onlined or offlined during runtime.
|
||||
|
||||
Enabling this driver assumes that your platform hardware
|
||||
and firmware have support for hot-plugging physical memory. If
|
||||
your system does not support physically adding or ripping out
|
||||
memory DIMMs at some platfrom defined granularity (individually
|
||||
or as a bank) at runtime, then you need not enable this driver.
|
||||
|
||||
If one selects "m," this driver can be loaded using the following
|
||||
command:
|
||||
$>modprobe acpi_memhotplug
|
||||
endif # ACPI
|
||||
|
||||
endmenu
|
||||
@@ -0,0 +1,58 @@
|
||||
#
|
||||
# Makefile for the Linux ACPI interpreter
|
||||
#
|
||||
|
||||
export ACPI_CFLAGS
|
||||
|
||||
ACPI_CFLAGS := -Os
|
||||
|
||||
ifdef CONFIG_ACPI_DEBUG
|
||||
ACPI_CFLAGS += -DACPI_DEBUG_OUTPUT
|
||||
endif
|
||||
|
||||
EXTRA_CFLAGS += $(ACPI_CFLAGS)
|
||||
|
||||
#
|
||||
# ACPI Boot-Time Table Parsing
|
||||
#
|
||||
obj-$(CONFIG_ACPI_BOOT) += tables.o
|
||||
obj-$(CONFIG_ACPI_INTERPRETER) += blacklist.o
|
||||
|
||||
#
|
||||
# ACPI Core Subsystem (Interpreter)
|
||||
#
|
||||
obj-$(CONFIG_ACPI_INTERPRETER) += osl.o utils.o \
|
||||
dispatcher/ events/ executer/ hardware/ \
|
||||
namespace/ parser/ resources/ tables/ \
|
||||
utilities/
|
||||
|
||||
#
|
||||
# ACPI Bus and Device Drivers
|
||||
#
|
||||
processor-objs += processor_core.o processor_throttling.o \
|
||||
processor_idle.o processor_thermal.o
|
||||
ifdef CONFIG_CPU_FREQ
|
||||
processor-objs += processor_perflib.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_ACPI_BUS) += sleep/
|
||||
obj-$(CONFIG_ACPI_BUS) += bus.o
|
||||
obj-$(CONFIG_ACPI_AC) += ac.o
|
||||
obj-$(CONFIG_ACPI_BATTERY) += battery.o
|
||||
obj-$(CONFIG_ACPI_BUTTON) += button.o
|
||||
obj-$(CONFIG_ACPI_EC) += ec.o
|
||||
obj-$(CONFIG_ACPI_FAN) += fan.o
|
||||
obj-$(CONFIG_ACPI_VIDEO) += video.o
|
||||
obj-$(CONFIG_ACPI_PCI) += pci_root.o pci_link.o pci_irq.o pci_bind.o
|
||||
obj-$(CONFIG_ACPI_POWER) += power.o
|
||||
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
|
||||
obj-$(CONFIG_ACPI_CONTAINER) += container.o
|
||||
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
|
||||
obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o
|
||||
obj-$(CONFIG_ACPI_DEBUG) += debug.o
|
||||
obj-$(CONFIG_ACPI_NUMA) += numa.o
|
||||
obj-$(CONFIG_ACPI_ASUS) += asus_acpi.o
|
||||
obj-$(CONFIG_ACPI_IBM) += ibm_acpi.o
|
||||
obj-$(CONFIG_ACPI_TOSHIBA) += toshiba_acpi.o
|
||||
obj-$(CONFIG_ACPI_BUS) += scan.o motherboard.o
|
||||
obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
|
||||
@@ -0,0 +1,354 @@
|
||||
/*
|
||||
* acpi_ac.c - ACPI AC Adapter Driver ($Revision: 27 $)
|
||||
*
|
||||
* Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
|
||||
* Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
|
||||
#define ACPI_AC_COMPONENT 0x00020000
|
||||
#define ACPI_AC_CLASS "ac_adapter"
|
||||
#define ACPI_AC_HID "ACPI0003"
|
||||
#define ACPI_AC_DRIVER_NAME "ACPI AC Adapter Driver"
|
||||
#define ACPI_AC_DEVICE_NAME "AC Adapter"
|
||||
#define ACPI_AC_FILE_STATE "state"
|
||||
#define ACPI_AC_NOTIFY_STATUS 0x80
|
||||
#define ACPI_AC_STATUS_OFFLINE 0x00
|
||||
#define ACPI_AC_STATUS_ONLINE 0x01
|
||||
#define ACPI_AC_STATUS_UNKNOWN 0xFF
|
||||
|
||||
#define _COMPONENT ACPI_AC_COMPONENT
|
||||
ACPI_MODULE_NAME ("acpi_ac")
|
||||
|
||||
MODULE_AUTHOR("Paul Diefenbaugh");
|
||||
MODULE_DESCRIPTION(ACPI_AC_DRIVER_NAME);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int acpi_ac_add (struct acpi_device *device);
|
||||
static int acpi_ac_remove (struct acpi_device *device, int type);
|
||||
static int acpi_ac_open_fs(struct inode *inode, struct file *file);
|
||||
|
||||
static struct acpi_driver acpi_ac_driver = {
|
||||
.name = ACPI_AC_DRIVER_NAME,
|
||||
.class = ACPI_AC_CLASS,
|
||||
.ids = ACPI_AC_HID,
|
||||
.ops = {
|
||||
.add = acpi_ac_add,
|
||||
.remove = acpi_ac_remove,
|
||||
},
|
||||
};
|
||||
|
||||
struct acpi_ac {
|
||||
acpi_handle handle;
|
||||
unsigned long state;
|
||||
};
|
||||
|
||||
static struct file_operations acpi_ac_fops = {
|
||||
.open = acpi_ac_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
AC Adapter Management
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static int
|
||||
acpi_ac_get_state (
|
||||
struct acpi_ac *ac)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_get_state");
|
||||
|
||||
if (!ac)
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
status = acpi_evaluate_integer(ac->handle, "_PSR", NULL, &ac->state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Error reading AC Adapter state\n"));
|
||||
ac->state = ACPI_AC_STATUS_UNKNOWN;
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static struct proc_dir_entry *acpi_ac_dir;
|
||||
|
||||
static int acpi_ac_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_ac *ac = (struct acpi_ac *) seq->private;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_seq_show");
|
||||
|
||||
if (!ac)
|
||||
return_VALUE(0);
|
||||
|
||||
if (acpi_ac_get_state(ac)) {
|
||||
seq_puts(seq, "ERROR: Unable to read AC Adapter state\n");
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
seq_puts(seq, "state: ");
|
||||
switch (ac->state) {
|
||||
case ACPI_AC_STATUS_OFFLINE:
|
||||
seq_puts(seq, "off-line\n");
|
||||
break;
|
||||
case ACPI_AC_STATUS_ONLINE:
|
||||
seq_puts(seq, "on-line\n");
|
||||
break;
|
||||
default:
|
||||
seq_puts(seq, "unknown\n");
|
||||
break;
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int acpi_ac_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_ac_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_ac_add_fs (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_add_fs");
|
||||
|
||||
if (!acpi_device_dir(device)) {
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
|
||||
acpi_ac_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return_VALUE(-ENODEV);
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
/* 'state' [R] */
|
||||
entry = create_proc_entry(ACPI_AC_FILE_STATE,
|
||||
S_IRUGO, acpi_device_dir(device));
|
||||
if (!entry)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Unable to create '%s' fs entry\n",
|
||||
ACPI_AC_FILE_STATE));
|
||||
else {
|
||||
entry->proc_fops = &acpi_ac_fops;
|
||||
entry->data = acpi_driver_data(device);
|
||||
entry->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_ac_remove_fs (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_remove_fs");
|
||||
|
||||
if (acpi_device_dir(device)) {
|
||||
remove_proc_entry(ACPI_AC_FILE_STATE,
|
||||
acpi_device_dir(device));
|
||||
|
||||
remove_proc_entry(acpi_device_bid(device), acpi_ac_dir);
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Model
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
acpi_ac_notify (
|
||||
acpi_handle handle,
|
||||
u32 event,
|
||||
void *data)
|
||||
{
|
||||
struct acpi_ac *ac = (struct acpi_ac *) data;
|
||||
struct acpi_device *device = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_notify");
|
||||
|
||||
if (!ac)
|
||||
return_VOID;
|
||||
|
||||
if (acpi_bus_get_device(ac->handle, &device))
|
||||
return_VOID;
|
||||
|
||||
switch (event) {
|
||||
case ACPI_AC_NOTIFY_STATUS:
|
||||
acpi_ac_get_state(ac);
|
||||
acpi_bus_generate_event(device, event, (u32) ac->state);
|
||||
break;
|
||||
default:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Unsupported event [0x%x]\n", event));
|
||||
break;
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_ac_add (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_ac *ac = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_add");
|
||||
|
||||
if (!device)
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
ac = kmalloc(sizeof(struct acpi_ac), GFP_KERNEL);
|
||||
if (!ac)
|
||||
return_VALUE(-ENOMEM);
|
||||
memset(ac, 0, sizeof(struct acpi_ac));
|
||||
|
||||
ac->handle = device->handle;
|
||||
strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME);
|
||||
strcpy(acpi_device_class(device), ACPI_AC_CLASS);
|
||||
acpi_driver_data(device) = ac;
|
||||
|
||||
result = acpi_ac_get_state(ac);
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
result = acpi_ac_add_fs(device);
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
status = acpi_install_notify_handler(ac->handle,
|
||||
ACPI_DEVICE_NOTIFY, acpi_ac_notify, ac);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Error installing notify handler\n"));
|
||||
result = -ENODEV;
|
||||
goto end;
|
||||
}
|
||||
|
||||
printk(KERN_INFO PREFIX "%s [%s] (%s)\n",
|
||||
acpi_device_name(device), acpi_device_bid(device),
|
||||
ac->state?"on-line":"off-line");
|
||||
|
||||
end:
|
||||
if (result) {
|
||||
acpi_ac_remove_fs(device);
|
||||
kfree(ac);
|
||||
}
|
||||
|
||||
return_VALUE(result);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_ac_remove (
|
||||
struct acpi_device *device,
|
||||
int type)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_ac *ac = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_remove");
|
||||
|
||||
if (!device || !acpi_driver_data(device))
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
ac = (struct acpi_ac *) acpi_driver_data(device);
|
||||
|
||||
status = acpi_remove_notify_handler(ac->handle,
|
||||
ACPI_DEVICE_NOTIFY, acpi_ac_notify);
|
||||
if (ACPI_FAILURE(status))
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Error removing notify handler\n"));
|
||||
|
||||
acpi_ac_remove_fs(device);
|
||||
|
||||
kfree(ac);
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
static int __init
|
||||
acpi_ac_init (void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_init");
|
||||
|
||||
acpi_ac_dir = proc_mkdir(ACPI_AC_CLASS, acpi_root_dir);
|
||||
if (!acpi_ac_dir)
|
||||
return_VALUE(-ENODEV);
|
||||
acpi_ac_dir->owner = THIS_MODULE;
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_ac_driver);
|
||||
if (result < 0) {
|
||||
remove_proc_entry(ACPI_AC_CLASS, acpi_root_dir);
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
static void __exit
|
||||
acpi_ac_exit (void)
|
||||
{
|
||||
ACPI_FUNCTION_TRACE("acpi_ac_exit");
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_ac_driver);
|
||||
|
||||
remove_proc_entry(ACPI_AC_CLASS, acpi_root_dir);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
||||
module_init(acpi_ac_init);
|
||||
module_exit(acpi_ac_exit);
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* blacklist.c
|
||||
*
|
||||
* Check to see if the given machine has a known bad ACPI BIOS
|
||||
* or if the BIOS is too old.
|
||||
*
|
||||
* Copyright (C) 2004 Len Brown <len.brown@intel.com>
|
||||
* Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
enum acpi_blacklist_predicates
|
||||
{
|
||||
all_versions,
|
||||
less_than_or_equal,
|
||||
equal,
|
||||
greater_than_or_equal,
|
||||
};
|
||||
|
||||
struct acpi_blacklist_item
|
||||
{
|
||||
char oem_id[7];
|
||||
char oem_table_id[9];
|
||||
u32 oem_revision;
|
||||
acpi_table_type table;
|
||||
enum acpi_blacklist_predicates oem_revision_predicate;
|
||||
char *reason;
|
||||
u32 is_critical_error;
|
||||
};
|
||||
|
||||
/*
|
||||
* POLICY: If *anything* doesn't work, put it on the blacklist.
|
||||
* If they are critical errors, mark it critical, and abort driver load.
|
||||
*/
|
||||
static struct acpi_blacklist_item acpi_blacklist[] __initdata =
|
||||
{
|
||||
/* Compaq Presario 1700 */
|
||||
{"PTLTD ", " DSDT ", 0x06040000, ACPI_DSDT, less_than_or_equal, "Multiple problems", 1},
|
||||
/* Sony FX120, FX140, FX150? */
|
||||
{"SONY ", "U0 ", 0x20010313, ACPI_DSDT, less_than_or_equal, "ACPI driver problem", 1},
|
||||
/* Compaq Presario 800, Insyde BIOS */
|
||||
{"INT440", "SYSFexxx", 0x00001001, ACPI_DSDT, less_than_or_equal, "Does not use _REG to protect EC OpRegions", 1},
|
||||
/* IBM 600E - _ADR should return 7, but it returns 1 */
|
||||
{"IBM ", "TP600E ", 0x00000105, ACPI_DSDT, less_than_or_equal, "Incorrect _ADR", 1},
|
||||
{"ASUS\0\0", "P2B-S ", 0, ACPI_DSDT, all_versions, "Bogus PCI routing", 1},
|
||||
|
||||
{""}
|
||||
};
|
||||
|
||||
|
||||
#if CONFIG_ACPI_BLACKLIST_YEAR
|
||||
|
||||
static int __init
|
||||
blacklist_by_year(void)
|
||||
{
|
||||
int year;
|
||||
char *s = dmi_get_system_info(DMI_BIOS_DATE);
|
||||
|
||||
if (!s)
|
||||
return 0;
|
||||
if (!*s)
|
||||
return 0;
|
||||
|
||||
s = strrchr(s, '/');
|
||||
if (!s)
|
||||
return 0;
|
||||
|
||||
s += 1;
|
||||
|
||||
year = simple_strtoul(s,NULL,0);
|
||||
|
||||
if (year < 100) { /* 2-digit year */
|
||||
year += 1900;
|
||||
if (year < 1996) /* no dates < spec 1.0 */
|
||||
year += 100;
|
||||
}
|
||||
|
||||
if (year < CONFIG_ACPI_BLACKLIST_YEAR) {
|
||||
printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), "
|
||||
"acpi=force is required to enable ACPI\n",
|
||||
year, CONFIG_ACPI_BLACKLIST_YEAR);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int blacklist_by_year(void) { return 0; }
|
||||
#endif
|
||||
|
||||
int __init
|
||||
acpi_blacklisted(void)
|
||||
{
|
||||
int i = 0;
|
||||
int blacklisted = 0;
|
||||
struct acpi_table_header *table_header;
|
||||
|
||||
while (acpi_blacklist[i].oem_id[0] != '\0')
|
||||
{
|
||||
if (acpi_get_table_header_early(acpi_blacklist[i].table, &table_header)) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strncmp(acpi_blacklist[i].oem_id, table_header->oem_id, 6)) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strncmp(acpi_blacklist[i].oem_table_id, table_header->oem_table_id, 8)) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((acpi_blacklist[i].oem_revision_predicate == all_versions)
|
||||
|| (acpi_blacklist[i].oem_revision_predicate == less_than_or_equal
|
||||
&& table_header->oem_revision <= acpi_blacklist[i].oem_revision)
|
||||
|| (acpi_blacklist[i].oem_revision_predicate == greater_than_or_equal
|
||||
&& table_header->oem_revision >= acpi_blacklist[i].oem_revision)
|
||||
|| (acpi_blacklist[i].oem_revision_predicate == equal
|
||||
&& table_header->oem_revision == acpi_blacklist[i].oem_revision)) {
|
||||
|
||||
printk(KERN_ERR PREFIX "Vendor \"%6.6s\" System \"%8.8s\" "
|
||||
"Revision 0x%x has a known ACPI BIOS problem.\n",
|
||||
acpi_blacklist[i].oem_id,
|
||||
acpi_blacklist[i].oem_table_id,
|
||||
acpi_blacklist[i].oem_revision);
|
||||
|
||||
printk(KERN_ERR PREFIX "Reason: %s. This is a %s error\n",
|
||||
acpi_blacklist[i].reason,
|
||||
(acpi_blacklist[i].is_critical_error ? "non-recoverable" : "recoverable"));
|
||||
|
||||
blacklisted = acpi_blacklist[i].is_critical_error;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
blacklisted += blacklist_by_year();
|
||||
|
||||
return blacklisted;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,303 @@
|
||||
/*
|
||||
* acpi_container.c - ACPI Generic Container Driver
|
||||
* ($Revision: )
|
||||
*
|
||||
* Copyright (C) 2004 Anil S Keshavamurthy (anil.s.keshavamurthy@intel.com)
|
||||
* Copyright (C) 2004 Keiichiro Tokunaga (tokunaga.keiich@jp.fujitsu.com)
|
||||
* Copyright (C) 2004 Motoyuki Ito (motoyuki@soft.fujitsu.com)
|
||||
* Copyright (C) 2004 Intel Corp.
|
||||
* Copyright (C) 2004 FUJITSU LIMITED
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/container.h>
|
||||
|
||||
#define ACPI_CONTAINER_DRIVER_NAME "ACPI container driver"
|
||||
#define ACPI_CONTAINER_DEVICE_NAME "ACPI container device"
|
||||
#define ACPI_CONTAINER_CLASS "container"
|
||||
|
||||
#define INSTALL_NOTIFY_HANDLER 1
|
||||
#define UNINSTALL_NOTIFY_HANDLER 2
|
||||
|
||||
#define ACPI_CONTAINER_COMPONENT 0x01000000
|
||||
#define _COMPONENT ACPI_CONTAINER_COMPONENT
|
||||
ACPI_MODULE_NAME ("acpi_container")
|
||||
|
||||
MODULE_AUTHOR("Anil S Keshavamurthy");
|
||||
MODULE_DESCRIPTION(ACPI_CONTAINER_DRIVER_NAME);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define ACPI_STA_PRESENT (0x00000001)
|
||||
|
||||
static int acpi_container_add(struct acpi_device *device);
|
||||
static int acpi_container_remove(struct acpi_device *device, int type);
|
||||
|
||||
static struct acpi_driver acpi_container_driver = {
|
||||
.name = ACPI_CONTAINER_DRIVER_NAME,
|
||||
.class = ACPI_CONTAINER_CLASS,
|
||||
.ids = "ACPI0004,PNP0A05,PNP0A06",
|
||||
.ops = {
|
||||
.add = acpi_container_add,
|
||||
.remove = acpi_container_remove,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
/*******************************************************************/
|
||||
|
||||
static int
|
||||
is_device_present(acpi_handle handle)
|
||||
{
|
||||
acpi_handle temp;
|
||||
acpi_status status;
|
||||
unsigned long sta;
|
||||
|
||||
ACPI_FUNCTION_TRACE("is_device_present");
|
||||
|
||||
status = acpi_get_handle(handle, "_STA", &temp);
|
||||
if (ACPI_FAILURE(status))
|
||||
return_VALUE(1); /* _STA not found, assmue device present */
|
||||
|
||||
status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
|
||||
if (ACPI_FAILURE(status))
|
||||
return_VALUE(0); /* Firmware error */
|
||||
|
||||
return_VALUE((sta & ACPI_STA_PRESENT) == ACPI_STA_PRESENT);
|
||||
}
|
||||
|
||||
/*******************************************************************/
|
||||
static int
|
||||
acpi_container_add(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_container *container;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_container_add");
|
||||
|
||||
if (!device) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "device is NULL\n"));
|
||||
return_VALUE(-EINVAL);
|
||||
}
|
||||
|
||||
container = kmalloc(sizeof(struct acpi_container), GFP_KERNEL);
|
||||
if(!container)
|
||||
return_VALUE(-ENOMEM);
|
||||
|
||||
memset(container, 0, sizeof(struct acpi_container));
|
||||
container->handle = device->handle;
|
||||
strcpy(acpi_device_name(device), ACPI_CONTAINER_DEVICE_NAME);
|
||||
strcpy(acpi_device_class(device), ACPI_CONTAINER_CLASS);
|
||||
acpi_driver_data(device) = container;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device <%s> bid <%s>\n", \
|
||||
acpi_device_name(device), acpi_device_bid(device)));
|
||||
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_container_remove(struct acpi_device *device, int type)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_container *pc = NULL;
|
||||
pc = (struct acpi_container*) acpi_driver_data(device);
|
||||
|
||||
if (pc)
|
||||
kfree(pc);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
container_device_add(struct acpi_device **device, acpi_handle handle)
|
||||
{
|
||||
acpi_handle phandle;
|
||||
struct acpi_device *pdev;
|
||||
int result;
|
||||
|
||||
ACPI_FUNCTION_TRACE("container_device_add");
|
||||
|
||||
if (acpi_get_parent(handle, &phandle)) {
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
if (acpi_bus_get_device(phandle, &pdev)) {
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
if (acpi_bus_add(device, pdev, handle, ACPI_BUS_TYPE_DEVICE)) {
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
result = acpi_bus_scan(*device);
|
||||
|
||||
return_VALUE(result);
|
||||
}
|
||||
|
||||
static void
|
||||
container_notify_cb(acpi_handle handle, u32 type, void *context)
|
||||
{
|
||||
struct acpi_device *device = NULL;
|
||||
int result;
|
||||
int present;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE("container_notify_cb");
|
||||
|
||||
present = is_device_present(handle);
|
||||
|
||||
switch (type) {
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
/* Fall through */
|
||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||
printk("Container driver received %s event\n",
|
||||
(type == ACPI_NOTIFY_BUS_CHECK)?
|
||||
"ACPI_NOTIFY_BUS_CHECK":"ACPI_NOTIFY_DEVICE_CHECK");
|
||||
status = acpi_bus_get_device(handle, &device);
|
||||
if (present) {
|
||||
if (ACPI_FAILURE(status) || !device) {
|
||||
result = container_device_add(&device, handle);
|
||||
if (!result)
|
||||
kobject_hotplug(&device->kobj,
|
||||
KOBJ_ONLINE);
|
||||
else
|
||||
printk("Failed to add container\n");
|
||||
}
|
||||
} else {
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
/* device exist and this is a remove request */
|
||||
kobject_hotplug(&device->kobj, KOBJ_OFFLINE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||
if (!acpi_bus_get_device(handle, &device) && device) {
|
||||
kobject_hotplug(&device->kobj, KOBJ_OFFLINE);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
container_walk_namespace_cb(acpi_handle handle,
|
||||
u32 lvl,
|
||||
void *context,
|
||||
void **rv)
|
||||
{
|
||||
char *hid = NULL;
|
||||
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
struct acpi_device_info *info;
|
||||
acpi_status status;
|
||||
int *action = context;
|
||||
|
||||
ACPI_FUNCTION_TRACE("container_walk_namespace_cb");
|
||||
|
||||
status = acpi_get_object_info(handle, &buffer);
|
||||
if (ACPI_FAILURE(status) || !buffer.pointer) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
info = buffer.pointer;
|
||||
if (info->valid & ACPI_VALID_HID)
|
||||
hid = info->hardware_id.value;
|
||||
|
||||
if (hid == NULL) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (strcmp(hid, "ACPI0004") && strcmp(hid, "PNP0A05") &&
|
||||
strcmp(hid, "PNP0A06")) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
switch(*action) {
|
||||
case INSTALL_NOTIFY_HANDLER:
|
||||
acpi_install_notify_handler(handle,
|
||||
ACPI_SYSTEM_NOTIFY,
|
||||
container_notify_cb,
|
||||
NULL);
|
||||
break;
|
||||
case UNINSTALL_NOTIFY_HANDLER:
|
||||
acpi_remove_notify_handler(handle,
|
||||
ACPI_SYSTEM_NOTIFY,
|
||||
container_notify_cb);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
end:
|
||||
acpi_os_free(buffer.pointer);
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
|
||||
static int __init
|
||||
acpi_container_init(void)
|
||||
{
|
||||
int result = 0;
|
||||
int action = INSTALL_NOTIFY_HANDLER;
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_container_driver);
|
||||
if (result < 0) {
|
||||
return(result);
|
||||
}
|
||||
|
||||
/* register notify handler to every container device */
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE,
|
||||
ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX,
|
||||
container_walk_namespace_cb,
|
||||
&action, NULL);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static void __exit
|
||||
acpi_container_exit(void)
|
||||
{
|
||||
int action = UNINSTALL_NOTIFY_HANDLER;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_container_exit");
|
||||
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE,
|
||||
ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX,
|
||||
container_walk_namespace_cb,
|
||||
&action, NULL);
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_container_driver);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
module_init(acpi_container_init);
|
||||
module_exit(acpi_container_exit);
|
||||
@@ -0,0 +1,233 @@
|
||||
/*
|
||||
* debug.c - ACPI debug interface to userspace.
|
||||
*/
|
||||
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/acglobal.h>
|
||||
|
||||
#define _COMPONENT ACPI_SYSTEM_COMPONENT
|
||||
ACPI_MODULE_NAME ("debug")
|
||||
|
||||
#define ACPI_SYSTEM_FILE_DEBUG_LAYER "debug_layer"
|
||||
#define ACPI_SYSTEM_FILE_DEBUG_LEVEL "debug_level"
|
||||
|
||||
#ifdef MODULE_PARAM_PREFIX
|
||||
#undef MODULE_PARAM_PREFIX
|
||||
#endif
|
||||
|
||||
#define MODULE_PARAM_PREFIX
|
||||
module_param(acpi_dbg_layer, uint, 0400);
|
||||
module_param(acpi_dbg_level, uint, 0400);
|
||||
|
||||
struct acpi_dlayer {
|
||||
const char *name;
|
||||
unsigned long value;
|
||||
};
|
||||
struct acpi_dlevel {
|
||||
const char *name;
|
||||
unsigned long value;
|
||||
};
|
||||
#define ACPI_DEBUG_INIT(v) { .name = #v, .value = v }
|
||||
|
||||
static const struct acpi_dlayer acpi_debug_layers[] =
|
||||
{
|
||||
ACPI_DEBUG_INIT(ACPI_UTILITIES),
|
||||
ACPI_DEBUG_INIT(ACPI_HARDWARE),
|
||||
ACPI_DEBUG_INIT(ACPI_EVENTS),
|
||||
ACPI_DEBUG_INIT(ACPI_TABLES),
|
||||
ACPI_DEBUG_INIT(ACPI_NAMESPACE),
|
||||
ACPI_DEBUG_INIT(ACPI_PARSER),
|
||||
ACPI_DEBUG_INIT(ACPI_DISPATCHER),
|
||||
ACPI_DEBUG_INIT(ACPI_EXECUTER),
|
||||
ACPI_DEBUG_INIT(ACPI_RESOURCES),
|
||||
ACPI_DEBUG_INIT(ACPI_CA_DEBUGGER),
|
||||
ACPI_DEBUG_INIT(ACPI_OS_SERVICES),
|
||||
ACPI_DEBUG_INIT(ACPI_CA_DISASSEMBLER),
|
||||
ACPI_DEBUG_INIT(ACPI_COMPILER),
|
||||
ACPI_DEBUG_INIT(ACPI_TOOLS),
|
||||
};
|
||||
|
||||
static const struct acpi_dlevel acpi_debug_levels[] =
|
||||
{
|
||||
ACPI_DEBUG_INIT(ACPI_LV_ERROR),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_WARN),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_INIT),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_INFO),
|
||||
|
||||
ACPI_DEBUG_INIT(ACPI_LV_INIT_NAMES),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_PARSE),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_LOAD),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_DISPATCH),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_EXEC),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_NAMES),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_OPREGION),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_BFIELD),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_TABLES),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_VALUES),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_OBJECTS),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_RESOURCES),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_USER_REQUESTS),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_PACKAGE),
|
||||
|
||||
ACPI_DEBUG_INIT(ACPI_LV_ALLOCATIONS),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_FUNCTIONS),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_OPTIMIZATIONS),
|
||||
|
||||
ACPI_DEBUG_INIT(ACPI_LV_MUTEX),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_THREADS),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_IO),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_INTERRUPTS),
|
||||
|
||||
ACPI_DEBUG_INIT(ACPI_LV_AML_DISASSEMBLE),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_VERBOSE_INFO),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_FULL_TABLES),
|
||||
ACPI_DEBUG_INIT(ACPI_LV_EVENTS),
|
||||
};
|
||||
|
||||
static int
|
||||
acpi_system_read_debug (
|
||||
char *page,
|
||||
char **start,
|
||||
off_t off,
|
||||
int count,
|
||||
int *eof,
|
||||
void *data)
|
||||
{
|
||||
char *p = page;
|
||||
int size = 0;
|
||||
unsigned int i;
|
||||
|
||||
if (off != 0)
|
||||
goto end;
|
||||
|
||||
p += sprintf(p, "%-25s\tHex SET\n", "Description");
|
||||
|
||||
switch ((unsigned long) data) {
|
||||
case 0:
|
||||
for (i = 0; i < ARRAY_SIZE(acpi_debug_layers); i++) {
|
||||
p += sprintf(p, "%-25s\t0x%08lX [%c]\n",
|
||||
acpi_debug_layers[i].name,
|
||||
acpi_debug_layers[i].value,
|
||||
(acpi_dbg_layer & acpi_debug_layers[i].value) ?
|
||||
'*' : ' ');
|
||||
}
|
||||
p += sprintf(p, "%-25s\t0x%08X [%c]\n", "ACPI_ALL_DRIVERS",
|
||||
ACPI_ALL_DRIVERS,
|
||||
(acpi_dbg_layer & ACPI_ALL_DRIVERS) == ACPI_ALL_DRIVERS?
|
||||
'*' : (acpi_dbg_layer & ACPI_ALL_DRIVERS) == 0 ?
|
||||
' ' : '-');
|
||||
p += sprintf(p,
|
||||
"--\ndebug_layer = 0x%08X (* = enabled, - = partial)\n",
|
||||
acpi_dbg_layer);
|
||||
break;
|
||||
case 1:
|
||||
for (i = 0; i < ARRAY_SIZE(acpi_debug_levels); i++) {
|
||||
p += sprintf(p, "%-25s\t0x%08lX [%c]\n",
|
||||
acpi_debug_levels[i].name,
|
||||
acpi_debug_levels[i].value,
|
||||
(acpi_dbg_level & acpi_debug_levels[i].value) ?
|
||||
'*' : ' ');
|
||||
}
|
||||
p += sprintf(p, "--\ndebug_level = 0x%08X (* = enabled)\n",
|
||||
acpi_dbg_level);
|
||||
break;
|
||||
default:
|
||||
p += sprintf(p, "Invalid debug option\n");
|
||||
break;
|
||||
}
|
||||
|
||||
end:
|
||||
size = (p - page);
|
||||
if (size <= off+count) *eof = 1;
|
||||
*start = page + off;
|
||||
size -= off;
|
||||
if (size>count) size = count;
|
||||
if (size<0) size = 0;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_system_write_debug (
|
||||
struct file *file,
|
||||
const char __user *buffer,
|
||||
unsigned long count,
|
||||
void *data)
|
||||
{
|
||||
char debug_string[12] = {'\0'};
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_system_write_debug");
|
||||
|
||||
if (count > sizeof(debug_string) - 1)
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
if (copy_from_user(debug_string, buffer, count))
|
||||
return_VALUE(-EFAULT);
|
||||
|
||||
debug_string[count] = '\0';
|
||||
|
||||
switch ((unsigned long) data) {
|
||||
case 0:
|
||||
acpi_dbg_layer = simple_strtoul(debug_string, NULL, 0);
|
||||
break;
|
||||
case 1:
|
||||
acpi_dbg_level = simple_strtoul(debug_string, NULL, 0);
|
||||
break;
|
||||
default:
|
||||
return_VALUE(-EINVAL);
|
||||
}
|
||||
|
||||
return_VALUE(count);
|
||||
}
|
||||
|
||||
static int __init acpi_debug_init(void)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
int error = 0;
|
||||
char * name;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_debug_init");
|
||||
|
||||
if (acpi_disabled)
|
||||
return_VALUE(0);
|
||||
|
||||
/* 'debug_layer' [R/W] */
|
||||
name = ACPI_SYSTEM_FILE_DEBUG_LAYER;
|
||||
entry = create_proc_read_entry(name, S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir,
|
||||
acpi_system_read_debug,(void *)0);
|
||||
if (entry)
|
||||
entry->write_proc = acpi_system_write_debug;
|
||||
else
|
||||
goto Error;
|
||||
|
||||
/* 'debug_level' [R/W] */
|
||||
name = ACPI_SYSTEM_FILE_DEBUG_LEVEL;
|
||||
entry = create_proc_read_entry(name, S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir,
|
||||
acpi_system_read_debug, (void *)1);
|
||||
if (entry)
|
||||
entry->write_proc = acpi_system_write_debug;
|
||||
else
|
||||
goto Error;
|
||||
|
||||
Done:
|
||||
return_VALUE(error);
|
||||
|
||||
Error:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Unable to create '%s' proc fs entry\n", name));
|
||||
|
||||
remove_proc_entry(ACPI_SYSTEM_FILE_DEBUG_LEVEL, acpi_root_dir);
|
||||
remove_proc_entry(ACPI_SYSTEM_FILE_DEBUG_LAYER, acpi_root_dir);
|
||||
error = -EFAULT;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
subsys_initcall(acpi_debug_init);
|
||||
@@ -0,0 +1,9 @@
|
||||
#
|
||||
# Makefile for all Linux ACPI interpreter subdirectories
|
||||
#
|
||||
|
||||
obj-y := dsfield.o dsmthdat.o dsopcode.o dswexec.o dswscope.o \
|
||||
dsmethod.o dsobject.o dsutils.o dswload.o dswstate.o \
|
||||
dsinit.o
|
||||
|
||||
EXTRA_CFLAGS += $(ACPI_CFLAGS)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,235 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: dsinit - Object initialization namespace walk
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2005, R. Byron Moore
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acdispat.h>
|
||||
#include <acpi/acnamesp.h>
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME ("dsinit")
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_init_one_object
|
||||
*
|
||||
* PARAMETERS: obj_handle - Node
|
||||
* Level - Current nesting level
|
||||
* Context - Points to a init info struct
|
||||
* return_value - Not used
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Callback from acpi_walk_namespace. Invoked for every object
|
||||
* within the namespace.
|
||||
*
|
||||
* Currently, the only objects that require initialization are:
|
||||
* 1) Methods
|
||||
* 2) Operation Regions
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_init_one_object (
|
||||
acpi_handle obj_handle,
|
||||
u32 level,
|
||||
void *context,
|
||||
void **return_value)
|
||||
{
|
||||
acpi_object_type type;
|
||||
acpi_status status;
|
||||
struct acpi_init_walk_info *info = (struct acpi_init_walk_info *) context;
|
||||
|
||||
|
||||
ACPI_FUNCTION_NAME ("ds_init_one_object");
|
||||
|
||||
|
||||
/*
|
||||
* We are only interested in objects owned by the table that
|
||||
* was just loaded
|
||||
*/
|
||||
if (((struct acpi_namespace_node *) obj_handle)->owner_id !=
|
||||
info->table_desc->table_id) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
info->object_count++;
|
||||
|
||||
/* And even then, we are only interested in a few object types */
|
||||
|
||||
type = acpi_ns_get_type (obj_handle);
|
||||
|
||||
switch (type) {
|
||||
case ACPI_TYPE_REGION:
|
||||
|
||||
status = acpi_ds_initialize_region (obj_handle);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Region %p [%4.4s] - Init failure, %s\n",
|
||||
obj_handle, acpi_ut_get_node_name (obj_handle),
|
||||
acpi_format_exception (status)));
|
||||
}
|
||||
|
||||
info->op_region_count++;
|
||||
break;
|
||||
|
||||
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
info->method_count++;
|
||||
|
||||
/* Print a dot for each method unless we are going to print the entire pathname */
|
||||
|
||||
if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
|
||||
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the execution data width (32 or 64) based upon the
|
||||
* revision number of the parent ACPI table.
|
||||
* TBD: This is really for possible future support of integer width
|
||||
* on a per-table basis. Currently, we just use a global for the width.
|
||||
*/
|
||||
if (info->table_desc->pointer->revision == 1) {
|
||||
((struct acpi_namespace_node *) obj_handle)->flags |= ANOBJ_DATA_WIDTH_32;
|
||||
}
|
||||
|
||||
/*
|
||||
* Always parse methods to detect errors, we will delete
|
||||
* the parse tree below
|
||||
*/
|
||||
status = acpi_ds_parse_method (obj_handle);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] - parse failure, %s\n",
|
||||
obj_handle, acpi_ut_get_node_name (obj_handle),
|
||||
acpi_format_exception (status)));
|
||||
|
||||
/* This parse failed, but we will continue parsing more methods */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete the parse tree. We simply re-parse the method
|
||||
* for every execution since there isn't much overhead
|
||||
*/
|
||||
acpi_ns_delete_namespace_subtree (obj_handle);
|
||||
acpi_ns_delete_namespace_by_owner (((struct acpi_namespace_node *) obj_handle)->object->method.owning_id);
|
||||
break;
|
||||
|
||||
|
||||
case ACPI_TYPE_DEVICE:
|
||||
|
||||
info->device_count++;
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* We ignore errors from above, and always return OK, since
|
||||
* we don't want to abort the walk on a single error.
|
||||
*/
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_initialize_objects
|
||||
*
|
||||
* PARAMETERS: table_desc - Descriptor for parent ACPI table
|
||||
* start_node - Root of subtree to be initialized.
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Walk the namespace starting at "start_node" and perform any
|
||||
* necessary initialization on the objects found therein
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ds_initialize_objects (
|
||||
struct acpi_table_desc *table_desc,
|
||||
struct acpi_namespace_node *start_node)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_init_walk_info info;
|
||||
|
||||
|
||||
ACPI_FUNCTION_TRACE ("ds_initialize_objects");
|
||||
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"**** Starting initialization of namespace objects ****\n"));
|
||||
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Parsing all Control Methods:"));
|
||||
|
||||
info.method_count = 0;
|
||||
info.op_region_count = 0;
|
||||
info.object_count = 0;
|
||||
info.device_count = 0;
|
||||
info.table_desc = table_desc;
|
||||
|
||||
/* Walk entire namespace from the supplied root */
|
||||
|
||||
status = acpi_walk_namespace (ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
|
||||
acpi_ds_init_one_object, &info, NULL);
|
||||
if (ACPI_FAILURE (status)) {
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "walk_namespace failed, %s\n",
|
||||
acpi_format_exception (status)));
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
|
||||
"\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n",
|
||||
table_desc->pointer->signature, table_desc->table_id, info.object_count,
|
||||
info.device_count, info.method_count, info.op_region_count));
|
||||
|
||||
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
|
||||
"%hd Methods, %hd Regions\n", info.method_count, info.op_region_count));
|
||||
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user