ACPICA: minimal patch to integrate new tables into Linux

Signed-off-by: Len Brown <[email protected]>
This commit is contained in:
Alexey Starikovskiy 2007-02-02 19:48:19 +03:00 • committed by Len Brown
commit ad71860a17
31 changed files with 191 additions and 453 deletions

View file

@ -26,7 +26,7 @@
* Pontus Fuchs - Helper functions, cleanup
* Johann Wiesner - Small compile fixes
* John Belmonte - ACPI code for Toshiba laptop was a good starting point.
* Éric Burghard - LED display support for W1N
* <EFBFBD>ic Burghard - LED display support for W1N
*
*/
@ -1128,7 +1128,6 @@ static int asus_model_match(char *model)
static int asus_hotk_get_info(void)
{
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL };
union acpi_object *model = NULL;
int bsts_result;
char *string = NULL;
@ -1142,11 +1141,9 @@ static int asus_hotk_get_info(void)
* HID), this bit will be moved. A global variable asus_info contains
* the DSDT header.
*/
status = acpi_get_table(ACPI_TABLE_ID_DSDT, 1, &dsdt);
status = acpi_get_table(ACPI_SIG_DSDT, 1, &asus_info);
if (ACPI_FAILURE(status))
printk(KERN_WARNING " Couldn't get the DSDT table header\n");
else
asus_info = dsdt.pointer;
/* We have to write 0 on init this far for all ASUS models */
if (!write_acpi_int(hotk->handle, "INIT", 0, &buffer)) {
@ -1358,8 +1355,6 @@ static void __exit asus_acpi_exit(void)
acpi_bus_unregister_driver(&asus_hotk_driver);
remove_proc_entry(PROC_ASUS, acpi_root_dir);
kfree(asus_info);
return;
}

View file

@ -44,7 +44,7 @@ struct acpi_blacklist_item {
char oem_id[7];
char oem_table_id[9];
u32 oem_revision;
acpi_table_type table;
char *table;
enum acpi_blacklist_predicates oem_revision_predicate;
char *reason;
u32 is_critical_error;
@ -56,18 +56,18 @@ struct acpi_blacklist_item {
*/
static struct acpi_blacklist_item acpi_blacklist[] __initdata = {
/* Compaq Presario 1700 */
{"PTLTD ", " DSDT ", 0x06040000, ACPI_DSDT, less_than_or_equal,
{"PTLTD ", " DSDT ", 0x06040000, ACPI_SIG_DSDT, less_than_or_equal,
"Multiple problems", 1},
/* Sony FX120, FX140, FX150? */
{"SONY ", "U0 ", 0x20010313, ACPI_DSDT, less_than_or_equal,
{"SONY ", "U0 ", 0x20010313, ACPI_SIG_DSDT, less_than_or_equal,
"ACPI driver problem", 1},
/* Compaq Presario 800, Insyde BIOS */
{"INT440", "SYSFexxx", 0x00001001, ACPI_DSDT, less_than_or_equal,
{"INT440", "SYSFexxx", 0x00001001, ACPI_SIG_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,
{"IBM ", "TP600E ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal,
"Incorrect _ADR", 1},
{"ASUS\0\0", "P2B-S ", 0, ACPI_DSDT, all_versions,
{"ASUS\0\0", "P2B-S ", 0, ACPI_SIG_DSDT, all_versions,
"Bogus PCI routing", 1},
{""}
@ -106,8 +106,7 @@ int __init acpi_blacklisted(void)
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)) {
if (acpi_get_table_header(acpi_blacklist[i].table, 0, &table_header)) {
i++;
continue;
}

View file

@ -44,9 +44,6 @@ ACPI_MODULE_NAME("acpi_bus")
extern void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger);
#endif
struct fadt_descriptor acpi_fadt;
EXPORT_SYMBOL(acpi_fadt);
struct acpi_device *acpi_root;
struct proc_dir_entry *acpi_root_dir;
EXPORT_SYMBOL(acpi_root_dir);
@ -582,11 +579,12 @@ static int __init acpi_bus_init_irq(void)
return 0;
}
acpi_native_uint acpi_gbl_permanent_mmap;
void __init acpi_early_init(void)
{
acpi_status status = AE_OK;
struct acpi_buffer buffer = { sizeof(acpi_fadt), &acpi_fadt };
if (acpi_disabled)
return;
@ -597,6 +595,15 @@ void __init acpi_early_init(void)
if (!acpi_strict)
acpi_gbl_enable_interpreter_slack = TRUE;
acpi_gbl_permanent_mmap = 1;
status = acpi_reallocate_root_table();
if (ACPI_FAILURE(status)) {
printk(KERN_ERR PREFIX
"Unable to reallocate ACPI tables\n");
goto error0;
}
status = acpi_initialize_subsystem();
if (ACPI_FAILURE(status)) {
printk(KERN_ERR PREFIX
@ -611,14 +618,6 @@ void __init acpi_early_init(void)
goto error0;
}
/*
* Get a separate copy of the FADT for use by other drivers.
*/
status = acpi_get_table(ACPI_TABLE_ID_FADT, 1, &buffer);
if (ACPI_FAILURE(status)) {
printk(KERN_ERR PREFIX "Unable to get the FADT\n");
goto error0;
}
#ifdef CONFIG_X86
if (!acpi_ioapic) {
extern acpi_interrupt_flags acpi_sci_flags;

View file

@ -872,9 +872,7 @@ static int __init acpi_ec_get_real_ecdt(void)
acpi_status status;
struct acpi_table_ecdt *ecdt_ptr;
status = acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING,
(struct acpi_table_header **)
&ecdt_ptr);
status = acpi_get_table("ECDT", 1, (struct acpi_table_header **)&ecdt_ptr);
if (ACPI_FAILURE(status))
return -ENODEV;

View file

@ -134,41 +134,41 @@ static void __init acpi_request_region (struct acpi_generic_address *addr,
if (!addr->address || !length)
return;
if (addr->address_space_id == ACPI_ADR_SPACE_SYSTEM_IO)
if (addr->space_id == ACPI_ADR_SPACE_SYSTEM_IO)
request_region(addr->address, length, desc);
else if (addr->address_space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
else if (addr->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
request_mem_region(addr->address, length, desc);
}
static void __init acpi_reserve_resources(void)
{
acpi_request_region(&acpi_gbl_FADT->xpm1a_evt_blk,
acpi_gbl_FADT->pm1_evt_len, "ACPI PM1a_EVT_BLK");
acpi_request_region(&acpi_gbl_FADT.xpm1a_event_block,
acpi_gbl_FADT.pm1_event_length, "ACPI PM1a_EVT_BLK");
acpi_request_region(&acpi_gbl_FADT->xpm1b_evt_blk,
acpi_gbl_FADT->pm1_evt_len, "ACPI PM1b_EVT_BLK");
acpi_request_region(&acpi_gbl_FADT.xpm1b_event_block,
acpi_gbl_FADT.pm1_event_length, "ACPI PM1b_EVT_BLK");
acpi_request_region(&acpi_gbl_FADT->xpm1a_cnt_blk,
acpi_gbl_FADT->pm1_cnt_len, "ACPI PM1a_CNT_BLK");
acpi_request_region(&acpi_gbl_FADT.xpm1a_control_block,
acpi_gbl_FADT.pm1_control_length, "ACPI PM1a_CNT_BLK");
acpi_request_region(&acpi_gbl_FADT->xpm1b_cnt_blk,
acpi_gbl_FADT->pm1_cnt_len, "ACPI PM1b_CNT_BLK");
acpi_request_region(&acpi_gbl_FADT.xpm1b_control_block,
acpi_gbl_FADT.pm1_control_length, "ACPI PM1b_CNT_BLK");
if (acpi_gbl_FADT->pm_tm_len == 4)
acpi_request_region(&acpi_gbl_FADT->xpm_tmr_blk, 4, "ACPI PM_TMR");
if (acpi_gbl_FADT.pm_timer_length == 4)
acpi_request_region(&acpi_gbl_FADT.xpm_timer_block, 4, "ACPI PM_TMR");
acpi_request_region(&acpi_gbl_FADT->xpm2_cnt_blk,
acpi_gbl_FADT->pm2_cnt_len, "ACPI PM2_CNT_BLK");
acpi_request_region(&acpi_gbl_FADT.xpm2_control_block,
acpi_gbl_FADT.pm2_control_length, "ACPI PM2_CNT_BLK");
/* Length of GPE blocks must be a non-negative multiple of 2 */
if (!(acpi_gbl_FADT->gpe0_blk_len & 0x1))
acpi_request_region(&acpi_gbl_FADT->xgpe0_blk,
acpi_gbl_FADT->gpe0_blk_len, "ACPI GPE0_BLK");
if (!(acpi_gbl_FADT.gpe0_block_length & 0x1))
acpi_request_region(&acpi_gbl_FADT.xgpe0_block,
acpi_gbl_FADT.gpe0_block_length, "ACPI GPE0_BLK");
if (!(acpi_gbl_FADT->gpe1_blk_len & 0x1))
acpi_request_region(&acpi_gbl_FADT->xgpe1_blk,
acpi_gbl_FADT->gpe1_blk_len, "ACPI GPE1_BLK");
if (!(acpi_gbl_FADT.gpe1_block_length & 0x1))
acpi_request_region(&acpi_gbl_FADT.xgpe1_block,
acpi_gbl_FADT.gpe1_block_length, "ACPI GPE1_BLK");
}
static int __init acpi_motherboard_init(void)

View file

@ -36,6 +36,7 @@
#include <linux/delay.h>
#include <linux/workqueue.h>
#include <linux/nmi.h>
#include <linux/acpi.h>
#include <acpi/acpi.h>
#include <asm/io.h>
#include <acpi/acpi_bus.h>
@ -136,53 +137,43 @@ void acpi_os_vprintf(const char *fmt, va_list args)
#endif
}
acpi_status acpi_os_get_root_pointer(u32 flags, struct acpi_pointer *addr)
acpi_physical_address __init acpi_os_get_root_pointer(void)
{
if (efi_enabled) {
addr->pointer_type = ACPI_PHYSICAL_POINTER;
if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
addr->pointer.physical = efi.acpi20;
return efi.acpi20;
else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
addr->pointer.physical = efi.acpi;
return efi.acpi;
else {
printk(KERN_ERR PREFIX
"System description tables not found\n");
return AE_NOT_FOUND;
return 0;
}
} else {
if (ACPI_FAILURE(acpi_find_root_pointer(flags, addr))) {
printk(KERN_ERR PREFIX
"System description tables not found\n");
return AE_NOT_FOUND;
}
}
return AE_OK;
} else
return acpi_find_rsdp();
}
acpi_status
acpi_os_map_memory(acpi_physical_address phys, acpi_size size,
void __iomem ** virt)
void __iomem *acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
{
if (phys > ULONG_MAX) {
printk(KERN_ERR PREFIX "Cannot map memory that high\n");
return AE_BAD_PARAMETER;
return 0;
}
/*
* ioremap checks to ensure this is in reserved space
*/
*virt = ioremap((unsigned long)phys, size);
if (!*virt)
return AE_NO_MEMORY;
return AE_OK;
if (acpi_gbl_permanent_mmap)
/*
* ioremap checks to ensure this is in reserved space
*/
return ioremap((unsigned long)phys, size);
else
return __acpi_map_table((unsigned long)phys, size);
}
EXPORT_SYMBOL_GPL(acpi_os_map_memory);
void acpi_os_unmap_memory(void __iomem * virt, acpi_size size)
{
iounmap(virt);
if (acpi_gbl_permanent_mmap) {
iounmap(virt);
}
}
EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);

View file

@ -431,7 +431,7 @@ static int acpi_processor_get_info(struct acpi_processor *pr)
* Check to see if we have bus mastering arbitration control. This
* is required for proper C3 usage (to maintain cache coherency).
*/
if (acpi_fadt.V1_pm2_cnt_blk && acpi_fadt.pm2_cnt_len) {
if (acpi_fadt.pm2_control_block && acpi_fadt.pm2_control_length) {
pr->flags.bm_control = 1;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Bus mastering arbitration control present\n"));

View file

@ -160,7 +160,7 @@ static inline u32 ticks_elapsed(u32 t1, u32 t2)
{
if (t2 >= t1)
return (t2 - t1);
else if (!acpi_fadt.tmr_val_ext)
else if (!(acpi_fadt.flags & ACPI_FADT_32BIT_TIMER))
return (((0x00FFFFFF - t1) + t2) & 0x00FFFFFF);
else
return ((0xFFFFFFFF - t1) + t2);
@ -236,7 +236,7 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
/* Dummy wait op - must do something useless after P_LVL2 read
because chipsets cannot guarantee that STPCLK# signal
gets asserted in time to freeze execution properly. */
unused = inl(acpi_fadt.xpm_tmr_blk.address);
unused = inl(acpi_fadt.xpm_timer_block.address);
}
}
@ -338,7 +338,7 @@ static void acpi_processor_idle(void)
* detection phase, to work cleanly with logical CPU hotplug.
*/
if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
!pr->flags.has_cst && !acpi_fadt.plvl2_up)
!pr->flags.has_cst && !(acpi_fadt.flags & ACPI_FADT_C2_MP_SUPPORTED))
cx = &pr->power.states[ACPI_STATE_C1];
#endif
@ -384,11 +384,11 @@ static void acpi_processor_idle(void)
case ACPI_STATE_C2:
/* Get start time (ticks) */
t1 = inl(acpi_fadt.xpm_tmr_blk.address);
t1 = inl(acpi_fadt.xpm_timer_block.address);
/* Invoke C2 */
acpi_cstate_enter(cx);
/* Get end time (ticks) */
t2 = inl(acpi_fadt.xpm_tmr_blk.address);
t2 = inl(acpi_fadt.xpm_timer_block.address);
#ifdef CONFIG_GENERIC_TIME
/* TSC halts in C2, so notify users */
@ -420,11 +420,11 @@ static void acpi_processor_idle(void)
}
/* Get start time (ticks) */
t1 = inl(acpi_fadt.xpm_tmr_blk.address);
t1 = inl(acpi_fadt.xpm_timer_block.address);
/* Invoke C3 */
acpi_cstate_enter(cx);
/* Get end time (ticks) */
t2 = inl(acpi_fadt.xpm_tmr_blk.address);
t2 = inl(acpi_fadt.xpm_timer_block.address);
if (pr->flags.bm_check) {
/* Enable bus master arbitration */
atomic_dec(&c3_cpu_count);
@ -457,7 +457,7 @@ static void acpi_processor_idle(void)
#ifdef CONFIG_HOTPLUG_CPU
/* Don't do promotion/demotion */
if ((cx->type == ACPI_STATE_C1) && (num_online_cpus() > 1) &&
!pr->flags.has_cst && !acpi_fadt.plvl2_up) {
!pr->flags.has_cst && !(acpi_fadt.flags & ACPI_FADT_C2_MP_SUPPORTED)) {
next_state = cx;
goto end;
}
@ -627,7 +627,8 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
* Check for P_LVL2_UP flag before entering C2 and above on
* an SMP system.
*/
if ((num_online_cpus() > 1) && !acpi_fadt.plvl2_up)
if ((num_online_cpus() > 1) &&
!(acpi_fadt.flags & ACPI_FADT_C2_MP_SUPPORTED))
return -ENODEV;
#endif
@ -636,8 +637,8 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
pr->power.states[ACPI_STATE_C3].address = pr->pblk + 5;
/* determine latencies from FADT */
pr->power.states[ACPI_STATE_C2].latency = acpi_fadt.plvl2_lat;
pr->power.states[ACPI_STATE_C3].latency = acpi_fadt.plvl3_lat;
pr->power.states[ACPI_STATE_C2].latency = acpi_fadt.C2latency;
pr->power.states[ACPI_STATE_C3].latency = acpi_fadt.C3latency;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"lvl2[0x%08x] lvl3[0x%08x]\n",
@ -883,7 +884,7 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr,
* WBINVD should be set in fadt, for C3 state to be
* supported on when bm_check is not required.
*/
if (acpi_fadt.wb_invd != 1) {
if (!(acpi_fadt.flags & ACPI_FADT_WBINVD)) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Cache invalidation should work properly"
" for C3 to be enabled on SMP systems\n"));
@ -1164,9 +1165,9 @@ int __cpuinit acpi_processor_power_init(struct acpi_processor *pr,
if (!pr)
return -EINVAL;
if (acpi_fadt.cst_cnt && !nocst) {
if (acpi_fadt.cst_control && !nocst) {
status =
acpi_os_write_port(acpi_fadt.smi_cmd, acpi_fadt.cst_cnt, 8);
acpi_os_write_port(acpi_fadt.smi_command, acpi_fadt.cst_control, 8);
if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status,
"Notifying BIOS of _CST ability failed"));

View file

@ -352,31 +352,24 @@ int acpi_processor_notify_smm(struct module *calling_module)
is_done = -EIO;
/* Can't write pstate_cnt to smi_cmd if either value is zero */
if ((!acpi_fadt.smi_cmd) || (!acpi_fadt.pstate_cnt)) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No SMI port or pstate_cnt\n"));
/* Can't write pstate_control to smi_command if either value is zero */
if ((!acpi_fadt.smi_command) || (!acpi_fadt.pstate_control)) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No SMI port or pstate_control\n"));
module_put(calling_module);
return 0;
}
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Writing pstate_cnt [0x%x] to smi_cmd [0x%x]\n",
acpi_fadt.pstate_cnt, acpi_fadt.smi_cmd));
"Writing pstate_control [0x%x] to smi_command [0x%x]\n",
acpi_fadt.pstate_control, acpi_fadt.smi_command));
/* FADT v1 doesn't support pstate_cnt, many BIOS vendors use
* it anyway, so we need to support it... */
if (acpi_fadt_is_v1) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Using v1.0 FADT reserved value for pstate_cnt\n"));
}
status = acpi_os_write_port(acpi_fadt.smi_cmd,
(u32) acpi_fadt.pstate_cnt, 8);
status = acpi_os_write_port(acpi_fadt.smi_command,
(u32) acpi_fadt.pstate_control, 8);
if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status,
"Failed to write pstate_cnt [0x%x] to "
"smi_cmd [0x%x]", acpi_fadt.pstate_cnt,
acpi_fadt.smi_cmd));
"Failed to write pstate_control [0x%x] to "
"smi_command [0x%x]", acpi_fadt.pstate_control,
acpi_fadt.smi_command));
module_put(calling_module);
return status;
}

View file

@ -1333,7 +1333,7 @@ static int acpi_bus_scan_fixed(struct acpi_device *root)
/*
* Enumerate all fixed-feature devices.
*/
if (acpi_fadt.pwr_button == 0) {
if ((acpi_fadt.flags & ACPI_FADT_POWER_BUTTON) == 0) {
result = acpi_add_single_object(&device, acpi_root,
NULL,
ACPI_BUS_TYPE_POWER_BUTTON);
@ -1341,7 +1341,7 @@ static int acpi_bus_scan_fixed(struct acpi_device *root)
result = acpi_start_single_object(device);
}
if (acpi_fadt.sleep_button == 0) {
if ((acpi_fadt.flags & ACPI_FADT_SLEEP_BUTTON) == 0) {
result = acpi_add_single_object(&device, acpi_root,
NULL,
ACPI_BUS_TYPE_SLEEP_BUTTON);

View file

@ -73,7 +73,7 @@ acpi_system_write_sleep(struct file *file,
static int acpi_system_alarm_seq_show(struct seq_file *seq, void *offset)
{
u32 sec, min, hr;
u32 day, mo, yr;
u32 day, mo, yr, cent = 0;
unsigned char rtc_control = 0;
unsigned long flags;
@ -87,20 +87,19 @@ static int acpi_system_alarm_seq_show(struct seq_file *seq, void *offset)
rtc_control = CMOS_READ(RTC_CONTROL);
/* If we ever get an FACP with proper values... */
if (acpi_gbl_FADT->day_alrm)
if (acpi_gbl_FADT.day_alarm)
/* ACPI spec: only low 6 its should be cared */
day = CMOS_READ(acpi_gbl_FADT->day_alrm) & 0x3F;
day = CMOS_READ(acpi_gbl_FADT.day_alarm) & 0x3F;
else
day = CMOS_READ(RTC_DAY_OF_MONTH);
if (acpi_gbl_FADT->mon_alrm)
mo = CMOS_READ(acpi_gbl_FADT->mon_alrm);
if (acpi_gbl_FADT.month_alarm)
mo = CMOS_READ(acpi_gbl_FADT.month_alarm);
else
mo = CMOS_READ(RTC_MONTH);
if (acpi_gbl_FADT->century)
yr = CMOS_READ(acpi_gbl_FADT->century) * 100 +
CMOS_READ(RTC_YEAR);
else
yr = CMOS_READ(RTC_YEAR);
if (acpi_gbl_FADT.century)
cent = CMOS_READ(acpi_gbl_FADT.century);
yr = CMOS_READ(RTC_YEAR);
spin_unlock_irqrestore(&rtc_lock, flags);
@ -111,10 +110,11 @@ static int acpi_system_alarm_seq_show(struct seq_file *seq, void *offset)
BCD_TO_BIN(day);
BCD_TO_BIN(mo);
BCD_TO_BIN(yr);
BCD_TO_BIN(cent);
}
/* we're trusting the FADT (see above) */
if (!acpi_gbl_FADT->century)
if (!acpi_gbl_FADT.century)
/* If we're not trusting the FADT, we should at least make it
* right for _this_ century... ehm, what is _this_ century?
*
@ -134,6 +134,8 @@ static int acpi_system_alarm_seq_show(struct seq_file *seq, void *offset)
*
*/
yr += 2000;
else
yr += cent * 100;
seq_printf(seq, "%4.4u-", yr);
(mo > 12) ? seq_puts(seq, "**-") : seq_printf(seq, "%2.2u-", mo);
@ -317,12 +319,12 @@ acpi_system_write_alarm(struct file *file,
* offsets into the CMOS RAM here -- which for some reason are pointing
* to the RTC area of memory.
*/
if (acpi_gbl_FADT->day_alrm)
CMOS_WRITE(day, acpi_gbl_FADT->day_alrm);
if (acpi_gbl_FADT->mon_alrm)
CMOS_WRITE(mo, acpi_gbl_FADT->mon_alrm);
if (acpi_gbl_FADT->century)
CMOS_WRITE(yr / 100, acpi_gbl_FADT->century);
if (acpi_gbl_FADT.day_alarm)
CMOS_WRITE(day, acpi_gbl_FADT.day_alarm);
if (acpi_gbl_FADT.month_alarm)
CMOS_WRITE(mo, acpi_gbl_FADT.month_alarm);
if (acpi_gbl_FADT.century)
CMOS_WRITE(yr / 100, acpi_gbl_FADT.century);
/* enable the rtc alarm interrupt */
rtc_control |= RTC_AIE;
CMOS_WRITE(rtc_control, RTC_CONTROL);

View file

@ -39,7 +39,6 @@ ACPI_MODULE_NAME("acpi_system")
#define ACPI_SYSTEM_FILE_EVENT "event"
#define ACPI_SYSTEM_FILE_DSDT "dsdt"
#define ACPI_SYSTEM_FILE_FADT "fadt"
extern struct fadt_descriptor acpi_fadt;
/* --------------------------------------------------------------------------
FS Interface (/proc)
@ -76,17 +75,16 @@ acpi_system_read_dsdt(struct file *file,
char __user * buffer, size_t count, loff_t * ppos)
{
acpi_status status = AE_OK;
struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL };
struct acpi_table_header *dsdt = NULL;
ssize_t res;
status = acpi_get_table(ACPI_TABLE_ID_DSDT, 1, &dsdt);
status = acpi_get_table(ACPI_SIG_DSDT, 1, &dsdt);
if (ACPI_FAILURE(status))
return -ENODEV;
res = simple_read_from_buffer(buffer, count, ppos,
dsdt.pointer, dsdt.length);
kfree(dsdt.pointer);
dsdt, dsdt->length);
return res;
}
@ -103,17 +101,16 @@ acpi_system_read_fadt(struct file *file,
char __user * buffer, size_t count, loff_t * ppos)
{
acpi_status status = AE_OK;
struct acpi_buffer fadt = { ACPI_ALLOCATE_BUFFER, NULL };
struct acpi_table_header *fadt = NULL;
ssize_t res;
status = acpi_get_table(ACPI_TABLE_ID_FADT, 1, &fadt);
status = acpi_get_table(ACPI_SIG_FADT, 1, &fadt);
if (ACPI_FAILURE(status))
return -ENODEV;
res = simple_read_from_buffer(buffer, count, ppos,
fadt.pointer, fadt.length);
kfree(fadt.pointer);
fadt, fadt->length);
return res;
}

View file

@ -74,6 +74,7 @@ static unsigned long sdt_pa; /* Physical Address */
static unsigned long sdt_count; /* Table count */
static struct acpi_table_sdt sdt_entry[ACPI_MAX_TABLES] __initdata;
static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;
void acpi_table_print(struct acpi_table_header *header, unsigned long phys_addr)
{
@ -284,12 +285,12 @@ acpi_get_table_header_early(enum acpi_table_id id,
struct fadt_descriptor *fadt =
(struct fadt_descriptor *)*header;
if (fadt->revision == 3 && fadt->Xdsdt) {
if (fadt->header.revision == 3 && fadt->Xdsdt) {
*header = (void *)__acpi_map_table(fadt->Xdsdt,
sizeof(struct
acpi_table_header));
} else if (fadt->V1_dsdt) {
*header = (void *)__acpi_map_table(fadt->V1_dsdt,
} else if (fadt->dsdt) {
*header = (void *)__acpi_map_table(fadt->dsdt,
sizeof(struct
acpi_table_header));
} else
@ -410,12 +411,11 @@ static int __init acpi_table_get_sdt(struct acpi_table_rsdp *rsdp)
/* First check XSDT (but only on ACPI 2.0-compatible systems) */
if ((rsdp->revision >= 2) &&
(((struct acpi20_table_rsdp *)rsdp)->xsdt_address)) {
if ((rsdp->revision >= 2) && rsdp->xsdt_physical_address) {
struct acpi_table_xsdt *mapped_xsdt = NULL;
sdt_pa = ((struct acpi20_table_rsdp *)rsdp)->xsdt_address;
sdt_pa = rsdp->xsdt_physical_address;
/* map in just the header */
header = (struct acpi_table_header *)
@ -457,16 +457,16 @@ static int __init acpi_table_get_sdt(struct acpi_table_rsdp *rsdp)
}
for (i = 0; i < sdt_count; i++)
sdt_entry[i].pa = (unsigned long)mapped_xsdt->entry[i];
sdt_entry[i].pa = (unsigned long)mapped_xsdt->table_offset_entry[i];
}
/* Then check RSDT */
else if (rsdp->rsdt_address) {
else if (rsdp->rsdt_physical_address) {
struct acpi_table_rsdt *mapped_rsdt = NULL;
sdt_pa = rsdp->rsdt_address;
sdt_pa = rsdp->rsdt_physical_address;
/* map in just the header */
header = (struct acpi_table_header *)
@ -507,7 +507,7 @@ static int __init acpi_table_get_sdt(struct acpi_table_rsdp *rsdp)
}
for (i = 0; i < sdt_count; i++)
sdt_entry[i].pa = (unsigned long)mapped_rsdt->entry[i];
sdt_entry[i].pa = (unsigned long)mapped_rsdt->table_offset_entry[i];
}
else {
@ -599,13 +599,10 @@ int __init acpi_table_init(void)
if (rsdp->revision < 2)
result =
acpi_table_compute_checksum(rsdp,
sizeof(struct acpi_table_rsdp));
acpi_table_compute_checksum(rsdp, ACPI_RSDP_REV0_SIZE);
else
result =
acpi_table_compute_checksum(rsdp,
((struct acpi20_table_rsdp *)
rsdp)->length);
acpi_table_compute_checksum(rsdp, rsdp->length);
if (result) {
printk(KERN_WARNING " >>> ERROR: Invalid checksum\n");
@ -617,5 +614,7 @@ int __init acpi_table_init(void)
if (acpi_table_get_sdt(rsdp))
return -ENODEV;
acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
return 0;
}

View file

@ -2,7 +2,6 @@
# Makefile for all Linux ACPI interpreter subdirectories
#
obj-y := tbconvrt.o tbget.o tbrsdt.o tbxface.o \
tbgetall.o tbinstal.o tbutils.o tbxfroot.o
obj-y := tbxface.o tbinstal.o tbutils.o tbfind.o
EXTRA_CFLAGS += $(ACPI_CFLAGS)

View file

@ -545,7 +545,7 @@ acpi_tb_get_root_table_entry(u8 * table_entry,
*
******************************************************************************/
acpi_status
acpi_status __init
acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
{
struct acpi_table_rsdp *rsdp;

View file

@ -78,7 +78,7 @@ static acpi_status acpi_tb_load_namespace(void);
*
******************************************************************************/
acpi_status
acpi_status __init
acpi_initialize_tables(struct acpi_table_desc *initial_table_array,
u32 initial_table_count, u8 allow_resize)
{
@ -132,8 +132,6 @@ acpi_initialize_tables(struct acpi_table_desc *initial_table_array,
return_ACPI_STATUS(status);
}
ACPI_EXPORT_SYMBOL(acpi_initialize_tables)
/*******************************************************************************
*
* FUNCTION: acpi_reallocate_root_table
@ -365,6 +363,10 @@ acpi_get_table(char *signature,
*out_table = acpi_gbl_root_table_list.tables[i].pointer;
}
if (!acpi_gbl_permanent_mmap) {
acpi_gbl_root_table_list.tables[i].pointer = 0;
}
return (status);
}