aboutsummaryrefslogtreecommitdiff
path: root/arch/x86
diff options
context:
space:
mode:
authorColin Ian King <colin.king@canonical.com>2011-05-23 15:06:50 +0100
committerJohn Rigby <john.rigby@linaro.org>2012-06-21 05:16:31 -0600
commitd55ad2e5ca6014cf2e9fc45084b20405a3ca32da (patch)
treeba5c8c8eac819c7d5cc0360a21b2c36cb6c856f6 /arch/x86
parent094a8d6503be332207ec157066d46b7ba29a8ede (diff)
UBUNTU: SAUCE: S3 early resume debug via keyboard LEDs
Add support to debug S3 early resume by flashing the keyboard LEDs three times in the realmode path. This is useful to allow one to determine if S3 hangs occur in the BIOS or during the early resume phase. Add kernel parameter acpi_sleep=s3_leds to enable the s3 debugging option. This can also be enabled by writing 8 to /proc/sys/kernel/acpi_video_flags. Signed-off-by: Colin Ian King <colin.king@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> Acked-by: John Johansen <john.johansen@canonical.com> Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/acpi/sleep.c2
-rw-r--r--arch/x86/realmode/rm/wakemain.c27
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 95bf99de905..79357aae9f1 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -94,6 +94,8 @@ static int __init acpi_sleep_setup(char *str)
acpi_realmode_flags |= 2;
if (strncmp(str, "s3_beep", 7) == 0)
acpi_realmode_flags |= 4;
+ if (strncmp(str, "s3_leds", 7) == 0)
+ acpi_realmode_flags |= 8;
#ifdef CONFIG_HIBERNATION
if (strncmp(str, "s4_nohwsig", 10) == 0)
acpi_no_s4_hw_signature();
diff --git a/arch/x86/realmode/rm/wakemain.c b/arch/x86/realmode/rm/wakemain.c
index 91405d515ec..810b9c13c7a 100644
--- a/arch/x86/realmode/rm/wakemain.c
+++ b/arch/x86/realmode/rm/wakemain.c
@@ -61,6 +61,30 @@ static void send_morse(const char *pattern)
}
}
+#define I8042_STATUS_REG 0x64
+#define I8042_DATA_REG 0x60
+#define I8042_SET_LED_BITS 0xed
+#define I8042_STR_IBF 0x02
+
+static void flash_keyboard_leds(void)
+{
+ int i;
+ unsigned char leds = 7;
+
+ /* Flash keyboard LEDs 3 times */
+ for (i = 0; i < 6; i++) {
+ while (inb(I8042_STATUS_REG) & I8042_STR_IBF)
+ ;
+ outb(I8042_SET_LED_BITS, I8042_DATA_REG);
+ while (inb(I8042_STATUS_REG) & I8042_STR_IBF)
+ ;
+ outb(leds, I8042_DATA_REG);
+ leds ^= 7;
+ udelay(500000);
+ }
+}
+
+
void main(void)
{
/* Kill machine if structures are wrong */
@@ -79,4 +103,7 @@ void main(void)
probe_cards(0);
set_mode(wakeup_header.video_mode);
}
+
+ if (wakeup_header.realmode_flags & 8)
+ flash_keyboard_leds();
}