Split generic and x86 s2ram code: the new files (s2ram.{c,h}) contains
platform specific code moved out of the main file.

Signed-Off-By: Luca Tettamanti <[EMAIL PROTECTED]>

---
 Makefile    |    8 -
 s2ram-x86.c |  331 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 s2ram-x86.h |   10 +
 s2ram.c     |  331 +-------------------------------------------------------
 s2ram.h     |   22 ++-
 suspend.c   |    2 
 6 files changed, 367 insertions(+), 337 deletions(-)
--- a/Makefile  2007-04-10 23:36:27.000000000 +0200
+++ b/Makefile  2007-04-10 23:46:38.000000000 +0200
@@ -81,7 +81,7 @@
        $(CC) $(CC_FLAGS) -DCONFIG_BOTH -c $< -o $@
 
 s2ram.o: s2ram.c s2ram.h whitelist.c
-       $(CC) $(CC_FLAGS) -c $< -o $@
+       $(CC) $(CC_FLAGS) -include s2ram-x86.h -c $< -o $@
 
 md5.o encrypt.o: %.o : %.c %.h md5.h
        $(CC) $(CC_FLAGS) -DHAVE_INTTYPES_H -DHAVE_STDINT_H -c $< -o $@
@@ -98,11 +98,11 @@
 s2disk:        $(SWSUSP_OBJ) suspend.c
        $(CC) -g $(CC_FLAGS)  $^ -o $@ $(SWSUSP_LD_FLAGS)
 
-s2ram: $(S2RAM_OBJ) s2ram.o
+s2ram: $(S2RAM_OBJ) s2ram.o s2ram-x86.o
        $(CC) -g $(CC_FLAGS)  $^ -o $@ $(S2RAM_LD_FLAGS)
 
-s2both:        $(SWSUSP_OBJ) $(S2RAM_OBJ) s2ram-both.o suspend.c 
-       $(CC) -g $(CC_FLAGS) -DCONFIG_BOTH  $^ -o $@ $(SWSUSP_LD_FLAGS) 
$(S2RAM_LD_FLAGS)
+s2both:        $(SWSUSP_OBJ) $(S2RAM_OBJ) s2ram-both.o suspend.c s2ram-x86.o
+       $(CC) -g $(CC_FLAGS) -DCONFIG_BOTH -include s2ram-x86.h $^ -o $@ 
$(SWSUSP_LD_FLAGS) $(S2RAM_LD_FLAGS)
 
 resume:        resume.c $(SWSUSP_OBJ)
        $(CC) $(CC_FLAGS) $(STATIC_CC_FLAGS) $^ -o $@ $(STATIC_LD_FLAGS) 
$(SWSUSP_LD_FLAGS)
--- a/s2ram.c   2007-04-10 23:36:27.000000000 +0200
+++ b/s2ram.c   2007-04-10 21:40:41.000000000 +0200
@@ -11,244 +11,19 @@
 #include <errno.h>
 #include <string.h>
 
-#include <pci/pci.h>
-
 #ifndef S2RAM
 #define S2RAM
 #endif
-#include "vbetool/vbetool.h"
 #include "vt.h"
 #include "s2ram.h"
 
-static void *vbe_buffer;
-static unsigned char vga_pci_state[256];
-static struct pci_dev vga_dev;
-static struct pci_access *pacc;
-/* Flags set from whitelist */
-static int flags = 0, force = 0, vbe_mode = -1;
-char bios_version[1024], sys_vendor[1024], sys_product[1024], 
sys_version[1024];
-
-/* return codes for s2ram_is_supported */
-#define S2RAM_OK       0
-#define S2RAM_FAIL     1
-#define S2RAM_NOFB     126
-#define S2RAM_UNKNOWN  127
-
-/* flags for the whitelist */
-#define S3_BIOS     0x01       /* machine needs acpi_sleep=s3_bios */
-#define S3_MODE     0x02       /* machine needs acpi_sleep=s3_mode */
-#define VBE_SAVE    0x04       /* machine needs "vbetool save / restore" */
-#define VBE_POST    0x08       /* machine needs "vbetool post" */
-#define RADEON_OFF  0x10       /* machine needs "radeontool light off" */
-#define UNSURE      0x20       /* unverified entries from acpi-support 0.59 */
-#define NOFB        0x40       /* must not use a frame buffer */
-#define VBE_MODE    0x80       /* machine needs "vbetool vbemode get / set" */
-#define PCI_SAVE   0x100       /* we need to save the VGA PCI registers */
-
-#include "whitelist.c"
-
-static void identify_machine(void)
-{
-       printf("This machine can be identified by:\n");
-       printf("    sys_vendor   = \"%s\"\n"
-              "    sys_product  = \"%s\"\n"
-              "    sys_version  = \"%s\"\n"
-              "    bios_version = \"%s\"\n",
-              sys_vendor, sys_product, sys_version, bios_version);
-       printf("See http://en.opensuse.org/S2ram for details.\n"
-              "\n"
-              "If you report a problem, please include the complete output "
-              "above.\n");
-}
-
-void machine_known(int i)
-{
-       if (i < 0) {
-               printf("Internal error: machine_known, i<0. Please report.\n");
-               return;
-       }
-
-       printf("Machine matched entry %d:\n"
-              "    sys_vendor   = '%s'\n"
-              "    sys_product  = '%s'\n"
-              "    sys_version  = '%s'\n"
-              "    bios_version = '%s'\n", i,
-              whitelist[i].sys_vendor, whitelist[i].sys_product,
-              whitelist[i].sys_version, whitelist[i].bios_version);
-       printf("Fixes: 0x%x  %s%s%s%s%s%s%s%s\n", flags,
-              (flags & VBE_SAVE) ? "VBE_SAVE " : "",
-              (flags & VBE_POST) ? "VBE_POST " : "",
-              (flags & VBE_MODE) ? "VBE_MODE " : "",
-              (flags & RADEON_OFF) ? "RADEON_OFF " : "",
-              (flags & S3_BIOS) ? "S3_BIOS " : "",
-              (flags & S3_MODE) ? "S3_MODE " : "",
-              (flags & NOFB) ? "NOFB " : "",
-              (flags & PCI_SAVE) ? "PCI_SAVE " : "");
-       if (flags & UNSURE)
-               printf("Machine is in the whitelist but perhaps using "
-                      "vbetool unnecessarily.\n"
-                      "Please try to find minimal options.\n\n");
-       /* in case of a bugreport we might need to find a better match than
-        * the one we already have (additional BIOS version e.g)...
-        */
-       identify_machine();
-}
-
-static int set_acpi_video_mode(int mode)
-{
-       FILE *f = fopen("/proc/sys/kernel/acpi_video_flags", "w");
-       if (!f) {
-               printf("/proc/sys/kernel/acpi_video_flags does not exist; you 
need a kernel >=2.6.16.\n");
-               return S2RAM_FAIL;
-       }
-       fprintf(f, "%d", mode);
-       fflush(f);
-       fclose(f);
-       return S2RAM_OK;
-}
-
-static int match(const char *t, const char *s)
-{
-       int len = strlen(s);
-       /* empty string matches always */
-       if (len == 0)
-               return 1;
-
-       if (s[len-1] == '*') {
-               len--;
-               return !strncmp(t, s, len);
-       } else {
-               return !strcmp(t,s);
-       }
-}
-
-static int machine_match(void)
-{
-       int i;
-       /* sys_vendor = NULL terminates the whitelist array */
-       for (i = 0; whitelist[i].sys_vendor; i++) {
-               if (match(sys_vendor,   whitelist[i].sys_vendor)  &&
-                   match(sys_product,  whitelist[i].sys_product) &&
-                   match(sys_version,  whitelist[i].sys_version) &&
-                   match(bios_version, whitelist[i].bios_version)) {
-                       return i;
-               }
-       }
-       return -1;
-}
-
-int s2ram_check(int id)
-{
-       int ret = S2RAM_OK;
-
-       if (id < 0) {
-               ret = S2RAM_UNKNOWN;
-       } else {
-               flags = whitelist[id].flags;
-               if ((flags & NOFB) && is_framebuffer())
-                       ret = S2RAM_NOFB;
-       }
-
-       return ret;
-}
-
-int find_vga(void)
-{
-       struct pci_dev *dev;
-       unsigned int class;
-
-       pci_scan_bus(pacc);     /* We want to get the list of devices */
-
-       for (dev=pacc->devices; dev; dev=dev->next) {
-               pci_fill_info(dev, PCI_FILL_IDENT);
-               class = pci_read_word(dev, PCI_CLASS_DEVICE);
-               if (class == 0x300)
-                       break;
-       }
-
-       if (!dev)
-               return 0;
-
-       memcpy(&vga_dev, dev, sizeof(*dev));
-       vga_dev.next = NULL;
-
-       return 1;
-}
-
-void save_vga_pci(void)
-{
-       pci_read_block(&vga_dev, 0, vga_pci_state, 256);
-}
-
-void restore_vga_pci(void)
-{
-       pci_write_block(&vga_dev, 0, vga_pci_state, 256);
-}
-
-/* warning: we have to be on a text console when calling this */
-int s2ram_hacks(void)
-{
-       int ret = 0;
-
-       /* 0 means: don't touch what was set on kernel commandline */
-       if (flags & (S3_BIOS | S3_MODE))
-               ret = set_acpi_video_mode(flags & (S3_BIOS | S3_MODE));
-
-       if (ret)
-               return ret;
-
-       if (flags & VBE_SAVE) {
-               int size;
-               vbetool_init();
-               printf("Calling save_state\n");
-               vbe_buffer = __save_state(&size);
-       }
-       if (flags & VBE_MODE) {
-               vbetool_init();
-               printf("Calling get_mode\n");
-               vbe_mode = __get_mode();
-       }
-       if (flags & RADEON_OFF) {
-               map_radeon_cntl_mem();
-               printf("Calling radeon_cmd_light(0)\n");
-               radeon_cmd_light(0);
-       }
-       if (flags & PCI_SAVE) {
-               pacc = pci_alloc();     /* Get the pci_access structure */
-               pci_init(pacc);         /* Initialize the PCI library */
-
-               if (find_vga()) {
-                       printf("saving PCI config of device %02x:%02x.%d\n",
-                               vga_dev.bus, vga_dev.dev, vga_dev.func);
-                       save_vga_pci();
-               } else
-                       /* pci_save requested, no VGA device found => abort */
-                       return 1;
-       }
-
-       return 0;
-}
-
-int s2ram_is_supported(void)
-{
-       int ret = 0, id;
-
-       if (flags && !force) {
-               printf("acpi_sleep, vbe_save, vbe_post, radeontool and pci_save"
-                       " parameter must be used with --force\n\n");
-               return EINVAL;
-       }
-
-       if (!force) {
-               dmi_scan();
-               id = machine_match();
-               ret = s2ram_check(id);
-       } 
+#ifndef S2RAM_PLATFORM_OPTS
+#define S2RAM_PLATFORM_OPTS
+#endif
 
-       return ret;
-}
+int force;
+int test_mode;
 
-/* Actually enter the suspend. May be ran on frozen system. */
 int s2ram_do(void)
 {
        int ret = 0;
@@ -271,74 +46,6 @@
        return ret;
 } 
 
-void s2ram_resume(void)
-{
-       if (flags & PCI_SAVE) {
-               printf("restoring PCI config of device %02x:%02x.%d\n",
-                       vga_dev.bus, vga_dev.dev, vga_dev.func);
-               restore_vga_pci();
-
-               pci_cleanup(pacc);
-       }
-       // FIXME: can we call vbetool_init() multiple times without cleaning up?
-       if (flags & VBE_POST) {
-               vbetool_init();
-               printf("Calling do_post\n");
-               do_post();
-       }
-       if (vbe_buffer) {
-               vbetool_init();
-               printf("Calling restore_state_from\n");
-               restore_state_from(vbe_buffer);
-       }
-       if (vbe_mode >= 0) {
-               vbetool_init();
-               printf("Calling set_vbe_mode\n");
-               do_set_mode(vbe_mode, 0);
-       }
-       if (flags & RADEON_OFF) {
-               printf("Calling radeon_cmd_light(1)\n");
-               radeon_cmd_light(1);
-       }
-}
-
-void s2ram_add_flag(int opt, const char *opt_arg)
-{
-       /* The characters are the `deprecated' short options. They will not
-        * clash with the new labels untill we reach quirk 65... */
-       switch (opt) {
-               case 1:
-               case 'f':
-                       force = 1;
-                       break;
-               case 2:
-               case 's':
-                       flags |= VBE_SAVE;
-                       break;
-               case 3:
-               case 'p':
-                       flags |= VBE_POST;
-                       break;
-               case 4:
-               case 'm':
-                       flags |= VBE_MODE;
-                       break;
-               case 5:
-               case 'r':
-                       flags |= RADEON_OFF;
-                       break;
-               case 6:
-               case 'v':
-                       flags |= PCI_SAVE;
-                       break;
-               case 7:
-               case 'a':
-                       flags |= (atoi(optarg) & (S3_BIOS | S3_MODE));
-                       break;
-
-       }
-}
-
 #ifndef CONFIG_BOTH
 static void usage(void)
 {
@@ -346,35 +53,22 @@
               "\n"
               "Options:\n"
               "    -h, --help:       this text.\n"
-              "    -n, --test:       test if the machine is in the database.\n"
-              "                      returns 0 if known and supported\n"
               "    -i, --identify:   prints a string that identifies the 
machine.\n"
               "    -f, --force:      force suspending, even on unknown 
machines.\n"
-              "\n"
-              "the following options are only available with --force:\n"
-              "    -s, --vbe_save:   save VBE state before suspending and "
-                                      "restore after resume.\n"
-              "    -p, --vbe_post:   VBE POST the graphics card after resume\n"
-              "    -m, --vbe_mode:   get VBE mode before suspend and set it 
after resume\n"
-              "    -r, --radeontool: turn off the backlight on radeons "
-                                      "before suspending.\n"
-              "    -a, --acpi_sleep: set the acpi_sleep parameter before "
-                                      "suspend\n"
-              "                      1=s3_bios, 2=s3_mode, 3=both\n"
-              "    -v, --pci_save:   save the PCI config space for the VGA 
card.\n"
               "\n");
+       s2ram_usage_platform();
        exit(1);
 }
 
 int main(int argc, char *argv[])
 {
-       int i, id = -1, ret = 0, test_mode = 0;
+       int i, ret = 0;
        int active_console = -1;
        struct option options[] = {
                { "test",       no_argument,            NULL, 'n'},
                { "help",       no_argument,            NULL, 'h'},
                { "identify",   no_argument,            NULL, 'i'},
-               HACKS_LONG_OPTS
+               S2RAM_PLATFORM_OPTS
                { NULL,         0,                      NULL,  0 }
        };
 
@@ -384,7 +78,6 @@
                        usage();
                        break;
                case 'i':
-                       dmi_scan();
                        identify_machine();
                        exit(0);
                case 'n':
@@ -404,13 +97,7 @@
                usage();
        }
 
-       if (test_mode) {
-               machine_known(id);
-               goto out;
-       }
-
        ret = s2ram_is_supported();
-
        if (ret == S2RAM_UNKNOWN) {
                printf("Machine is unknown.\n");
                identify_machine();
@@ -420,7 +107,7 @@
        if (ret == S2RAM_NOFB)
                printf("This machine can only suspend without framebuffer.\n");
 
-       if (ret)
+       if (ret || test_mode)
                goto out;
 
        /* switch to console 1 first, since we might be in X */
--- a/s2ram.h   2007-04-10 23:36:27.000000000 +0200
+++ b/s2ram.h   2007-04-10 21:39:19.000000000 +0200
@@ -13,20 +13,22 @@
 void dmi_scan(void);
 
 /* from s2ram.c */
-int s2ram_check(int id);
+
+/* return codes for s2ram_is_supported */
+#define S2RAM_OK        0
+#define S2RAM_FAIL      1
+#define S2RAM_NOFB      126
+#define S2RAM_UNKNOWN   127
+
+extern int force;
+extern int test_mode;
+
+void s2ram_usage_platform(void);
 int s2ram_hacks(void);
 int s2ram_is_supported(void);
+void identify_machine(void);
 int s2ram_do(void);
 void s2ram_resume(void);
 void s2ram_add_flag(int opt, const char *arg);
 
-#define HACKS_LONG_OPTS \
-               { "force",      no_argument,            NULL, 1}, \
-               { "vbe_save",   no_argument,            NULL, 2}, \
-               { "vbe_post",   no_argument,            NULL, 3}, \
-               { "vbe_mode",   no_argument,            NULL, 4}, \
-               { "radeontool", no_argument,            NULL, 5}, \
-               { "pci_save",   no_argument,            NULL, 6}, \
-               { "acpi_sleep", required_argument,      NULL, 7},
-
 
--- a/s2ram-x86.c       1970-01-01 01:00:00.000000000 +0100
+++ b/s2ram-x86.c       2007-04-10 21:38:51.000000000 +0200
@@ -0,0 +1,331 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <errno.h>
+
+#include <pci/pci.h>
+
+#include "vbetool/vbetool.h"
+#include "s2ram.h"
+#include "vt.h"
+
+static void *vbe_buffer;
+static unsigned char vga_pci_state[256];
+static struct pci_dev vga_dev;
+static struct pci_access *pacc;
+char bios_version[1024], sys_vendor[1024], sys_product[1024], 
sys_version[1024];
+
+static int flags;
+static int vbe_mode = -1;
+
+/* flags for the whitelist */
+#define S3_BIOS     0x01       /* machine needs acpi_sleep=s3_bios */
+#define S3_MODE     0x02       /* machine needs acpi_sleep=s3_mode */
+#define VBE_SAVE    0x04       /* machine needs "vbetool save / restore" */
+#define VBE_POST    0x08       /* machine needs "vbetool post" */
+#define RADEON_OFF  0x10       /* machine needs "radeontool light off" */
+#define UNSURE      0x20       /* unverified entries from acpi-support 0.59 */
+#define NOFB        0x40       /* must not use a frame buffer */
+#define VBE_MODE    0x80       /* machine needs "vbetool vbemode get / set" */
+#define PCI_SAVE   0x100       /* we need to save the VGA PCI registers */
+
+#include "whitelist.c"
+
+void s2ram_usage_platform() {
+       printf(
+              "    -n, --test:       test if the machine is in the database.\n"
+              "                      returns 0 if known and supported\n"
+              "the following options are only available with --force:\n"
+              "    -s, --vbe_save:   save VBE state before suspending and "
+                                      "restore after resume.\n"
+              "    -p, --vbe_post:   VBE POST the graphics card after resume\n"
+              "    -m, --vbe_mode:   get VBE mode before suspend and set it 
after resume\n"
+              "    -r, --radeontool: turn off the backlight on radeons "
+                                      "before suspending.\n"
+              "    -a, --acpi_sleep: set the acpi_sleep parameter before "
+                                      "suspend\n"
+              "                      1=s3_bios, 2=s3_mode, 3=both\n"
+              "    -v, --pci_save:   save the PCI config space for the VGA 
card.\n"
+              "\n");
+}
+
+void identify_machine(void)
+{
+       static int dmi_done = 0;
+
+       if (!dmi_done) {
+               dmi_scan();
+               dmi_done = 1;
+       }
+
+       printf("This machine can be identified by:\n");
+       printf("    sys_vendor   = \"%s\"\n"
+              "    sys_product  = \"%s\"\n"
+              "    sys_version  = \"%s\"\n"
+              "    bios_version = \"%s\"\n",
+              sys_vendor, sys_product, sys_version, bios_version);
+       printf("See http://en.opensuse.org/S2ram for details.\n"
+              "\n"
+              "If you report a problem, please include the complete output "
+              "above.\n");
+}
+
+static void machine_known(int i)
+{
+       if (i < 0) {
+               printf("Internal error: machine_known, i<0. Please report.\n");
+               return;
+       }
+
+       printf("Machine matched entry %d:\n"
+              "    sys_vendor   = '%s'\n"
+              "    sys_product  = '%s'\n"
+              "    sys_version  = '%s'\n"
+              "    bios_version = '%s'\n", i,
+              whitelist[i].sys_vendor, whitelist[i].sys_product,
+              whitelist[i].sys_version, whitelist[i].bios_version);
+       printf("Fixes: 0x%x  %s%s%s%s%s%s%s%s\n", flags,
+              (flags & VBE_SAVE) ? "VBE_SAVE " : "",
+              (flags & VBE_POST) ? "VBE_POST " : "",
+              (flags & VBE_MODE) ? "VBE_MODE " : "",
+              (flags & RADEON_OFF) ? "RADEON_OFF " : "",
+              (flags & S3_BIOS) ? "S3_BIOS " : "",
+              (flags & S3_MODE) ? "S3_MODE " : "",
+              (flags & NOFB) ? "NOFB " : "",
+              (flags & PCI_SAVE) ? "PCI_SAVE " : "");
+       if (flags & UNSURE)
+               printf("Machine is in the whitelist but perhaps using "
+                      "vbetool unnecessarily.\n"
+                      "Please try to find minimal options.\n\n");
+       /* in case of a bugreport we might need to find a better match than
+        * the one we already have (additional BIOS version e.g)...
+        */
+       identify_machine();
+}
+
+static int set_acpi_video_mode(int mode)
+{
+       FILE *f = fopen("/proc/sys/kernel/acpi_video_flags", "w");
+       if (!f) {
+               printf("/proc/sys/kernel/acpi_video_flags does not exist; you 
need a kernel >=2.6.16.\n");
+               return S2RAM_FAIL;
+       }
+       fprintf(f, "%d", mode);
+       fflush(f);
+       fclose(f);
+       return S2RAM_OK;
+}
+
+static int match(const char *t, const char *s)
+{
+       int len = strlen(s);
+       /* empty string matches always */
+       if (len == 0)
+               return 1;
+
+       if (s[len-1] == '*') {
+               len--;
+               return !strncmp(t, s, len);
+       } else {
+               return !strcmp(t,s);
+       }
+}
+
+static int machine_match(void)
+{
+       int i;
+       /* sys_vendor = NULL terminates the whitelist array */
+       for (i = 0; whitelist[i].sys_vendor; i++) {
+               if (match(sys_vendor,   whitelist[i].sys_vendor)  &&
+                   match(sys_product,  whitelist[i].sys_product) &&
+                   match(sys_version,  whitelist[i].sys_version) &&
+                   match(bios_version, whitelist[i].bios_version)) {
+                       return i;
+               }
+       }
+       return -1;
+}
+
+static int s2ram_check(int id)
+{
+       int ret = S2RAM_OK;
+
+       if (id < 0) {
+               ret = S2RAM_UNKNOWN;
+       } else {
+               flags = whitelist[id].flags;
+               if ((flags & NOFB) && is_framebuffer())
+                       ret = S2RAM_NOFB;
+       }
+
+       return ret;
+}
+
+static int find_vga(void)
+{
+       struct pci_dev *dev;
+       unsigned int class;
+
+       pci_scan_bus(pacc);     /* We want to get the list of devices */
+
+       for (dev=pacc->devices; dev; dev=dev->next) {
+               pci_fill_info(dev, PCI_FILL_IDENT);
+               class = pci_read_word(dev, PCI_CLASS_DEVICE);
+               if (class == 0x300)
+                       break;
+       }
+
+       if (!dev)
+               return 0;
+
+       memcpy(&vga_dev, dev, sizeof(*dev));
+       vga_dev.next = NULL;
+
+       return 1;
+}
+
+static void save_vga_pci(void)
+{
+       pci_read_block(&vga_dev, 0, vga_pci_state, 256);
+}
+
+static void restore_vga_pci(void)
+{
+       pci_write_block(&vga_dev, 0, vga_pci_state, 256);
+}
+
+/* warning: we have to be on a text console when calling this */
+int s2ram_hacks(void)
+{
+       int ret = 0;
+
+       /* 0 means: don't touch what was set on kernel commandline */
+       if (flags & (S3_BIOS | S3_MODE))
+               ret = set_acpi_video_mode(flags & (S3_BIOS | S3_MODE));
+
+       if (ret)
+               return ret;
+
+       if (flags & VBE_SAVE) {
+               int size;
+               vbetool_init();
+               printf("Calling save_state\n");
+               vbe_buffer = __save_state(&size);
+       }
+       if (flags & VBE_MODE) {
+               vbetool_init();
+               printf("Calling get_mode\n");
+               vbe_mode = __get_mode();
+       }
+       if (flags & RADEON_OFF) {
+               map_radeon_cntl_mem();
+               printf("Calling radeon_cmd_light(0)\n");
+               radeon_cmd_light(0);
+       }
+       if (flags & PCI_SAVE) {
+               pacc = pci_alloc();     /* Get the pci_access structure */
+               pci_init(pacc);         /* Initialize the PCI library */
+
+               if (find_vga()) {
+                       printf("saving PCI config of device %02x:%02x.%d\n",
+                               vga_dev.bus, vga_dev.dev, vga_dev.func);
+                       save_vga_pci();
+               } else
+                       /* pci_save requested, no VGA device found => abort */
+                       return 1;
+       }
+
+       return 0;
+}
+
+int s2ram_is_supported(void)
+{
+       int ret = 0, id;
+
+       if (flags && !force) {
+               printf("acpi_sleep, vbe_save, vbe_post, radeontool and pci_save"
+                       " parameter must be used with --force\n\n");
+               return EINVAL;
+       }
+
+       if (!force) {
+               dmi_scan();
+               id = machine_match();
+               ret = s2ram_check(id);
+
+               if (test_mode && ret != S2RAM_UNKNOWN)
+                       machine_known(id);
+       } 
+
+       return ret;
+}
+
+void s2ram_resume(void)
+{
+       if (flags & PCI_SAVE) {
+               printf("restoring PCI config of device %02x:%02x.%d\n",
+                       vga_dev.bus, vga_dev.dev, vga_dev.func);
+               restore_vga_pci();
+
+               pci_cleanup(pacc);
+       }
+       // FIXME: can we call vbetool_init() multiple times without cleaning up?
+       if (flags & VBE_POST) {
+               vbetool_init();
+               printf("Calling do_post\n");
+               do_post();
+       }
+       if (vbe_buffer) {
+               vbetool_init();
+               printf("Calling restore_state_from\n");
+               restore_state_from(vbe_buffer);
+       }
+       if (vbe_mode >= 0) {
+               vbetool_init();
+               printf("Calling set_vbe_mode\n");
+               do_set_mode(vbe_mode, 0);
+       }
+       if (flags & RADEON_OFF) {
+               printf("Calling radeon_cmd_light(1)\n");
+               radeon_cmd_light(1);
+       }
+}
+
+void s2ram_add_flag(int opt, const char *opt_arg)
+{
+       /* The characters are the `deprecated' short options. They will not
+        * clash with the new labels untill we reach quirk 65... */
+       switch (opt) {
+               case 1:
+               case 'f':
+                       force = 1;
+                       break;
+               case 2:
+               case 's':
+                       flags |= VBE_SAVE;
+                       break;
+               case 3:
+               case 'p':
+                       flags |= VBE_POST;
+                       break;
+               case 4:
+               case 'm':
+                       flags |= VBE_MODE;
+                       break;
+               case 5:
+               case 'r':
+                       flags |= RADEON_OFF;
+                       break;
+               case 6:
+               case 'v':
+                       flags |= PCI_SAVE;
+                       break;
+               case 7:
+               case 'a':
+                       flags |= (atoi(optarg) & (S3_BIOS | S3_MODE));
+                       break;
+
+       }
+}
+
--- a/s2ram-x86.h       1970-01-01 01:00:00.000000000 +0100
+++ b/s2ram-x86.h       2007-04-10 21:25:13.000000000 +0200
@@ -0,0 +1,10 @@
+#define S2RAM_PLATFORM_OPTS \
+               { "force",      no_argument,            NULL, 1}, \
+               { "vbe_save",   no_argument,            NULL, 2}, \
+               { "vbe_post",   no_argument,            NULL, 3}, \
+               { "vbe_mode",   no_argument,            NULL, 4}, \
+               { "radeontool", no_argument,            NULL, 5}, \
+               { "pci_save",   no_argument,            NULL, 6}, \
+               { "acpi_sleep", required_argument,      NULL, 7},
+
+
--- a/suspend.c 2007-04-10 23:36:27.000000000 +0200
+++ b/suspend.c 2007-04-10 23:45:07.000000000 +0200
@@ -1175,7 +1175,7 @@
                { "image_size",         required_argument,      NULL, 's'},
                { "resume_offset",      required_argument,      NULL, 'o'},
 #ifdef CONFIG_BOTH
-               HACKS_LONG_OPTS
+               S2RAM_PLATFORM_OPTS
 #endif
                { NULL,                 0,                      NULL,  0 }
        };


Luca
-- 
Let me make your mind, leave yourself behind
Be not afraid

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Suspend-devel mailing list
Suspend-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/suspend-devel

Reply via email to