Commit 95069f89 authored by Andres Salomon's avatar Andres Salomon Committed by Linus Torvalds

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: default avatarJordan Crouse <jordan.crouse@amd.com>
Signed-off-by: default avatarAndres Salomon <dilinger@debian.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1feb17e2
...@@ -441,8 +441,8 @@ config X86_REBOOTFIXUPS ...@@ -441,8 +441,8 @@ config X86_REBOOTFIXUPS
this config is intended, is when reboot ends with a stalled/hung this config is intended, is when reboot ends with a stalled/hung
system. system.
Currently, the only fixup is for the Geode GX1/CS5530A/TROM2.1. Currently, the only fixup is for the Geode machines using
combination. CS5530A and CS5536 chipsets.
Say Y if you want to enable the fixup. Currently, it's safe to Say Y if you want to enable the fixup. Currently, it's safe to
enable this option even if you don't need it. enable this option even if you don't need it.
......
...@@ -5,12 +5,14 @@ ...@@ -5,12 +5,14 @@
* *
* List of supported fixups: * List of supported fixups:
* geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz> * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz>
* geode-gx/lx/cs5536 - Andres Salomon <dilinger@debian.org>
* *
*/ */
#include <asm/delay.h> #include <asm/delay.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <asm/reboot_fixups.h> #include <asm/reboot_fixups.h>
#include <asm/msr.h>
static void cs5530a_warm_reset(struct pci_dev *dev) static void cs5530a_warm_reset(struct pci_dev *dev)
{ {
...@@ -21,6 +23,16 @@ static void cs5530a_warm_reset(struct pci_dev *dev) ...@@ -21,6 +23,16 @@ static void cs5530a_warm_reset(struct pci_dev *dev)
return; 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 { struct device_fixup {
unsigned int vendor; unsigned int vendor;
unsigned int device; unsigned int device;
...@@ -29,6 +41,7 @@ struct device_fixup { ...@@ -29,6 +41,7 @@ struct device_fixup {
static struct device_fixup fixups_table[] = { static struct device_fixup fixups_table[] = {
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, cs5530a_warm_reset }, { 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 },
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment