Date: Mon, 29 Oct 2001 03:08:21 +0900 From: nork@cityfujisawa.ne.jp (Norikatsu Shigemura) To: FreeBSD-gnats-submit@freebsd.org Subject: kern/31559: agp driver patch for i840/i845/i850/i860 Message-ID: <011029030821.M0197428@pelsia.netmove.co.jp>
next in thread | raw e-mail | index | archive | help
>Number: 31559
>Category: kern
>Synopsis: agp driver patch for i840/i845/i850/i860
>Confidential: no
>Severity: non-critical
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Sun Oct 28 10:10:00 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: Norikatsu Shigemura
>Release: FreeBSD 4.4-STABLE i386
>Organization:
Personal
>Environment:
System: FreeBSD sakura.ninth-nine.com 4.4-STABLE FreeBSD 4.4-STABLE #53: Sun Oct 28 04:18:12 JST 2001 nork@sakura.ninth-nine.com:/usr/obj/usr/src/sys/SAKURA i386
CPU: Intel PentiumIII 800EBMHz x 2
MotherBoard: SUPERMICRO PIIIDM3
Chipset: i840
GraphicsCard: Matrox Millenium G400SH(16MB)
>Description:
I write agp driver for i840/i845/i850/i860. I test and My
environment is ok(XFree86-DRI). Probably i850 is ok. I refer
Linux 2.4.10 about i840/i850. But I refer Intel DataSheet
about i845/i860. So I have no confidence in myself about
i845/i860.
>How-To-Repeat:
>Fix:
--- sys/pci/agp_intel.c.orig Wed Jul 19 18:48:04 2000
+++ sys/pci/agp_intel.c Sun Oct 28 03:48:09 2001
@@ -74,6 +74,18 @@
case 0x71a18086:
return ("Intel 82443GX host to AGP bridge");
+
+ case 0x1a218086:
+ return ("Intel 82840 host to AGP bridge");
+
+ case 0x1a308086:
+ return ("Intel 82845 host to AGP bridge");
+
+ case 0x25308086:
+ return ("Intel 82850 host to AGP bridge");
+
+ case 0x25318086:
+ return ("Intel 82860 host to AGP bridge");
};
if (pci_get_vendor(dev) == 0x8086)
@@ -102,6 +114,7 @@
{
struct agp_intel_softc *sc = device_get_softc(dev);
struct agp_gatt *gatt;
+ u_int32_t type = pci_get_devid(dev);
int error;
error = agp_generic_attach(dev);
@@ -130,11 +143,44 @@
pci_write_config(dev, AGP_INTEL_ATTBASE, gatt->ag_physical, 4);
/* Enable things, clear errors etc. */
- pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x2280, 4);
- pci_write_config(dev, AGP_INTEL_NBXCFG,
- (pci_read_config(dev, AGP_INTEL_NBXCFG, 4)
- & ~(1 << 10)) | (1 << 9), 4);
- pci_write_config(dev, AGP_INTEL_ERRSTS + 1, 7, 1);
+ switch (type) {
+ case 0x1a218086: /* i840 */
+ case 0x25308086: /* i850 */
+ case 0x25318086: /* i860 */
+ pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x0000, 4);
+ pci_write_config(dev, AGP_INTEL_MCHCFG,
+ (pci_read_config(dev, AGP_INTEL_MCHCFG, 2)
+ | (1 << 9)), 2);
+ break;
+
+ case 0x1a308086: /* i845 */
+ pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x0000, 4);
+ pci_write_config(dev, AGP_INTEL_I845_MCHCFG,
+ (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1)
+ | (1 << 1)), 1);
+ break;
+
+ default: /* Intel Generic (maybe) */
+ pci_write_config(dev, AGP_INTEL_AGPCTRL, 0x2280, 4);
+ pci_write_config(dev, AGP_INTEL_NBXCFG,
+ (pci_read_config(dev, AGP_INTEL_NBXCFG, 4)
+ & ~(1 << 10)) | (1 << 9), 4);
+ }
+
+ switch (type) {
+ case 0x1a218086: /* i840 */
+ pci_write_config(dev, AGP_INTEL_I8XX_ERRSTS, 0xc000, 2);
+ break;
+
+ case 0x1a308086: /* i845 */
+ case 0x25308086: /* i850 */
+ case 0x25318086: /* i860 */
+ pci_write_config(dev, AGP_INTEL_I8XX_ERRSTS, 0x001c, 2);
+ break;
+
+ default: /* Intel Generic (maybe) */
+ pci_write_config(dev, AGP_INTEL_ERRSTS + 1, 7, 1);
+ }
return 0;
}
@@ -143,18 +189,40 @@
agp_intel_detach(device_t dev)
{
struct agp_intel_softc *sc = device_get_softc(dev);
+ u_int32_t type = pci_get_devid(dev);
int error;
error = agp_generic_detach(dev);
if (error)
return error;
- printf("%s: set NBXCFG to %x\n", __FUNCTION__,
- (pci_read_config(dev, AGP_INTEL_NBXCFG, 4)
- & ~(1 << 9)));
- pci_write_config(dev, AGP_INTEL_NBXCFG,
- (pci_read_config(dev, AGP_INTEL_NBXCFG, 4)
- & ~(1 << 9)), 4);
+ switch (type) {
+ case 0x1a218086: /* i840 */
+ case 0x25308086: /* i850 */
+ case 0x25318086: /* i860 */
+ printf("%s: set MCHCFG to %x\n", __FUNCTION__, (unsigned)
+ (pci_read_config(dev, AGP_INTEL_MCHCFG, 2)
+ & ~(1 << 9)));
+ pci_write_config(dev, AGP_INTEL_MCHCFG,
+ (pci_read_config(dev, AGP_INTEL_MCHCFG, 2)
+ & ~(1 << 9)), 2);
+
+ case 0x1a308086: /* i845 */
+ printf("%s: set MCHCFG to %x\n", __FUNCTION__, (unsigned)
+ (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1)
+ & ~(1 << 1)));
+ pci_write_config(dev, AGP_INTEL_MCHCFG,
+ (pci_read_config(dev, AGP_INTEL_I845_MCHCFG, 1)
+ & ~(1 << 1)), 1);
+
+ default: /* Intel Generic (maybe) */
+ printf("%s: set NBXCFG to %x\n", __FUNCTION__,
+ (pci_read_config(dev, AGP_INTEL_NBXCFG, 4)
+ & ~(1 << 9)));
+ pci_write_config(dev, AGP_INTEL_NBXCFG,
+ (pci_read_config(dev, AGP_INTEL_NBXCFG, 4)
+ & ~(1 << 9)), 4);
+ }
pci_write_config(dev, AGP_INTEL_ATTBASE, 0, 4);
AGP_SET_APERTURE(dev, sc->initial_aperture);
agp_free_gatt(sc->gatt);
--- sys/pci/agpreg.h.orig Wed Jul 19 18:48:04 2000
+++ sys/pci/agpreg.h Sun Oct 28 03:45:05 2001
@@ -57,6 +57,13 @@
#define AGP_INTEL_ATTBASE 0xb8
/*
+ * Config offsets for Intel i840/i845/i850/i860 AGP chipsets.
+ */
+#define AGP_INTEL_MCHCFG 0x50
+#define AGP_INTEL_I845_MCHCFG 0x51
+#define AGP_INTEL_I8XX_ERRSTS 0xc8
+
+/*
* Config offsets for VIA AGP chipsets.
*/
#define AGP_VIA_GARTCTRL 0x80
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?011029030821.M0197428>
