Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jan 2003 12:21:06 -0700 (MST)
From:      Mike Hibler <mike@cs.utah.edu>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/47311: [PATCH] Kernel support for NVIDIA nForce2-based motherboards
Message-ID:  <200301211921.h0LJL6iD077900@bas.flux.utah.edu>

next in thread | raw e-mail | index | archive | help

>Number:         47311
>Category:       kern
>Synopsis:       [PATCH] Kernel support for NVIDIA nForce2-based motherboards
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 21 11:30:01 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Mike Hibler
>Release:        FreeBSD 4.6-STABLE i386
>Organization:
University of Utah
>Environment:
System: FreeBSD bas.flux.utah.edu 4.6-STABLE FreeBSD 4.6-STABLE #1: Mon Sep 9 14:33:29 MDT 2002 root@bas.flux.utah.edu:/usr/src/sys/compile/BAS i386

Applies to FreeBSD-stable as of late December.

>Description:

Adds support for (or at least recognition of) various devices on NVIDIA
nForce2 motherboards: various PCI bridges, memory controller, ATA
controller, USB 1.x controller, AC97 audio.

Also adds support for 3Com NIC + Altima AC101L PHY found on ASUS A7N8X MB.

NO support for the builtin NVIDIA NIC or advanced audio capabilities.

This patch subsumes kern/46660 from <rrs@mx1.net> and also an audio patch
posted by <atrens@nortelnetworks.com> and reflects additional input and
testing from <stevelon@ntlworld.com>.

Note: the capitalization of "NVIDIA" has been changed to be consistent
with their web page.

>How-To-Repeat:

>Fix:

diff -r -u ./dev/ata/ata-dma.c /tmp/sys/dev/ata/ata-dma.c
--- ./dev/ata/ata-dma.c	Thu Oct  3 03:37:48 2002
+++ /tmp/sys/dev/ata/ata-dma.c	Sun Dec 22 15:02:46 2002
@@ -372,7 +372,8 @@
 	/* we could set PIO mode timings, but we assume the BIOS did that */
 	break;
 
-    case 0x01bc10de:	/* nVIDIA nForce */
+    case 0x01bc10de:	/* NVIDIA nForce */
+    case 0x006510de:	/* NVIDIA nForce2 */
     case 0x74411022:	/* AMD 768 */
     case 0x74111022:	/* AMD 766 */
     case 0x74091022:	/* AMD 756 */
@@ -383,7 +384,7 @@
 		{ 0x00, 0x00, 0xea, 0x00, 0xe8, 0x00, 0x00 },	/* ATA66 */
 		{ 0x00, 0x00, 0xf4, 0x00, 0xf1, 0xf0, 0x00 },	/* ATA100 */
 		{ 0x00, 0x00, 0xf6, 0x00, 0xf2, 0xf1, 0xf0 },   /* VIA ATA133 */
-		{ 0x00, 0x00, 0xc0, 0x00, 0xc5, 0xc6, 0x00 }};  /* AMD/nVIDIA */
+		{ 0x00, 0x00, 0xc0, 0x00, 0xc5, 0xc6, 0xc7 }};  /* AMD/NVIDIA */
 	    int *reg_val = NULL;
 	    char *chip = "VIA";
 
@@ -424,10 +425,15 @@
 		reg_val = via_modes[4];
 		chip = "AMD";
 	    }
-	    else if (ch->chiptype == 0x01bc10de) {		/* nVIDIA */
+	    else if (ch->chiptype == 0x01bc10de) {		/* nForce */
 		udmamode = imin(udmamode, 5);
 		reg_val = via_modes[4];
-		chip = "nVIDIA";
+		chip = "NVIDIA";
+	    }
+	    else if (ch->chiptype == 0x006510de) {		/* nForce2 */
+		udmamode = imin(udmamode, 6);
+		reg_val = via_modes[4];
+		chip = "NVIDIA";
 	    }
 	    else 
 		udmamode = 0;
diff -r -u ./dev/ata/ata-pci.c /tmp/sys/dev/ata/ata-pci.c
--- ./dev/ata/ata-pci.c	Thu Oct  3 03:37:48 2002
+++ /tmp/sys/dev/ata/ata-pci.c	Mon Dec 23 10:55:21 2002
@@ -237,7 +237,10 @@
 	return "AMD 768 ATA100 controller";
 
     case 0x01bc10de:
-	return "nVIDIA nForce ATA100 controller";
+	return "NVIDIA nForce ATA100 controller";
+
+    case 0x006510de:
+	return "NVIDIA nForce2 ATA133 controller";
 
     case 0x02111166:
 	return "ServerWorks ROSB4 ATA33 controller";
@@ -469,7 +472,8 @@
     case 0x74091022: /* AMD 756 default setup */
     case 0x74111022: /* AMD 766 default setup */
     case 0x74411022: /* AMD 768 default setup */
-    case 0x01bc10de: /* nVIDIA nForce default setup */
+    case 0x01bc10de: /* NVIDIA nForce default setup */
+    case 0x006510de: /* NVIDIA nForce2 default setup */
 	/* set prefetch, postwrite */
 	pci_write_config(dev, 0x41, pci_read_config(dev, 0x41, 1) | 0xf0, 1);
 
diff -r -u ./dev/mii/acphy.c /tmp/sys/dev/mii/acphy.c
--- ./dev/mii/acphy.c	Tue Oct 22 03:39:38 2002
+++ /tmp/sys/dev/mii/acphy.c	Mon Dec 23 11:12:03 2002
@@ -126,9 +126,17 @@
 
 	ma = device_get_ivars(dev);
 
-	if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_xxALTIMA &&
-	    MII_MODEL(ma->mii_id2) == MII_MODEL_xxALTIMA_AC101) {
-		device_set_desc(dev, MII_STR_xxALTIMA_AC101);
+	if (MII_OUI(ma->mii_id1, ma->mii_id2) == MII_OUI_xxALTIMA) {
+		switch (MII_MODEL(ma->mii_id2)) {
+		case MII_MODEL_xxALTIMA_AC101:
+			device_set_desc(dev, MII_STR_xxALTIMA_AC101);
+			break;
+		case MII_MODEL_xxALTIMA_AC101L:
+			device_set_desc(dev, MII_STR_xxALTIMA_AC101L);
+			break;
+		default:
+			return (ENXIO);
+		}
 	} else 
 		return (ENXIO);
 
@@ -279,7 +287,7 @@
 {
 	struct mii_data *mii = sc->mii_pdata;
 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
-	int bmsr, bmcr, diag;
+	int bmsr, bmcr, diag, anlpar, id;
 
 	mii->mii_media_status = IFM_AVALID;
 	mii->mii_media_active = IFM_ETHER;
@@ -305,14 +313,51 @@
 			mii->mii_media_active |= IFM_NONE;
 			return;
 		}
-		diag = PHY_READ(sc, MII_ACPHY_DIAG);
-		if (diag & AC_DIAG_SPEED)
-			mii->mii_media_active |= IFM_100_TX;
-		else
-			mii->mii_media_active |= IFM_10_T;
 
-		if (diag & AC_DIAG_DUPLEX)
-			mii->mii_media_active |= IFM_FDX;
+		/*
+		 * AC101 has bits in the dianostic register reporting
+		 * the results of auto-negotiation.
+		 */
+		id = PHY_READ(sc, MII_PHYIDR2);
+		if (MII_MODEL(id) == MII_MODEL_xxALTIMA_AC101) {
+			diag = PHY_READ(sc, MII_ACPHY_DIAG);
+			if (diag & AC_DIAG_SPEED)
+				mii->mii_media_active |= IFM_100_TX;
+			else
+				mii->mii_media_active |= IFM_10_T;
+
+			if (diag & AC_DIAG_DUPLEX)
+				mii->mii_media_active |= IFM_FDX;
+
+			return;
+		}
+
+		/*
+		 * Have to figure it out ourselves on the 101L
+		 */
+		if (PHY_READ(sc, MII_ANER) & ANER_LPAN) {
+			anlpar = PHY_READ(sc, MII_ANAR) &
+			    PHY_READ(sc, MII_ANLPAR);
+			if (anlpar & ANLPAR_T4)
+				mii->mii_media_active |= IFM_100_T4;
+			else if (anlpar & ANLPAR_TX_FD)
+				mii->mii_media_active |= IFM_100_TX|IFM_FDX;
+			else if (anlpar & ANLPAR_TX)
+				mii->mii_media_active |= IFM_100_TX;
+			else if (anlpar & ANLPAR_10_FD)
+				mii->mii_media_active |= IFM_10_T|IFM_FDX;
+			else if (anlpar & ANLPAR_10)
+				mii->mii_media_active |= IFM_10_T;
+			else
+				mii->mii_media_active |= IFM_NONE;
+			return;
+		}
+
+		/*
+		 * Link partner is not capable of autonegotiation.
+		 */
+		mii->mii_media_active = mii_media_from_bmcr(bmcr);
+
 	} else
 		mii->mii_media_active = ife->ifm_media;
 }
diff -r -u ./dev/mii/miidevs /tmp/sys/dev/mii/miidevs
--- ./dev/mii/miidevs	Thu Dec 12 03:56:54 2002
+++ /tmp/sys/dev/mii/miidevs	Mon Dec 23 11:26:06 2002
@@ -97,6 +97,7 @@
 
 /* Altima Communications PHYs */
 model xxALTIMA AC101		0x0021 AC101 10/100 media interface
+model xxALTIMA AC101L		0x0012 AC101L 10/100 media interface
 
 /* Advanced Micro Devices PHYs */
 model xxAMD 79C873		0x0000 Am79C873 10/100 media interface
diff -r -u ./dev/mii/miidevs.h /tmp/sys/dev/mii/miidevs.h
--- ./dev/mii/miidevs.h	Thu Dec 12 03:56:54 2002
+++ /tmp/sys/dev/mii/miidevs.h	Mon Dec 23 11:26:35 2002
@@ -105,6 +105,8 @@
 /* Altima Communications PHYs */
 #define	MII_MODEL_xxALTIMA_AC101	0x0021
 #define	MII_STR_xxALTIMA_AC101	"AC101 10/100 media interface"
+#define	MII_MODEL_xxALTIMA_AC101L	0x0012
+#define	MII_STR_xxALTIMA_AC101L	"AC101L 10/100 media interface"
 
 /* Advanced Micro Devices PHYs */
 #define	MII_MODEL_xxAMD_79C873	0x0000
diff -r -u ./pci/if_xl.c /tmp/sys/pci/if_xl.c
--- ./pci/if_xl.c	Thu Nov 28 03:56:24 2002
+++ /tmp/sys/pci/if_xl.c	Mon Dec 23 11:23:18 2002
@@ -212,6 +212,8 @@
 		"3Com 3c656B Fast Etherlink XL" },
 	{ TC_VENDORID, TC_DEVICEID_TORNADO_656C,
 		"3Com 3c656C Fast Etherlink XL" },
+	{ TC_VENDORID, TC_DEVICEID_NFORCE2_10_100,
+		"3Com nForce2 integrated fast etherlink" },
 	{ 0, 0, NULL }
 };
 
@@ -1213,6 +1215,7 @@
 	case TC_DEVICEID_HURRICANE_656:		/* 3c656 */
 	case TC_DEVICEID_HURRICANE_656B:	/* 3c656B */
 	case TC_DEVICEID_TORNADO_656C:		/* 3c656C */
+	case TC_DEVICEID_NFORCE2_10_100:	/* NVIDIA nForce2 integrated */
 		sc->xl_media = XL_MEDIAOPT_MII;
 		sc->xl_xcvr = XL_XCVR_MII;
 		if (verbose)
@@ -1284,6 +1287,8 @@
 		sc->xl_flags |= XL_FLAG_8BITROM;
 	if (pci_get_device(dev) == TC_DEVICEID_HURRICANE_556B)
 		sc->xl_flags |= XL_FLAG_NO_XCVR_PWR;
+	if (pci_get_device(dev) == TC_DEVICEID_NFORCE2_10_100)
+		sc->xl_flags |= XL_FLAG_PHYOK;
 
 	if (pci_get_device(dev) == TC_DEVICEID_HURRICANE_575A ||
 	    pci_get_device(dev) == TC_DEVICEID_HURRICANE_575B ||
diff -r -u ./pci/if_xlreg.h /tmp/sys/pci/if_xlreg.h
--- ./pci/if_xlreg.h	Tue Nov 12 03:37:57 2002
+++ /tmp/sys/pci/if_xlreg.h	Mon Dec 23 11:13:33 2002
@@ -669,6 +669,7 @@
 #define TC_DEVICEID_HURRICANE_656		0x6560
 #define TC_DEVICEID_HURRICANE_656B		0x6562
 #define TC_DEVICEID_TORNADO_656C		0x6564
+#define TC_DEVICEID_NFORCE2_10_100		0x9201
 
 /*
  * PCI low memory base and low I/O base register, and
diff -r -u ./pci/ohci_pci.c /tmp/sys/pci/ohci_pci.c
--- ./pci/ohci_pci.c	Thu Aug 29 03:42:03 2002
+++ /tmp/sys/pci/ohci_pci.c	Sat Dec 21 23:26:02 2002
@@ -79,6 +79,7 @@
 #define PCI_OHCI_VENDORID_NEC		0x1033
 #define PCI_OHCI_VENDORID_OPTI		0x1045
 #define PCI_OHCI_VENDORID_SIS		0x1039
+#define PCI_OHCI_VENDORID_NVIDIA	0x10de
 
 #define PCI_OHCI_DEVICEID_ALADDIN_V	0x523710b9
 static const char *ohci_device_aladdin_v = "AcerLabs M5237 (Aladdin-V) USB controller";
@@ -107,6 +108,9 @@
 #define PCI_OHCI_DEVICEID_KEYLARGO	0x0019106b
 static const char *ohci_device_keylargo = "Apple KeyLargo USB controller";
 
+#define PCI_OHCI_DEVICEID_NVIDIANF2	0x006710de
+static const char *ohci_device_nvidianf2 = "NVIDIA nForce2 USB controller";
+
 static const char *ohci_device_generic = "OHCI (generic) USB controller";
 
 #define PCI_OHCI_BASE_REG	0x10
@@ -139,6 +143,8 @@
 		return (ohci_device_sis5571);
 	case PCI_OHCI_DEVICEID_KEYLARGO:
 		return (ohci_device_keylargo);
+	case PCI_OHCI_DEVICEID_NVIDIANF2:
+		return (ohci_device_nvidianf2);
 	default:
 		if (pci_get_class(self) == PCIC_SERIALBUS
 		    && pci_get_subclass(self) == PCIS_SERIALBUS_USB
@@ -222,6 +228,9 @@
 		break;
 	case PCI_OHCI_VENDORID_SIS:
 		sprintf(sc->sc_vendor, "SiS");
+		break;
+	case PCI_OHCI_VENDORID_NVIDIA:
+		sprintf(sc->sc_vendor, "NVIDIA");
 		break;
 	default:
 		if (bootverbose)
diff -r -u ./pci/pcisupport.c /tmp/sys/pci/pcisupport.c
--- ./pci/pcisupport.c	Thu Nov 28 03:56:25 2002
+++ /tmp/sys/pci/pcisupport.c	Mon Dec 23 11:36:13 2002
@@ -695,6 +695,13 @@
 	case 0x1a318086:
 		return ("Intel 82845 PCI-PCI (AGP) bridge");
 	
+	/* NVIDIA -- vendor 0x10de */
+	case 0x006c10de:
+	case 0x006d10de:
+		return ("NVIDIA nForce2 PCI-PCI bridge");
+	case 0x01e810de:
+		return ("NVIDIA nForce2 PCI-PCI (AGP) bridge");
+
 	/* VLSI -- vendor 0x1004 */
 	case 0x01021004:
 		return ("VLSI 82C534 Eagle II PCI Bus bridge");
@@ -906,6 +913,10 @@
 	case 0x24408086:
 		return ("Intel 82801BA/BAM (ICH2) PCI to LPC bridge");
 	
+	/* NVIDIA -- vendor 0x10de */
+	case 0x006010de:
+		return ("NVIDIA nForce2 PCI-ISA bridge");
+
 	/* VLSI -- vendor 0x1004 */
 	case 0x00061004:
 		return ("VLSI 82C593 PCI to ISA bridge");
@@ -1072,6 +1083,10 @@
 		return ("CMD Tech 670 (USB0670) USB controller");
 	case 0x06731095:
 		return ("CMD Tech 673 (USB0673) USB controller");
+
+	/* NVIDIA -- vendor 0x10de */
+	case 0x006710de:
+		return ("NVIDIA nForce2 USB controller");
 	}
 
 	if (pci_get_class(dev) == PCIC_SERIALBUS
@@ -1230,6 +1245,14 @@
 		return ("Intel 82801AA (ICH) AC'97 Audio Controller");
 	case 0x24258086:
 		return ("Intel 82801AB (ICH0) AC'97 Audio Controller");
+
+	/* NVIDIA -- vendor 0x10de */
+	case 0x01eb10de:
+	case 0x01ec10de:
+	case 0x01ed10de:
+	case 0x01ee10de:
+	case 0x01ef10de:
+		return ("NVIDIA nForce2 memory controller");
 
 	/* Sony -- vendor 0x104d */
 	case 0x8009104d:
diff -r -u ./dev/sound/pci/ich.c /tmp/dev/sound/pci/ich.c
--- ./dev/sound/pci/ich.c	Sun Dec 29 23:41:37 2002
+++ /tmp/dev/sound/pci/ich.c	Sun Dec 29 23:33:25 2002
@@ -624,7 +624,15 @@
 		return 0;
 
 	case 0x01b110de:
-		device_set_desc(dev, "Nvidia nForce AC97 controller");
+		device_set_desc(dev, "NVIDIA nForce AC97 controller");
+		return 0;
+
+	case 0x006a10de:
+		device_set_desc(dev, "NVIDIA nForce2 Audio Codec");
+		return 0;
+
+	case 0x006b10de:
+		device_set_desc(dev, "NVIDIA nForce2 MCP Audio Processing Unit");
 		return 0;
 
 	default:


>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?200301211921.h0LJL6iD077900>