diff options
| author | Andres Salomon <dilinger@queued.net> | 2007-07-06 14:17:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-06 14:45:11 -0400 |
| commit | 95069f89e80bb49ecc1b135bf85747e8dc6681f9 (patch) | |
| tree | 33f11de09544bfd37d7bee25b7d3ace0bdac4412 | |
| parent | 1feb17e286339382a1ae36e0fecc4d88c2d7f123 (diff) | |
GEODE: reboot fixup for geode machines with CS5536 boards
Writing to MSR 0x51400017 forces a hard reset on CS5536-based machines,
this has the reboot fixup do just that if such a board is detected.
Acked-by: Jordan Crouse <jordan.crouse@amd.com>
Signed-off-by: Andres Salomon <dilinger@debian.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | arch/i386/Kconfig | 4 | ||||
| -rw-r--r-- | arch/i386/kernel/reboot_fixups.c | 13 |
2 files changed, 15 insertions, 2 deletions
diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig index d2f6a247414d..b1b2b30b1b8e 100644 --- a/arch/i386/Kconfig +++ b/arch/i386/Kconfig | |||
| @@ -441,8 +441,8 @@ config X86_REBOOTFIXUPS | |||
| 441 | this config is intended, is when reboot ends with a stalled/hung | 441 | this config is intended, is when reboot ends with a stalled/hung |
| 442 | system. | 442 | system. |
| 443 | 443 | ||
| 444 | Currently, the only fixup is for the Geode GX1/CS5530A/TROM2.1. | 444 | Currently, the only fixup is for the Geode machines using |
| 445 | combination. | 445 | CS5530A and CS5536 chipsets. |
| 446 | 446 | ||
| 447 | Say Y if you want to enable the fixup. Currently, it's safe to | 447 | Say Y if you want to enable the fixup. Currently, it's safe to |
| 448 | enable this option even if you don't need it. | 448 | enable this option even if you don't need it. |
diff --git a/arch/i386/kernel/reboot_fixups.c b/arch/i386/kernel/reboot_fixups.c index 2d78d918340f..03e1cce58f49 100644 --- a/arch/i386/kernel/reboot_fixups.c +++ b/arch/i386/kernel/reboot_fixups.c | |||
| @@ -5,12 +5,14 @@ | |||
| 5 | * | 5 | * |
| 6 | * List of supported fixups: | 6 | * List of supported fixups: |
| 7 | * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz> | 7 | * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz> |
| 8 | * geode-gx/lx/cs5536 - Andres Salomon <dilinger@debian.org> | ||
| 8 | * | 9 | * |
| 9 | */ | 10 | */ |
| 10 | 11 | ||
| 11 | #include <asm/delay.h> | 12 | #include <asm/delay.h> |
| 12 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
| 13 | #include <asm/reboot_fixups.h> | 14 | #include <asm/reboot_fixups.h> |
| 15 | #include <asm/msr.h> | ||
| 14 | 16 | ||
| 15 | static void cs5530a_warm_reset(struct pci_dev *dev) | 17 | static void cs5530a_warm_reset(struct pci_dev *dev) |
| 16 | { | 18 | { |
| @@ -21,6 +23,16 @@ static void cs5530a_warm_reset(struct pci_dev *dev) | |||
| 21 | return; | 23 | return; |
| 22 | } | 24 | } |
| 23 | 25 | ||
| 26 | static void cs5536_warm_reset(struct pci_dev *dev) | ||
| 27 | { | ||
| 28 | /* | ||
| 29 | * 6.6.2.12 Soft Reset (DIVIL_SOFT_RESET) | ||
| 30 | * writing 1 to the LSB of this MSR causes a hard reset. | ||
| 31 | */ | ||
| 32 | wrmsrl(0x51400017, 1ULL); | ||
| 33 | udelay(50); /* shouldn't get here but be safe and spin a while */ | ||
| 34 | } | ||
| 35 | |||
| 24 | struct device_fixup { | 36 | struct device_fixup { |
| 25 | unsigned int vendor; | 37 | unsigned int vendor; |
| 26 | unsigned int device; | 38 | unsigned int device; |
| @@ -29,6 +41,7 @@ struct device_fixup { | |||
| 29 | 41 | ||
| 30 | static struct device_fixup fixups_table[] = { | 42 | static struct device_fixup fixups_table[] = { |
| 31 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, | 43 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, |
| 44 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, cs5536_warm_reset }, | ||
| 32 | }; | 45 | }; |
| 33 | 46 | ||
| 34 | /* | 47 | /* |
