Date: Tue, 16 Dec 2008 10:18:16 -0500 From: John Baldwin <john@baldwin.cx> To: Tor Egge <Tor.Egge@cvsup.no.freebsd.org> Cc: "yr.retarded@gmail.com" <yr.retarded@gmail.com>, "freebsd-current@freebsd.org" <freebsd-current@FreeBSD.org>, John Baldwin <jhb@FreeBSD.org> Subject: Re: lockup booting 8.0-CURRENT-200811 snap image Message-ID: <8D488E8F-BDEB-4384-9D64-48812E8DFC7B@baldwin.cx> In-Reply-To: <20081214.035113.104070918.Tor.Egge@cvsup.no.freebsd.org> References: <200812041421.53099.jhb@freebsd.org> <58c737d70812041934v359e9833vbe68e6be871875f8@mail.gmail.com> <200812051131.30003.jhb@freebsd.org> <20081214.035113.104070918.Tor.Egge@cvsup.no.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
So the real fix is that we need to disable memory and I/O decoding int
the PCI command register when messing with the BARs. One thing to be
careful with is we can't do any console I/O (i.e. printfs) while the
BAR is disabled. I will come up with a proper patch when I get back to
a real computer.
--
John Baldwin
On Dec 13, 2008, at 10:51 PM, Tor Egge <Tor.Egge@cvsup.no.freebsd.org>
wrote:
>> Well, we probably need to come up with a better way to determine
>> which
>> machines to actually use it on. It's a shame that MCFG is
>> apparently busted
>> on so many machines (either that or we are not doing something
>> correctly).
>
> pci_add_map() writes 0xffffffff to the map register in order to
> probe for
> writable bits. This had the immediate side effect of hanging my
> machine.
> Since I didn't know about the "Add hw.pci.mcfg=0 to /boot/
> loader.conf" at that
> time, I started using the enclosed kludgy patch (specific for Intel
> 82Q33
> hardware). Only the GMADDR map register was a problem.
>
> It looks like the graphics memory aperture was mapped on top of the
> memory
> mapped pci config registers, thus only IO access to the pci config
> registers
> worked to undo the supposedly temporary change.
>
> - Tor Egge
> Index: sys/conf/options
> ===================================================================
> RCS file: /home/ncvs/src/sys/conf/options,v
> retrieving revision 1.651
> diff -u -r1.651 options
> --- sys/conf/options 11 Dec 2008 16:13:17 -0000 1.651
> +++ sys/conf/options 12 Dec 2008 20:00:11 -0000
> @@ -786,3 +786,7 @@
> # Virtualize the network stack
> VIMAGE opt_global.h
> VIMAGE_GLOBALS opt_global.h
> +
> +# Kludge to work around hangs during probing of Intel 82Q33 PCI
> devices
> +# (vendor 0x8086, device 0x29d2).
> +PCI_INTEL_82Q33_KLUDGE opt_kludge.h
> Index: sys/dev/pci/pci.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/dev/pci/pci.c,v
> retrieving revision 1.366
> diff -u -r1.366 pci.c
> --- sys/dev/pci/pci.c 13 Nov 2008 19:57:33 -0000 1.366
> +++ sys/dev/pci/pci.c 14 Nov 2008 18:27:31 -0000
> @@ -30,6 +30,7 @@
> __FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.366 2008/11/13
> 19:57:33 mav Exp $");
>
> #include "opt_bus.h"
> +#include "opt_kludge.h"
>
> #include <sys/param.h>
> #include <sys/systm.h>
> @@ -2289,11 +2290,52 @@
> int type;
> int barlen;
> struct resource *res;
> +#ifdef PCI_INTEL_82Q33_KLUDGE
> + struct pci_devinfo *dinfo;
> + pcicfgregs *cfg;
> + uint32_t msacval;
> +#endif
>
> map = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
> +#ifdef PCI_INTEL_82Q33_KLUDGE
> + dinfo = device_get_ivars(dev);
> + cfg = &dinfo->cfg;
> + /*
> + * The test write to probe for writable address bits hangs
> + * some machines. Kludge around this by faking the test based
> + * on the MSAC register at offset 0x62. Intel doc is slightly
> + * inconsistent about which bits in MSAC controls the aperture
> + * size.
> + */
> + if (cfg->vendor == 0x8086 && cfg->device == 0x29d2 && reg ==
> 24) {
> + printf("Kludge: "
> + "faking test to avoid hang for 82Q33 GMADDR config
> \n");
> + msacval = PCIB_READ_CONFIG(pcib, b, s, f, 0x62, 1);
> + printf("82Q33 MSAC (offset 0x62) val is 0x%02x\n", msacval);
> + switch ((msacval >> 1) & 3) {
> + case 0:
> + testval = 0xf8000008u;
> + break;
> + case 1:
> + testval = 0xf0000008u;
> + break;
> + case 3:
> + testval = 0xe0000008u;
> + break;
> + default:
> + printf("BAD MSAC val\n");
> + testval = 0xe0000008u;
> + break;
> + }
> + goto kludgedone;
> + }
> +#endif
> PCIB_WRITE_CONFIG(pcib, b, s, f, reg, 0xffffffff, 4);
> testval = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
> PCIB_WRITE_CONFIG(pcib, b, s, f, reg, map, 4);
> +#ifdef PCI_INTEL_82Q33_KLUDGE
> +kludgedone:
> +#endif
>
> if (PCI_BAR_MEM(map))
> type = SYS_RES_MEMORY;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8D488E8F-BDEB-4384-9D64-48812E8DFC7B>
