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>