From a55040f783f7da5a5e74cdc58031bc2bde605832 Mon Sep 17 00:00:00 2001 From: Andres Salomon Date: Fri, 6 Jul 2007 11:17:30 -0700 Subject: [PATCH] --- yaml --- r: 58246 b: refs/heads/master c: 95069f89e80bb49ecc1b135bf85747e8dc6681f9 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/i386/Kconfig | 4 ++-- trunk/arch/i386/kernel/reboot_fixups.c | 13 +++++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 386bdef08e1a..9f391dfb0bc0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1feb17e286339382a1ae36e0fecc4d88c2d7f123 +refs/heads/master: 95069f89e80bb49ecc1b135bf85747e8dc6681f9 diff --git a/trunk/arch/i386/Kconfig b/trunk/arch/i386/Kconfig index d2f6a247414d..b1b2b30b1b8e 100644 --- a/trunk/arch/i386/Kconfig +++ b/trunk/arch/i386/Kconfig @@ -441,8 +441,8 @@ config X86_REBOOTFIXUPS this config is intended, is when reboot ends with a stalled/hung system. - Currently, the only fixup is for the Geode GX1/CS5530A/TROM2.1. - combination. + Currently, the only fixup is for the Geode machines using + CS5530A and CS5536 chipsets. Say Y if you want to enable the fixup. Currently, it's safe to enable this option even if you don't need it. diff --git a/trunk/arch/i386/kernel/reboot_fixups.c b/trunk/arch/i386/kernel/reboot_fixups.c index 2d78d918340f..03e1cce58f49 100644 --- a/trunk/arch/i386/kernel/reboot_fixups.c +++ b/trunk/arch/i386/kernel/reboot_fixups.c @@ -5,12 +5,14 @@ * * List of supported fixups: * geode-gx1/cs5530a - Jaya Kumar + * geode-gx/lx/cs5536 - Andres Salomon * */ #include #include #include +#include static void cs5530a_warm_reset(struct pci_dev *dev) { @@ -21,6 +23,16 @@ static void cs5530a_warm_reset(struct pci_dev *dev) return; } +static void cs5536_warm_reset(struct pci_dev *dev) +{ + /* + * 6.6.2.12 Soft Reset (DIVIL_SOFT_RESET) + * writing 1 to the LSB of this MSR causes a hard reset. + */ + wrmsrl(0x51400017, 1ULL); + udelay(50); /* shouldn't get here but be safe and spin a while */ +} + struct device_fixup { unsigned int vendor; unsigned int device; @@ -29,6 +41,7 @@ struct device_fixup { static struct device_fixup fixups_table[] = { { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, +{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, cs5536_warm_reset }, }; /*