Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 31 May 2003 20:46:54 -0700
From:      "David P. Reese Jr." <daver@gomerbud.com>
To:        Dag-Erling Smorgrav <des@ofug.org>
Cc:        current@freebsd.org
Subject:   Re: viapropm doesnt like sys/dev/pci.c rev 1.214
Message-ID:  <20030601034654.GA643@tombstone.localnet.gomerbud.com>
In-Reply-To: <xzpof1i65d2.fsf@flood.ping.uio.no>
References:  <20030531210600.GA670@tombstone.localnet.gomerbud.com> <xzpof1i65d2.fsf@flood.ping.uio.no>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jun 01, 2003 at 01:52:57AM +0200, Dag-Erling Smorgrav wrote:
> "David P. Reese Jr." <daver@gomerbud.com> writes:
> > In rev 1.214 of sys/dev/pci/pci.c, we have started checking if a
> > pci_set_command_bit() was successful with a subsequent PCI_READ_CONFIG
> > and comparing the results.  For some odd reason, this doesnt work when
> > my viapropm tries to attach.
> 
> viapropm is seriously broken for other reasons and needs professional
> help.

It will be hard for me to provide that professional help because the
chipset docs require an NDA.

> >         pci_set_command_bit(dev, child, bit);
> >         command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
> >         if (command & bit)
> >                 return (0);
> 
> It should allow the register to "settle" between write and read, which
> may take some time (see chipset docs for timing details).  DELAY(1000)
> should be OK in an attach function.

Well, using the following patch:

Index: pci.c
===================================================================
RCS file: /home/daver/cvs-freebsd/src/sys/dev/pci/pci.c,v
retrieving revision 1.214
diff -u -r1.214 pci.c
--- pci.c	16 Apr 2003 03:15:08 -0000	1.214
+++ pci.c	1 Jun 2003 02:45:11 -0000
@@ -606,6 +606,9 @@
 		break;
 	}
 	pci_set_command_bit(dev, child, bit);
+#define PCI_CFG_DELAY 10000000
+	device_printf(dev, "delaying for %i microseconds\n", PCI_CFG_DELAY);
+	DELAY(PCI_CFG_DELAY);
 	command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2);
 	if (command & bit)
 		return (0);

I get:

viapropm0: SMBus I/O base at 0x5000
viapropm0: <VIA VT82C686A Power Management Unit> port 0x5000-0x500f at device 7.4 on pci0
pci0: delaying for 10000000 microseconds
viapropm0: failed to enable port mapping!
viapropm0: could not allocate bus space
device_probe_and_attach: viapropm0 attach returned 6

This seems to imply that we don't have a timing problem.  Instead it looks
like the chip doesn't want reflect it's status in it's command register.
Can someone with access to the docs give me a clue?

-- 

   David P. Reese Jr.                                      daver@gomerbud.com
   --------------------------------------------------------------------------
   It can be argued that returning a NULL pointer when asked to allocate
   zero bytes is a silly response to a silly question.
                                         -- FreeBSD manual page for malloc(3)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030601034654.GA643>