Date: Wed, 10 Sep 2008 12:22:14 +0200 From: "Marco Trillo" <marcotrillo@gmail.com> To: "Nathan Whitehorn" <nwhitehorn@freebsd.org> Cc: powerpc@freebsd.org Subject: Re: Call for testers: Apple ATA DMA Message-ID: <b9c23c9f0809100322n1659cb36oa05acf2f13f3c7e1@mail.gmail.com> In-Reply-To: <48C69864.3010208@freebsd.org> References: <48C69864.3010208@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Hello, On Tue, Sep 9, 2008 at 5:38 PM, Nathan Whitehorn <nwhitehorn@freebsd.org> wrote: > I just finished a patch to the Apple built-in ATA drivers (ata_macio and > ata_kauai) that adds DMA support. Due to lack of Kauai hardware (G4 > machines), it has had only minimal testing, so I'd appreciate some more. > > The patch can be found here: > http://people.freebsd.org/~nwhitehorn/apple-ata-dma.patch Regarding the Kauai mode setting: > +static const u_int udma_timing_kauai[] = { /* 0x0000ffff */ > + 0x000070c0, /* UDMA0 */ > + 0x00005d80, /* UDMA1 */ > + 0x00004a60, /* UDMA2 */ > + 0x00003a50, /* UDMA3 */ > + 0x00002a30, /* UDMA4 */ > + 0x00002921 /* UDMA5 */ > +}; > + > static void > ata_kauai_setmode(device_t parent, device_t dev) > { > struct ata_device *atadev = device_get_softc(dev); > + struct ata_kauai_softc *sc = device_get_softc(parent); > + uint32_t dmaconf = 0; > + uint32_t mode; > > - /* TODO bang kauai speed register */ > - atadev->mode = ATA_PIO; > + mode = atadev->mode = ata_limit_mode(dev,atadev->mode,ATA_UDMA5); > + > + if ((mode & ATA_DMA_MASK) == ATA_UDMA0) { > + dmaconf = udma_timing_kauai[mode & ATA_MODE_MASK]; > + > + bus_write_4(sc->sc_memr, DMA_CONFIG_REG, dmaconf); > + } else if ((mode & ATA_DMA_MASK) == ATA_WDMA0) { > + dmaconf = dma_timing_kauai[mode & ATA_MODE_MASK]; > + > + bus_write_4(sc->sc_memr, DMA_CONFIG_REG, dmaconf); > + } else { > + dmaconf = pio_timing_kauai[(mode & ATA_MODE_MASK) - ATA_PIO0]; > + > + bus_write_4(sc->sc_memr, PIO_CONFIG_REG, dmaconf); > + } > } > + The "DMA_CONFIG_REG" register is actually only for UDMA timings, not for DMA+UDMA. DMA mode timings are ORed with PIO mode timings in the "PIO_CONFIG_REG" register; as indicated with the masks: 0x00fff000 for DMA and 0xff000fff for PIO. This can be verified by looking at Mac OS X's AppleKauaiATA.cpp driver, in lines 985 and 986 and others [1] . Note that the NetBSD driver also contains this error, and there is a patch for it on NetBSD PR 39176. OpenBSD driver doesn't have this problem. In addition, to enable UDMA, you need to OR 1 to the UDMA timing mode. So for example for UDMA2, you need to write 0x00004a61 and not simply 0x00004a60 . Hope that helps. Regards, Marco.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?b9c23c9f0809100322n1659cb36oa05acf2f13f3c7e1>