Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / arch / i386 / kernel / acpi / sleep.c
index 629f7b8..4ee8357 100644 (file)
@@ -7,78 +7,40 @@
 
 #include <linux/acpi.h>
 #include <linux/bootmem.h>
-#include <asm/smp.h>
+#include <linux/dmi.h>
+#include <linux/cpumask.h>
 
+#include <asm/smp.h>
 
 /* address in low memory of the wakeup routine. */
 unsigned long acpi_wakeup_address = 0;
 unsigned long acpi_video_flags;
 extern char wakeup_start, wakeup_end;
 
-extern void zap_low_mappings(void);
-
 extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
 
-static void map_low(pgd_t *pgd_base, unsigned long start, unsigned long end)
-{
-       unsigned long vaddr;
-       pmd_t *pmd;
-       pgd_t *pgd;
-       int i, j;
-
-       pgd = pgd_base;
-
-       for (i = 0; i < PTRS_PER_PGD; pgd++, i++) {
-               vaddr = i*PGDIR_SIZE;
-               if (end && (vaddr >= end))
-                       break;
-               pmd = pmd_offset(pgd, 0);
-               for (j = 0; j < PTRS_PER_PMD; pmd++, j++) {
-                       vaddr = i*PGDIR_SIZE + j*PMD_SIZE;
-                       if (end && (vaddr >= end))
-                               break;
-                       if (vaddr < start)
-                               continue;
-                       set_pmd(pmd, __pmd(_KERNPG_TABLE + _PAGE_PSE +
-                                                               vaddr - start));
-               }
-       }
-}
-
 /**
  * acpi_save_state_mem - save kernel state
  *
  * Create an identity mapped page table and copy the wakeup routine to
  * low memory.
  */
-int acpi_save_state_mem (void)
+int acpi_save_state_mem(void)
 {
        if (!acpi_wakeup_address)
                return 1;
-       if (!cpu_has_pse)
-               return 1;
-       map_low(swapper_pg_dir, 0, LOW_MAPPINGS_SIZE);
-       memcpy((void *) acpi_wakeup_address, &wakeup_start, &wakeup_end - &wakeup_start);
+       memcpy((void *)acpi_wakeup_address, &wakeup_start,
+              &wakeup_end - &wakeup_start);
        acpi_copy_wakeup_routine(acpi_wakeup_address);
 
        return 0;
 }
 
-/**
- * acpi_save_state_disk - save kernel state to disk
- *
- */
-int acpi_save_state_disk (void)
-{
-       return 1;
-}
-
 /*
- * acpi_restore_state
+ * acpi_restore_state - undo effects of acpi_save_state_mem
  */
-void acpi_restore_state_mem (void)
+void acpi_restore_state_mem(void)
 {
-       zap_low_mappings();
 }
 
 /**
@@ -92,13 +54,11 @@ void acpi_restore_state_mem (void)
 void __init acpi_reserve_bootmem(void)
 {
        if ((&wakeup_end - &wakeup_start) > PAGE_SIZE) {
-               printk(KERN_ERR "ACPI: Wakeup code way too big, S3 disabled.\n");
+               printk(KERN_ERR
+                      "ACPI: Wakeup code way too big, S3 disabled.\n");
                return;
        }
-#ifdef CONFIG_X86_PAE
-       printk(KERN_ERR "ACPI: S3 and PAE do not like each other for now, S3 disabled.\n");
-       return;
-#endif
+
        acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE);
        if (!acpi_wakeup_address)
                printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3 disabled.\n");
@@ -118,5 +78,29 @@ static int __init acpi_sleep_setup(char *str)
        return 1;
 }
 
-
 __setup("acpi_sleep=", acpi_sleep_setup);
+
+static __init int reset_videomode_after_s3(struct dmi_system_id *d)
+{
+       acpi_video_flags |= 2;
+       return 0;
+}
+
+static __initdata struct dmi_system_id acpisleep_dmi_table[] = {
+       {                       /* Reset video mode after returning from ACPI S3 sleep */
+        .callback = reset_videomode_after_s3,
+        .ident = "Toshiba Satellite 4030cdt",
+        .matches = {
+                    DMI_MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
+                    },
+        },
+       {}
+};
+
+static int __init acpisleep_dmi_init(void)
+{
+       dmi_check_system(acpisleep_dmi_table);
+       return 0;
+}
+
+core_initcall(acpisleep_dmi_init);