MCP68 AHCI Support

M.R. Fremouw maarten at fremouw.nl
Tue Nov 13 12:19:40 PST 2007


Hi,

It seems that FreeBSD 7.0 current does not support the Nvidia MCP68  
chipset in AHCI mode. To fix this I created a patch to add support for  
the MCP68. I also added the ID's for the pata ide controller to let it  
work in UDMA6 mode.

Maarten

The patch:
diff -Naur sys-orig/dev/ata/ata-all.h sys-nvidiaahci/dev/ata/ata-all.h
--- sys-orig/dev/ata/ata-all.h	2007-11-13 19:41:36.000000000 +0100
+++ sys-nvidiaahci/dev/ata/ata-all.h	2007-11-13 20:21:38.000000000 +0100
@@ -155,7 +155,7 @@
  #define ATA_AHCI_GHC                    0x04
  #define         ATA_AHCI_GHC_AE         0x80000000
  #define         ATA_AHCI_GHC_IE         0x00000002
-#define         ATA_AHCI_GHC_HR         0x80000001
+#define         ATA_AHCI_GHC_HR         0x00000001

  #define ATA_AHCI_IS                     0x08
  #define ATA_AHCI_PI                     0x0c
diff -Naur sys-orig/dev/ata/ata-chipset.c sys-nvidiaahci/dev/ata/ata- 
chipset.c
--- sys-orig/dev/ata/ata-chipset.c	2007-11-13 19:41:36.000000000 +0100
+++ sys-nvidiaahci/dev/ata/ata-chipset.c	2007-11-13 20:21:38.000000000  
+0100
@@ -453,6 +453,11 @@
      struct ata_pci_controller *ctlr = device_get_softc(dev);
      u_int32_t version;

+    /* enable AHCI mode, AE should be set high before calling reset
+       according to AHCI specifictions rev. 1.10, section 5.2.2.1 */
+    ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC,
+             ATA_INL(ctlr->r_res2, ATA_AHCI_GHC) | ATA_AHCI_GHC_AE);
+
      /* reset AHCI controller */
      ATA_OUTL(ctlr->r_res2, ATA_AHCI_GHC,
  	     ATA_INL(ctlr->r_res2, ATA_AHCI_GHC) | ATA_AHCI_GHC_HR);
@@ -2931,6 +2936,9 @@
       { ATA_NFORCE_MCP61_S1, 0, 0,         NV4|NVQ, ATA_SA300,  
"nForce MCP61" },
       { ATA_NFORCE_MCP61_S2, 0, 0,         NV4|NVQ, ATA_SA300,  
"nForce MCP61" },
       { ATA_NFORCE_MCP61_S3, 0, 0,         NV4|NVQ, ATA_SA300,  
"nForce MCP61" },
+     { ATA_NFORCE_MCP68,    0, AMDNVIDIA, NVIDIA,  ATA_UDMA6, "nForce  
MCP68" },
+     { ATA_NFORCE_MCP68_S1, 0, 0,         AHCI,    ATA_SA300, "nForce  
MCP68" },
+     { ATA_NFORCE_MCP68_S2, 0, 0,         AHCI,    ATA_SA300, "nForce  
MCP68" },
       { 0, 0, 0, 0, 0, 0}} ;
      char buffer[64] ;

@@ -2963,6 +2971,9 @@
  						   &ctlr->r_rid2, RF_ACTIVE))) {
  	    int offset = ctlr->chip->cfg2 & NV4 ? 0x0440 : 0x0010;

+            if(ctlr->chip->cfg2 == AHCI)
+                return ata_ahci_chipinit(dev);
+
  	    ctlr->allocate = ata_nvidia_allocate;
  	    ctlr->reset = ata_nvidia_reset;

diff -Naur sys-orig/dev/ata/ata-pci.h sys-nvidiaahci/dev/ata/ata-pci.h
--- sys-orig/dev/ata/ata-pci.h	2007-11-13 19:41:36.000000000 +0100
+++ sys-nvidiaahci/dev/ata/ata-pci.h	2007-11-13 20:21:38.000000000 +0100
@@ -232,6 +232,9 @@
  #define ATA_NFORCE_MCP61_S1     0x03e710de
  #define ATA_NFORCE_MCP61_S2     0x03f610de
  #define ATA_NFORCE_MCP61_S3     0x03f710de
+#define ATA_NFORCE_MCP68        0x056010de // PATA IDE
+#define ATA_NFORCE_MCP68_S1     0x055410de // AHCI
+#define ATA_NFORCE_MCP68_S2     0x058410de // Linux AHCI

  #define ATA_PROMISE_ID          0x105a
  #define ATA_PDC20246            0x4d33105a


More information about the freebsd-current mailing list