* [PATCH][2.4] remove amd7(saucy)_tco
@ 2004-05-01 19:37 Zwane Mwaikambo
2004-05-02 8:48 ` Willy Tarreau
0 siblings, 1 reply; 4+ messages in thread
From: Zwane Mwaikambo @ 2004-05-01 19:37 UTC (permalink / raw)
To: Linux Kernel; +Cc: Marcelo Tosatti
Hello Marcelo,
This driver has already been removed in 2.6, essentially we've had
problems getting it working (it's been a while now) with a lot of boards,
all seems to be alright until the actual point where the hardware is
supposed to reset the system. So lets just back it out.
It applies to -bk
Index: linux-2.4.26/drivers/char/Config.in
===================================================================
RCS file: /home/cvsroot/linux-2.4.26/drivers/char/Config.in,v
retrieving revision 1.1.1.1
diff -u -p -B -r1.1.1.1 Config.in
--- linux-2.4.26/drivers/char/Config.in 19 Apr 2004 17:41:42 -0000 1.1.1.1
+++ linux-2.4.26/drivers/char/Config.in 1 May 2004 19:26:27 -0000
@@ -273,7 +273,6 @@ if [ "$CONFIG_WATCHDOG" != "n" ]; then
if [ "$CONFIG_SGI_IP22" = "y" ]; then
dep_tristate ' Indy/I2 Hardware Watchdog' CONFIG_INDYDOG $CONFIG_SGI_IP22
fi
- dep_tristate ' AMD 766/768 TCO Timer/Watchdog' CONFIG_AMD7XX_TCO $CONFIG_EXPERIMENTAL
if [ "$CONFIG_8xx" = "y" ]; then
tristate ' MPC8xx Watchdog Timer' CONFIG_8xx_WDT
fi
Index: linux-2.4.26/drivers/char/Makefile
===================================================================
RCS file: /home/cvsroot/linux-2.4.26/drivers/char/Makefile,v
retrieving revision 1.1.1.1
diff -u -p -B -r1.1.1.1 Makefile
--- linux-2.4.26/drivers/char/Makefile 19 Apr 2004 17:41:42 -0000 1.1.1.1
+++ linux-2.4.26/drivers/char/Makefile 1 May 2004 19:26:34 -0000
@@ -320,7 +320,6 @@ obj-$(CONFIG_SC1200_WDT) += sc1200wdt.o
obj-$(CONFIG_SCx200_WDT) += scx200_wdt.o
obj-$(CONFIG_WAFER_WDT) += wafer5823wdt.o
obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
-obj-$(CONFIG_AMD7XX_TCO) += amd7xx_tco.o
obj-$(CONFIG_INDYDOG) += indydog.o
obj-$(CONFIG_8xx_WDT) += mpc8xx_wdt.o
Index: linux-2.4.26/drivers/char/amd7xx_tco.c
===================================================================
RCS file: linux-2.4.26/drivers/char/amd7xx_tco.c
diff -N linux-2.4.26/drivers/char/amd7xx_tco.c
--- linux-2.4.26/drivers/char/amd7xx_tco.c 19 Apr 2004 17:41:42 -0000 1.1.1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,387 +0,0 @@
-/*
- * AMD 766/768 TCO Timer Driver
- * (c) Copyright 2002 Zwane Mwaikambo <zwane@holomorphy.com>
- * All Rights Reserved.
- *
- * Parts from;
- * Hardware driver for the AMD 768 Random Number Generator (RNG)
- * (c) Copyright 2001 Red Hat Inc <alan@redhat.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation.
- *
- * The author(s) of this software shall not be held liable for damages
- * of any nature resulting due to the use of this software. This
- * software is provided AS-IS with no warranties.
- *
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/kernel.h>
-#include <linux/miscdevice.h>
-#include <linux/watchdog.h>
-#include <linux/ioport.h>
-#include <linux/spinlock.h>
-#include <linux/ioport.h>
-#include <asm/semaphore.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <linux/notifier.h>
-#include <linux/reboot.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-
-#define AMDTCO_MODULE_VER "build 20021116"
-#define AMDTCO_MODULE_NAME "amd7xx_tco"
-#define PFX AMDTCO_MODULE_NAME ": "
-
-#define MAX_TIMEOUT 38 /* max of 38 seconds, although the system will only
- * reset itself after the second timeout */
-
-/* pmbase registers */
-#define TCO_RELOAD_REG 0x40 /* bits 0-5 are current count, 6-7 are reserved */
-#define TCO_INITVAL_REG 0x41 /* bits 0-5 are value to load, 6-7 are reserved */
-#define TCO_TIMEOUT_MASK 0x3f
-#define TCO_STATUS1_REG 0x44
-#define TCO_STATUS2_REG 0x46
-#define NDTO_STS2 (1 << 1) /* we're interested in the second timeout */
-#define BOOT_STS (1 << 2) /* will be set if NDTO_STS2 was set before reboot */
-#define TCO_CTRL1_REG 0x48
-#define TCO_HALT (1 << 11)
-#define NO_REBOOT (1 << 10) /* in DevB:3x48 */
-
-static char banner[] __initdata = KERN_INFO PFX AMDTCO_MODULE_VER "\n";
-static int timeout = 38;
-static u32 pmbase; /* PMxx I/O base */
-static struct pci_dev *dev;
-static struct semaphore open_sem;
-static spinlock_t amdtco_lock; /* only for device access */
-static int expect_close = 0;
-
-MODULE_PARM(timeout, "i");
-MODULE_PARM_DESC(timeout, "range is 0-38 seconds, default is 38");
-
-static inline u8 seconds_to_ticks(int seconds)
-{
- /* the internal timer is stored as ticks which decrement
- * every 0.6 seconds */
- return (seconds * 10) / 6;
-}
-
-static inline int ticks_to_seconds(u8 ticks)
-{
- return (ticks * 6) / 10;
-}
-
-static inline int amdtco_status(void)
-{
- u16 reg;
- int status = 0;
-
- reg = inb(pmbase+TCO_CTRL1_REG);
- if ((reg & TCO_HALT) == 0)
- status |= WDIOF_KEEPALIVEPING;
-
- reg = inb(pmbase+TCO_STATUS2_REG);
- if (reg & BOOT_STS)
- status |= WDIOF_CARDRESET;
-
- return status;
-}
-
-static inline void amdtco_ping(void)
-{
- outb(1, pmbase+TCO_RELOAD_REG);
-}
-
-static inline int amdtco_gettimeout(void)
-{
- u8 reg = inb(pmbase+TCO_RELOAD_REG) & TCO_TIMEOUT_MASK;
- return ticks_to_seconds(reg);
-}
-
-static inline void amdtco_settimeout(unsigned int timeout)
-{
- u8 reg = seconds_to_ticks(timeout) & TCO_TIMEOUT_MASK;
- outb(reg, pmbase+TCO_INITVAL_REG);
-}
-
-static inline void amdtco_global_enable(void)
-{
- u16 reg;
-
- spin_lock(&amdtco_lock);
-
- /* clear NO_REBOOT on DevB:3x48 p97 */
- pci_read_config_word(dev, 0x48, ®);
- reg &= ~NO_REBOOT;
- pci_write_config_word(dev, 0x48, reg);
-
- spin_unlock(&amdtco_lock);
-}
-
-static inline void amdtco_enable(void)
-{
- u16 reg;
-
- spin_lock(&amdtco_lock);
- reg = inw(pmbase+TCO_CTRL1_REG);
- reg &= ~TCO_HALT;
- outw(reg, pmbase+TCO_CTRL1_REG);
- spin_unlock(&amdtco_lock);
-}
-
-static inline void amdtco_disable(void)
-{
- u16 reg;
-
- spin_lock(&amdtco_lock);
- reg = inw(pmbase+TCO_CTRL1_REG);
- reg |= TCO_HALT;
- outw(reg, pmbase+TCO_CTRL1_REG);
- spin_unlock(&amdtco_lock);
-}
-
-static int amdtco_fop_open(struct inode *inode, struct file *file)
-{
- if (down_trylock(&open_sem))
- return -EBUSY;
-
-#ifdef CONFIG_WATCHDOG_NOWAYOUT
- MOD_INC_USE_COUNT;
-#endif
-
- if (timeout > MAX_TIMEOUT)
- timeout = MAX_TIMEOUT;
-
- amdtco_disable();
- amdtco_settimeout(timeout);
- amdtco_global_enable();
- amdtco_enable();
- amdtco_ping();
- printk(KERN_INFO PFX "Watchdog enabled, timeout = %ds of %ds\n",
- amdtco_gettimeout(), timeout);
-
- return 0;
-}
-
-
-static int amdtco_fop_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-{
- int new_timeout;
- int tmp;
-
- static struct watchdog_info ident = {
- options: WDIOF_SETTIMEOUT | WDIOF_CARDRESET,
- identity: "AMD 766/768"
- };
-
- switch (cmd) {
- default:
- return -ENOTTY;
-
- case WDIOC_GETSUPPORT:
- if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof ident))
- return -EFAULT;
- return 0;
-
- case WDIOC_GETSTATUS:
- return put_user(amdtco_status(), (int *)arg);
-
- case WDIOC_KEEPALIVE:
- amdtco_ping();
- return 0;
-
- case WDIOC_SETTIMEOUT:
- if (get_user(new_timeout, (int *)arg))
- return -EFAULT;
-
- if (new_timeout < 0)
- return -EINVAL;
-
- if (new_timeout > MAX_TIMEOUT)
- new_timeout = MAX_TIMEOUT;
-
- timeout = new_timeout;
- amdtco_settimeout(timeout);
- /* fall through and return the new timeout */
-
- case WDIOC_GETTIMEOUT:
- return put_user(amdtco_gettimeout(), (int *)arg);
-
- case WDIOC_SETOPTIONS:
- if (copy_from_user(&tmp, (int *)arg, sizeof tmp))
- return -EFAULT;
-
- if (tmp & WDIOS_DISABLECARD)
- amdtco_disable();
-
- if (tmp & WDIOS_ENABLECARD)
- amdtco_enable();
-
- return 0;
- }
-}
-
-
-static int amdtco_fop_release(struct inode *inode, struct file *file)
-{
- if (expect_close) {
- amdtco_disable();
- printk(KERN_INFO PFX "Watchdog disabled\n");
- } else {
- amdtco_ping();
- printk(KERN_CRIT PFX "Unexpected close!, timeout in %d seconds\n", timeout);
- }
-
- up(&open_sem);
- return 0;
-}
-
-
-static ssize_t amdtco_fop_write(struct file *file, const char *data, size_t len, loff_t *ppos)
-{
- if (ppos != &file->f_pos)
- return -ESPIPE;
-
- if (len) {
-#ifndef CONFIG_WATCHDOG_NOWAYOUT
- size_t i;
- char c;
- expect_close = 0;
-
- for (i = 0; i != len; i++) {
- if (get_user(c, data + i))
- return -EFAULT;
-
- if (c == 'V')
- expect_close = 1;
- }
-#endif
- amdtco_ping();
- }
-
- return len;
-}
-
-
-static int amdtco_notify_sys(struct notifier_block *this, unsigned long code, void *unused)
-{
- if (code == SYS_DOWN || code == SYS_HALT)
- amdtco_disable();
-
- return NOTIFY_DONE;
-}
-
-
-static struct notifier_block amdtco_notifier =
-{
- notifier_call: amdtco_notify_sys
-};
-
-static struct file_operations amdtco_fops =
-{
- owner: THIS_MODULE,
- write: amdtco_fop_write,
- ioctl: amdtco_fop_ioctl,
- open: amdtco_fop_open,
- release: amdtco_fop_release
-};
-
-static struct miscdevice amdtco_miscdev =
-{
- minor: WATCHDOG_MINOR,
- name: "watchdog",
- fops: &amdtco_fops
-};
-
-static struct pci_device_id amdtco_pci_tbl[] __initdata = {
- { 0x1022, 0x7443, PCI_ANY_ID, PCI_ANY_ID, },
- { 0, }
-};
-
-MODULE_DEVICE_TABLE (pci, amdtco_pci_tbl);
-
-static int __init amdtco_init(void)
-{
- int ret;
-
- sema_init(&open_sem, 1);
- spin_lock_init(&amdtco_lock);
-
- pci_for_each_dev(dev) {
- if (pci_match_device (amdtco_pci_tbl, dev) != NULL)
- goto found_one;
- }
-
- return -ENODEV;
-
-found_one:
-
- if ((ret = register_reboot_notifier(&amdtco_notifier))) {
- printk(KERN_ERR PFX "Unable to register reboot notifier err = %d\n", ret);
- goto out_clean;
- }
-
- if ((ret = misc_register(&amdtco_miscdev))) {
- printk(KERN_ERR PFX "Unable to register miscdev on minor %d\n", WATCHDOG_MINOR);
- goto out_unreg_reboot;
- }
-
- pci_read_config_dword(dev, 0x58, &pmbase);
- pmbase &= 0x0000FF00;
-
- if (pmbase == 0) {
- printk (KERN_ERR PFX "power management base not set\n");
- ret = -EIO;
- goto out_unreg_misc;
- }
-
- /* ret = 0; */
- printk(banner);
- goto out_clean;
-
-out_unreg_misc:
- misc_deregister(&amdtco_miscdev);
-out_unreg_reboot:
- unregister_reboot_notifier(&amdtco_notifier);
-out_clean:
- return ret;
-}
-
-static void __exit amdtco_exit(void)
-{
- misc_deregister(&amdtco_miscdev);
- unregister_reboot_notifier(&amdtco_notifier);
-}
-
-
-#ifndef MODULE
-static int __init amdtco_setup(char *str)
-{
- int ints[4];
-
- str = get_options (str, ARRAY_SIZE(ints), ints);
- if (ints[0] > 0)
- timeout = ints[1];
-
- if (!timeout || timeout > 38)
- timeout = MAX_TIMEOUT;
-
- return 1;
-}
-
-__setup("amd7xx_tco=", amdtco_setup);
-#endif
-
-module_init(amdtco_init);
-module_exit(amdtco_exit);
-
-MODULE_AUTHOR("Zwane Mwaikambo <zwane@holomorphy.com>");
-MODULE_DESCRIPTION("AMD 766/768 TCO Timer Driver");
-MODULE_LICENSE("GPL");
-EXPORT_NO_SYMBOLS;
-
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH][2.4] remove amd7(saucy)_tco
2004-05-01 19:37 [PATCH][2.4] remove amd7(saucy)_tco Zwane Mwaikambo
@ 2004-05-02 8:48 ` Willy Tarreau
2004-05-02 10:02 ` Martin Josefsson
2004-05-02 15:55 ` Zwane Mwaikambo
0 siblings, 2 replies; 4+ messages in thread
From: Willy Tarreau @ 2004-05-02 8:48 UTC (permalink / raw)
To: Zwane Mwaikambo; +Cc: Linux Kernel, Marcelo Tosatti
On Sat, May 01, 2004 at 03:37:36PM -0400, Zwane Mwaikambo wrote:
> Hello Marcelo,
> This driver has already been removed in 2.6, essentially we've had
> problems getting it working (it's been a while now) with a lot of boards,
> all seems to be alright until the actual point where the hardware is
> supposed to reset the system. So lets just back it out.
Indeed, I've just checked here, because I believed I had seen it working,
but now I think it was the softdog. It does nothing at all. I've downloaded
and read AMD's datasheet and the driver seems to do the right thing. BTW,
I wonder if the chip is buggy or not, because I tried to play with the
SYSRST and FULLRST bits in the 0xCF9 register. Changing SYSRST to 1 does not
change anything, and changing FULLRST to 1 immediately reboots the machine
even if no reset was pending !
Regards,
Willy
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][2.4] remove amd7(saucy)_tco
2004-05-02 8:48 ` Willy Tarreau
@ 2004-05-02 10:02 ` Martin Josefsson
2004-05-02 15:55 ` Zwane Mwaikambo
1 sibling, 0 replies; 4+ messages in thread
From: Martin Josefsson @ 2004-05-02 10:02 UTC (permalink / raw)
To: Willy Tarreau; +Cc: Zwane Mwaikambo, Linux Kernel, Marcelo Tosatti
[-- Attachment #1: Type: text/plain, Size: 1441 bytes --]
On Sun, 2004-05-02 at 10:48, Willy Tarreau wrote:
> On Sat, May 01, 2004 at 03:37:36PM -0400, Zwane Mwaikambo wrote:
> > Hello Marcelo,
> > This driver has already been removed in 2.6, essentially we've had
> > problems getting it working (it's been a while now) with a lot of boards,
> > all seems to be alright until the actual point where the hardware is
> > supposed to reset the system. So lets just back it out.
>
> Indeed, I've just checked here, because I believed I had seen it working,
> but now I think it was the softdog. It does nothing at all. I've downloaded
> and read AMD's datasheet and the driver seems to do the right thing. BTW,
> I wonder if the chip is buggy or not, because I tried to play with the
> SYSRST and FULLRST bits in the 0xCF9 register. Changing SYSRST to 1 does not
> change anything, and changing FULLRST to 1 immediately reboots the machine
> even if no reset was pending !
Exactly the same thing we (zwane and I) saw when trying to fix it. We
gave up after some time. We tested it on the 760mpx chipset on an Asus
A7M-266D motherboard (don't remember which north/south bridge
combination that is)
We've also seen even weirder things on the same chipset but from another
motherboard-manufacturer. There absolutely nothing happened after the
timer reached 0. No bits set anywhere. On my board we at least got that.
I use pci-based watchdog cards instead...
--
/Martin
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][2.4] remove amd7(saucy)_tco
2004-05-02 8:48 ` Willy Tarreau
2004-05-02 10:02 ` Martin Josefsson
@ 2004-05-02 15:55 ` Zwane Mwaikambo
1 sibling, 0 replies; 4+ messages in thread
From: Zwane Mwaikambo @ 2004-05-02 15:55 UTC (permalink / raw)
To: Willy Tarreau; +Cc: Linux Kernel, Marcelo Tosatti
On Sun, 2 May 2004, Willy Tarreau wrote:
> On Sat, May 01, 2004 at 03:37:36PM -0400, Zwane Mwaikambo wrote:
> > Hello Marcelo,
> > This driver has already been removed in 2.6, essentially we've had
> > problems getting it working (it's been a while now) with a lot of boards,
> > all seems to be alright until the actual point where the hardware is
> > supposed to reset the system. So lets just back it out.
>
> Indeed, I've just checked here, because I believed I had seen it working,
> but now I think it was the softdog. It does nothing at all. I've downloaded
> and read AMD's datasheet and the driver seems to do the right thing. BTW,
> I wonder if the chip is buggy or not, because I tried to play with the
> SYSRST and FULLRST bits in the 0xCF9 register. Changing SYSRST to 1 does not
> change anything, and changing FULLRST to 1 immediately reboots the machine
> even if no reset was pending !
That agrees with what Martin Josefsson and i came across, we ended up
combing through the datasheet and ended up coming to the conclusion that
either we were missing something subtle or the hardware just didn't work.
It's a shame because i had a friend who had a whole bunch of these and
wanted to use the watchdog in production.
Zwane
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2004-05-02 15:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-05-01 19:37 [PATCH][2.4] remove amd7(saucy)_tco Zwane Mwaikambo
2004-05-02 8:48 ` Willy Tarreau
2004-05-02 10:02 ` Martin Josefsson
2004-05-02 15:55 ` Zwane Mwaikambo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.