Skip site navigation (1)Skip section navigation (2)
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>