Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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.
+13 −0
Original line number Diff line number Diff line
@@ -5,12 +5,14 @@
 *
 * List of supported fixups:
 * geode-gx1/cs5530a - Jaya Kumar <jayalk@intworks.biz>
 * geode-gx/lx/cs5536 - Andres Salomon <dilinger@debian.org>
 *
 */

#include <asm/delay.h>
#include <linux/pci.h>
#include <asm/reboot_fixups.h>
#include <asm/msr.h>

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 },
};

/*